From 583edea4150e73a1d2ff05176c5ed02455c4135a Mon Sep 17 00:00:00 2001 From: Scott Westover Date: Fri, 5 Jul 2024 11:54:54 -0400 Subject: [PATCH] updated demos Signed-off-by: Scott Westover --- phaser-3/3.60/mobile-swipe/src/swipe.js | 28 +- phaser-3/3.70/draggable-demo/src/main.js | 55 +- .../minimap-1-demo/.vscode/extensions.json | 3 + .../3.80/minimap-1-demo/.vscode/settings.json | 12 + phaser-3/3.80/minimap-1-demo/README.md | 21 + .../assets/data/animations.json | 100 + .../minimap-1-demo/assets/data/assets.json | 38 + .../minimap-1-demo/assets/data/quests.json | 7 + .../assets/minimap/bonus1_full.png | Bin 0 -> 24636 bytes .../minimap-1-demo/assets/minimap/minimap.png | Bin 0 -> 104369 bytes .../minimap-1-demo/assets/minimap/tile056.png | Bin 0 -> 1357 bytes .../minimap-1-demo/assets/minimap/town.json | 1311 + .../minimap-1-demo/assets/minimap/town.png | Bin 0 -> 91202 bytes phaser-3/3.80/minimap-1-demo/docs/example.gif | Bin 0 -> 7157653 bytes phaser-3/3.80/minimap-1-demo/index.html | 23 + phaser-3/3.80/minimap-1-demo/jsconfig.json | 7 + .../src/components/common/index.js | 31 + .../components/events/event-bus-component.js | 13 + .../src/components/input/input-component.js | 63 + .../input/keyboard-input-component.js | 43 + .../grid-movement-animation-component.js | 97 + .../movement/grid-movement-component.js | 147 + .../src/components/movement/grid-utils.js | 29 + .../3.80/minimap-1-demo/src/game-scene.js | 107 + .../3.80/minimap-1-demo/src/lib/phaser.js | 1 + phaser-3/3.80/minimap-1-demo/src/main.js | 18 + .../3.80/minimap-1-demo/src/types/phaser.d.ts | 116274 +++++++++++++++ .../minimap-2-demo/.vscode/extensions.json | 3 + .../3.80/minimap-2-demo/.vscode/settings.json | 12 + phaser-3/3.80/minimap-2-demo/README.md | 17 + .../assets/data/animations.json | 100 + .../minimap-2-demo/assets/data/assets.json | 38 + .../minimap-2-demo/assets/data/quests.json | 7 + .../assets/minimap/bonus1_full.png | Bin 0 -> 24636 bytes .../minimap-2-demo/assets/minimap/minimap.png | Bin 0 -> 104369 bytes .../minimap-2-demo/assets/minimap/tile056.png | Bin 0 -> 1357 bytes .../minimap-2-demo/assets/minimap/town.json | 1311 + .../minimap-2-demo/assets/minimap/town.png | Bin 0 -> 91202 bytes phaser-3/3.80/minimap-2-demo/docs/example.gif | Bin 0 -> 177359 bytes phaser-3/3.80/minimap-2-demo/index.html | 23 + phaser-3/3.80/minimap-2-demo/jsconfig.json | 7 + .../src/camera-example-scene.js | 88 + .../src/components/common/index.js | 31 + .../components/events/event-bus-component.js | 13 + .../src/components/input/input-component.js | 63 + .../input/keyboard-input-component.js | 43 + .../grid-movement-animation-component.js | 97 + .../movement/grid-movement-component.js | 147 + .../src/components/movement/grid-utils.js | 29 + .../minimap-2-demo/src/image-example-scene.js | 64 + .../3.80/minimap-2-demo/src/lib/phaser.js | 1 + phaser-3/3.80/minimap-2-demo/src/main.js | 19 + .../3.80/minimap-2-demo/src/types/phaser.d.ts | 116274 +++++++++++++++ 53 files changed, 236761 insertions(+), 54 deletions(-) create mode 100644 phaser-3/3.80/minimap-1-demo/.vscode/extensions.json create mode 100644 phaser-3/3.80/minimap-1-demo/.vscode/settings.json create mode 100644 phaser-3/3.80/minimap-1-demo/README.md create mode 100644 phaser-3/3.80/minimap-1-demo/assets/data/animations.json create mode 100644 phaser-3/3.80/minimap-1-demo/assets/data/assets.json create mode 100644 phaser-3/3.80/minimap-1-demo/assets/data/quests.json create mode 100644 phaser-3/3.80/minimap-1-demo/assets/minimap/bonus1_full.png create mode 100644 phaser-3/3.80/minimap-1-demo/assets/minimap/minimap.png create mode 100644 phaser-3/3.80/minimap-1-demo/assets/minimap/tile056.png create mode 100644 phaser-3/3.80/minimap-1-demo/assets/minimap/town.json create mode 100644 phaser-3/3.80/minimap-1-demo/assets/minimap/town.png create mode 100644 phaser-3/3.80/minimap-1-demo/docs/example.gif create mode 100644 phaser-3/3.80/minimap-1-demo/index.html create mode 100644 phaser-3/3.80/minimap-1-demo/jsconfig.json create mode 100644 phaser-3/3.80/minimap-1-demo/src/components/common/index.js create mode 100644 phaser-3/3.80/minimap-1-demo/src/components/events/event-bus-component.js create mode 100644 phaser-3/3.80/minimap-1-demo/src/components/input/input-component.js create mode 100644 phaser-3/3.80/minimap-1-demo/src/components/input/keyboard-input-component.js create mode 100644 phaser-3/3.80/minimap-1-demo/src/components/movement/grid-movement-animation-component.js create mode 100644 phaser-3/3.80/minimap-1-demo/src/components/movement/grid-movement-component.js create mode 100644 phaser-3/3.80/minimap-1-demo/src/components/movement/grid-utils.js create mode 100644 phaser-3/3.80/minimap-1-demo/src/game-scene.js create mode 100644 phaser-3/3.80/minimap-1-demo/src/lib/phaser.js create mode 100644 phaser-3/3.80/minimap-1-demo/src/main.js create mode 100644 phaser-3/3.80/minimap-1-demo/src/types/phaser.d.ts create mode 100644 phaser-3/3.80/minimap-2-demo/.vscode/extensions.json create mode 100644 phaser-3/3.80/minimap-2-demo/.vscode/settings.json create mode 100644 phaser-3/3.80/minimap-2-demo/README.md create mode 100644 phaser-3/3.80/minimap-2-demo/assets/data/animations.json create mode 100644 phaser-3/3.80/minimap-2-demo/assets/data/assets.json create mode 100644 phaser-3/3.80/minimap-2-demo/assets/data/quests.json create mode 100644 phaser-3/3.80/minimap-2-demo/assets/minimap/bonus1_full.png create mode 100644 phaser-3/3.80/minimap-2-demo/assets/minimap/minimap.png create mode 100644 phaser-3/3.80/minimap-2-demo/assets/minimap/tile056.png create mode 100644 phaser-3/3.80/minimap-2-demo/assets/minimap/town.json create mode 100644 phaser-3/3.80/minimap-2-demo/assets/minimap/town.png create mode 100644 phaser-3/3.80/minimap-2-demo/docs/example.gif create mode 100644 phaser-3/3.80/minimap-2-demo/index.html create mode 100644 phaser-3/3.80/minimap-2-demo/jsconfig.json create mode 100644 phaser-3/3.80/minimap-2-demo/src/camera-example-scene.js create mode 100644 phaser-3/3.80/minimap-2-demo/src/components/common/index.js create mode 100644 phaser-3/3.80/minimap-2-demo/src/components/events/event-bus-component.js create mode 100644 phaser-3/3.80/minimap-2-demo/src/components/input/input-component.js create mode 100644 phaser-3/3.80/minimap-2-demo/src/components/input/keyboard-input-component.js create mode 100644 phaser-3/3.80/minimap-2-demo/src/components/movement/grid-movement-animation-component.js create mode 100644 phaser-3/3.80/minimap-2-demo/src/components/movement/grid-movement-component.js create mode 100644 phaser-3/3.80/minimap-2-demo/src/components/movement/grid-utils.js create mode 100644 phaser-3/3.80/minimap-2-demo/src/image-example-scene.js create mode 100644 phaser-3/3.80/minimap-2-demo/src/lib/phaser.js create mode 100644 phaser-3/3.80/minimap-2-demo/src/main.js create mode 100644 phaser-3/3.80/minimap-2-demo/src/types/phaser.d.ts diff --git a/phaser-3/3.60/mobile-swipe/src/swipe.js b/phaser-3/3.60/mobile-swipe/src/swipe.js index fa1eaf6..ab9d71f 100644 --- a/phaser-3/3.60/mobile-swipe/src/swipe.js +++ b/phaser-3/3.60/mobile-swipe/src/swipe.js @@ -61,28 +61,38 @@ export class Swipe { * @returns {void} */ #setupEvents() { - this.#scene.input.on(Phaser.Input.Events.POINTER_DOWN, this.#handlePointerDown, this); - this.#scene.input.on(Phaser.Input.Events.POINTER_UP, this.#handlePointerUp, this); - this.#scene.events.once(Phaser.Scenes.Events.SHUTDOWN, () => { - this.#scene.input.off(Phaser.Input.Events.POINTER_DOWN, this.#handlePointerDown, this); - this.#scene.input.off(Phaser.Input.Events.POINTER_UP, this.#handlePointerUp, this); + document.addEventListener(Phaser.Input.Events.POINTER_DOWN, (/** @type {PointerEvent} */ pointer) => { + console.log(pointer.x, pointer.y); + this.#handlePointerDown(pointer); }); + document.addEventListener(Phaser.Input.Events.POINTER_UP, (/** @type {PointerEvent} */ pointer) => { + console.log(pointer.x, pointer.y); + this.#handlePointerUp(pointer); + }); + // this.#scene.input.on(Phaser.Input.Events.POINTER_DOWN, this.#handlePointerDown, this); + // this.#scene.input.on(Phaser.Input.Events.POINTER_UP, this.#handlePointerUp, this); + // this.#scene.events.once(Phaser.Scenes.Events.SHUTDOWN, () => { + // this.#scene.input.off(Phaser.Input.Events.POINTER_DOWN, this.#handlePointerDown, this); + // this.#scene.input.off(Phaser.Input.Events.POINTER_UP, this.#handlePointerUp, this); + // }); } /** - * @param {Phaser.Input.Pointer} pointer + * @param {PointerEvent} pointer * @returns {void} */ #handlePointerDown(pointer) { - this.#lastPointerDownLocation = pointer.position.clone(); + //this.#lastPointerDownLocation = pointer.position.clone(); + this.#lastPointerDownLocation = new Phaser.Math.Vector2(pointer.x, pointer.y); } /** - * @param {Phaser.Input.Pointer} pointer + * @param {PointerEvent} pointer * @returns {void} */ #handlePointerUp(pointer) { - this.#lastPointerUpLocation = pointer.position.clone(); + //this.#lastPointerUpLocation = pointer.position.clone(); + this.#lastPointerUpLocation = new Phaser.Math.Vector2(pointer.x, pointer.y); this.#handleSwipe(); if (this.#swipeDirection !== DIRECTION.NONE && this.#config && this.#config.swipeDetectedCallback) { this.#config.swipeDetectedCallback(this.#swipeDirection); diff --git a/phaser-3/3.70/draggable-demo/src/main.js b/phaser-3/3.70/draggable-demo/src/main.js index fbefb27..8ef7c3d 100644 --- a/phaser-3/3.70/draggable-demo/src/main.js +++ b/phaser-3/3.70/draggable-demo/src/main.js @@ -1,58 +1,23 @@ import Phaser from './lib/phaser.js'; -const ASSETS = { - BACKGROUND: { key: 'BACKGROUND', path: 'background.png' }, - SHIP: { key: 'SHIP', path: 'ship-a1.png' }, - ROCK: { key: 'ROCK', path: 'big-a.png' }, -}; - export class Game extends Phaser.Scene { constructor() { super({ key: 'Game' }); } - preload() { - this.load.setPath('assets/starfighter'); - Object.values(ASSETS).forEach((asset) => { - this.load.image(asset.key, asset.path); - }); - } - create() { - this.add - .image( - this.scale.width / 2, - this.scale.height / 2, - ASSETS.BACKGROUND.key, - 0 - ) - .setAngle(-90) - .setAlpha(0.7) - .setScale(2.5); - const ship = this.add - .image(this.scale.width / 2, this.scale.height - 200, ASSETS.SHIP.key, 0) - .setScale(3); - ship.setInteractive({ - draggable: true, + console.log('1'); + this.time.delayedCall(0, () => { + console.log('2'); }); - ship.on('drag', (pointer, dragX, dragY) => { - console.log(pointer); - console.log(dragX, dragY); - ship.setPosition(dragX, dragY); - }); - - const rock = this.add - .image(this.scale.width / 2, 150, ASSETS.ROCK.key, 0) - .setScale(3); - - rock.setInteractive({ - draggable: true, - }); - - rock.on('drag', (pointer, x, y) => { - rock.x = x; - rock.y = y; + console.log('3'); + new Promise((resolve) => { + setTimeout(() => { + console.log('5'); + resolve(); + }, 3); }); + console.log('4'); } } diff --git a/phaser-3/3.80/minimap-1-demo/.vscode/extensions.json b/phaser-3/3.80/minimap-1-demo/.vscode/extensions.json new file mode 100644 index 0000000..741a7c7 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["esbenp.prettier-vscode", "ritwickdey.LiveServer"] +} diff --git a/phaser-3/3.80/minimap-1-demo/.vscode/settings.json b/phaser-3/3.80/minimap-1-demo/.vscode/settings.json new file mode 100644 index 0000000..5ed0be9 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "eslint.format.enable": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "prettier.singleQuote": true, + "prettier.semi": true, + "editor.formatOnSave": true, + "prettier.printWidth": 120, + "cSpell.words": ["anims"] +} diff --git a/phaser-3/3.80/minimap-1-demo/README.md b/phaser-3/3.80/minimap-1-demo/README.md new file mode 100644 index 0000000..6a14db4 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/README.md @@ -0,0 +1,21 @@ +# Phaser 3 - Create Minimap Using Phaser 3 Camera Demo + +![demo](docs/example.gif) + +A quick demo of how you can use the built in events of Phaser 3 to know when an animation is completed, that way you can use that event to perform some additional game logic. + +For a detailed walkthrough, checkout my video on YouTube here: + +Coming soon... + +Link to live demo: + +[Minimap Using Phaser 3 Camera Demo](https://devshareacademy.github.io/code-examples-from-my-video-content/phaser-3/animation-completion-events/index.html) + +## Credit + +The art assets used in this demo were created by: + +- [finalbossblues](https://finalbossblues.itch.io/openrtp-tiles) +- [oceansdream](https://oceansdream.itch.io/nostalgia-icons1) +- [finalbossblues](https://finalbossblues.com/timefantasy/free-graphics/) diff --git a/phaser-3/3.80/minimap-1-demo/assets/data/animations.json b/phaser-3/3.80/minimap-1-demo/assets/data/animations.json new file mode 100644 index 0000000..5a6f4da --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/assets/data/animations.json @@ -0,0 +1,100 @@ +{ + "anims": [ + { + "key": "idle", + "type": "frame", + "frames": [ + { + "frame": 55 + } + ], + "defaultTextureKey": "characters", + "frameRate": 6, + "repeat": -1 + }, + { + "key": "walk_down", + "type": "frame", + "frames": [ + { + "frame": 54 + }, + { + "frame": 55 + }, + { + "frame": 56 + }, + { + "frame": 55 + } + ], + "defaultTextureKey": "characters", + "frameRate": 6, + "repeat": -1 + }, + { + "key": "walk_left", + "type": "frame", + "frames": [ + { + "frame": 66 + }, + { + "frame": 67 + }, + { + "frame": 68 + }, + { + "frame": 67 + } + ], + "defaultTextureKey": "characters", + "frameRate": 6, + "repeat": -1 + }, + { + "key": "walk_right", + "type": "frame", + "frames": [ + { + "frame": 78 + }, + { + "frame": 79 + }, + { + "frame": 80 + }, + { + "frame": 79 + } + ], + "defaultTextureKey": "characters", + "frameRate": 6, + "repeat": -1 + }, + { + "key": "walk_up", + "type": "frame", + "frames": [ + { + "frame": 90 + }, + { + "frame": 91 + }, + { + "frame": 92 + }, + { + "frame": 91 + } + ], + "defaultTextureKey": "characters", + "frameRate": 6, + "repeat": -1 + } + ] +} diff --git a/phaser-3/3.80/minimap-1-demo/assets/data/assets.json b/phaser-3/3.80/minimap-1-demo/assets/data/assets.json new file mode 100644 index 0000000..ab5da74 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/assets/data/assets.json @@ -0,0 +1,38 @@ +[ + { + "path": "assets/minimap", + "files": [ + { + "type": "image", + "key": "background", + "url": "town.png" + }, + { + "type": "image", + "key": "map", + "url": "minimap.png" + }, + { + "type": "image", + "key": "questIcon", + "url": "tile056.png" + }, + { + "type": "spritesheet", + "key": "characters", + "url": "bonus1_full.png", + "frameConfig": { "frameWidth": 26, "frameHeight": 36 } + } + ] + }, + { + "path": "assets/data", + "files": [ + { + "type": "json", + "key": "quests", + "url": "quests.json" + } + ] + } +] diff --git a/phaser-3/3.80/minimap-1-demo/assets/data/quests.json b/phaser-3/3.80/minimap-1-demo/assets/data/quests.json new file mode 100644 index 0000000..56bf694 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/assets/data/quests.json @@ -0,0 +1,7 @@ +[ + { + "id": "quest1", + "x": 568, + "y": 348 + } +] diff --git a/phaser-3/3.80/minimap-1-demo/assets/minimap/bonus1_full.png b/phaser-3/3.80/minimap-1-demo/assets/minimap/bonus1_full.png new file mode 100644 index 0000000000000000000000000000000000000000..9954fcd11493c30e08e99600b2f03c5c3f419e22 GIT binary patch literal 24636 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 literal 0 HcmV?d00001 diff --git a/phaser-3/3.80/minimap-1-demo/assets/minimap/minimap.png b/phaser-3/3.80/minimap-1-demo/assets/minimap/minimap.png new file mode 100644 index 0000000000000000000000000000000000000000..a98071dddc828b82dcd799a9836283b56df06016 GIT binary patch literal 104369 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 literal 0 HcmV?d00001 diff --git a/phaser-3/3.80/minimap-1-demo/assets/minimap/tile056.png b/phaser-3/3.80/minimap-1-demo/assets/minimap/tile056.png new file mode 100644 index 0000000000000000000000000000000000000000..47a42430e633afac00382b47819c292b94beaa88 GIT binary patch literal 1357 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 z%0AlWoR@-`A)9;03|UWkUKy|S8`1s{%wgOjjA&lWBz$sfu{B%{o|03)*Ffi2Z(!2- z^%nMehLjt&;xlsY84N6I{kw9=D|19zepLV6_)fO|5a~xILY?gJ63(g4vy{Dp_>T9D6IFg4QzYvD!J6##eCy@$o3uEbQl)?C z={(}|X*x{#d2URQ4TvUZQIftzQntL2?>KzNV%>1GJWy_uEPkaVquwfTZ5<)YDz&yk zFk#NaN0^;*nW~9p6E51mg>RvI z;3uJyN9|LE+_Ro*LuDhhbOSLA1Sj7Tu@U+X)l_8hP(mZ6G(oXy^ZQ1PD5pa=sQhBh z`V0X{V38Hf@orz?Dt|H=OG z2WW#10&ngnI^epEn$)st=q6K&+oG4F7~=cS~cg3Y>TFq zZoN;A;X7YLUf+JhaL%@1Y`na&BY4H|VB(2O*^+FwRKD(*k3d-QveZE{Z+392Rmg0& z=@_lwFhXlECfM&7XSUmD&<6}4E6~Dc%XF^Ba#eiYLOM7~w`aQ{EqqDta(=RWvbM23 z-WL@Y9}q6HbUX_XduY<*tP=I2?Gb}s@tnF_9;MdDbxnUiKWn6Gcdab9Bp?@4X_+2nAj}g@E5qlNWj?d?g5jOi{z-RM!;Eg@+tdAO z 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%0A;rO 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

  • }_4RhdOVcVdry&gEm-2 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

    XzeU|!zh_n+$WK=&k`vVUz5g-q5tWjy1wQr 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

    Q4hDHH>r)fo~}L%V#4 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%0AJ}My&f=OooOGRRHP(TKGe%MzRz>D3Jw9tn`Y@ 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%0D=etB>+-na3l9x1$#LGgf`0*<27tUsYVE$ye<= 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⪚%Cmu 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%0Ao!1n|iRj-zK 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�b|!V7#Ua{yHc#J?*E{nQJy*!4hN?SdY%u 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 dDKdV0W_8uYl>kjHlnby6O4s;HK30%! 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

    _JNbs#{}7e_kfRGQ9X^2gNm8b+4c7vlJt}Uo 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 z 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

    sx}{2Y2FBT0DCv3 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 z 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

  • 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 z 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

    >UbGNSiIW@_K@OH#63{Vq2f2Sq}CLjrn!kE)Ih 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%0D=Q#`68?y95ZtzdZ2p5=4Fq(6>)zI#j6& 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 z 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

    rIbCVWaaWTM=WjJ(97;J{tw_~UuS?oK# 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
    ?!_pD0UyGVN;=k?v{ZM-;5Oec0RfFHy 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 ?bhY0N*nU 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%0D3PSBjGFXqKUavl!cik6_s}5qE^^PEd=)|VY*uW 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%0A&(7MNNc&7hP7t=L**LL*=a2v1j&#O z93eMtmgvsa==rd7Kpi4)rL+@ICD=ALmhBB|^uk=0t4+(y5X&PKdDn>+<~;3ep=$OV^$NS8XvznILj_j>9v%!m4wFCC++jn2DUSj>({`30lW*$z^>(5Mv z$s@*OVT*$Elr*seW3QEAU(VxIur>?BDeap_$1W=UtAQue?1Hg7+qP}Ttj5uA5R%T+ z0a8vpSz|=Z!ZK(;BB#r1M41#*fY!I^D-@D%H4M^X$d-lK=KO}5!zQz=BN(HFwr^wd zt}zrT$(^i?3Ezl=sR%WTB9WEL@%?TLoWsi^#L+-C$+6Nft)aSd(`(pzmYuyM2}!SY zB*~q=KVE-5`B4E#ncnI%B5i~h8Nx;|zdgL-=Jj3NWRaFOsUF^9a2#9o?_5|Nxyd%y zf{#1*$h|F)8U&EM+Qo=!-)29A*yE)M^qT0ucXm+A@ zbfGRyo3V^CaE<_B=o}_Pyr^$YUkEDPs*7#PZJ-+d+&IKh=82=m>@EQWhz=o9?+~(WZ z&l^*(q2dSp**Jrdg+&Fy*pp$!eRx#{j&ax^9e1Rm+o$|UZ$p~IMZHRd+C_E>OwtHq zJy1ByIp;dhul+7=xmp2!s9k%8@)RTgcGjVQIhDdFKVtX$yR;k_~q&w+A2J!o;h${&;hoID4*K#V>$ldcLwI!Y5_kcQH*RGV1yd3{C9QtLqFW>CA zX#8@_=reQVoUz+a(f#;Wqxejm;+U8NM@eVef%?OBra+lHgnnUEIc62vt9l$hcf5X7 zE0X^LBH>coE`7-{Kz^LW(68XY$So*|HwBP*CSPb|&_?{6u^!(JM2f!TSjiZXGc2^Z z$#$Po|23XSbBX_o$HZ25rlh5Ts%-t~w02BJyg!q5~NJTk=Z!y&Gf zdw!~GoKYc{sUYOl1VvAsKnMxu4c`>ysaXv5XaqSx!hKud0 zrQ4&DDGPQxg$M7wtRS__o;2rw`I-5aT+y6HJFqj6l{jmyR`Uy3`9#bgnw+yL8K1Ho zA!b=t9FBbx%h=cokUu4?qs_|fzAr=GQAo5-|rx^mm5X`Xw zp7P_A7}Nqgxed-F_NItKvv4T4hQZ``G)C+DV_SjJkQ>~8)>;(_#-?xOCv&RNMya`2 zpYR5`dsR2i7;?~kLDpKv97q5eacF}8#RFWiJm!erWs3=)C9v`=E8X~!L6#NZFODje zmPAvvEW1MNO$<3=-oLx|_FIP=dE03D^m($saGD8!!~STQfWiGPbrHH*e$O|bs`-zO9RN19-L7#xb7 zdZY4$GopWu_*_oJ6Mgh^T~r7Mf(d2UU)XB&J|*2HyZq#og4YDF8DSj>Ifh>!h0ix$Wt;b2ZS=g$cRcosEuT`W~MP~8C{4I zSLmZM{yy{tTq3z!NqD~EmL_JUeZ^;mGr^}d}<3%L$sXN2! zC8#Vxdxp%__z5Yw|0I>M3bN|{XEd%E6z>BNM}`i;&k-Ryq!ffPJwrT`GT1$0q~fsj zT}D6zt2EpbwcE_Y#5RBjr4!jw#w73#t!0NlQp?gij04}_=M7CfB>Wo_L1z|CmU;BS z)06H%`~h9&DLrG7^Kz_{_dw89f~6K>8}_Kxb1ixR?m~s^-I64p z01c%rg!r!!;i(il{~Jc)6iZx!K285SmrAQ$plej5NSvZ7W8Qxl*q=#(U`?j1+(rv5LFnc0b5v3J$zOU`CNvt<3 zeH$;DWQ0f~!gbw=P&;HOEm1(gjIN>|;Zc{Vuow>fB2VR)$Qkjcs>pX226iTWsB_Cf zWXe{3!KDzVX}BRprK7<`>y)m|D)zR#x?vcs(=cr)t*KYGe%! zS<#!>W~O@`k@IjtrELq5NDd_Sp1-($`Q#*JkY05 zu@9UW?@o`we95(|nxzIHSMuc>@maO;I?ZdDYudRr(OGrOEKYA$>sscvf5GrpRs$aS zb|LH5LMGcR>!*K~`md~1JW}PurSf={W6`4RSpCBU;+ZiRV2lWxhQzYa7Z#vNM7WjX z$?ro6kz@_o5QEO6lsmGSvYR&Co+8&Ud^z*-&4tW|H003)f#_AL$^akr0E^}VVhe1f z0E=Frl=%ND4*P}rIaB;IMXZ4aHk(Gg!`iQqFRi!vT=x)b&X2ljD@3%Q8~DWw#F9|Q zl9P8z1k=S_zW5pz9XQSk4r67Mva)}P^Ej*pnpn9UD^;#^zPF@_TvBwWBt)llyQ(De zLvgOTq$dSap&6HJf+`IVpTr~crY%ZX;MQ@U5nkTR^r_YWu^v2&o`&FFPSVj>Qiwvvu&n)8tm4dd4rN)XUVU^S4tTi%RBOmh?ivp&> zOd_#x8Xif6N8+J&Y*$DTx|RdmPlSjp3Lp%cLS!{-anWv(<`QnR2 z-#dKqX)NXr4O2}6*N|(Ru0qRbsNGS*E1_H*8Am2S%-K-mrs_E=<`oA$4`8~fsG0nl zsp*m^5VF6a{^v6dF!0+2aq-rJ|bKkiDEn0UPFO0jVhipQkqJ z7c`FMBYSy*##D(WvIWGGip)dS82%O?qtuu+)kHT{PZH`!XlPxhnpd>uy?xcS!{||7 zP2g|TV1D%^7W0fCHpOq~p`wE2>n5FQu1qvP=|ex^i_iPky#g?UeDN7RYLbTem~a@F zh7?i~XKdj6u_sgTr$^(iAC}s^n2KOig(Fm$T|QgUE=ln_TQ*Upy$AZQ9coX#AlAVI z&Eqo|ZL%P=NmI)c0P|bOb;OH*oJJRuMPsS(2iW=%p_IJ<~O2?j}oR6^Ei#oyxJBH(ua?T<=_NV%sWoUjIg-Qze(7Ic}Em<3JB=E z*`0@v-G0B0d9RBZq;wjUH~3_CoLPSH=eM47Kxp&DX7`3PQ!^FBYDgdKIXPUr(n9T%(K_%H>T&$%^rnr z)5*S7JjPVv?z=X0YI*0LyXZ-vbNE946KdxqAhy2HdWN9?=c%$CM|mrTa0<%~<0!9J z@BT4xFN6nSW7V>${u^;B{A2C1UCe(~aHVLl^u7nKcd`~JJ)>0N_w(CTBaqMYG3_)Y z8IN??C$_@w2a?dq*)@jiU9;h+L2BJIc4?HTR23M?p6F#e;p+L~CFRi7HnhZcolmom zcC*+!pmnsZ&udrjS$VEr4%ZkpD4?Rd+t7=YQ`eA~UMeywqFO*5I(HWtz1|o#*=Oq4 zI*M)eiMaimcyEw`9^`SJ(ZrGoAbJ%nkI&7+j|c#0)jGGL7FEq3E_RCZ;dfW*4)|b0 zuN#3L@P#Xknh5U<_#r>-=;`X1~==P|Lc3;iRs4jxC)Ixle|CSNHuA0oJdSTBTy5fCo}VK#00 zpNHY6rV}boL0qO`Y&-%ts3Jb8f{e!h;-1_Q*9O&k@N)xt=RH^eQ2vUL^`#+i8Eu%~ z;>mUGyIaIR5yg}uIM1iib$m!f8*-kUR|{BthO~v6|5!l(we-P#b z$Pj6Si`TWr^i>b^#?dtE^95jY0`eKYp{1;)-1*)Q#n#QpyL0?U?)P@jw%A`;t-gEPo!b?EP{_>=R%7y&}pVfW}cV0hQxv6}O|E9{*Gw_Wg@lVR!bB zq0gw|Kc;2l*rL0+R|R~hC1OP~p>_dZGfzWhqg$iGTYpBq+W6E(MvWOd-<-}AC-%caOSaqO48{b6J(#^ulSReHJK0>OHZq382=V zE3i(X7)soR0AostUIda+-?69w6hUou?<`B24t@1iGMeBE1oYBk5+B-YKhAw9{L zp8XXJ2(aR-SllS>(ncH72e>*{c{?1%u~clWz0tm$c(dg~_tB(}JyaFS@7Hf8`kwF_ zv-O00z)!oBcID_@t8YX00GQXhua|RfzxREzw-0Uj8|B%C9-_Yd+OR&4#m&<$y*moM zX$JD7p@*=ki{wiJ3M$2*_noZx145R%P!#Alo{e4}II~iv*LoOr6WiLisyq1n@I6~U ze!|pTzXD%&iEr57HxJy@wHOVS4!X&dZl>RTG-;&MKfYnj4Ru7hflTJ=TYAZ|qG5pht_KxfIk2;gHXFOe3YUkrVUo zCn}WzZXvurbmWBa9v6=jCoZt4|`!lyMbU%J^oAdAEyTn&K-|bO;|EO~J^zZ)7 z{pgnP?vd9W?>@RxL>okm9%m zIeo_9F5{zoZ$#JOc8k~qnO&j1Yj3hpGL1ZLbjG{CTDi~lO?>a}0Y^+N+&q_S{4jOY zd3TZO9yT$me1c^Wzn=5F@Q2G4YJ88k^?1sPwDBD>RI0>6Dwa|+cunv~!^OKi?zCW{ z@xc7gyZ_a>)*Sv@pX>9x*Xb&fVR0h-*V&_je5xvv05F$xjA8z1%snTfMr7T$cwh;; zM{TK?lkycIm$ep1LHWrsytJ!fl2IgehMqe~Q$`|ylxIrn)4q|a=W8&mf$iH+Q42}Z zuFc5bD!^-mc(>!_-fm^6Ww)y4H6?dEx82E3C9CBm|LC>L_GCFumDgTNWt5J#7@U$j zJ)z@pAdFgd@Ty|;m>SB(yIo6W@lir8(nLA)98=MrJXjXouQPfe^zxl|DiIStb&BVZ z2g7j#k>BifLKOoUQ^7mZyE>0}aiLd_{4*aeJLfh2sfZlq6D%V*W_T|c7g5+O-E>GI zeWc>w^fp{4#NPV7cu!N?N{L0@FPOrO?rfF>F3qjZ zgqCnU%fca-Va}ssd%jN@%lrvONp>#`VgdS^`dd3DC9o{$a7k@RSX}~C!Z_UAywv&$ zA|c;8F+ZrxcZaIZaE4HL&o&L!>j=$VUmJVR*keJGk1m+1rcxTjh;GC$NY2Mj&;_| zdHzdyD`8@IY-Mj~nBz~&28JB^Y{-=V>Nn$^DvX&%vy6`=!4r!26wexp-#!+Jdx7qp z>NlO6JxBODSRu>Zx9$Po;wDYS2StEkOnl-@|ej1zn`JW6ts`v)Y-g_*g5jXYyo zb;v0*uu5G!B1=2hK}KS6-fQ-DHm({E*O{?@%d=rZc&Y?Jp?`q|2qFJZUG~`)?AL_B z*zbS9z>1~6J1ii}A z^KCE_;s)!dwD?-lv^ zt@L2O^Kx#yH;O^V840!iTBrTMw9@SCBg)?~epoG&2h&hxnV-xfT?`pWL5+Mgn_;pY znDBH0q!gBL@BLhR6!+7+vs66to|%)oeStl$%0Kt$#ls4zS&yxLkD>#Y9Fi|ciF>rn zJp9K0h|BPOtCFj!wI@@mU~#ED+&wcpwmVvPl4CCrM$>a+i3C`fFr2zZu{O0MNhU2o zrsA!$(k@{oyz*^`5<@W4O@9e5RDgYQiN@vdS-XQrB&~rIja0iTym1lOUM0Z2c$OPZ zs;Sbh3w!*{*jDUVzBRn|;EkQLszUxA>`Jw@HucdB%CGAB^Q@@LM@aQ1T}cq>&_>H$ zHmIx9Zi6OMZ?z5nLJMO=R|4%zTkZW1CpQ(m4#aBC+kbwiD5UtCxA~V&O}|mOX#qDp zQ_yw}*WngA@$w`u8r{eHtTMO-HS1{W9lorKiiq^{{JeH(-|x)!g}bkKil^pYFGUHL z$5C@wcVTqx(Y|9!?@Fh1%f>5>8h@F)y2J}i7Vi|zM~D2j4~VSpd1C)grCUZ=fYm`r zwgf8G0UXiV=?ps-H#KQZL}D|4fbIm6xJ>kyWfJM{>;te~B(TcDbQ(QA=AhSIJBPg% zlHbFNAUidgPCh{r&9@=^*L@Uk+dkEX3SnfK$8xlAh&fI~%Mk%#+_6 z>@e+N9@i~<5DYU7_>ii)Ju-MthpBX(S1-{5Qb@Nr!YW+c^)x|7cd~8R>c0ONTp%Gk zNpdQ?_U0O2!p`|UZ^Ybg82N1Zjr->T=ttH@u8n!P%VrSFeQkA)@K4QKlAoKAU_{5h zXg{sK1vhQ22o@Kp!~O2BOZ_uQ73ld5DtgTvI~8z4>0ECwB}CGD0AzlupLEz{8t>im zuj=wf(F(aLEBkLy#nj+8H|#*d(qw4XX1`>)L? z7VBDg$-aZF$exT+7^Ocs9RZbU8u1>Kzv?&_ybcZ2vkH!qA-u z&Wh@NRpEajoF(B?K%s(V=`I9J*HrA=>t5c9`WD{`No?}_1l9i@HRYzaqrG=+-+sT@ zM@dhfzPI^r{lK3Cxp5#PgD`B9`~8mc^O3EXy0`r&z1*I~UTSB&QI-YHH_9m8TUh(o%@Kya*)#{AD?iv|8!@m;oh36Cef@&cJV8{Q& z3IYXb+=A+g13#ukNX9jCb)k$s=&1t57Lc5i9HSsZ^+n8n%_pA=XAK`k!9{Z@kUjZa zxE59z7XlFS`2e6nhDHV*J|1JODSOqsIn>67{6j7W-;>39{PHse;wV#2I+(B8sdnT> zgjqBvO+VCPe}LdZrmJ!n55WeH3h zR0{=uNu~d8&ODu#U4w%^RjmzW?+i3=Deb+=^@hd!REIafK4MjtJMxwajGw9=co~&- z!Y!+hmi_K&-XA~%wr=6F59~r-F@sG6KRCZ(o-5a0bl%KW} zmvU13N{iI43!*pgA=J-J7d!q=r%Xe4kKGg90#rk-0RCX|G$@j4MDn*?Zc@qq)j67P znv|u94+O*wyh|jYwm#w;=sHWMF0dKh6Raj!L7D!6@iR{bdJ5BMmh0n^jcm* zfvrtW(P(J%1IayMMT5aD3V&4*B)5!ge~ok>oT9BXkY<;xiarQ|zcJkN)&lHKg`7md zjY&cvAf3eKCiBv+6hIwWToQAiV{d*CDHRz-w;|dbe{oB1yMY;>K735#4+w0GN2nzr zjx5|&cvB|hBYC`C#%~%<35`srwK$f4?RgY z1pq8xM2`lD@o4hXP)dGgX;+re2%e^JFPzVa!evzTWv2f+P@bRV~Ck;^Gq#6JsxP}yYGSsc%PE`}bNXI4Ak7524m0i_?+TB+k zI@23J6F(#N(AiLZkl`9#6FdlO8)9gv%aHv$O7Xh=-1epQtBuZXXSd)s8)dHXQ`hxU zu@_TBnP4|8G-xclNgE!7P2aZ#snSa|XiG`vi-_SwJVPNN)yVqVhZYL3WB40`G<(!d zBvRUCtMq#EB=XMqpI zrwdKH|kj@%&A(^PHfitHE*o_jKZ%LU+2!~!o_7cK? z3h~*>P}D&*Zxr|yt5!?UlY1G>e+ome>1(tSqYEI#1thg$JgR{aIZ*zaRco!m{Dvrx z?q#^LXrfF&d>EuB6v^X8=AY8fVsS_adS*%Cz;~y626pz2!|5s4&nRhzXjevHy&a^A zC)%(7R9CLZl(V* zfZ6E4Df|Ud?-aEyvWfsm!3m4V`+Z_L42vChMYK4>7vKv7-F zHn82ss50G=b;dJmW=6&~$$q|K(cLbqW1wOSfAnIMSXM{qisrtxLNR|=|AUZnOuu9lPkwuH#og3f_* zn7=Y8EN2fK)Pu9+Mut)dnu*!0@-gY3wDttY*=Qc@3;?5S(H*fc85{tj(!hAyq7q=W zO?L$tvl!i%PFJQx#t$Hymz=MPf*;8Z8vKycoOIj$Fh*(c&aPB-8MO=7M#dEFWsZk6 zbk+mDG{HT_ER+#Wd3l0GUpOwZc=Naje^8!9cU?<^J{L2N8te|!RzY-ShPD{h0(p)a22Q@%tYvm5G(~?QBlT0~xv$Q*vFn2sO*^X|^1|xjrYjg&_ zS;$v?c>HbFbJsT9AEOp9tgozECLQKlV8g85y6LWmIE`c2noIkdG5iQp_e3!L#3%Ri zRjN7-C~N7vdQ;uC8GA3m4)H{LrWD780GuZ_2MlNQ@ej+Eo$ZO(FLMc zYG}lvh4v}A-cgc4Vz}l?Gs^GzjOT{RD8i+I4Z8=R=csSVKCo}cMGjF{j$8}WWd#af zWDgg4v{qyffLy~!of7H1xRJovbB)5+y*+uELHph zvS16-CtwGH+zBGYh@ED~n!~@6XHos+wvNe^zENBDWb)^dnXZ}fk5j!te+K3R6%wqm z28XTmlx9>aBIE&qMQ~q)ACf+J-#PNK*2D+2Tj)!KcM4fM{pzI;$pRWUm6lfaFT+_o z-IDf!%t-}tOcT?to*gNw$j-hs$7yrS`522%EeL_cA=Qn{NJvfM-J)NJ951yi6}yOy z9#^~E+vhdGpfT`O#s_y+Sn0J7?qiUOM`_90>0}|r)mtkF`}(Wr%Q=khD9YV&r4ml( z%o*<&dOYn6hVGfS)DqoQ)N`6_i)M_>QrALGdE|V&h&DGWDd$JjUW*(ce&|EEMB?{c zN@Xh(Av;RwLPP2SLYfw>^vXuMi&@&|#a6Ag(V$Q{RCVd*tcey{NBvV-3E7cmYMGfs zqH8Z@kd|`up@cU58|K}<`$JO!#vrIG_j1Nxx&5EkcxMDThG(arZxP^4#VRI0Qbjlb zlt=?_Wq`?N>7ieLXdxh58H?#OVSVQuiP%h*P8^U83fcXmoxDRPur<~|)L;^zk0*|YjbXQqiW{j=5WqXGeDe3+YI@t<_LgjG|_zEu?r`d$T&9!4I43^;h7%{ zdA?-^2d}S()Mk$2nNj47S!PuKhw%9_*?QKvrqfh3M`5N^`gOQlJ@McjjVsS=nj5gM z1!Kkl{&Z#Lz5`g0+5*-NQKfk1wkZih#;2$H%AH{DGg?bg-U7)lzsQM3?2i0i?Xz~_ zA3W0@VQaR;!c|`V)a~QQt4I{^>X0dF!FN2eq!i+^{f1Kt#F$ zfO*r94Zx-s0NsKkd7IF!49roQbG`8I@DXM{M|6u4%o%nT52q0d%T3eMi_&p6yl5JK zx*s=gkmr=rX3(f{R!Mh`5+jofi$D}>P9CAKAYv2|@dg@nEM~LhYbp_NeI1j^k3mvt z9`9+vZx|2VesF0j`el@I?~u>a?H7)Bz>OGot{Og#(&p(JKN5bP&5zZ2QG`3#elHV6 z$~*sgO*|sLZz3jUAT`Ekbf?Zq_zuek>wG%=gNVhL!^bxc9og86(j+@tz8x#x2oJLL z9{7>Etl8=V$g_T#!VAIp}#rG@xT!fJz6_ZczwrC2uX z(bl%xYSjmz2LwO0iOd8Obp+QIaYZe2J5v8Q9r69Kc5PHup`es+jJWLmi;ji(9=_7Y zLftYD2OeEDKc;4Eu0f-8PnC4}4_>~w>y(&Wn-@eno?V~{!N@D?5{1w9DXGbVcs(+4 z<+>eOT3VZ$&*oH~oH~QK;&n#LC{#ZqtlaVYeETtoV0cz1_xWV7`RM0<=tD2(I`c`N zKckT>x5{@Vaz!IW&mT0cwu(sAy`g37FxKZOT{qftAyw`K-x?6YwMJn;jCgYYyx zYjC0I^GUA%s|nS)?wp-QsrscpMn@07AcPWX9y<54w0Xw_Ee~hCq*kq(vqZ$z%|4Y( zl|Dhd5Hyv=|3{v)KAtz?BUXWz{C}R5LdPiBohsDumlE~RFcQH2bBtjyH5>~_?dF5_ zg&WE)ziCgt-^d;Pw)(in_3Wj*1kCy*SQoN-^2W~}k6-r+^rsV)R{vhm7)Y}3Kbql? zxNWP9UoAL)BJFEtbgoJ9vg8$q5z_av;9ef+x!ElKMt-nCuy?hozl?u<>0cxtzr_ZpjUBlDrjzX-aB(yTZzblsJ|6N zV>0FToYM$e)bm*^$k_2~k)SC5pTCKZ?>SWQ6UFbf4%5`j3DemzK91K=Wj znIMd(+z-eC2dWT>X}FducjcyioW(irb%S$3nJ`R^?oqM0o6?$|Q-I+6_#n0H z_D+mU4+l7=81Z+|N>-m|J#0ytR(FzC#Bw2i#^187yQ32(cN8Y*tQ1k`(`ZlsqMCN z8bTonZ8IvjzqWw+DGXtqpW62E|{{9`2IIvU90xq$_cjmH>6NWsaC zr$ImhJS}M34Rttzqi&a?DkKQbB}O04k|2--ZC&$tzb)`p!j zXdJKckh!xEYO92AVNV{2tqpDnklby?5$FLKDxXBfey)gsz1s$nK^%3z6%j!{g|k-& z&paSc#Dt1mX<>!o-ffK-mbg`4+g{PHZTEaXbt*TQ5E$x{Q*PiKDpyBg7~-e$ts^Bn ztE1X?+Pk5DhpWl-4?jHnWIDjJRl*{=&2~qfdWrtlH1xB#s;C{1rvWoia^!!JIUWjX z4|hX_f8b)iJLUiP$S7@djHA9&J8#n>Y$9HDP33j9@&>T6+iiQm%R#rs!8@gABTC}X zyM@x-+AP&O%Wq@{n1et(K^8VmL!J^sI+Ex#=(cT&n705xDe?-C9^X~qRE~%oxm#&> zK8i=NH;(ZdHjrVE6#DRcYOJMq=``YThN>KDinX5@^jgN`M8p8D$&a267TZdJ1{rg( z+hBG0LI~9In^vS6PbERL)U+pob}9f+7f^{14In4N+wI)c7EGyBO_MdAyUSBL>~MV8 zuqP(nc6tFX3w`ngZE!uF9j9d!)aVtlQ@YTO&=U;Bl(nE~K<| zq1w|?!*&OgT_V>)q-(XQ$^}%yjGw!|0nS~)^!ORLW(}#_vU?@V~8TDErgE z9^^E8)=Kxx*2qr=2W=mPa6P{q}?zlnMg^6yiwfA2N# zKWn->FEL120m4Q~bbNExJMGarMt93K?P8 zLb$mx-Y>4RN<$}4ai1||dstrBFC^hWfF0sQOr5V@yJUp?Q>uYN_;PlTv${n4xp^xl zCs4&oyR~Y2^msweTUS8|oTr??v4ZRY_pU08FKFXJP1g#1+P?0%+?gJvX!NKKpp?O30BeEDN_EbNv80RZ6}MR2Qpc2KY0L3fk+2HCeC%$aI(7Q*1_ zRb7d|%Mi@D1vNv{qyAxx>MSoZPqjiz&IyMNS2-^IZngbfVq8qk-kK%2l9I@7$f@kJ ztQz^rHfQ50f9Z3fVuX@A=_Zf-vm;21G)EP9$(cVa*1^>;3AbDh=ZF+zb_JXCn2lPU zar?eVv%ebY;WRZ>g&BPcQHaG`n|4T`0E9obU~MqxDFr&KS#wOlAGQiwMmUVUQF)59 zlP4~>9B8W&ppsZ4YU|SsPYd(bFTXPK|DI0zZvoXhf8?K)y?^f6>HUY+I0u&m-waEW z3Ooe83~jnK17U0wxFakSRg@rsI^cCvvAtKUjn!|zPGof)oK-z$aS@be@ zV;u53UVLeoULSMWWOJyhBJXvQtGV8befNf1DjZvPgL&I&=G(TmR1UHz2g({25NN}6 znxu>L_Pb##7TvD>q{H^$b|oIxEBf!A90Z-EO-a+nLOZ#Y*N^i`=`)?VB-{r3D0zhZ z_KG{CD!^E=G3oKUOpo_dMO$0Xm;JJYT2={PmFf!Hv)c?ENVc?{jYg1zJU>OILPVuP zM4;9`V4QCg+s18=FP0WkNym=Kw>**^OHtOS(E0CJBAdG*Qr$;5+1F1@umtU<AdPP#XxTBA(ErIkN4H{a-fRqiI8IGsw`3 zjS~ijBl0dxt5_#%jgsr7wr&ksKhkHcEghZnJ&gUFh~MZ<94~9>!^I7mg8ki<9)LYA z-9seK3AdcO`pb!mwT|0Nk=eG5@s{}_;u?z^uwtnyvHXwTzAQa0qPA%*&dJbysgbCM z7xzVYA#7r)~%B%Y3nhwLW4fj;y& zs>s+|>*x~s*2*m1nBc5v>5SsjpdPdZ@1aUciJi0avGAdT9z@?D0P9J2@aBl~Y4C;> zP(z?imC9Zv05VHFW@0}(W-n=C^3fr;)6EheUh^QLwlu^2>6JHY1a?tJAXMUxrGWI!C&7CL zAH7Vy{@EQWb9De`8~E9|*n9Q*@fmxyTp`2dOx29PGxpq$tGkKsDGOJ&6k#<%V-Gz< zdwylf_N8dhie)(U(%vE}G>|qPq?SLhYYe1ALg~;3tnjJQQ>>(c_prA#=!-D2Nl^FI+omvQ^g6|Tt@Y%tYv85rc5gN#(%v-%CQsaf71*az_bFS z6J}6W1Zrd_i_)OMorXX`9ANI`^&ASu^I4eMEQ$R*(vaqx$eB>$9IM5b>2O4Z(|BXD zb)7ga*WPohWR-l_W6kYVq_^jGPR+QpOe50J*+!skfQwuUSMQU~_yqXhYgY_xP?8 zbJlK7&tK8A9Nwl*KZMB0FwBRZ8RF9jR6xY?h+Pl>!eDc9D(uE|K=(*FltAlPyUVQy zQ5rfT z9=7_}r{#F5oJjO29Sw?oGh}yVZ}^mX$#A7#iP`U6CVe&In$jm`PdX5ZB0(a1N%s5Z zU_rHRHE7w@&xK9KpCkMn`=Se0ly>j`kM2^$uwlUb0sB{up8_ExPZ{>shH2*fkwg$j zuB%Glc~C?3PzToGYwv=b21v)wCKj9R?K7vy8c0bT(lz)WMfd*5)c?l;{Omq6Y%|OZ z+syqo*O1tlTOqfE`qbPqw{ojg$~MehE|qJUOC^*`D(N~S+Me%^QMl1=C?Q_pN+pg0}MB*FW3$))gM z4*33ZGw$6U#;xIdo~8Ac(Od+VB`*Szk{+yAJ&ncr6|TAJiInOjZmgUpX)L9^Hc141 z-fw@x)ds3|p=$GaxLQPeK|9yaW(~6Z8Fx?7_bl1nhW4bj9TkGfLJ3*JRod>*N%w4W zNs#C+o$+CS$^1L082;qFjRDM&KuvopQ= zXh!_?7LTl%F+Hr(trm|T%~L_|N3QKUp1q!BR)^SNXP%RMSL&PxzDx-_n^GjSRI1O-_%wiOuF8h-(ldlE4>12F{v38vE|BX zdm35Uy{36?XY;3y3+)1xTPO*=!zFm0R@#rs2pi6>GujntJBumFi*(0!7YB*fWsjNZ z9Twpt@Df)oWACnvhrjIuS+Ka-M~rOr_`}1ljB{{(Wp7{ncx#An_v>t$$4ndk@=5=c zSZ=g+ZN9&WRX~u~Qs1lQME-O7GfQnjP3h*qe_Tw`8?fU{>P_&)Q;*-HU6M!X2bcOk z{2jbrM=@L*)Fbm%?3mY%6{;S|{-UzXbk4(9j__waq`M7299e7jAPii`d}eBo^4%}p z>S3x{En+tGkX4m1P_w{2i$C1LT%77S&zqu>a=w9G%~wI7=1bF~mOEAr_JsRb>jE1L zML>4&=8tZiLqjc^qP6Rxaz_|*vk=>6`|7RkTiT@6KU-9aF8k77Gc(nUz&#U5~7k>^7 z?Rq5g_#4{j+d9dD!-Gwl9ubkBwrpma&RYDKn%)Wd_jz>Cq-7B4s^M_tozu@t-wo8+WwrWE&(5{uT!~ac2drJiqj`HMLA#93mhQ}_`pR|l>XwsLq$)H>2vQv_qfCMc+^Rp+qqEd0UNtF z?4m~-hFEcaaQn*PDDvjZzv?2quk5{7T%Qb4Cox7J#~Z0#xGRaBC|8&^#b?%!9IG60 zQMlUQ`ieT%@zg+sY7w1*MSi`6eSS+|nj{$a9R4LfQG*#)bcd9B_{T#}0+#nJS;Gt1 zyTOik<7q~B7=mXPQHRe5`8FrwKlaPU9i_xknU2ZV!625z{qJwphLjDci)#DIz=nAz z3(tZyfvuD@W95n#TzqoxF{V&?s|J36@4f7dbZJc8a5!OWQxn1~o@w09l=#L|Py^a) z{m$&ehZ2q(PZoCfm1`L|95g>n9@v8C@Z`OJQ@&!m{>lf_eZ=X0A#4!1*UW?L#~S^4 z%RLYt<+Jm{wZfkpIQEZf?>;TzC|5M@HhKTk%9N|%&3Go7Tz|8Zb)eu5OE89>iPoyT z81gRXkl2RnYLi2<{^!(A0r|avb%0q>5dTkRTg~*z+4Spje}9yIzCT|Q#NZe52WAQ) z=sWl8DNc<;&C*~9=AkAP_mkrRQj6VHDn~=B-c;~-S6mjr!8bXXa=tKZadnFqvg5Lv z8OYE(%Um{UIaG2plv&)bVHg5B^RQpzYnZw@RmuDa`E0RmmjYZ+q)y z&}gALfhQltH>`3|T5`$l>7| z5&fVLZ%?vc#%`UX9)Z%(g}WuJ6URpCZEvmKsGPm94ga}Ya@zjH=UD*y9Q3TZwB2#q zJai%Y#NcGJ(&c-bLmIcvAM&$7LJVtn|Gav|Hy%2{&;G2lv1rSQFF&1@D#F}u-E)|& z?vJZjy9lhm8R+?UdnEQQEIM)A6T?`$@qKGp4`=E&_Qchs8B@-P;O~xe7oR&9!W2$D zbT556utNsnkoH`hzZ0%msqjbj>$K@kv6G9k!LqD0`E>LySUfn{6P7pA+3;{=b4A#d za@{svLj^2_mFFpUVnxNT;b`7s^_%$Fp6xL;cCp<{MRST{09fN4IqCMD9V-qwXy>qDptYTzpX%NEZ2@Y$?W5_LB9te(B z!TYf{p}}i0o7M=c`Vh1tS;Pe6M)&bxB+e37PHucF2uei?%XU}g3mQ`zEk=ktZ&&P5 zk9CN6Q_ndS>(v-{e{xYfwd(raQ_;au*x|Utu}lUrjLqh$N?MMCU<4!&E*~ZV@qkS& zBEA$n#O{}7Vm#?tsCDd;HrgOv+z(Z>Bj3qH638y71V3dSgj&itk#lPKoI8KQ{@mH< zogeeu3L|z73zOqcyr~oH&3E@(W*7O3iDRL|#MCgNz-^Di`z_=>!mc-UL9Jq%icjn6 zd2IZ#u3;j_7WPI7Hyt{1;`HHGU7X+QA`@vi!(g3?t)sZ%&f!2gc-z&*_a{AR_Du+C z`{E$>Qbt*n@}^Y)hTn5zUKbb8tO7391@g{LgFmw;35l4C0(H_s8T?;ZWe>01$-mcF zHvIW|j7GXi_v=S-lCHN}M>;RemzlJ7>ZrsQ#b&G6c&GB9r1eAd^gSk$_q4p_iR#p2vdC=xzdU&53-FF;mBfj6@dTgm z8P$}i!`0bdN|v6OlAi-nU$v=fNX%_?7^gogQ`PR-M-*=D?MK*e>casjQew$~t}~Sr z!KSmNT;Q{;%AnFD&>M+#-|0@tx>@F_gMIvKcuJsW^j70^CFmenS=e+i79I9a zKM$il6a|VNT5CEzo7laSw~YhV+O~GrNN5K&Sevt^Rmn#?xKKxLB^;`mJ>xZ$Rr+0> zrSYDzYfDXxj;7+PBeVWQvx(%!$s#?vlsjzi{irgM-0Ut+uVI!_&~4FN`0fai()uKy zZow$uQ(F!@#s;}hk)cxI!V^n2?|a6l{i?B1pD=!uzWv4Ec&W=)<3EjDD3YPfe|5rk z*8z0J8pPk&KA*|4F8Oi=eMH{E>$NqwTpgUHAxmuO%)Pp*ZSbzzKMr&ZFXrn{a%*=F zMCqtRm0?22n|3#8!X7PfEmr43M-J!Eb}|dLuTm5YkhPy^Le%Hv)+#e1+_K@kcOvch z5r@n0!o49)AH!K&XOm8j+2L>>PeP7Lqng}%y3jrxK5+?2aJ&stFxv}O;fG}5FM<>q z;yBF?K%|Zd&tWg~6ns5Z4RFj{>t-e@xO1S3I+|{3Ned@ehqgK z)mj+rKc#%y?WqB^m;EGT5Z){he5NL6q5iSwOR0Hhmq2^73GqEQ*S;vcFtW~7xp);} zcPhC+zqJ8-fj;cvGo)_Q&MPEVh=?>RzxX92MZT=%Ot;7QLe4%yR?(uDdvo#moILj@ zN%ypBe<%glMOdHrn|*L;t}!zYOq^(YX(0?R%-flz5n?Br?$#sgmnnNWi$o`kBs_PA z{E7v~9Xj`7H?LHsF!3|uI#L>dT8-JP9Kfvs2Z2->YzqtisOheAhN+M80>@`$gW3zl z1l|U>D$RWgQZMY@b_PgT_;1Gh%UVB?v76hT?b)EPVpCYuUGchoE6k`=8zJJVeZ%D1 z&CIb6k4I{)q~|Er6@oOpg(^=HCTbpragf?rfhA0x+8l? z)fW0?!|;vEn#H4}3n6gx@wv$(&5;_qE;(8Q7D@*IO2k_r*C+0EfF=}%jUn@ur+|JL zPpX(tV9DG%D94MBPqTvnZAMUIF%xHJGf0+`_5y&7 zdd9ju1ov#@1|cv|5L6eyI1|C+^o;JPx{NLqfj8#p2NZ8Mv zdY^(Timl6&Oz8~=YHLBS_b`qHsAolWzJfX=9a2gYXUWlYNLUvD9!%$Z?R4kpPoA(C zu|mgHK&$nBkN*3`Cb1NAdSpzaCbBpdi&yxh@lq_XpI{a`=QW}(AVVB52a0{Ovk-le z9`w(CIqdeH;96N)SxlB|mZ`dl@ElrRso=_5mf{M;)e|Bl79(o#fAF~B;6tDvQm0K^c z-Q+(9zWO8-#&+-t3(j~&8tW~ZZ~ykMiUlg}$s$Y@gE_0K`7T~{iE+~C5-{gv2z3^M z-z|RGn&*mM?$DgE%U# zDw!kT^(*&$)F$002G1!%nQCE7!lgN_)4BoXue}G*c^2A&>i@(e0~egX%eo`V?0Y&O6u6KpI%!W*CS!>@3-3tl?r$Q`BeJ zih6lUMF7yv)Vlhfl=fgNaH)HE(9J1gW3QOlNs&*HfnN-3?icOyWo;P?_j}%o6|YkA zKrx}8P{jPHHJ?AtM&3+D_Av05D2mw6x=}8bc#rA5;Z*qj_MN&O$E0SvX)d#)euRIb zRoEYX?A=Fq|A5b1{&rQLvL3D?(s7hv9mo3}#gKShHtPLxgd=-1fgHc~#VbsRmxz=u z-J{Hj1dL)Ums3Et*}gQ1@?rl#Eouyk@0K>?cP2(1{*LTDkd)$1xgRrQx!Fx| zKGwu#w>Q}RV~YO8a6A`4rjtnnJhk<+c^{c-zZsV2r45+RRC&LC%srlF1`~@ot~5b5 zXa|gbOFnyB$t_$8=@ZIP8&oqIRK?s2Q$jf*82edKA&+evepwFwukEBr;kgL)+(mVP zg8d>%QB(-pLv;jOZM_Ym5qt{WK`6Tik9s@{H)pA9?y+XP!V)R+CJ`!OZhF2A8a|QV z`TeAw0&~rIN*eSXbiO{#T$k`6R+VbdH1{@afUtLATfu{*fX!EY=kV*J4!v80OkD6g zhsbOewGQFgZJOA94mke~u>=8y<<=RcY%(JIC^A3;3)+ez5S|MoiKsnoZh<{6c(!wZ zp);wIr6zRtw)VzI_I(y5p>=OM@nu32-tSZc>Cu=Vt|*3}>!R@WmtTh(tpt>peXV=} z5k_{t*}UN1T>&f@ho5H|a$!s7SjJqiiA$fNM4QBTy$Av%cwdVz+PfOw_?4%BgsRgU z>2rCWnO!N05#n9hI$5sy(28R2TO2)HLtv-kg! zsMZuuW15NSk-)NCDkd2a0HRKSJ<@4nYM(Y#kaf#s!*|0pEn4x?QH>Z7A zM3ogRT0f%48K?*q!`^`nmlH7KBC2h_`mP2!KnU8YA~-hpR&ikKo_6xFiR9K1K@x?K z1R#7B9{Uc$WKy3%Dv?WJBkg<~w?sbl4aa{LsXOb)dly5`NaPB>U=<6Tl^S&jcd6(U zw;@kr5i=L>vdA9Ws*^)qLlT4gIhW>0dG5zN$Nm&3I7pdS;rBEY!CqG=#QRxjJiDfq zmblJC^g{P4eykpsb5kaR#R~vVqD>W1!>sptTJMvkJD#L@`JDi!)4(}LM4{On+;}9k`!!SAI1#4UwTb*iAn-= zch5*Mn=9uuvSS^|jnVig`bf4(MlQkcpsoSH2#;g9*%U#XKm^Qu z6wh)ub$*4^O6~i;!*HO;;-Ksp(r!EC_@am&ZrxRE6W$g_xSsux(8IEHW*6 zLwFttPnO*U7>^f#gCLo?EIEQ;qNaql6$4niGT%*kwnz43^pd~i2@e|{=br1Q&T!Sh z2Z@-5>OXAEnd*!|3I-sfy&G`sMPef;=hu|{JI~yBX){rgO2`C}SRmW^D~raY8ta3l#t|QDQ@lI!Z;etYfpyn*0|<5 ziZ8f{^Pnr3Ks-@wt_2cYNjgSqWG{YG^&V1CNY<&S2oRx_W^3>j(gQe^p1;9>Zc!UJ{W0vY9(RN}3k6444Yb+!E zIL(0_=66+-&_`7VRP!cM#9|6jILjM>I!}4hC8UpvodWPz z4`F85EqxJ&8FPJ=e^k~fq;B;-*W|vZBK3iO%v263jrY%)e@|1MY$bkH{XMjn0M{Gu zAaX$@F-87ICnE49`3x z+5Nc{+&pYVtw=07q5F(TJ92a2u=>Y-B8wRt(fhE#CrC(%l!7!EVO-Udi(A%?69Dy;Zr)-*7jC@B)S93myVN$w}iV59_mm zW;ZCnLy{#*QQAOC6VyY&SHmKN6Jb)39#XdIreWw6K_YGRay_@j6@&J{a>1B!mJ0XY z+w62-ar#Zt^Yn2dj0u7^ZrBd#;e?*xtCs1V0`6)*0givV( z!0rks7DX#_3KW{jMp{S%L4gw2trxLR);v*KG_yG?;ni)Nd?!MwZu&M&(YPO)Y$$y{ zj(xA{WbUR4KB_lQTo0e*KvdiTUwa8G0)X2|wC#W>6dBNCgJpd}DB!F7{LT}uEsLTS zyg)YD9&h?~$Jmz2Q~GYK<^Uu8T%S(2l!d8h^o%!d8kVY@Q$A;7Ln5pDi4i*)$@wYO zxe6+=lucZiAA9p!q)UnHjvcTGplu=qcykbmEW(rO*J<3>s~S$um(9j zIsHe`g(VyDwZ9u+_S@5#|0j*}NFnud6{W1`>-uN&1k6XEqN>hBls95{%~G=N7`q^9 zPW1Ee_T#c(66kHN(sQBQI`4BIAeSbA!bR?KrgY--5Dd-C>wXRDl=BeCYNz=3UU_D zeJS~;idh!62a7F&VZl6})8cqL`FwWh;YdKC_p}m;hbK{fot2K4ZaZ9GuNc8r6ubSi zYY}S%`+71qBd1Na zwLb6LqwwTn_>{oy&$&;#ds5yIwF*^zYHSn7sw_6z7KM)Pduey-Pt2!ji`XfLFyng( zGo6{(v!NBkOV8~SdVEhu>_@5f?6@}mcQEIJc3zG?3PlIi?rx@7E7jLL>3% zt0O{}?L>;nS`#y8*jZkSkS=5ny29Y5(NQiu;{cKQRiDzx{!h;Q6IY0ijxFdAo%bPLE zax~kX&yATG2pRVs{brUuRYKPwFuZGT=Y&HCAmzfTE+I^)M%GdpRHNDR>%Z!iNNNqtmcX=%no0I~<+f86qZQ>s5W~bA%nprdwZ{kA&&sqf zuWR&g4>q*KT1}buE`ZT?i?W(GG-S1tkFuQ+f|2wjItB=XzA~_rtaYP<#u>_GEPTVe zQr4LGZM`*aHal$d_qzzmhVQq2{p+k`vG~xYeaI-tUo1%(Ki$?I=WYMG8R}otOMZw_ zM}<^Yfs^F)x9`vjN!o$jA1&FDwAcSyYm#cq_qs4=S$`#5jw}*^Rs1@QASlw(3`oir zfuY4a2eCfaprdWJwqB{|02o-h_@Alx46+|*LzE}m80y+8Dik`jupCqg(pr)MGIP$5%Jmy^^F$dR}_1)U6BAPe{~ zV!X}o;+}F-(*8%Ste5EGPHT6iENhRc-ZVVx)k;B9QOUVaoqqDmx^o{0A#uc=v$?ai}?QmLJk?S?0=XXxS<0C%y z&yj;}02$A_i*lQh0(_J-i3|WOYt;Mn=_sEE5C7O+8Gm$DJ2mK2==n#J^fk+-KdZpo zXDfCU0_!5zD`s~K{I|==V%u$!0EzvZj2~OgZvD>N(9_Uy6y!<>kxe~>byhta*M;D- zAZg+&fIMpqtdgx7YPqP|orktFT~dwcOa%tnLU0>#E|UBTK(M&z&-PV5C6gEaa$YgJ zu`|A5IvS7j7PMPhhk;Ml#63G*3APNb+D#kvsK;l)D51*^a=J!e2-h5q^xf6Hdb}rn z$zEjzxQ~|rU={$z81&0oC-F6gB-%ub2tbx{RZ}F&ql+&s_Nu59Jn!6puv=g=o7P!c z3N@Dg?4y9b4B=d~5@<)F+=B#*3ROt7hAN7W8vtN7Yamp(C`)IFEXYJRB*w``iyxIj z`feGx$B<##yO;%fRV7NoKP2k8GW70J7gR<_9gVtteEZD^Wfo^Z9gdar<2EWaR|(8_ zh37b#DB??y*(RLOKC>krJ_g_#1|KY*eM~E7tc@z967*9=v{>q7z1Oj8=k1UT*zlM> zk|A_-o0DKa$A;OgkNR>x(qiSF>3EryQ(8BTkI)csBSSgxx6^Gr=~oQGf0vw@xXz> zRjBD45OTF&iNggAg>WO2n3b>>E?u`vbId8+MpziPJG0aR1euwTi|EYOGns=EJrjbI z#a8QS&2i3a@XSYDxZ{t8NN-xUdOK|MAMeTE9(uCaJ@=ILyMK14xMs!lWeKH))^4`mG`ayYTWizZvwr( z>NgYkDvRX&yKeJnY0|JUxJ2;UEP>4y~~|?ON)K!J$`* z#5kOhRJdq)X|ix@4^>gFlj+n|dJ`!U`AGqW3b!Af*m7cf*X!2Uh-b4kt1;@3n|YkG z;e}Woyq<2ELTympwv7s}i0b!tuX8{F!D~91;*cEMiT+~6`p9jKrJ6CHPL@RnWoc9( zpA3Bl=e}l?MsOM?l+F<};cGg|)j}6}RdT=g8UV?VyWF$hfOO723uafNBi73_i^IvA z-piV(y_m4$RS*|j|K(UCzH^mEN(DRt#Pwd-(V9;Rad*y9ZR(I5bKOsk9nE5uuF4*(fUoC1op%;r9k#DZQE~dq zS7{U8wHJjeWbq?a+B%0@1NyNbsjT7j*e-(9tyB3QUf(>bOQ@E~eb=WdfSHE$w;GAT zs>od+69cfUnsQQgRcLXIGM?z(OX$Y9Ta;iKAnW9k@ZC*J5b^L)@QH0PBes(@ygZMd zvMaW+S^X960Njxaf-eCNBSV3`*$-9Z3QCRL*i4kXRB0HpYYE@N$V(^6gHMpu=~U<|B>An0dPyHF9cc$F46u z4xq<}6xezEYaie+dj=R<1u-s%*wIlJ$fze6^nM0-GZ_()qVw}EqC|$03B5B!h+49| z3>ICA_U`bLmu9fxKVR#Vi(#9{FpdZzp!2(zl=8^@+Zbew1kV4aWVpKFB?w@W5nKQ` z&Q=WFmRU0yt__MvbfG_9Qo8uWP`%&$&XODq18f`tVM_rw84Lu-US2>X5eVi7YXsO{ zA&MB6!%!>h{Hx}kItpNc;2S7Yaogb-8)9?U;n0Vn4*myv>G<9y`RI{I=Vhg?2)xr( zqxLD{X-m&>5f%*(&sI}IFInt5WfB`6JH{j|CWqL+0@4l~U0e>b56t)wK~TZS3?4#w z_#wl{5HlL6QL=5SRQ=N+b_`%;r75o@`x_>6zGL;vvsKiXoRvxW@$I1LWVOjTRVjIe zgeGf7s;Zkdn|&-dE8r9~c*dmRRm&?aOF$5(&Ybr+)puABPKbI#c3QD;z1WYdURL){ z<|sba%e7T5hbo`O9ao(+?yfNWZv#35uRKWCAFjgL9Z;BALdKQCWZY_W6I=>x2$dnD zNeZZ62sIpR2LNorAcceQQXNsL2K^joV=Onyv`R!KLM^=*~Ha zLK41(7}CEOh0n&`G& zSr=Q^flxG&0NbX)6K{i6b==fbHB80e@yeX@zm(3$x<4hH*?Kakc#qOCopkPS#>oZhj5BKI3pUJo7hB|EIneBo0@f ztT??S&$*j;1=k=ZqsF-CCxGIYtFR+%WO`P)^fp;8LA-1C06aI)?jhjon4jE?@p-t! zi(w#+mLg+2x7_M!43@~hyV6KEk}qfT^GkKy0bp|{;-nvNP+S|cpAH6F`(^2C3b3n| zhAWe&)F~Qb4El)>)xRWXnG13DI3N-!h{y_~T=GsEwCGU6zRJuy=_kAWap`lz9(zT^?78*ISo~v z&+sHC^qI>KD;OtLzxZmZ`p86zCcBwROi)XZ3oT}6!)mskEN+o&oju>0maWyJeyAcm z~OE68e`|x}^&4-(u+th?QpTtbDGqP{W;v#)TR3_$M$7|bA zen;Ra6x;?L8rcj;vtLIa_^^G~xeEj?$jZ%QEyy6}tCAD@sIdfM!agb`r#k`Q^G3i6 zqPk%DnxS=Ic^g2dgNhmQE*t%{yOfVKA1{wmw(H`AP+0Gw+P^Guzo|W=VtErGkTz$! z(;{f`x@z>~wWlEUwH~mov7md<0 zv&3CsC|XQGZUo7fl_Jw5Nx@>6PP(1;D8iQwi=`*$mzI}_5K0;Fhr05D3Uqf+c_Ki| zAool2O5uCRNgIR?4@A4Mb5ZYUw{lbg3} zk~0|_I?B#1*xO2;~lj`@wWmBU?@Kq=N9 z`X`QV|Ku%p*`MdUE&3 zqJJMjGF=f?s}lyCE{!LMnUiQEIp41taMcj`HPUWXc~pn+U#IK)SOK&xbiI#2${oq! z9kBa@>7Codv6Yr5f4U^5b2{ImtDIBKVbhb6y5g^K`*rkfS~nE6fg{VI9b01_c!qCV zcQxDqDms1TnAIlo>>6f-t?>RJKEdl+MG`@at)?PrUz`ebPSPx40(1bJDNB;p0pO(@ z#+_TGeg?)8M8E@3tE@K)T%WUa>G`Em`DCYLAQ*^+_CzC)_r)O zy*g;7mvB9vfZ~Qce;e;yk+KbfT^J!YowR8IUEO{NPbstcFmlRkgT7p9?kSx9WM|q{ zF>y!RvH7>YXeyRarrg_mhqkmCNZPH}yDtL}Nkw)rlTp?^yE3u&TbTII4<#1en;+O{ zxaFVc3Mg5*Lg}YcGw`xX**6NDaygZL0i@uvMO*0I`QY3+*wsX(xhq254kKn_cD7(l zY~v0Mld}!mZbbh6vtEgr_?nG=M^y16XnYT~v3@k$yXm=`v-~vm$oqt*BLY0@(R$3U=Fd>j*YsMFIs~eEc%ss>?(s@F+nm2^fd4t= zuxy(B7QkJ4sCx2t%2VUY0oUe@bwA?GcideJ3Rl+JQ^@3sPrQ06JG3vbm)4_#pI8a4g)yZ;LT zFaQMHX++1MK8uvr$cj=4bV3;bgkM1nfV1K#STk)l9YHY63;@stk;32n`l+Ozok_@B zLiGJ5Mb;goTVmu+4ElPfVdeLpHA_Xg`8t$ebT(G?@cC$Tc6@4-d*7R!dm7W17)rEy zbXh4p^1@eRC7}6tuc@{fp8V~sPpx#L75L&(Ol|pb@tRXF9j!27ylkuu0naCFJey3o zbL2nQU%f_(4bI1gjQx9mzNuYJXmj?tj3%Kze9Qpeh_zIiq|P=yc1=*GR*AxBIkFi^WM-L#+=v|(Ocoe#FJt(mdK}lj zlksh6`S8g%*{<5Cvujyou2ckqqVOgmj0Q446GcLEq9%x!cZ>`Fy6A1L(2M?(jrzNN zWp{^rBkOgat`G5Y%_$Qi$0v0N^YPrZIv zcjCp(!qvseX9O=#0OVAcS43em_$Q3FJ22$F{RiFlWbezk_bW4Z!rhP05r<7a#KenB zUO4pSy8~0(x29h*C zuDAOkrfY66_d&H*EcKp`PIifo7pFXp=VYp`@qYRu(u-E9Q1)d`7VF0UU8{SaQ3QJYv+px##?8Lu1xP5jIDy` zt|3~%ms^KxU+f)t(A{z_Y}g35Kefv;wlPevCQ}%?)cs;TG};K6+!s9(AJ)$Y!Cgj$ z21YH&ez2CGrvy-BOLVJED}KcgfvKwV+LnKQjcCd?y0>{Brhypc#l0(E&5>|BuCAU% zo|i6^EX(4>dw%>_xf@E!DiR6~j~Fx^o|~_T-t*|4XZZ7B9TQHN|>jVrxo!sC$j(1N(?sp_9b-h90?%{1yF>Ct*} zfqJ~$kTGwTE{UOU5k9wu_ zce%mR?YlgoC;YN8^EuYyg_tvP1NYvh?09z%;f?eS%Lk!{<||~ORfb-TW*PHM#l}%l zltHv(f7Gu`fzckEC6Nigi#lCUQ=QTidaja+`)LhbA4Hnh{s90SmvAbGe9*{V1klJR$WuKJdH$1WU!Bg> zzpnr6D7kCTx0BOkUa178#fy zseHX=3O1GuK3YyG%st(Y-h**bo{{oX3f+i zANH$Jnq?Rh-XSJKgkMF@>776pQl#=R{U3|BUDwrERPB|d9L(9OBF{P|(#uoRX~qH+ z@jlx8$S)5|Jq#B~V(XfP-UF{&RJiZVBAU3s=}t_6Ylw^bw;*?a$GQAW@k3lgo)*1F zrAbDwR=mWt*a|06stZ$I@+}N`PN^7)W+3O;|Gi#H_Fugv(O#8S4a+x|!V4w_RraLI z8(98?S@mq?K3mJRn*wB&WB_E6oNsTK1juE8<6f4sXG)eY_FXJKCHH>3sgZwvYvN0of|u4dHtfYc)x!n|dw{$#b`hdIzE~Lc zXkI06X2|%>;nQKPWa80IuqMtTFH_dP^lyh5f|;nHU5J7!RdCIAaqgYGPvB**C%y6_Y;Y+s1G(U|9_82c5aClUK&0~!i~ zdZeX0Lh=2-h0L{sIyH*>5%C~Ad| zMsOi2CY=B*N(3>WBas=UN@KV7HjS)#Si)vJ5knGzllC&~eWHk>1p{&S44AxE6(3S^3b6!FAmm6l? zy#S#7xR82=z;^Qv+6DR`vHsqfg#0E2p1bMw@l}Df*n9Tq{^18hK2Zl>c=zHx?izx( zbWH^uQn8JBtczpl-Q>C4|ulFinK)7^B_4-~h2?eSD~=@M1dxIh}J&%6CPU-i$o z7cYL;wrtTTt{QoMzi-po6M=yjr_#!I;$3Tv#zyZYaISA=9RKy;b)HpnRoKbQ{qE1j zm)!jm=5+4QENH)((Xq_tjeRYEfgDAmlTb;v=AFG-ZuaLEp@e)b+D(MRA`e@#20rXP zh|wnR;YDu8XRKtY0WB{;ge=+e4KlcfF>H4VgqBYYuRk<8xXHr5=s?da^}C%c!?n^} zFMN~A&QY%fiGo7v^8sQNdY{YOQkJxn3_#9p2EM%9J~{R`>vk>IZqu8|TqWx{s5XX) zzB*BOi`$5Z33=m)-Z^;;3DoJ^GoGFFB&UKU#ySrlR821$$H*_SCPiVfe6#txHz&XP}5+-ku6oj-m+ z?t*r4GWpZ)9})21)%`y~hSG*7s49+zLW;V>kj}O9ov<@F!bQI0^HQ{bui%RjYG=Br z`yDa1^O{!@7tH}Zp995I*R31s{hBr4yPl5ib)b-89fdsU*AgvZu4f(yNYcD~qXlfG zcK|4gOx}1h2>|s%_C39EqUpLZo9Aed6Ooi#D9Jq_v^Qt-j8}6{?(uig?hCp z+R7$RIpFJrMk^u2A&F`$h6t+Rk#$-2Y{-c+{vPkF+bJeaA>g+=aua%Oyq|BpfYiO; zDfpO0{P{=KAKiB_xxjfNJRTslbO~MsTukxwkj+rd^^TaOT_!nf17onFteopI#f$}4SlO1T#6F8Z4YTpzzHQh96HQSC1 zp+!lrJCflU=`IHiU~M<~5g53c9}2hJ`mnR~=_o9G@yulo?|UP+Dg~?==<0s`NWUtVWq=B>yRR&PcnK%-Dxkm^QfttTiDzX>ASIVI zV}9iVn4I&Zs)N+5gMI?zboiEDzF*QnVN$N~mF$RK{y_t{rC&iqLqQ*tBC^MQ_UEGP zWJb`-Gt^ zw9OV>*~{CY(Rd@)bAPc;s78EgL-z%p4*S-9N!SUt*s^J)kpRE3(TE?Wa1i?V zET}C!{i65%GuJKDk{<|zz-@=_oq5t%*0my7HugXJG^o9%_H_59AXC(jtjih$syhaB zwJ^-gZxF3WZNlj>+nbRouQyWc zfGfU$dGceU+H->9p)&FmyQXFH&3$D8*gd(!Cxxh|8n}DT`;cnj3#E~rFxFwS30=4U zEXxo6$}w%ZyBz@H9J3g9kOGT|!m@0en(8PF-x`2jPbaXD+4)}8R;7iWdD+|Z8ecqy z{C5({>IAcv+zQl{yy#iUYsWV(2`UzBkA&8K>>>t!->3ohJhEIfq=QS*Rh-h)2pY(5 zx$i7d*Vy>=#?+?gX5)AGYfTSB{`-(6-LO0U&c3IP=ejnIF?1{Ho+pzV;;)Og2IN9~ zE`pw(ipRiB>;Nr#eP$jP@H?lrssFkokA>Vw9d&SEWWOWxKO*S>22n$MTGWIPErlL$ zl99pZqdEHNn`aHsIVMM4j7{MUrC}ETpk`}sOj(NLuJVq`%iHAumn*iEf6DE7JgAq) z(`y;D7guR@@*SHIiX8uzHZS+(u48nFwl{!C;{K1Kdyi-O|Kb4t+5KXexo(Ed{ci5p z*ci<64~4dxg~_=nuOevO4{77g;erY-;pF;zDT7~`|bDV{@fn#$9s?W zIj{3PIs?YxzMXdi#q^x@tCxh&Z|67FSbx&gxgD2lp=$yet7?|%okvbtG&J47$w)cs z^yph1{^kmpr4SQgo?*$GJP6&)n?C>OV1BYSkoIt;iq_vuF|Co+|rY=x=b!M7CdbKSJ8X5vG9|%z@C_(yJEwIfCoDT4ll4BDLB~ zzU(sO+~{}$FHI{9QO#bf$*dA`3V8ZjIy@>=p^dkn6?WHBRlUkt1KxI_G+msL{HP1; zNlBI`C8P2!PHzodv;N1|5duASbtoj1*19$GiV-J(LL z*q5dvtHy0UIgwAwy53@@Pe<%)ccX^A$(`Rt9454QboCCVgamZ1CmnAB;o-YFM#f-?aT0H8C26pjrH?lP_09)MzQ)U;X1z+kdQ z#uh5CHmnCkqb8GN06;K0fzgY@p*7RY&y!MeRx@_*^TFrC5Snt?Yc#k^_3GXB?&APL zp$C^z`laSlka*XAg$bla6|nzUhNv0Ky9^Lvz#U7O;*9hQQDC6w>Q{&VF3CWU>X@Ra z|Li4hKPu`zF7tp*sQ*p*SFDrJ`aQ~ak;@6aa=i;I(*nR(@9qUnJ)5~J<;?iGL z?vcjoj`PwzNT7572fN+mb4BR$j#+DW45J{&FsVs#ZjMw@j`bB)B;K70eZK;^{~7$; zSH>_@Tdz8p_bf$r5%KADZEW?u>t^#Yl>5;n6Nf_g*v;4q5_L9SCrB$VT0ZnTW80;o z+(Dsbta8!Y^-T2ZTo2Fk9IKJooNds1uj?E9P3Wpdy5u*-)w$)h>xbq$CEHyZ%K{8~ z3XuRvr18tgOHnx!r)U+3b5W^}R$%7<%So}4J?~&zrOc`)6(ZhYKkxw7odwk@0Y{BT zQ_}-@;HHXM{T{H5AcH*Zc_}Kx1qrk10cVTsZ)#a+mk0qrl~6ESM>1Iv=c9fS#s~cx z!UN10!;a^D?jFq4@?=0{F-!Tc&lkSS&?gD*Zx#sqe>(Pndj@+!_^XhKwBknN!nDV- z7<3X<-w+a8cCz(*^mc7d>{#}H{dKW4_vk6cNwbWpl-1qXpJ6@eC)8zB@>3`R4V@~w zx5v$TnxzUj*pXm|8exty-VdGlZ(iv{?k$Bl&O7$6rcmS3>d(g?V!YA0r|5M1*YS#! zKS;1Skb3&$vO6ncJ5KlTSiy9aznJKc`G;Fn3VJA7SDG*QMZ0^4?;!}(!6m-v0GBEkKU;0yLP zrLAgzGP?pweR2LxXtB5r-|phIxNK9z5eV|+zokn-syc_e0$=on`>t->=#E$z55Ekb zAsD70Gh8EkCTqI0B(5DHmTa;IPD}80idJp@NpNCZ9?L^3@gk5|+i@)@F$QYqPoh?c3Lp_gs{if>8w$;8|ZxTz;A& zdPDC|Qs$=JzH|R@IUoRM6!gsCCGZs`UG1_wAag9BV8jq_U6iF@@736^+!PfpWbnK+ zHa`}>G+So;GU_b^Bo>AMBS0>cD@p5>KSc8~Z@qkDB|UnRi%?uV|F7!b?OLUH^M;I4 z<}qvl1W9oLILI0z{jj;nq5V$+E94-#XNX*H5ko$4a6WpS5j&}WuT)viaI~UqHGm)Y zwZK$u`J9ju^mUA%Ipp2kbyIB>3m2nk+gOZl4^he0oCnzUOI?%!Gw~fRZzohE>+~6l zXW9xdO@|BkF>r660^4z;XLE{F!L%Y5CGb?O_VrCQIx5>cxqZxY0FjTTB% zru9ELj8B@bGGEOaXp)1M@7?2dE!Tx!8mzbbE-zJ?4ZrzwpYFd78JBxv6bD?1*yaGp z)z^u8MaPuwP%74UT%!6BI!C8D5dEVY`yj$D6xxJB@5VmD&*I3fF~K^$CjhB=LmzRl z36!fNasV=^9Bihap5ZUSg1zvOUK*0&2hbddH%PIqLo)^DYs10xjdo!Kn#8fPc_waD zyk~{~$zW37#=Ucjzp@KPd?`j4z5dBSbqG5`NaLMIvhwxvo;}%{*_E!TJ^{1du~Wv+ zy;3G^LJmI3F!8FuVUorlcAW;AHZ^==bG{ynWjz z+03ffvswJbyc1S37TzhvnSIN3;Me6JYR} z8AiA9uhAqB8O%W$YU5w0msHliqQVY#4Cv*w=S+d@B=>8jNpA&Y38g7YTpCT0?puQ$ z9IO`O<=pWVX9HEx!SXf_#Qzr*^?jsmDC#3k&d@G+lhX9ujkT91}me8eo}+mmEX&kdILORE%u2En+szH8PNp6|AZp6@h}7Kj@EZ+vj%I664II!I8afSq5EiZ8l1)h=0ZM&sb^# zby4*G>YT8JpEBnGHr#7=kSLmMr(RW%;aMDX`)SmO;e*3y=N%fcXa`DZox#S^-%FVq zlPNt|mUJrs=OckdCZQ{#mju}F(R{6n1RE+H9_3W zq&ev3gD?TxHJ!nYH1%vTG-`2)b{z&c$OpA^dt06B-}2c*+Cusz>YwhKv}pUiq`DmY z`{hC>7^V=JnBwe_JXz8^@TWpZ=cjN4psnKvU7F3zpm=-HnT}W~Lv+$8l zuv=+7DiG+Q*zFcvdF49;q0(($zW2t`;~L3v{L`Gx5O@j@`|h zfyGg7xD0Kr{e8u-qFR(sO2cPH`8iInWBxg2 zrx;a!K?J0nHu=IyW+pY92^uW_fPDpL19j3J7k8tTiGQRB)JJ`)mESps4 zJ`v{~I$Y2)#~$=gCFG>kgL2OvDu1)yx=!12{ZJ9?EPKj+?4wBv_T;OdNzX@LnA)Dl z4qAB%Ui?q?`fa1CngT3sgujkOA^FT}n^Ti&5RNo@!fVUy?x5W9PcyGxqa04P=cKD5Dr*t7QevD7Lt$=;@{odY_<79o*tobPn{)rFh|Tm)=lEr*RzS+w$pXSG|Gu4iq-)`a#V2PaUs#n{ zB2(0@JYB}%4pck4`=ceVkB&Saea2e!PXx+5D#xnJ$kn9r02r5N3zSk{np zw7Pd}k1Nz{I~nj}sYP8CEB8~M;~=93jPo7Y2|kdq^lJJ@^yu}|`KXGX1AUy-$l$?B z4}=+Jzy1&ySOa9+2*$=Bg_UxNI-0_wQwuqnm^{>UGT9SLlisE&Gi((ZT-k1aQJG|= zQ8M8St?6|&p1(%cNB{wA{hupSjOgex#xQ$S)dfENt4%;wl295HUXalbb(j_BO z)PCWr-BT;=Gw41`##EOxUYGUr)6M;AV!FI_3Q;y`BGz07_AXCV3Vx>NxrmgzITfN; z2o3VW*v>!YZ#ZAelz|#~{4+Y8&1H{XJtU<1+;d7;{?+ufgz(i=3}97mzS6J0$W`V+ zY5dt#HMFJj`HN*w6m{%O1Cz|tkG5c7Kg=?Eaj4}Fe**T z7Xu_;*i75y)3Pp%28hdzUTy3*x0*M6;bv&Pm)1CF5MZYTP{E_e{&~k5d&Pk=0Moge zGyG;TM#HcnTtV$rA$M0XlROwqQ=%EjpRNQ5k;&druv~uf2NX;87eUVJTKhMSjSp9K z*U4Z7-OjRAKynqngT&Ze{27+lIobiYAy1z-T9g`%MR~Kf=Y4Ze_G%CCb6zu|YJ9;? zrR+S0l)q|~ukYu7Y)%atmgK#ke-{iJw~3hxcr!8ZGd)p9hJjYSd?t%QETw&`v$sNA zE)`jwEJXj==j>-EG)2N>O#)x8@Lw(qS;u>!;Bi%v4kV9 z7G!x7c9;rQ5X)tV-ga$|5%y6O9LQ2776jNvffz)23Ajmv zH|c$#QstS{@&K}PxiKFCRB-T&WN!wTP_eWXrSegw{|pSQF$z{R zvp-}3QAkiH_<+QaG{sb~`dm4g4pa2ne@JzJm=NYO4gmQnR?P$c6`6b)x|%%X9x~gp zci*K$kPC|G7oHUM*`sd+WBF&`1`X-dSBKth5BJUqoodcJF6@0T`;(R(t0O%IxWF%Kn4XG-)G{oU*NA z9rrsuE%vpRKrPm4MiVwbeu8dx{y1q{>)dlN2d%B)L*p8x9r5aaXfmM%*V2BCi$`gx zIu_c|eby3It4gM#Q&W$xU30mLijVOc7==3Wqi)|HM+MiR=EqX)Gu>5=SJOetTPk6; z)6TXnpQJ81YgZ53G=q(zoH^mMRHPj-Kg76U-q5`H5N>NZ-oNK-pHhtJAbS%m>oOI!l}uR#>8|wqT41ZfAqLz1u_Zodp4dHa z^|Nawwb&|;1+R~lPTF63f8BUiX?h~2Z;W4>{`S+$o;^rJ9Hvu>rV$sKL8N9dso-5Z zu^kX%N3BHvbFf@GghrRnCV>8AaY@74CbiCNM+#;?0s!HH8;yng@o}OWW+@vzTs)iA z(hfQoK4gQX5$Irr-4uMk(>9;--{r&mw%rD{t60QyENmNBD`6ZTa1u+WbrR(=H9|s3 zP-COFHaUZPbX-c#rLS&%`AvHLMfW{)DeIl$@VmOKim+3sg1`JlXPlOy|3>b;t4_Jc zzWFFe`^<5_6_BOF#X!-kP@r&@Z4N#pa#bvD|NrBBfq% z5Cbg0vV)q_wk4bupx2aBA?K+GgQn%FirEE$~kaq1v>pJvOAqoH$>uxYCk`l?$ z2+FT>Ds^x^GaM+99a`e`Cr?&QvBUQRig-uEPzO_0Led)EEUPq@w1Cv9K7#|Fc4%WAQ0l&L$+w9 zlx3aJv72W6#R&V^{1+Zd73PIhU@u(KOLH^ze%e1a%vqreEO$}koOdkr97k>r<*+Fr zbLp1>UHdgT)m%Gk{j=W4*eWP%;!o0i;lg@b8w{yUUpzjcCyq4 zcn=?Y)B4L>!)ZIMW)SI`8`ot#yY#xwyz}wxWb}pv=6R-*!WWN|(Nu-!P#3$mAx(1O zM`8_MT%))MPSC#j{%cVSDJ}r=(|aedxBOtGu=Z`062)xEJf>jC}*$9MtKZ_`p|R z9bQNdCPB<{eD-lYY@U@`1|M@C@DZDmu~*cMO>xO9XbBG$3e8;B^GlXuCYz;t>q`t6 zVj=1-DQDmJ8~fa^^U3)WInCCF)cgZvv2resM4XM$ud!W`eyhnxO(`zLR~&#w`aulz z-ZPgz3~wjrGy|P4)Vl6a#a2MbV6k=E-yUxP0~e1fax8R6^f+qr-?0_fpXQN&>~4L2 zp^81-QP0KaWVdXVXQdDLrjB3!P8BtxDQ=K^L;Xd4KzAy?8HGu&WgQn~a62TgNC3Nd z(u9@R2f0sKy*ksS)JDFGNY53zQOzY>ZEZd@5&qcp{@WsKmTBE=qTre!LD>s0*3vxHnQSGe@&%apH`* z0L8#;-NV)TqPKDt11ILMDgOm)TG7b8$y#S-lvDd{nEhIFTtXxGeS#OnH60yY{7na< z@jBk=_MxS=Gh-f)o*(!#7OXbCapRJ>CD4<28u+CrhsZE(lzw9?2?G$#UqJIf;;>wT zDpjV13ZADXbnBW*s5&q(v-YO5S_ZGeu2gXxE z1zz`@h8d6YjG3x^!h_{*n0fre(;TTsGTCjb@V$f3(pKjOD0)wwrz|S9egCivIJGNq zp-=x9e2UbWG*B1*)w^ZUH2mHv{T$V)a@&xRJdNESPfNR^|E)<}?9o4X+YIW}><&tX zFzG+no;Uv#d;d7$4q&vQ!Rv=si^t%;X)Gx)^>!lPO#bv(1h86>y%hlU+5Ny5%}X_B zBjz-yXLX0hLn59Q?P=&3TKM|@X`@G1)Y5|?m+Rdzvvq%p&TaVU22d26qi!YJ0idtt zvlo9wzqt%p%VJb4K>Z^^d|mfbSmu$pBMR+pU7(bKRB+QU-@XX>*=Hy{-dRAK$r4%v zngBX=X@pi_rOlMyi~%l7%X- z$8^-`KfmmPURzW}62;7q-Ebu+hEpBUMj2OJO@7`)nEX-&?@;JC zyLjF{0Rrlt&)uD6*cKWBnQ4`0fjD~Q@xGa1QuY(bY0EyGU<*t}&DiZB-zO<+y_ZY$ z!%72798V7&`}819Z^3%`b}cDm)4}3&-4bIospIx%y^v%t4~r~|!l}D4Z54%O*?qCO zz1e@WhGq5tlo!@siP5-Ou^nF*R(jNn3`u_HpG;NdmzT$56snSOQ~)XQj_P3_-GKo# zwxVyUI?4SW(Let;IuwxHT_LIJw%-3D6L!h`xUhN+MXS$e1sQb3XL({3r_SzqTYPjp zINeSEzU*r2QKknOY$LY6x!w6jwl*+9I4hwhl3dOz%ZRV0A83d!_Px&Xx5c)a4|vIFZuNHTd+}ysj)=y^|%Nb60)y53L5M znHw+&8%@!p0RdOq;n#mG8^Qo16V!^NXEUiEZLOFEm9Qh0g%FPVYv79+$_3DZgTdsq zOywsG=yBnrsFCA_zcMd`(1Y)rzc<|3d4HKN_7=j+JCT#MI+9U~zscK9?mc0jbW2{9 z9KO&zEPMKe->B3HWv7D^U-~pcgF0d060Pv~-5-G=ikH@^lScjwpLh&eHGb4FV3~gE zMBV23+KeB4Vor}w|6G$w{^%k~Am0%SsV~7^CQS$5SU>@jq)g!KoOzs!N44Vdi0PXf z(HYEJep}w+`uv*uJmX}fBBry094xAw?5_ACasj=ZhKk|@oZ zB3Q{k?H8=Wyl3WY4$FN@GRp*#=TrgVb2oz(Qh)*X{jSBQW{)gdW{qh4KKL&MLGfax zh!HoKA0Z$p)SZbUZ7^|d5Q=t;7>gh57{t>@**8}UA2Z9+8`#OP9W1WgXj_ZtH9`_r zAWYpzTU=l1Fut6VUN#mf61$P6$7nYy`i2lIY_vBhoPlah(s1gR2l2`U80dYLs9`J} zn@FQ8E#ymt$arM2LvG5#!lOmY-k3GbNPnIF5Ge)y$EKt@_l3(omn9A9%J{CFwC0;B z2Q9A=rq15OuID;GFZK6V4HC9^rE_EfkhL}NQNs(@5?5t19^0zdj?QT8NfKMKp;zZ7 zO@~_+bfsVI*+e0GSN2t3KH|0kLIafbGmT#*Fd?XvBqlSFjb_%-l`P#@z||ZuAT5%m z??nY6AMfv%D&8pg7q-M#azfe}vi?8nzf3qDp;TEn;F`ir*{26;_yGm_t^_+LhzAs} zhkVeGg0hgo_iD$BE#uPH&2K5B$W;j*MEtqBjD2?+Y9o*7>%|;huJG3!FV1Pikc^j#t7OT ztjr~&zxoD_`HHv@vlLk(8D%X<$9V@R%0@B9-ypccI=??S11gmM;~VHk9|z->12QuTt(1IL3NCE=t+qqV)C;_fDw%n>ptv~n8v z;$e&l<%z7T>$I*f+D3%v51)uW-g@6^KBwb7G zoF;l4C@(frgRRBOYkwjP{^LA7>b_#(ZE($WAx`)dhgW<@MeUe(nNDQ_6(I6-bXX@+ zu1s$ky{`=ogV$@Xlnkp-JaRP+F3RsKab)l5XjXgWB}{vP!p{hNo-Y&@A?~BdYEQa} zVuEm={UB!*D9Jw+ta~(kfcwnyx+(pWB1~aRQ4mN)r;rdv0GpP_OHo>7r>Lsuiq_@Z z^L3O3D}j2!V|~a$e586-5+j-BO@$~#cnckp!H?Z>Hz*4IzM_k)MkV-wfe1{dxTG23 zIR#;KYU#x*dSU!Y?Ztm&Fz!~*hyApY7oX30gql3Ot9(IBCDa2mf>kQjGhJ9S{!}8p zr)r*v{7wj|A5fKe79CX3eK{N^EZ>(vml&m{r`(Coy>zl97Aq49Ei@31Rs12@^A5m- z9r-vi&-TqK0ADKDE*K^Fl#2Se`o^hdT>siy8%vB7x?I0Y}Mz`_TzAO~ycC=z2eX9J$_dk0N%*pNZHE;rUueKz8zUmKxP$l1wA`Kk)WtaVS zA<~3)hg*9ybFPry5-7ImZFDY7MxwdjvG3FrDXyqU8!{JD=gB2{u~`C7%A=hmF-GeR(evJuDr_3bTvyB_PyIb z`*Q<*M>QqHtr9*fMngN!=L>r_R*L}BEcHlG#Cvxwnku+^D6u2u+?=z2Uwik$qRI>g zbfu(3Kko%VnYsw7ecf$7exY=R`FPyd+~g@IVm5)Kvv0-jK%4zI2Y zs8L*Cc!g6sV+mueh_7G?1gGPfF5$R9>=Quja09x9&Cl+Q5PC?VuLWQQoecprntv0= zhDV*E%YjeoLBZ0aDm-;z@+rDYtCEF`B4a)>297Q$rW4@Nr!bqkm|H}LEWHKgY1?(Z zQ>>{dt{z6CZZ|E@WTK0cj{mf5p_o79a9HQe?J#``AxR6E>y z*_^>K5Fm35D*O~xW*<+%O`y$Ddjy&591c331h1MwtudwJxRSp}!n17AVJb3?Jdwb~ z`cvU~V)$5Fnd3Z#bVYUR8c+;Lu)j|(8c-8xj(%*&db@mVKg^E_b>PXp-c*{`M_BhO zye*Kv7;WfJl{pRIhs4x^*@!+iA62!fkV+D3XeZPIvd{jHx(S-ZQt=!aJWegu!!UIj z?6w7Fu;qU1tIdn4!42eN!ScQaBtA=p->!OcOT*8T6uPBwd{&LmQafp&9?L^l2~Y-KGL9+(K$9C!zj=#4^_;u^`#neB?Cm_Bf@ff`e)%X<6dLCYi!w)k1Cn zFmEf(UVXTG{CcaM!*?tft~e_dS~fI&XW~)fOop3+jbCkS9|j`jo78 zz+{RTcO$v>FN>le?f@8?Tv}rE5vG`;4=6Y|S-8XvU7@Qj%!P5N zB3+##QT<2)72eG;y)2IX8;BNwcx<-SJGRKUIJSxnVN$Iwcbf7+d#b}tKQi~66-P1v zrX{_V^WZVu(c#?xDCkcM3+d)h4 z2yIMPk>%%3$SIEL`65$LppZoXvYTY{QW+}ze$EhDidr;}a} zmHx3hyG2P>w0M3%Os~xhOu&f9I3QQ%KPlwXYN7wh%7+|;z5SP6Ezh(A9cIIbJbV>b z6wLE)gkd{a#13QMmt?8lQ=)%qzMbEcFvSw{fGwk1bcd>CIEV>i2RAjl3V|?f#(w-j zIn8QFH%W?f!1uGUtRHZ}+Sa!-P|k&X)RlE~jOEYg!U9zIfkS7_j*u`NOA5sqK`)n% z2CDdtEh)VS6jCk;kS-yjyFrEdHdIzjwIOM%goLq&?hUpfYr5`tp@eTx_9 zJG;pPO-thOk%QIz_>u=<_( z`CHV0E`dVUJ*>0hfgUny zxOoY)Zq^>DOU9*g{ne-_MbvlZG2uA=rFOGRS9cWFe_ZmAI;~VK6uBk|u14UNP8p|~ zXR*_RSA)agw~{B5X!Ha809z(8I#Gm>2IQZSaOmqA%dilwGrYUgr7=H_H24 z#T60|;luY~f`LDOYUM5!P^F4!aVz=NxD{sD(6h>qKNT=!}3lbd?aW2*MctX`x6t1Scx~wPA#-f2tMlz|WzVA5OU(Mt|q0DZp zr{(oZ4+6`6RY8`NvUy5{Y^)|3CHV`dxd2;v)^z$;<RIyFMZ(kt{Rc6kGFIXrOi65WVKRMsooEyuU7Cu2r!daeVGV0y6>ZO zj-^C4?Y<3{SpH9G0luVOR%U#tcQgQ&{2T31<`(g@7_or!x8J{7_%WpR8%o__|cs* zC$_w3F;|w@f4+A_)~Y<1EuX?3Jz#|{p(1qIh{34Uye84z9}1r!wiG{f{sX=!mIbAA zM&uTM|D}ys0)l$m@W&Zq5s~Y-D4*0jI&xP4;v!4fTvmm=CA$orFmyElUfw%$Y%y-# z1Nz`8GLwUd3EGKKMdb*#Qa^&=9*qj^Dil+pZUHE8;3^g*`~b*$V>J0!MybF;Y?h6% z7Gxty@0;_48LHXJf!MxYQ8-IDmDwLEa%&ZM;n*Ph>t6VorEq!Lv#2GRNETK}6(?%z zOj!2o8Pn}bC9CeW@?MdSr`>a2!mHB2CFfzS%zxenK+SCL9=-tUHRnC1K-@dsD-=4a|Ye` z%SAvrpuc2MEcG=A07z6^rY)47Fc{to-A+K!FFiXbb1Rb>Y{HeUSi048Dg-Bei$)gK zrLM?!$e*P?&D~WpBK04z8ZxXL+uy~x27Hhsu8k#3?cIf*s~F8C_AB+4DJKr)QUxF1 zf3(uL>4zv@$5fEuPXgW#7iaCfLT3S!G!Sv0wZ^``@0F~cUFCevr6SJl!q?x7B=yY} zP@nEi@MHNSRA2x1(;s5p&y8M&GOeFZRdE0FhqwW#LK2GbM?)8RLkoMq zv{yZQ3J8~bAp9BWJ3v;511^;sHcQ3*q9XGn_`#_hv|m+bn}JG=z_lSy6Dm zk=f8}gDabNT@mXcp92-?T}oBdRkd(fuZ{fY=kFLiJ#e2l4p~x)<)cx^+&8qHu4n?s42dIGHWAS&R?F)4z2bA zfOAts(?H`bB*r}-Z<~fm1a?AU8~_Q07i*@~?`48op-_rJ=rdI#NARB_l@o5_Mn}rm z)|ONYm8_3M6gH)eIu#}LRhS=3Nzav3+_T2amiXY3Lp2af3}0Tm+U#@WL4`(>5=zlA zb4S_3IonITt$lb)`+6#)kd}x2z;{_zZ*?^)4F0*W{Z3a*F5w>&{UAmZ&geSkwC3f5 zh>Etj3`` zi^cYx^b8S`$SlH=-MCh!(F`p787T%X>uEe=r*QDNN@@b*P~ecNtGW0AuiGfGu>)1n zDgol&`LkXI?(NYpgn|6drxw6sV4l%5F;>WMdN*Z)GQ$|a81^j2OxP?G*XEkc631Nf zP5&BBQuss^#vVK$WiJdQ@D(u#F^RwdC=B>Irsff&UoR?>*e^_pP{j$_$w&|&(x0k< z!Gm|0FwDUQl#5*aifp zfI!-Q(J+M8T_YN+ZwH4I+xl53PGFhgG9w~Mvt1_f6HZN9jKuVu3mL+92!zkhAbU&1!RLoJMO!PYHnR=;@(s$A=T8O=5i`wV z(j`-(R3#sb?QA*Wo;>=;zUR3|rj|ma5qG4!&n#%@4xfQLO+seNI4UMK4)4`@GS}fK z8q0{;PXhhm*AoKarnHRVj1Smnu9;`JBfVk4vST(0jptqux18E~s>SjV`#RxT!D1*U z)PYKd?`|xuClt0V+0AYI8L+!()Vmj;r zjrOa%6@SLVyxX`L%7O}oz2YS;`{m&?k7Mv}D!&0#m8rF@8so_gvm7J-bX<;+<@eD^ ziap_ePTn4eCoZ}Z+WV($(vriQ(3;v7j#}a_x00_#Cm4(=p9KR0>p;Ff>T`=S7(i&P zncJ4O6tOHZm$&?XD+_2q2nHmv@8Rc$1vVIZ&|5SCYQor;__-wtc=%oPD8Rw)BU!Vm z06HI=1xRnS|7TQ)4TLKkx`066DeNgIH^hP>`x^hXu`bG_omo4;i*u#azM-l3%?m*TC?AHMbKGxArxeix-P&vf} z^a<48pg%x(GmYMZ9MtmhxotR^gFG@1#U7f6$~Mr@7F4L7Ph97m%MhAP$u$g~foN@$ zwNAgH>zs=-tfF|}{F`B7b<_+7DHr)=ft>BxSzhHjAdP53l&Ix1emmQ_} ze~#b0@-LU8V$GyM!IX6O-Y*x$kpO#_lI4yh12YgBV776^afcfO0$9R9Z8(_~a^=Sy z5M~ke)P2%W_}exOBghmcjvGpdmEtg62(b2KEcV;3zxDeMh;$3Di@yS%+At{K9|BGg z3$QH7(_^#w{g}kH0TO((Eb5bx#@T22Hfg^Q^!iR7#Ya_J(WoDW7g?rh0c zHKGu?7Zkf+sKF~#WFK+R4bkpp;_WUah;QmqZjngd6k&d3Sa?UgyHNWVbYoy;AYnGZ z+hmX`)!+!%Q1+nJnZ3`t!#v^4pMgB6+H94Sz=o|K7F;jfWm0z7qU+w)%f9vj}rkSarVtwhIiR zM%uoJ4Y(;R{|N%+f2|a~v|(XBJ(XZRk80TBt5LN+r3jrDuckD%C5!)ZNBHhk^5+|X zR3Ip|dp@Cn5yf5*zndwT;s)&iih2FE!iSr$vX_)XpN(rR^wuyD9o3#JsaHxzv4;VR zw;s;|+O4D7L<@9O&J}G^?B-g=3gQfy70F}ZDL2gO zgUm>PAp8?39PD%K(Snb|YRP7<;%t|3jf=1lUwz0B zy1~NA+vB>QbR<9EQCoHIGw(zVUg(QAa^ID-k8Fgw{y1RbsJyK1>UQ$pZ*%b53hYU0(8ExDguRCkS+R$ zKYhlhc$4-xqW799ekuHZUmKFecbt`=Y#wy` zA$>m91D6i~?pCa%xyOHD0AP6)0l?alaLnjw2;{Rq^RIL?xF-oFvj^Fe^d}<-%T5xO zu@d!Reanbe9T82;2S^lSu?g=tVi*8X;21s-sKnvyPC!5Ee4QKmAVjXU^$9?ZaZPyU?P@y7)lG$BecCqj&hm_|m zI0omC381~diPjV|=ynGi)lhN8$^U{*hUUXfpFuuz74D8m-CBa`Pn(_$gNNQFKI3W` z$sof>RDBZE2aZ1dT>e5a>9%c(ZZT9d%r3*nD~kl92b@=c*k*F<=#9xdR_Z%N82*gu z5oOZ#(quZ@#^8r28MwH=$n^BLWansj(6DWxJJIkNM4zW+x{^*&xopsbY79-$P=|>m zBN;tD&SB|pW{947NaBE02-f#ZK10A%HnfR+6fl+fr``sLtWq#n4P6G@m4>@8mYyQB z8!nq^!d!lUidGv~6A(1z_o)bMLV+2^MnBlF7*GPicnX1)kKsenbKfnr#n#aM$5vH7RpL^oWmF0$^&VLDhez@h8v>12s7b zGIgUOLU_;w=7Bx=rj`1L&(Vg?Gg1kv&W)J|Y&j;J%_2K8?Og}0iH7hb!BUtcIDG`WD z)ZIe9#|po3zeL5EPXt`zGtEu5M2CT+AG|L;=H&s*J({FFHHPo13u2ZFp=DMwuh{)oYo0<3)NO2igh^M19QCZ>O* zx~X>0?uMvQc#%nd(Xa62ylIFx0$qqLu9|_N!6tRU$v8Xob-tiw6Hv=;^QFT~JOj_B zK+9XKRmZDxz_>*x9D6=)?8d>6SEvd>Y8R z_Qa=6DO4f!k#~hhwy9_eEfT1&qacg)jbfuH-rTxiv`_yp(Stwg9oeMtfYd_v@%J;D z{pb^!q?T^ac-Q=NfGzY230z@|Ot>ps+bYfS>B{Tr$~S7w7qG%F*uq^{jJ(E`rngB% zcQ=u{>RCJsk#{P?&xESkF#bLD!_!ueA=NuZ;AJ~Za8v=nZd)EG80>6Qa&!YImMsGX z@;}>(riEILX%2L17=}YO*5pZ8kmkl701H`iul1QpJ`qi!^W-jky;;#X~?vdo~yAmP=9IuK^qkH-Y`ifj4 zGroX&@7!fcb{nIvt=vq@A?!Ep7GF{%=~mZCkCgpOa(rfYAy0zWKoG4lwVl^!*^#%V z9@_>6f4=tV z%z@(r^jK;qn~J9n9_Z%7>m%EBPAT7WkM}wL7D>%XPuz>%(^i}Nn^LMOWc8A4oDzR~ zcJRcro^bWMcSue&jC|2eNX3Jp5Vqa9=ZG7>`fa?aEy?ivLg@JIP-IP4&q3NXM{WDq zvytwEk2q)J$jc|2A%n9$m4U%lMO||JQg)#*eV)7yaFIm{fd#{6A4tjJZdy;qrbJ1K zcKSV`^v7cc%6m=R*Y8ifci8N|8~uqc>NOs{OY~O}dK0asbvF0OM`4S8rF-t?Gd!2I z^{RXMLbs!Ywk<5K9lNpQ9JOEwGKu2wf4Ew+1B9*xA$kIlFM_yVMNP2AAM1*KN*EKr zC&l-Je#jVGZ@5YGO#uoIviJ!K;ko}SvF9}r(9GKRv3F{=H-I12p>w!Mx_4^%VG%M$ z`^o*V+pl0@*OBqlRBnu6WIobUdWP{roZUVmtSrknXT`>_2_ZL?D_5$KN>X-V&gRIKYL28*xhj>kjU16&m83!{y1puv zB>V06@BZKG^L{;F&*$T*nWhwxO}KMU^`f8bWh3d}_$fiD@kw7I*HLbM4o(okf=l3c znlfcl&E2ize@%+Q|JfQ4RGWh`j>ixi73E9EL`-@Eooy!n7@FaG(|s4Z@x6MpEGpSG zc#>{0DtsyfGGSAK6wkr;&&$s9m87>%C2eQiWTl`Od_CJ;jnv;Al{pyvU3&MNO{>`=O}W@1cM6J)u@?MtbIi|B*lyg!A^iAm znVr4hS&7Txr?aLPRtZ>@PHD;@Hc-qhj~IlO_8&f6kqDx|L{&Iyb)~`{V?TY9*LjO4 zLd~|Wr`!D)8d|Yx*04!f85-p&f7g=E;NjkVpEx>zJr|81MZT$Qp+qg)Ol+B4zi$pV zJ94?iE)1h0B|ndnr{1cS`_7XycR97Rc5tNi{^FLst9rUmEp#Pr?RSEc&l&PuB_L!A z%fdIttnR{}=`8h27ykS{{p)v%hML?y0QxKfo`F(!U_5f7?eH-SKg_6xSH}A(3iq6mlj$Gg#Hi z)!CJ3rz5?aU$FD4>nPtwbs>%*F3Y~z{?^FA{YYOZ6BxJWplVkt)W#sY?cLX`k8%2? z7^xm<1grXQQO34icKF!AutYJyPj>ujSn1koRGI!`b=u9+?JW;;1MK4`Go@x$ zJyi)#Y0BrLTpvZXbI*$YovlD98Wfcxk4L1tFS_o%F+Eii^z95K6dHBD#G$>yJJg|f zNQUD1%(yriwaFH*n=4PnuWrt}a`cz41~VPc`%yofG3WBvHVy}+Op=5L8C9KdLu2lqJxP@S`Pek||0;{JeTvwrE`xYmIO_5WD zOs#fmj-1o^%y$=@#V@Q~oi;vORA;sDVk!QbG+93sm0vo~r}yLMM<&`17$z{K&HITevze=p9b@}$$} zScWlBwKrWlYna?>a#Qp{xNZFGzk}ZnL`AX`R{+Ysd;kz)AZZLnl6-*-h3T=nTy$wy zUZd>fl8y%f6po@0%D>i0J85U=l`1PbxN-%VDeuo%U;m2#bgeAvV?QE~)LSn=CK3+Z zyi>eb*sO>LU6emp(kFB8#F|HGE|u0-=v4eAYA}pGL!sY0YZ1{(xiZq4tEELaTXgq} ze)gx~Katx|+9}^>58_ACvvoWAlG|aSrTAfWC#V0I@JMWFUjt&9OMWCsa@hJsjIN1f zw|LtI5Yr1POl+m^<#jE8y9Aqel|gUbS&#{sbbnnJJc-s-G_Fkuu&^F07UnDNKNrF9RqgV8Y~)09C7b8DJ(O=p?uAyiqvEG+U z?LoR+5(QJbXjIwAg!}t0?v~NZGpm(OE?bl$e1FE#r{Zl7sC(8 zyW6fw(RiG4eH|wEhl5b&&s9D1Ys%8rh-J5Xog%#wUA^ForE*s(6l~#;@*YQ_wEvvz zCzH}gZsgL+ZmP5ap#*LiGAUDHkROSt*NHGgDVrI_E6om!gf*fJc#B{SBZ3d5e6mtb zy~6rQ>#!4FSI^~pgc65wrI}=^D0R*EI)Mz^?}?Wqj4wJ%G;G_?{vPw`dTue*H1~s3 zWf@dRiSGPO*P7A_7EnWrP+}K6I#o(pV#%v^6(`4j604z7Wn- zQk?M$Slbr>@PTI=>(iO9^;~MxaBfL@zSyS@*Wj50!~^^Fq?d!>)G(3H^Agkj z%}0n8q5U?gLZN+M6e6#RLO_l0dk=^EI^4CQ+$G4~9XuYCs2Ou(WTpQ+4SfAjHyte=D@+h%hm4cnX;{e; z_g-sr^A^4LE=%11MGn(U}hL#QUZ8z5B)Fd@_8#+oisDe;)r{^;eW~ zcPB_IE;C1e(RTXNjz!OSqfxWkDEWJFwuX?}{l*ek?B=;!x+7!yuWaWZ9Pem!{FQy>{_DJ*OW60;;PfN9qv3BPZLd7I0rF>9wtV@84;O!{^F_H)uKN%O zsoxm`-stU$^Uu{#M^R{(?=c$3pIdAmZ!LQPfoW*Gn5g9`Z5Dh=6Nk@ya*Nz@WCw?O zj{N9_W3F&CT|FV$K|YoWF`pH;9X+}mmF+)dO)Ro|9xJ~AQ3+vbKJC|TReK66dn zipV-BEX?A(#@zPZPyAR1MA&}5AD+{)@7tP)$%NyC+*KiQOg zhgzVVcd1D4-~Ng$1R=>k!506*?C)X8txMmSr~k~8oh5K`96R^6eT!B#8$A1f5<+@+ zSYVxg>6nqKEgeD}bQT*f-Io0fhEc%Fr5x{SHYnNrWxLb6a76;cF5VE=3cRt`<;JH; zQdh z{>XAp%qUSj+1V$Y-~Vth=QtI&vUFQnzfMS5uif>q&uvG^#h{^aNU1Q;JqnlV3YTgCL7%rWRTw}CxJ4n998gsP|>H-O## zNEo^TbGB!Qv*v)>gC+>NB!9vH&glRXSl^@BW(h2ZL9X|p&71XHYOBG!ADHs3Tn`5} ziCQ-3P<9M6z^VtA@9H78vdpG$;w;-WG$4i{J=CfTpRW#FTe*Ey*KEtuKx~bvs$qp@ z!&wJ=b6;P0YQ%*XGrVlCGSXO$#t!hQ!Wx7tij!`d)9qfgNF~WU=!opeYPJdGI~$`R zK#F4Os-ElMmbmaC;TYyiJLqAkCIty14{fntV`-ixrE6SI+2v&UcZi*?FTuzb3T~S5 z9SkFzFR#Ha4c4(iUq508+h(1bLcaOUd~BrWM5StcA|sZ1FqS2w^1wx z#Sf#vhd+ZeK7)>UUCfM?wkKvEscQEC!1kl-W4c`9_)>v$EE*1a4Bj``ogbedWtx5^ z0uH^`yA|2Y%n|^t3ycmRE5l9HL`sq`v(bSSXd)W=Xr_D80%j{hM^tU|-TgYKr15+Tnemir}UEczgqDTi^0;x_+Fl_DIy{_k)>;U;ym_2oez6 z#r)jjevPJg!n!;Wo-11o26xxg?qF+kk%h^(WTat^RcwbbcRU|l>WWE!DeYg+qgO#M z(epQyKtY&Gv5zeMXE-v|P)Fq0#wQ^7rw3us($<2-qvz09q=?j=amHif=#JZ()@1*| zF*)xiL|=m~2DUwI11u6-DGi!JFPHZor^2%-k$xU?*|N(_5~+ZWlahbzPDr;3j=boh z4yRRtwO0IocwJwe>enXqkm|K*)7*n)D4bMYHXUTBcjs9&J4aC3Bg~@@%GixD6~6UXwMiRrn*!hAGzfQ!?8Tnj^|$;yk)B=sXqO`M$<{lvz`!R8uguD= z1CH18?lnINTxMwi0IActhWFS$+j4q(tK?WrU&hFwGNqXg+tccWl!5Nh1DK$}iG9rH zz1cB%L?Z4lZts7~e+y)ZwZO$g~gr8VWj!WnM;6qM7M&+hw|8YQM z90+0F?`L`2`QtP~$NDwTBFT4nxu)13iMJjen9Y71La72LUFL*XWGBC<_}A5&HJI%u zL98MJGjUHzeXwIVsMQ*0?_l;b0053=6B&%GW>7NS`+$Yqq5Dt!lIuTA;jxY#k=Z$c z77t^PI=3-5Us9@qDd;8k5}+homP|Etdr01{|P9fd)XhlpT2$y^XLKq&@AnA z5Fi1N1Z2EEd-JBSKpR=s9p&0<$Xy5L>+&C!ROMtLS---|ua;*AN0kt%peETufYuy! zu;gkvswsp^l(_9=APS0e*7g-*vn3`kU9lBd(BZH{ujJCNT|18`7jAExE1O06d$R9e z9DC6wA`bRfYL&|TxsH~%l{uhg-1)%fGfVU6nJs08%I_T8yLh<%s9=2F4#x$Xa>%=H z@YaP1PPQuH7xf@2*4X0bLA&11{Kzt1p#-3J>_)}_9{ zO&!QR>bu+j%i?pD?7bxDOcCSdnSLV!SRB0Gt9bi?izZKb`8d@3lnh--Wc|_M~=I4awRHmkvHybcCxcP~iH2?;{)>rlZ z5VFUCO=rN3vt^7|r9y#cE&t@A>6$J{7HL885BoqV?Qc>ZRp&0vDm4qrw);8tM6nsF-1O@Y()N@d`IT_&eM#X_ZdO-f zb2IYT*@P4Q(qbn71IJ_U0KAGyXwgi<_an07mlhus=O4vEO?|WXOM)3=UiB}uHGQkA zr1#u;42D#s^o^%I#q4)e)K_f zXIh3FVh2_Q2A2^r@y?Qi;^1AT$#(+ zf%$YXxOSnIt}1?!=QAGl_0|q*$|cKNVVtK?a;GuY_FxYaCQi1TN@$hUbk2>EKc2;_hP*sX$h=)gZY!k5T&bp4MzS?IY_Y|V`jPiKvqV<_^ zglO11PLM;{+UdWM>rec$*TCrLi>n8}1EJB@rIcu-OdbT-cWk-XaDCBjF_}-Bbz^6jkNQ?-)>h*RaOzyb@~_b6 zCG-o??Qj*U5sJI|i)cSQ@PcF5lt-hztXtFD`=mby$sMcXtq%Y8P@h39(m%BwoJq-3 zMhvL*k}_70#jBscSrx5YeuM+a*W-pC?PBWT;F5H_N+_H)&F!M*oHzJ2K>n30etE;^ z(|M}Q-Jjfo_>zx_N81OFJS^hwF&D}&X2&kErDSsBRt%?9E5jeVnl0_$k4xiaDe0PMR( z{ZLnS!wr75-~Dg^F&utnyPbqne>L!Ywfm=l*PT+YO<<>%*pMo@06Zfr0ofou(OL+^ z1FW*AVa?Biq*wVtc_;zTZCf1s?NEgK@Vyf zhe`E*xtO4I);cJoFM(y?|Cq?-c5W+!>o->?B>!3(*Htv2B#w?P>og8Ou;wN?yzESr zuQ8)tv?wa?_rf}E-&6-iCcSb59P3g45i~m68uN^Cxn1$2`re)j7m1gr>9MTe^XovJ zhWe1p{!fzVZ8@KwnI?`mo+-GM9C7FHk&8^|_GGm6BXO16WSm)z!@=QACOEf9)i~%9 zz0LE;=#1(94_(!hw~|BeWOY|($Nl>6nPpsAu3Lfr@1GGvgQh#eM@Rl#iyB`02X2dg z=<&^#z-R^P2&9~7(>P4ur95?8$~0m<@u4EYDS6HQy8_0$RXh*JZaR>2)hR2Ma1Aka z0;?hMHTI(tHYRZzKCNw$?6_}CF8=Tc5RZ)~D%P_p+ul*wY&h9Nm&;ol&-313Q_1nV z2HDDgN;q(W()SWPhPG%wh)blBb5FB%OQDJ`>jUnD;*s%epFEsMM=NNfs}boUKa_(P z$6nr*1+}4Z)c?@NIlAhbTcoi;OR)_SGSV{?@y2h(M6ypmNqu zYnZC1^OfS2A3-th8*B(wuJ(^2YKQK)l$K8wUQf%D09nc^hFIY;F}8TUQ*7k88)x(9 zI2N;GD^`C# zu@!#pUMl-P!Ei{&xug$OU^%l( zQ%7Y?%k;V*8QsQh6xoiKAC|K!$5)1lCP=*_mM_S+%?ChlSi?h=p@%U&Smu`39=02< zdmu*5FafM|l?OHCQzuXww8)y}vCVJfM;<0F)JHqPDT6sGi3}8tAa>B=$|r7sJ$F$k ztJ)fg_QI*!!?*>aMvN!H=7oU|*Oox}VL7lvb0=P-3``TuWvPZtJVqcmjy(ERrpANy@7}D)?vg% z@(AWx`dqBpuA&jjTdXNj-E4E-BBCnB?h=}ym;#j4qvWcnZq4Zj1zAMQMWe;d{b^|- z?XaG)yf+Leq`}@zd}k3!T)R>&H^R0?e*TQL0FV%(s2*yjyi+OKR{=S(l|}*S4^8V7 zw5!%xZ{S2M6D=jM#Mzo{^pui;A<+i->Q!AhVAP+5RZMEVtoVZ6`idp2AeS| zkK5dkb>9>s8d;I1CzoR_b`_7<2VV9Kyh_9^wLa=r$*oK=G+Ud`UFGG*+ZPC&16unP zx49#zfoBFalv;l)8hlPSWJi9M6gK3ygNN><+Q2yj&Ag*I!S$s_C}kWSYTLjCuT?yMZNONoe$Uv= z$8AimHWpn8xBKkZ9j}8Kr_P5sO}BOL_Jk$^b8Vb&9aHjzi#$XtrwupQA~6!|%$5|w zw?308G5wDzA6hW?U3mKQK1tgfC3-jvr5sB;zzGR2&~5ZNnix5lx5e}A)Afb^oBLnV zp4U&LM%Z93{uwZj_1tx;OXrcM7h9ng3G>?^U*ia{d*6y|G*!k$7z%f@A}3^+rL4Hz_zY3v6|dVX69kCem7jJdnDe!hOQrnR`hB{B;j`bN zRH}35RIUUJThSi*`j3ABJXB+;bI!I;Kk`rh%QKxXf_M<~JyF~mPQuKW^Zi}Yoq2$x z!Kila(oP-noncSV0CW142Xs%_o)^ortzKO!_4jW6=mDL1T@af!yS3|RLwP_27i3+cz+;TfNg&uU!7C#sW^ix?^g*II~>TxvA+3KUOl(1GNUy!sO8>tRdz?r>N8eurFxgNJ1jlxw(`*4#uRz~a5L3z`qctgSoe zRHl1=XN|2 zn+Nal#yCTVqvh?PyRnSZdS2dBi64GHG%mLN&p+(K{e%_m97KRPVjWv_-Qv~HL{D$~ za?+h(D;!V0JfL$KPSAAo-o{Z!Jk%}`QEei<8I;NZI8I%p-W8nqVp5Y)3_S&bJ>%&1 zJ^DgJUm5{qCsqyr+x6dau-X#CwOSdYoHzDZ$N|V}B!l)lu;kXYo5qCBjp5$qQ|yhs zrmZu-pGK@%YKg}<8oIl_N`ZcKKBw(tZyRKVuk9wz@*I@Iyb{UAtJ%iBFVGy8y{-rY z09%Lj+VEYa6$R)fSnb@!(hkZ7CPG3WH&z(m);z%#E(q7tXX=iUT@2R7KY)ZR-k1nC>S>QW?# zfPv)A7`Fyl@m$nGD&4=4wG`nezm#kwvtpK?xBnbauL|-Jz`h#JdCfgLVHoqHM5I3D z_l0u7d?atu0!=VD%VXd)d?|wt&+`5~_W11Q4e-z7xhPGIQyhY<5c!iEy^cqLxb1`b zf(9);zR42&>$|Y%<+p}EV>Z5&9G0GSu5IuxFDL2M;8p&qZw~5F_=?YI{RN5vD8E`@(v|6W!%a!Golx2#c8-?~+@K z$o=Ix0il7o^(gtDzzkgyC=&vskW4WZPjDcD1H^D}rn=VKvz2Kw5@X7ra4rnmajPg5 z3c|*69)GD%b)p{jlpCrm9ojAx|HaP=UF+y6p|fr=EO&FapkZ~v=ATPkaW02_T&HT$ z*i~Q#XyVv27B}MAJ_oVOiKi^n>?djNd%vcr8FJVT=c>$R{7*Vb;o7z^ZN2RUlRJ13 zS!2Ro+p^8R`kD6a)YAjs3pBt+EZt!8za0t6_ARyMuG^L++oUu;N5|_epE@WyT<^~~ zdMWRFbY8&3nU4!c&ljnCDF6lmXn^P@F3x7|)lt5dQ43Q(fP-xmqLJ*aUao{prYaX? z5dpT7oNXF&6*ky1=h#CeSp48Qd8v__6hdrt07T1x)QGUi zQ_dviEysZ7J)&c>`)v_O%`0TWnQ{74t?=00a5a15rNSU8>vXBt6h4%XT@zY&i>$j` zbXOi4k6rG%zJITT37VPLBByC^Gd9p*2p7V1@pi2oyz1IL;nAH}x@g>W{q3Eh8oD-0 z@QW$1>O1BL&YWU(x9gf8tt?$-s;rjAeAC2IT3WnKjLtDjGl$CiKXec6U(iGi=9~0~ zeR8h)EZo$OtDexz1YVMyO*q2G1SSeCMDV?HN(7_Ndh2u%* zQ$B|3jaW5$N&ZR+gaMrGS3T8%n&aRPZmtQeerM9m0}1FF$H1loWpxF>F|!Ot^^*}H zrB85jdb+j|$U`!39y~ys-;~ z>|E}mAM0Ys>9gh>(og0g;R2Mdl+8^I^P_pC5S_zEp83A+TbC>r1Q&t4*hOLRKeP5Q zM9U4`kVwfzUcsKF_oc*o!`!D3^7Scb)3hZt;kntUhyUlV$KRbFbE7MCgAxxcl>l0; zF~NWJjA1(Tcy*qX67@gNPp+C0tU`r30pUnewyFGi?&=X7c_KtCZvn*ELu32qRUUq{^z~3`8%scsfR}ml zcM4Mnn`|;&18fF{3FlFzLJ@CR;iDoEE*C7LsqX{1G&amy~USUr|U!A<3I_7H7 zN|NORWUF=7eWP_3Kunp^7T?U5sMY@eU5fMe-$9^$&MYr?3v&L-=BRIj0WNtF6 zY?OTHZ}6nOx3;8UXKDaPVPW|IaJs<87ywH6?VMl@VsPvZ{dU$QNnA+B{|a!vLAtRK zQ=hE@I^_qSE}b&q+#P5$h*ws3 zHJ0}}N(FD<*896105TAh41I+v5CB8~P=yOV@9v9z0l}$2#G}E^;qnF4Q8z||3J+&6 zs5BlTN9*(iSh`)u4%^r&a3~^Rq(H%fBo)bkMKVD4_h1`fsr28@q^-6wf1M)%pu*ok z1OTydtKDI0D+|Y|VyYAW{E789G}Hjx>>Cqws8h)bX}}D%3FpQW|1n&;pX3F(_u%?DLj3>sI1CCfH=RpDAw}zDG0E znCM(@H5O}-_BJTNKhPe!JiVqYn+R>d_nvWPo<4X-(?nQ#`)Ii^rJC)^zao%nJs)KS zi=8?5YJ7Lo@|bLPlS7s3vDSY{3_qh=ytktdzhGA?|zI)o>Lphbg zg@Z6Nldu|m&%UW%<4(z-afvYyq&t%V2!V+#L-{jh*ETmU8hMf`zoxl{<56xU*7`T0 zd|QE-rqxOeu8|XlR%BGTUbdzARQnVLV|Ay6e8?yPBLH?4A6?exf5{HS|G{z zLMiu}w~`4`HTo=Wo{e2>uZNNCZuEQ2c>ID(}o@FG}%u73%}(`Aw~ z*jEga{xwb=*QvLT2jM?1^yLjv4P*}nP-PS`Rc7ai4z7Nvekb-Q($64I`GR!3#_7q~&9o^=rE`Q0M`?dr0l$>`4TkyDrR z%bM~OEp}Ak@C)E!>tlbWrNe$0Ps;*qgPIwBfLw>T%*r!LyNlJYM@{5t#n={B6UW~) zlDEd~ufCo7_EF;7;ldYhUJtjNVHahDbRKHB`Sak(9W(#Uy=!@>ZJVrqa8`V(j&|?o zlRHaGV@*5We)zy(`(F%8|7H~j`agI8o*>Fm(6A2LJdok`(W{b@pi>gfCvMic!W}=d zn+r&Lj_*@4o+dTwY?+`o;);;5)O;yg3Q|NNsIx&3^a=wiYXxUQ70|6DH&vBEezvMr z2){4OML=R|sgQ6?VDyp;Dl|Qbr9c@I8J2RP^Xy{l#>fIHrLeHEo>)sYL=jr%8k~&B z=&{bUM!rs|?nNpMW%g$+w@&~4G>7U~L#2oSk8ugZW}mjk^x$cA4LgjjU8 zzE17U*Vn|S7L&J@61*u&imaZSD>~VO)-8Y(6B)%K3S3O=j_u9&(fX{QXsiP)z}YD* zHYoVsBXN{Br&(vFSkp*CV1!&Ez3h(xXdiM*i)Wu8>Y9B+h{6kipBca_>VpKt*Y>{Z zL4d4@ymieO&{DS)NstSk6~eH4ba%O-hXVjW4rWt`M@OW0xN98f{(JQH{l=2_d#8&1 zzMRcUVSiP98WQs!%f3mjvdKE|<7-rpjMJAliy>S4=aMkD-p@agQLT>VxNSCJ4FUE7 z1#_gmxiSF2#g(qrkYeOZxm=2BeAEB^xmMR&PgB=%AUWGHk_*h(mKKMJpGH&gl&PB* zrR3TiM`<&=Z~JOu+lwLcFr+WPPsy(l4;DkiB1)K2CTkuCHGUi|1b?wF#hcia~)E8Y?96nKQhRvvy4_9*|c;u+oM!EcjHa=hrp zVxjfJ`XLuuP1T`^Huc.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
    ~C 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

    r;(g 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

    XBo22VB_6o?OD9d3(kEC>c`K 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Ð5Y=Q4Fql#K@n$ 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 z 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 z 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 @OqLbWsMpUNfa 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 hymm|1 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

    jb73ahBtQU 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 z zfLKs9#*@JBm*2`1$}wo4C3v>7VDG#S69{A=w2TqhyFT$bLn3~Ck$}h;6Zs~W<`B{L0sRj%1t5iNa-P75`tjcXRCBZ0@!TDGr!dk=0Gy)2e=-KxM>%H#u>=#&_Ar-)?>Qh;W+RgxN4I zFzK7j8?{1r&JyI+|BgIx9pZ1ZFo+2D0OnC5zR1Z#z%1TAFPct)$Rvu1D3GbL{SX@D zPZS6x1(pp3A?HCVv_upafQlaqASi>NA_YQ;R|`3;J6Z?7kJ!s4Ny%}gFjSBP08tQt zcHv>qlhokfl5qf3bS3?l0(9$LxF4nwn2djx`j?n~HB=oEn z#CFwzx*bdsvdui$mZ@z2Cie6?G;mdv?xhIZN60EYml@LM>%Ex{tU8!8v#hyniulJ% z1#2l}QaI@*YoKfb=CKenPr$IK=<91}78%)J49|IV{Pa(BJiw8wm#(Lh(|8eq$Kglm zn4(R|lmOaeCg(H@Sy>5>7e}{+V3ixHY1b{66LI%==sKp^!7Nvq6$knn;w)8tkf}~! zKpX|?(uor0;W4fYG22UH{8M6gm|Iy4VJ~MF*oFr`(9=MKxjmv;x`yE{>ENCUaeOz* z&J@B7+3L`D$weyZUXH~_8?2r*&MMpuu4(apHTIG_P9%o)5rBdS@#f6whMNVXw&;>h z;6ya>bk;r*18o;5%4|Gm7RSg61|TRQjF;(sZ`k(a0*EIA⪚lGeMH)4$7q_l1?PT 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

    W$1`BY2?f(~K5%1TAF6tyn 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

    }*U2NeQW+7@(ZOJdIXh$7JkPrF%IY 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Μ2tJ=%MA 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 _owUVCfrQx+hWD;K|cS9x}xG)iR5p zEoXLnL$xdnr^WaRyJnMd#eaQ9JY|d=JH`P`u*L>lmjT35yFzHq@jOlfF7M9zodaed zQ7%)qM+!n}t}7|3dHQN4Qbn48`jXult4xm<?6x2)1A^)kmSIO)VAPFV z9|RPq3c!UjA$Ud>9$<-L_-sI^%dDgUSQH6H#j(_@0SF2Z%K#uY*hs3qCII&9bdTZ} z`C238k3{vw9>e?n+bRUCH>&&(8zpDWDu0P?9-F}`8sPY{kYFRa!su*Dup;(Peu~r% zerODc2Y`3c7$-z1@|Z?WMtP_3;dUhZt{=<0C9gA7!mZag# z%lWd-Af^{7^s^M*4Py|4HG;eV`w&U@?iiFd&Idfq+4q?Sn9Y>C3>;UN#C&ewAN+CEmbR>Rlu6`TX}w^ z+YFIq>voskj#)*FL8)tb%67TIMl5C~%ukZ-!~<-piMY(KL$M=|3H@ z_Iv5ykVQXKbqJ68NGx@?Lp9ie2X>~+ z*{bErn4mXQQNgF7*1{$GYVZ~4oNWWjfd&E~vMbP1CEs_Y=C&DG^do7yD=1U74#V@dY$~|>mZR0*NbPA#^v zWaddkIl?t4zd2@d{K*?+1TQZL2eJCe9#$?HQ7);;ETJxud=Flfh+y zzu{@#(6@GWZwIQXZ&sZJ7+=(#d82S=J&qKElgnq6Jc~1rP3lbLmgYPy(B9-ee?g)ve~scd^DQS@_HGOTjzE-G(UnD zk#~^0zp(oGKI)>Mtzpc`64b>9K+*2^b0xV|92{El48!8C{pkIqvO|b@*&%)2F2B>zh`vu3$v6g}R#1rneE9gsh6h-||B;zyni1H|omAT*35t;Hti>+E93`aCK@ zG;Kt%gcq%!iL7&eqtfF8H-~G89An5E@Yd2=SK^rC54KWQ0+~2Agx9!T0vRX~d5eJt zWsofnSKnPGd*!s%3g_+-S&Bm{Op>J0T3Z0OL7D%0DQuJthPNWhlqlE%N$aWQ#P9L+;K;%So^w? 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

    7#Veam5lV-Ni`mxj)och)p|A2aEG8@% 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 E3%rH`J!~e_m`22s60RS84CRV^#Fy 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�eY# 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

    2nRSj@-m5zS{F)?f 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

    !!loFFX56nrmiD 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

    V<;1kwh#g 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≻MM1l!?gLoeq{pQ4teOKO`=;kYV#ODiQRWaCgFje(XXVe?5nepkCv{#W< z7raIV(Cf!1_o=#o%^^$0UVm1xRJ<*o57%pL>Vp&5CQMglb1_gxuX>fq29htF|MuYP z<84rFzXrN6QbWrW!~1$SF9(;(d)U>va_#RBUl*`mB=}yw^j)@witKx00BHFp{Fby} z`lJRYq3@ASP4?Zcx9~t_yEaj-MO)srf(|3t{XN*-onX=iem+lOK2y+zd@y}3E$`b+ zaW0afm$Dm9-FY4<=EL1}AZtbEP60OGLoH2jxndZ?Ft!}EBOZd|LI|$=CAiJjRK{$< zz53^)AK_k`d}j^)P+}Vd70xfqJlC*Q zV;Da%`;AN&5_6Krd$NOGH^;a0T_7nl1F`2xmgB~1i6`uUY_Goi<8LmFz6AEjV=)rv z6H}oc552N@2LI?Tyegae!usl?8k#=GA6_ z*O*lwE(Cx1?2z)j=(KWmZDER~>HJHVQiSO-s#vhDe7 zdGD%kYE%OfvXA=dF=9vj)`;p)zOxF;uSJmZtev6~*3S(B#&Q&jddn(^l#q*T#-_oR zgh*q_lJuKSN&@fCh4`Qs&9g7F?~Gq7K=Q1vhwJ79b{=@O`+0FeFW&_Tzzu-ymNDfS z)B0u&JuncUIFmH3jnKM*C>#OTdx}B61`Ndh7vQ{W)0*b3h%Q ze?sW`u?9`9HVauOpVwEg`3^zWzF%t+YX7#J4A?lr;TBget#I~b;|jKe91*8&fw zJ+rC)m$TI3U;Wh@c5n1pa{RP7FH=Eq2lfq>KusGT4au>-SfGTjY73)gyw>I7_c&_h z=Irt$!`k3E=8b$AUv8MZ)#60#r{6ZF9kyzj8B+RGU?lcHDXJJCb?b?ArIH|jbDjdR zh_ucL*ZbS-MJ3-R-_2Pczak-Q*;I-u=#XfktupWQ(`_O==%FQ%A*=nl1Goc4`_YE@ zvrSQx$cT$bs1N#g}F0igS(+ zE~0~1bo(tUliQPCsJ+@Ru#A56D*EK}>Ul2g`y=va2hnPlUL0)kxm@xcuGMwxJA_*& zI@nFG$%n^C0!OjrZQu~D5$r=`ZRt#OCI)&tKCc!=Tg>eEylXd7WED)bO(he9+R|Ua zw4|^tuOGgPzqrB_C_X+ZrB8XEr7XT6zv~qEra8pPMXjKE*J9S^G;+T9EC^*F;<46q zg=QvXxaj87&*Ue$I=DrM)9Rz|tnVBa51E@9GuN;=x=wi%igvN?`e=tmDqGxm_IKH{fW=W}H-Js6x(bTL3j7Z{48&we{|d7Cn7g}v z|HGdW-XW($iwuxvKQFJz&y57a*D590Kn=VA@sT-=>KgIIu!P!I$%a+eg$P^^3A~pQ z@y`)B3T+(|s=hme8*?#iA&mcoUb;hWDhRy#uj}fG?95IDH=X^+MW7auqUA)<#1zUU zS7fc0p>LRjSqzHO-)Co0kOkGPWOmUOc+LGK2lH2Q9 z20t^pm#9TX<0v}Uv@|z~%9eg=YR|)$XJzrAt=Gct$p>iBZ1tSsd`AWy) zKq@vQ@vcjI2Y4u);A|VPZy3l`ch_nU3SQ4P?-596zYB(|s$%$cR7w=1a%PqXYbERH zQdAbn`V(x6^ilNNoJ>;vj-&#@vt3cPX|UK&N4-;%A+C~JK#U|HvYHz^g= z=+wW3ssOm~(nXb@t+w!iF~{->nsDINc*WF?kGlYBhi{WSZqo9OJMC6o3{D8jsekFR zN`1QTRrel^-SO67wFxIZ;6UGBxf19N|OV(6#!LRPI9;L_!Fo>O? zOA#!)+F)45IXR&|x7-ajhdlddUnL0DYzma;2qPDGzFWUI75Ej_Q|;pq0*OP{Ba|-k zvk8;DZKm!sai9dZR}S1GNp_N672C)pcwgHr@FvycF1INqgRy;=bbNoPZ`8BwuxHzh zypj|Qh8!M!^8gkO^}z#_;I_)YH-zU=HI22bf#BHL61f ztF)*4bfLfy@`)}~we}jq#3Jab1A@Gl&S&0mR9!3SaQZ=ILr+As#$)ob0XxIC&Ok5nPOANeP{7!DA1=`*(5HlK$ zOS}?kiBRCvCi$k3#y4Z}U3Glr4hErw4uD{B{uoSE4zX&6OhT{gWydx&WW!w0RfB& z?IwiV_~A(lN45Cb6aTs@_YPGnfZkM;RExhkOokp#gT;@ID96+-iChRGmt+NsI{w1d z$|Dbdb!&8%2tGA1)B11PhBqmby8C%>{L5jby70c!`Oh6+1)NPO#4do?us8!I( zFBu#YE$$xNz??F~bnAP<$RNtp3-pZVpVk`!PavSvV73&p<1IJSgwfCQ*!h42?jeoO zN_c7=WK60|ye;(|bN*zRwAS#Rchx|HRt5%64q5Ng)N$-vE1tr;9G{m`T_K^Xf#I9z zX(?(i=S`$f{KHZpf0JL#|0ci`|DC7q`bw9|>{Zj2(}tXT8SjU%>oxi3h{I9-J9=~V zUGI0ZgoOP4OR1N4AO7yJ0!R@mo#-fkFj%)d0T~|%-Qw8!%E`pBXVU` z-`;-qHWlN4@E6DI5Vg+T+48(pHT;HQGIQS~9ofS}s;!Xq#!x*>^VY-H*O=S&vqKj7 zA$W?I*yS)ip#HY_fV!;aFh6h!7~VgS=G13s|CNttvh9m5qxhqV?WD z4YX&}lFashoN7~`-~fy_JzRYOl-neP^8Dm-OV`&$S1jP(8BW9L3XTDOLA#&l8@ahV zjWV2?(I+^64G&kc88UW!c_bgB54iDo4 zHIKJ(^fxAK+nE#8Ig{GPyI+CN{W|W*Zl6~*bV|LS%+26mHQb#vD(!#%$g=J;gEzjd zlLQz`Wb_w^vEX91CqSV0LS`AVFfC$`t z(ASp=7BiY8vSJf?D@UMjao<3}%ZovL0$J;d>;Jb7Ubfj=@qXy`I7A}|^=O?{IFvF% z%mklz9i}-WF89M_W**HmUwxpo{@3%K+gje}ZS9 z;w>1;5f)nxk{i(3$ImFa-Y8RCP!4)t_LOtj^ZC*luubV_n~Q?`xY4qLzKiD_3M`lA z$XUR{{A~E5UJB$pqj`Dv*=6>G5Su~P0zTAC+OIO|Vz3}k`j(#co`<6IFX+IQH$Hp6 zxxO2mb99AN-QsAuus=Q-pb$A36p0v z@B&ca`0p=NQLgwbGH$x*f@EhG@2u-rhC_Uu@)MA6iDQva9!Rr@#%LUP*|)E_FAw`60&m@T)F+Ttw)1fG7k|66a_b| zfrZo9B6;ud2W9(Qt+IBGzMPiN%|UpbIehrZ+5NU97Hdn|29}Z${Gb1Cf2K$_P}QMf zU9$3Mcbr|xhxhzTQm}6o$972OMzH3xjR7$`>d4LJ@H3)4pAXg8(mB}R5v8M(9XC1k z#SdfUH6JEPhRgb%VcvI`>Pa8%+mEiblwc(XJy-N_^)Y&m<=ZNa-U!a;+M6Q%(Ltnz zTThw7GLZvS^#*p=pPP_9@-WoKsal_@VdcAJN5>YoXXP6B9d_7^%wEh@4v8+c{-%0A zk>MJr`FktqROyZ@3w+ke?;*C~p9cRiDIZc6o5}Q+J&Hp+SCilLoOexl1o?%fCa<`D z_{o`y`3rlXuq)CewEpPdxZVb6{f_Xly@` z?csJ2r~#AG6Z@%M+j{MaJW*Id$v1-&AZWW@K%ra!dxkA%_s%57I_N3A!T*q? zk`UlcBb57_M$sta2Fd?*jVmzK%LD9M{)?FYm}z zux<+&i&ZADJEnvIYp9S@is3n#?v|DQ>cW_g&=9S6(-W1Z#!9(k_!50+F_qw4qC43E zFLkP(y;S7%XSPn;eymj>Z6A`RGiPpJB8+YN%b7-MtyF^x^wf*96zo^!9bXXo+xyVC$bo=^#Oh+1zZDTbTKC``SXmMxa+S?QD6QWC~J(8;p*L5;X z!_3}G2m=<98&Nv$`I(KYSH{b(jMaX~j5={2uPeT`v47#Bo-~@$Tk-Yc?D7BB_RDY8 zkVML*R=S*1yVmMhb9eF>l;u%&^JkpcGVF=EZ>0N5UHKm*DajLPOZxiv!XI4#z}EGDSv zs#Zj{*Cp+P`9g4A)AOAGb5iE)w0pjZk)q*e)sYv8*V4sh#8FZf1?0d}GG_&Jo--qdS6q$|)7w zz7zO>1nbGZICC&>-|ea~!!FAKf2b~wl>VZj(MED?@L1K&jL0!Zc@RK4WL8V2s=_&S z!nt%q`J?I>?x~Vs5e?QSAdk?Q>T&#`Q|lk=ssK%-FBtZ&ei}&b)Kh0eEXTP#!T-~n zO+l%SmH)UtwsT2Dc^XYhup3hXc&@IV^Z8d`-_U=?`z{vrLA!GPnHG{sB!rvRBs?|mCUx_qZt z>Lk^9$D~wIX2VC#c@rov;8>0xr0$_PT!49nmtH>oxpU6vrtJbFPqLFlfRkrQ0PjSw zZwcITVpk6{cN-Hh2@t%0Bp+9j#BGXuO#yVA321qv3SQ5)+&9hu8e_on-}jNX+%h?z z?(qWJL6bQ(*5%;6C}l~^MSGE0+Lq~eEY<_0gHyA%mrUi|8YXO3+)Rt)7|?AE3{)(a zsj#s}7`RS7Qc}x$9Wuqarw_!Kd-o=ub1c6E`7Myq^~lKCS^h5U-T>j7@o}l7#-XT@ z(#pdg(awH)&lZwSrhhwrkY{3hAKzM9uhVOG@QtkqepbIq&SFmlZ0B3`Mx)BfQZ*hX z+XPRxz8^fWug6!B9mFx@Gma+eH-P2j8z9*9+kTJ|jPz#AW-C4n6%h0GyiC4Wb{>S@ zGg9{?Wjq{p7~bmZiDwy3hAO{Ln@wvz7Lq#Vh&qg;V7RpkC_8+Iihhq@$n|-t-!7Zi z>F6COkfPk~nMnj;M-D%!{v9-jKQPX_r%D5Z&z82Dark zE0r`&l!{2xJ8$t3vD^vebQ9PCPe&!}=dPaf_y;*UUCLfuii*X_rlP-LKG1W>ibSu; zcRf`vmn{9R9!J$H&ysf8{yx(TMrM0PS?;ME$gj;MDGWW8D!=-#G)O~R=05REYJp#T zJz1w>RJQ8ex%ttHp#~K<`XbR;bltC;moeA69~eov^j->XsVn%cN6t=OSAVYw*fjO( zw}*dVzRj0UUNj}znC{vN{PFmAEFw?t6u?QA8;V{;s%lK%fmvNkJd?RV4v?5o6t4NK z^*LDl_}!Yb%T|&j>y+njA!NZrkKKC6UpT0YB2P+L+gw2!LlYU51xTfY)tt?n{5W+^Jcc#PAZDlfyPEVX7h1EP)`VUrlf2eB za9Ht?DR^mK87eLnS3FM2u}5mjwU9O}^-c79eDo34h4{q~>0*`dOOztS?6;;fmp3=I zkjSE6IKis0_8T!_r1OT+ucpnE3&2haBN+=@82JGC&!D2;8*QI>HV*M3<*HQLb5pa+ zvXqZsj{5i|MxT@hVklk4$+0J=@$dk|Xe0if;d2j=!PUS|sHRw0FX?wL-L}ePN6F!X z4U7K9*>Zrq>?T+ae8}H;(LWiD-gK-i>QolUPrmWh?uIJu|E}U4iV6~=4kt(pXfla( zR2S>X2Os&_Mf58g+?E%SA@y4$;Z)OA{}t~j&rhgdfGFwD5%oU)Ev?)}smO`vkRguIQZbR}tjauI0TBFLjyzEMx9ieWsVj}@bvF`+7r|1#V5mz7cdoC}<>9EDl-?UgX3rF=$R;#cMIiU2 zosOT+qGo2Uz7`q23eqgoOVgK1qe>Ztk+qP7(Y@ODeZ}wRKV_F>SvRrtV?H{R9EmI> zA)C6${Y&uEGyWWz(G*^z#xy>=3*SrnYaIbAr9-aa6~&>dO+bzMP$dh#T2iQ@22eV? zHW>m!Flmr$wQ~7Ms$xE_d_=8$O0G5u9z-Hle~@?GLn_sgYS;PCnoSt=ZS`Hor^Fb| z%#j~>86^55C2=u)NQ3b)j^nj$QoSN+Fp>0Y>@RY8J0eBp=Dx z94uv{)d;?WJfs#u4$F`|osS}h${QZ<`6eB^Dz=dDrDp*aSLAxl!hFI))q5DEalIQ4M!V3!+nlf({CF!h2uLTidR1v*=t+$~Racly@z}n*>WI!4{9-tOZ$P zDPYkY#hXXkjfbwvJ9v<~!gQ^%S{+CLdHps-!Qxe8p1wx10g~>h$&(5apMD&w6vtPU z_!1QNhboTZWoiM^7iz%(aaR;iDtkoMX;kTPsG_%pvwx{`T`f?W?kFb&cncxcD^A!3 zhbLbk5W1sIJ0#nJP^IAHlmttzg@lM9_ILnY`xUa(DIM?NS9|qL*j5sx#(ES2wIG}s z1ynHI!^Q5mEdU@fFvv-3>lHNb6LO>$y@>=yO(T(0iX~($aq60NA-sxiCLg-{FCCps zn(8oARwH9azav{}VY*3}_Jtk%StK|5D3489yA4BHSf2SXfUO7Sk2=UDJA`Xnrhu(A zEGXm#h~MHy_mMfwiA7h1stcwzE48mWU8p2r>?eHVpX>k-A^p!s$k;wA zl`mJX7wFXE-&hM-I3ddZFhQADM<7Hj}FhRU`PI1yfQQJ@Ol&hygeGVTP6hlJ3Mm9&ogm|?W zOXZ|#MG*<&=>%J?y*_!zSK<}&4{9A^bTu^+_COq6Lx_3%Q!!s`l^vzE*{Dlr!vzV4 zR{^nObeGjy84ds?{n9K~?AxUz$D{66k!n^8m2IKJC7U-U4l+^L9Y@3Qf#ae2768Pz zeLBngu&Z}sm++W!JZ(1sC3}yC&<|-Vk{=PRUTcSp(VIi+Fd-(!TAva2KEs@PG=AXD zbiE%@+ho4YhyxS#m>W@F`<-^Jh;S91*1Ekht*J#oxSve<&&{G=G5BOS;)l6h5IN0p zibEt|YAI~qa9}bW?p=#6-EzwGL)x9_h*bBW9ttc3kELvG4_PS?f#_PR@SsnqmBy_( zB$NeNRU8_8#!J1QkL#Y&ys(VUrh!#{X(o|SzI>J0bHSro+n!9RT}WaYPrr;}UFp9H zJ4}w|kkg9cn;o_7l5pwHljvkIa%;sF2?eNNNnmYng7y2Sk%8K!c>zsN1B`uy^p7>^ zPvH+p(aBM1I%I^?rX2hWS(2@C8E_2|LfZfPTvZp`zPk{iZ>jS0)nx@*LB5A}&#lmYOAUK4_IL0Bg-1aEF3Pe82#qE63fwhyI4>mA~4 zEOv&Sd+wTkdfa`txZLr@9!Y3+@#*DrCrQvCF*-3+&2ab6k*Ntlw?+#?X+!J??w3ju z%f-~G;pgkx$2CSbp`l78{bI$?|wFplg6ktyxUSDxK{L%v{ zypJTcDZdGEra8X2WD|bf?Q=5d=*zZ??Ou^a`-+(m7oO}VZm{=|MlC2R3QZL2hZPulN082!-rDsLasf~5vJ~1K?%pqKREjpV)glf5i;rd6mv(i7>eZWpN_4`9|8m=MNa3E*W;m0LCD_3 zNK!%Xf4&EVBp4Qi*mUWHG&Cr>|KjNW<*1rz1m+t}v7V0`6KUkv1&@X*`G(>K3AnrQ z=rOP~X}?PTl;+*KAxXv%>@AH>LNv_{$n+)ZYJUgi;49+^ud1MxF65k42*0bJVASRt2QI8$EgN&u2-- zdB~n$n*G1VwL_*jbxxcNw);TDr)i;n)L;t4vY8}L*n^|aI&&(Lk7lUTy*>PC zu>0!V1w;v`fzm5I{MbM6Q&TSn&8>e^`epjxyRYGo!MBR_3-=#6%uoRFrAv6)t-Fdc z{t!dz&>i{9Mi=3;038imZMD$p53iJm=_s{2B_cFojwiR*K(*zlLsZC&IT?OM?m+Pz>5A8^wep`)CEl+P6Fr*NoyDgkaljc;woJW$!A6>NEtmnH}I<|phP`h z5An<1IgN0zB0=!u^o6VL=Y@NchHrZN#+p{vWO|^DfTfV27w3&a?l%U!{9tZHU@>e( z(t3*9-IFZ_Gf^-9TZq zS8(rQLEe$K=C%n)nFb@FU4PEI0T&Z43&0>MY1q-rX>q9T+{%U<8s()(P)J9$pCz;jl%lZg+>zDViH-C~g zofA=ZmQh8yGNz%d4g7m&$GW4N&@%mo@2AV^D?;9&tmy{=WsiVPzftV?e4C#$o1HYn zO8d425@AeoX(Wocfw1a`MoiVOVx-TvN^rUv_*52EkO9;}p8*?YC*jHn_;fw+EItp{ zY{-T0w#4G|4EkFlBoHb}3>b>s0?OZQU5As{Jw(PM9pkZ)c{=M$S>W9{d=VX4MPlU3 zSn{(p*50MOb{zNnUF`6s@rt|MpYDbis6!`sG$|+Yi>sBSyz0_w^3CIUQi=QcS@1I+ zXdLk92<$4%ybKAJ!=69`E6$lqE!jU`lF%7Kb~ni+A{pvuH-Go+YF}TL)Jf#wT(#o#x`NDKv9o%kUwJwWIJS?; zeQQbQ36Ce8o*EMfG#)Z7i#y)3HKdpNM;%4JkDx$&}G+neiUdB@P5rRN?| z=(6nt=qxabh`I{@^Py^Sl>Qz$iCj{O^9%Kb($!YU7PSflF>eqnBdg~ z^XD`iv`gpyma!irn;&prv%lMmyzq$ar1)+HacF)GcF@LtZE7?JmAUDJ2gN4c-oJFj zRhV(=P2#P%)zSL=SJq?EZ{J&w1#-9UPu`v>T9qeEJ^j0Mckufer0|<;zLC(cU)8j< z7T1T)A$CGz21=7%&^an2Q;tfJy5t|HhX0;Pl#1y`?GXAhj7-@1AqV;fYwf(g>&5wxtzLss(AR!JxZcfQ2L?H=hI-_L`m> z?$*J7R3756_OM|^$vGvtohnf4=FVPHqO7D%QQM&3YUvX#~?$hvL zk%o_@uatH+UtGn)y!cMbI^lN~t!CjfQH6?U0Ee`RIJwbvaU(fz_E!Ys-{y@x%n9_2#I;ND_z%eYsJY?KBqbp+ds-@)79T# zG?ByFl4Oh%YQZqux-ncj=G~kUm)-046jewzZn*WS1!_S#4o|54sNBJUSk?_s_&3if zMLYBc9PccMCUe!Ni7o*TrpND?N4B(WGEtg10=fB$q!8m`>tj}sR28XG*p!80AscqU zXJt;=_eQ9N=l8j!-YwUclyJjpPh3;-DiI{Cm(oA+N6QM z60_5gzitP&L8F|>UFy~#H6P<*nK}SO?JxVosw57d$nK85Rk6n#;WDG>Tpy15n+6OBsvf^!j3;&8J<7qGk%j8-J5bX<+o@xClNOQE3mx)M6)t-U6YAH9o zE=dwF0nF>tOp>^5uLWHf6QQ-#!nCz{GWjf+dxzW9yQg{BKaSAwU^;Er?)fuCDcFw+ z%{Dzob9sR&>0It0yLZo(@TDYp_&A; z2H1;9HfnYuDRodXX0?lH{t$ zs-sMnWpnF${8@i)*u{UCk(c4^G1^jv>pi-6>!3r9SrZi*&ext>Gt}p)%e)SIZ|T7e z?!;fMOe$WQ0w^fVoaBwP+nxheRy*2OZ&~|@1I&vIbNylk?<^mw>3jcQ32Zd3m_!mR%Kx=XsFR|8Q(p4o9kL^ zKGgi=32pkxy-+P26mQ$6g*4EVXKR`J!)AYBcZu>tgw$4QYQ&n%FHU#|C7nxw_wJ!B zpvg&A0cTH2KR~8Yp=sx?v2L*?H7DXaD5r)v%w%$UShRGOOUUN{|4D%V8T#pJC?tp@ zdEGTWi0W>O6_Z258~E92rKedo@$u+fe*vta0;Ed?ooa(0i;j4IpZsnz;Q`vX zV8t*4gU65Fy&4jrFZA!UI(Drik4Fl;G{1^iLX;ECq~9HEOSAy!Rh5^}v0T8EU#B|*oDg#pNJ|VkbF`*DTU$kkq3(YNx z6{NKxkkJyzco=G`-h&-c(tPZrWvt7br=+4()qhbCi=@Egfgw}Z{rfoVg%Ogzz`r^Wa^b$@l?uplcd1J| z&OD-s7gFJTtQ6&8Tz%^4)S%o96qo-aXtkRs~G0P zj4|9(;kT;qzZ!TqI>eVr4z^0xCHmj-uWl1ah3jf2Q?z6hpy331=WrGYP_~K_MqzBx zhU?z0F6URZeKuyrv>U*4!*#3ov{dibt%gV9Cct)UGW*tKR>GqM-t~g;!-`Q%Au@$` zGMzF>i+K}}Z%~~%F8bz_Z+Gl<5$9N*d`cW~CN?oGTPnsq`|x-`fBAt)3c{ZU`-8C^ ztdqDwf=`OT(s5YH2}A=rw~5+V0g~~ok-SGjct4W#jh7M-uAX8;PPM=%`60nm{yvIX z?bn$@=<3pqm$&j+9+8@>oO)P>Q*XrQ$?s*hd2#zXP2t^QBvs_T}^#Gan;|9fC{a%7|`F1+jC}h zf?24#4{YVH&qgcwa~9N22_Pt`3y6V<%9XrN(JiwXY=&0H_qs4%inrn`y<@P;mev}t$6~@7a-MXCZ)dk=y1Eg87e?4 zCWCU4#Usg>q)NjT@1Fh?*CBAd)ayT@B+TpJKZ;m=#$>hkQxG=P_#0TnyShdJA8~^u zHNoKoqu}uXaAgiCl`WaG!uePyabJK?Oq6*?I_;v=Mq}PTZkI7?b?hwa{&*hw=t6)2 zDmJ+(BxkKyX6aGzQou>&xYPS-!-70)V#xQsiOdPw(1Lp=#{dUV-@yY98ydg8q#`T8x*3qs!^cMmUIlcE4dIQ<0xH(yi&$HMs%cWckpUJn8tH(iZftF67lc;(6 z7d!LNA)l_j=GwZx$0$z$kA?Lp9$48Izv>Mm@x|(W#1{X_EK$;XCoc6{-G0-4lz;#F zEmFT&?a}zv@{DWGllOB&q=tBqyJ6*FW|d*G>rz)R@~MO!=@wF40AhyvvPM9xa1$f` zmYJ!Q{!%CX);MjdR&o(}Etj5fEU*G~Km4tK_|zHyL279KVjpkeHET^~sONa3encST z6mOh4O}fH@4h;*^f^Q|}#DuICkVn7y&+Qj`{!7yg@bCx7F{h=so!WD!^F%CPYLqe} zL_R2FL%!RaQ`s`t^a+Iop7x{`)2!SbA4VP z&{9iDdMl+xd3kcKvuAWrd>I$D5)Qiw*NP>*2w2nd-XVVAisc+lx))1(>tE3~0DpHa z1iHoQY?ZtskeU*}nvv?66{pU)vY+={3RvKEh6m>SO}(vxU=7{QB*X>rFBD=;jP)pTGYgVnL2s@vkVSZp+MrzEgNbursXT9#|K#(#$i|v=(0{Qn49DV$m z5G@(&;yeIhnKy7?2^zwiNka82d`|50p$^!=7V;#c>B zQjl|NFn z03J?0GrNW@6S5)QJF*NOecJUnF#b+D-3q>l47mB~(~n$#>bdOk>7#z_M+uTAZTv-B z{fdy6vLXAcvoq2qJJRJ3&f|{^ja`S5SC@)Mi+;jDD8by{L{!*R{{6RRN;n6&K=a`_JJjB#N= zesywoHsVTP!ll?VENMt(IjGc40ZR#Ho+Fm;&dpHDt>2N`xOhhH0PWPI|DF6R8u@`k zN{Ad~Uf#~cN#>QoFmh)-c~G%p=&yg*pQ}NGiT)S=e4xZ|(GB$Iz?f*kcwRxspJScj zP~o-Ay@h75XA;QWN7B)MOLjp7v4!lfHyccM59%CAL8F|Jg(bZ2Tsf3->|qE}eaIk4 ztrx!YLrD6az>?T8()w6id)aelh-+Ac%hLll`Tch5^+M#9xa2(6cOw41Hr!Oxszc%s zaT&QHbGT9~Od$C)JR0vh|LLchlae_~Mr%e(Jq5k6ZZ@$;1^u!``bbP!=dkeKyX@^V9;6u0Zo&v%ZY%?G_VD}U8mg*<4kw)kT*eK&cb84-Ekv&J%^ zuSi2Z^#IBuVQQ=?==}bd4ZeG{ZhM0u18jACwzTY{7_Xv>4yVKvJ;s)J#;JF{*J z^m}UHo}uu?LjKXQ=O@2LY~>#}KwQ}uAo5PnSHFyP{|~ACB^l}^zbjx{d+wv^iDHX} zjk1b)L+c9`K8-|od85K|T!wk9WqZ+k(WCTW^}W=uDsRakUvnqJ-=R4j(o8SKztUY&3O&|& z3zafm3az2@rw3|NUezxs< zw36>9CRDH9d}01L6SW2PVI~^gswF@1ma0Dh%i{oK z?xI@Ou`-dx`ylG8NwxFNp@EQr6gP*{k820jlPYLMO8)a|7%c7!Ir90|w?Q(01HSv0 z!?}&|q-Oy6a};i-x##+2h{fE42=E4acuwec!)AWtQvcGdbwKEjTIEmYPc$-+_=H-l zf9Yb?&kx*aMNzeJ&lO+FhHETY^InWjXmWrl>S#sD!E0>-pWL`g#LYv8vdnr|87#*k!1I2Qz3nE=g_EYWv)?uX2FXK zciI~_dcAA1!_!qG1!w#o-R||U_chsy2(9bW&i-1#-8^h`?fJPEg;Rn>Eo*9&$tU!(TTKBwV34DpR)xU=VjP`B~RP*{GlQrBC~&= zVi?OoSqN2a-EAY;yq&*_19Ql-Ki_max~<9BS_-t->#ksV7DsB!m5yS(J~vItjcH7b z{&`wG2#_roQ>KR+7qBYk@bY;paE~@3b3Zl4DHQt&l`ixd+o`92gOk1^bfL+`>52En zDl8p6vJNr7Nno~?0L0XDumAuCC?~2j2dDr|hB})J5B@r+%Lj;~>-O(1;^)itXIbB& zRf?)IlqZe)+av1HseEo-BtM;%8ba!HX;k{6g z3!fto%<-0AW}=BUmGUh6-ifrEJEkejw($ zgIATEDk9I%sOWmV0wTQC5vWfbsAa)?`9=IkwKdrE!Ia(#{W;4M9w0@z@5_jClDx?z z2WrFf&XoWIppjG>;4pwH)`nN)wDh``r4}ZT+ZDsM;)#910KX=@;?#PN)fjM`k~@fs zHfwy^FLCi;IjCj0r59UQQd*-adHq1XThI^xsx~O=JhQFVGV$-o0Yo>7x9;nuyYVJk zPf1b8&bIIWRjh}`%e{d0Su%u7I|4cj(PiPqSmChTs4?;{s(LL0Mwzku=kDJ~7mXmF zV7*12S9k?;HEH~O3l^>0{>l=s zeG0oiryGaf1we8%meC98yw-xJKa5&`n$H`IUeUDm>Ao)4>hh|NhDhv4)7c%+O}3L3bNlO>~r21^%k?p$TgULOD!=FVZwpw_$fD=Q0sr+;K4XAe3_>z4i|FSw8;l7k~)1D|zQcU{SF<&A|vk)m1XOnYrkboU4Sue@Gj^9W{*xTZEi4&~6*(a7)t-6!6Y|Xr8 zLQC}nxEIFxt?Hd-m;dUCLZ!Vb`@S~3E;Vzj69P{4{IImQwD^^lAE>;ScmUp&05 zDr1~QNmI)K*E#lc;<7IC$f1!iqS8Jf%Cts*O{bD5S3=k_i=^!sc=_OxrYi##y}>d` zG=u-B4?Qe<8Z2Q4U}U3cdv59OM={Xg*)40;7wm3>^k0AC&~xxuEaT?U_aJRI8bYXI z&&Pc)c)o+ahs*|}mN-ytUau&jD0<<2T%4kCK~HQp@AOEPTlWc9=F-NQf0uqwRu+l4 zWuC72{VlDukDnZNAx^=BbeytYbGQyDNM8wurrmyf?$_=Tpm(qtI3}uVd;2wLv0-Z) z)+Q}PuyIHaLe|EKzylX*B~FZ4DDz(RXd85D_tlqK24pu1 z&_NHyLd)LjcJ-It?Rdl>l&zGoTtadiujt4z=-YAOZmAHMSqSKJQ_M)`QuEHWBrY*?zip{C1MIB zg!#t5JM*r_!3vwJvykNn>u+YR=j-F83Rf=ei>U4XD=s%h9~6>qXI8PI*brA6kewUY z8F{I8^Kl^IVmBR8>j^zvXJDrSu4|;npinDqlU%bN|F)1Qp3E=#phN;vTzzgORCb_chizP{B@Y5aVpIKgI0{ zp!_~5zhhnYzHghWXK}Hh#P>~Jk6ivEj5wo(*+_%oX5}UstWW~hR0Uva$ej0l6PY`CjK^(sqXA|pS_5lyTayBGm?};? zPaEjIUSR84a)Z&?{GSj5mIJD8cNA~U$#|~-Wy~;t4SNnQvH!GS;CASe>XxthLx0fX z$xUsUHev_+Vcs1${9t}ZReqLmDbFrXqF2W0 zUKcMBu(UIjnVj)zzQQWsf6eEBheNqZILgJg*gnrL1YH}#gyOt^&FpLVdlcFg_K9gdAf}sa%js z=wK~Pm3~>j^HmUn`*YsB_VdY&gEe1EA`Q11#-=eir%cu$CpI8Yer{V_% z*RLAoJWrE;x(PP6p(=^SfBFG30sx!$U<|Sr$i|lt?p2fdZ2GfC#mPKtCO*Qam2kz8P8vfnH+RiuRgBT zsk-E;bAJs9RdA!i$uwjO0EPSvZ;C*z)0EJk;p;T5st5=fSkVjEDRcoqYyiY9CS&13 zDLQ9uv^lemeCgO3BU9vb&IKU(jj{;Z$ zO+deBDzXkJ)goHFpWJpT5)cO=QQ6xe|0?D>Z%1_L1Bi-{M8X&gdjOwodU5Ui1o$Aw zP0Iv#Pf#T7Iww0?E?r@xcM?naOz?B_c1H+18g}PSl^u&6V^PFV2|4vgFU+4L*U4k; zP12d71$qx;;z(AXzKfO#^nolER|*bl(s+5E5vvN;uA^K2zZgma?ICICaO{r|uG#W6 zLOxVv5~WApdVK~Idz_4_+xU@ibtmF-t{+A`4fcIF;P+@iN?Hf&5Mk7^{qnhp9FRm19cnyUaqpk zE|2ouDMB=Zk{To)13hA?e`ZiC2+m9^tFf&qA7i;Sz*AxO0A0Rz;s_0r?E| zSdbIOKK>0Om^5i^k64h)`o8tS-xujW3bahS6Nf}k@#)gJkkpQAg&b-1&$7#;#umcm zBpZvzl*;=&#&P1J)v41$;mO|_&ir*A3H&PP(3AiEa`2gIRqxl3Qa3jcttS*`uWula zUGj>(2-!F5Qf2wRSo)w!CTgevIfjdSeQawb!4Y@=RX9LYn!{5 z!3gKRF?YEEl=u-gbwD=6s%K(3OY)P139IBLJIzM!3w!>RxJ;I1tDIk}xj2 zRcjuiC7dJjUr1bJ8I=7lXg-ylTezZr|KsK<;N22#E&EVF`2JRnwL_xc@ZiSlhrE)^ zb&wodeBAuTZZ_DwnQ4KcA3S&I-1uH+HZ#uc;zxa_BP6;;EPX;-Oz<6KM9!L7W_n?~ zI}fl_CJRjYhF^s``g;Y>_r*y$zA05LTRK~xUrqRz=>~~(6R#A`6p$8=x_x)8`j0y_ z@~=s2zM^;wJzdaojV`;N+Vne#|J)iZRQwxDCMo-XU&Aev2}SBzazdb8$I?u-=>h31 zb)p+zgeO_BJWsb2X=XujrRuPy5uCg)2~n$Wg0hGkDSH2C_4TK_HrHBT_G&ikR4q^4>bai|3aI@LH_Vd-BLpqv%M7@0c?k*|Qt^;;=VMf9zR!7^; z30&A1bwTW++3(k$=PlYxH#{boFp(+EOPrZcl-Jr7(=FB7wL?`H>|DbG4mbwXYUi3Z zQhyy1$LXyXTir!CjhkK27O##KQWnY+U1nJa6z}=@zI4#tc8ak3{4P?)UOONKff0@k zyBshJS18py33K)-GTr*k^Z>Ot$`u>o=6W5|)ywLPgf`}cta3ex7mhxn>{Pjdk9}EXykd!-#y&Q9T-N1;%MhW!pItgoxvIUeC3lP)2w$s|C#*#ME-z{xqi_h zLw;#bpXTV8|FmG`d_C8tq0sh``R_q3JwWUJ{bseDE;{s<<56eY*!FkTJjIiH*)(i(wC~BZqTs z!5n5}UQOgHM^6OT^Wn)9n3wNR?cQqJ51ePdWS1=v!ZI_`u){WV<8zsJe(0vlV>18Aw>2R^_4KIt{ zG(pYODOsbunVC&o%|AB7*b&*nqy4>VHN0-)`@dvF0aZn4XUS9=QCBUuQU4G~0$EWZ zYC`vxVK%{Vi&&(d5krO$3LArp_0WgHrGx)v%S+&UGSla^yxpedTgI$f{eNkNPvKR% zTEG|h^IBIhu9i2wA6(vinRI_W+cq)$PO)}^%84?TZOd}8{f924j^DcP1yQPTm``d8 zSSThK2;zBnnkZp3K>Si5n6bO;ihA@?=)z5(7m^U!Dh|wVwkk99W14gL{H40Nvhb-c zrMLHb_C&owxwz;i?XzwCP6_G{QJ1m4-*VW8`dbD*z1wh+CuErngcl{P%&Uxpl>>89 z@?rYPA@|)3ENXuj6WO{-LLN>>=lCpYjyyZ37I1iA!_1*ec3Qs<3^}?$647I{<+CYl?uw@C&z!wceH!5ZE0f#nI z@79I(>=+uZaN98~+2#iTDlLr#+brCGgRRXHbIU&qcLH_=`BTMOuW%e!A}SwM9Rw<% z0bm0v$eZM3oW0BI{!O#%DYiWpmo_d~T@ypKq(@q&?9Be|VNvi5mx4YxT#>jV5^?>6 z)Gifp5dnSA1bZ={jj2;+!Z=m^loqJ~3Uc+k$~%~GjfOa3QL3Z;CI#yStO zgSba7S5TSy8ol3|t@Gpp8?1rEiSI&cBT6W-sSng(TAw2{z5)Qa6FZFG%$Dq#QUBhu z9Uhzj{V45^WbPRYFF3*Z$TDoK9~!GKBCF6*9|7V!yIt<u4yQW6~ zpAM?LEA-(+JM8)c9&9~p04>qMQ%oAvcmD+|sS|*3Ln=^JP!_g5Ya~S?0VO$9aeKfg z$jY17|9$x#ypvB;BCctby)-tIKmvhdc}g9Ef&_N9_Vl9cAX9Fzv1C=o4f0!!yGtS9 zUEU6J-Gx!Uq(L-%&(JjC?}gjA>dMbClTKR|HrO{N)-GmZz*`p3xRxVYjcn-hT3vl2 zuhLk(hmbR4(3h0$FhY{&@` zInY(atC@*i+cy|5L?)M&7a>d$8T2j}h@Wb5E+TagF+qA$p)Mu8M*)zx1@xqx4|g^S zqtcPk4_)R{B}od9yXo?NQ}~AjA5+gRU<>wI)q5Ev7_`YHy(dA59MZ`=NPp0E233ZI zz1|oGYkn^V2g?OlgkzKpk8@xJc#LPT&M-6q{u;wWq_BI5ZN1a|ENkcfrv3C)O5Gta zq^_ASOzfD*8bC+U!GmdUEj#HiJ4aBkX zLFkWe0*Tis+s86?+U-Zvu*dJNqB~4+cargcZ{v58#q662{|fs%6@v;oLKRh2^Ci#~ zHg)}0g_g%8+&sNTv0a5;?(*FtpFEKK|&5rP4Ll$tnV@CtE1ju_>=qvtCe5gUFQD--cvC@On? z6U0H@*}otF$Q^#QqyiN~Q!j}UwQd|Kdoh!`g0-#gMs4N_nI3n#H^y+_;E)SL#RC(@ zJ@D#9{Oxg;z}eThQiBN}gas0Y=2ro;$5$ zy=_adb`RU7&t_GAwck}b*yASUOcq@V#(IkCCY`4)DrAyrh6Wn@jj6DM3 zPHWYu7I4F&>_h`C=V!thzC-OD6yuLQ0;*em-)u5#f#%^~Rp?NxfR}%ne$RRNS z&6|M9AnK))KGInp3p{KxD(V_%Kn6eWa{pokvfFhaF9MDQ@TohyeYE{uX49a7^NSi9 zrLN_@iOq9_p@x;v!}aPi#FkGta3lLAi{pH|aXx19V+8`3sJ zRw~!MQ9$6}oi+2$IXbB~9P!At&zfdfDFhehaEK-B;++h z1U^T1Wvp}>sEB>9#?jK0)65LjC|{pNWuHqF%V2+XbjvzhZ}`u1&Oz1Px}TfBEGw=l zL$Mi%LLX{<_9|*c!?H1JsBPxoLoF*xl>?C|^zf(e>7Ut*_K*3ig_|0acgCsG7=7FH zzMVkZv^Z3lyGQ!9UN84iLvJ@YLTIEKZ9t070(MrKBzTBE%zf!Rz6Z z`K!1OT3g1+5+;|+^7AQNy=H(^RapHQ54f|nK_ym7X z6~DaYWRf27xn}81cfLXi{wvE+Xs~$4cwI_M!7p`QTx-2w=^IWTsj`Q{*Se@Z{0#aB zd^Ep`ZaPgfXhgCe&X`@}zHVYO%N6ZaxW+0VYs+_owl6p0$8%o*3dVr)vgnFX=lv~H zr3&bZD(BvP4bD$Y$(khxEDMV^lRW!7HNVm1ssOldZd9V%`;~!%Ha%9Iil3Mt7Pa#N z`dLx6QkDumRumA1(WPhzkRf|qw~K-{^<1NbN%>)Kx&?rd0ATF^0Lf{x;Q$&3ZZhWI z79M=tc`;0{LTrqJFy>l~#Xsz>SdQAC1W2qoxnJ#Ey%oR9!l4JVQfj3RlJNP~`s$#< z5r|LYo7+)Ljp_-T4sGG^VHa;AQ?4&^-quyzxc`JoC!^*VjeS9MVOJmfnr@Q?c>0?0 zW$>)ckRwSyZ&}>PCQHv5&N`#4l_;hmYKzwc%GT1HEdfX>5I`2&V|WYp9zk(v3Gv>) z6vVZi>NJVZ8cGD2$u*e8n7$O~*u!oZK5@gf0lhYnC?LhH17O>g2(U&}HaXKnhs#2{ zHJiW~@p~TY<^!6}Dm>Ggef*d;Q#S@qe24?D;sE8HcLSDI1tt9}9=mDq%VJBG?O*6% zpQ8$sRw50G!jV+@at-bbYld8z<~x>|Kv(vE%JEpDNIQbsqG|IuLCd?N*Ae#G7_^f& z&+CSMwy?qTl5dpuQASO`ijP0c)!E6%mJxL9Oz+yzNPJ-(=kN7}nos7T@;*@~bP8Q; zohKbtOv}<~#w4oUUcsUWVS78`eIQFXHvT4*%!GF?J}BFV;CkK6YPhl1mEYH99% zc#9=5S{N55-TjU2GBYLduCeZ+n+L`NWM9R_kVV)3p|wR%J3l(YVf5itR>YnERbYA| zz*hSjES=V{wSbBo4kCwR9+_L|R{~`?pO*p0Bv4^x9GpEhdT-(Ix649MaC7N*no&32 z7~B;nbD!dVH&bz>EQJ-jEjH44Kpc#B`lFMyY`| zLduChtk>H>pWpYKay(x;S{4i$+y9vyAlBw{bM^cEoF0>3r+wkh2`0oD=&=U^uWuZ$ z2R1o@*^iE#frfP!KBy}&u`jk7!tccPkb;l%5MLeB?wp6bJ(m{U-ikvt;!cl=`J5Ni zpxnx+0%|$KO$(ImuhJNfXNAT`I!Yn}_pRQ&j#KXD*gB~0-|B+NnK-W5UVU#@*KKEF z*|qaYatW)-mH>K9aC&92|Ym@2MXZ_a^>K6LY-#Su=i2tBu}0wV(r__ZY?fl#UFgh?Zt4 zhq&g5L$zE}$r}dmbgZ#l(|L_72>o-t=C{>D`D<7iw2e+}AL{@frHB8q&pea#&#{q) zoOjK+lx=D`^uzol$V4A1*e8K4&u2AsKcJ%m>6hEA9w^QCbdXC_V z8O(@STjo&fq-fuz>xcV!$T{F-YTkFP3YqRoS5=%PHsIujW1^6pWs4&?;)om3fonsL z-qjpi!?oS;wz5aJ&;z~svY0OHQbbV9#HW0N?-Llt!m~H=Do3ZDCk-}dl*hbOAItQ=YSbus zvig29?D=8iuY!r^ZPA79`ASFMI3^6ex_VPsIxt~#HapPj=JL`(#Q+|3Tg@us{Uf6A z5j!G21u75pDZ_a4vW`~Ly_-qAK=2j>xUJ~PLV*qox25kk@&a>$`MBuUwv&&?s{YJ?<& zN_3oKPH7Gm>Qi$_ItiUn*>B(9Kl^j1#~$~t`?_B5=gafZYxh+CL(QNS`bv7ArC>%95a!w067ZQ(+H)lm{4fAy+hV#Ped zM$czZHn`LvyyjD__6Pl&JJGr3kW;Hb2NkmYNUhxM%vSS;R_4-l<$^MK0qs z=xxdpvV7Nl+Czk}AcEtYDs#u9n4LibIWpS ziYj!_4vz8<9#+#oxk8A-{}3z!{K0LoqMdf4D(Of7TZv%fXp~wuSv{PJ(ja~Wq>C!l zD}wrKLMrJi{+U;TlIRQ$p{qN%qP46Y=J8}?9qtjz&1s#YJTOHZzt#G!s9G{xbq2o~h0!7gaeQG=HX+ri{AzR@#Dg9VD7^Z|ZSdwAJml}Z! zv1G&01?w3~L2^HWyw1%q?|Nxs`_X=%(6F3Ixx1*&+uCq0amczM2Iu>x*Kh1&I!TTL z&i4%hh1`^dB=A5`R+^IHW)W;P7zEScM4rBub!p6@5S_q2h@cmX6j3m^gsdWUfTO)a zAxbiM3UAgX2w(5oKayLN?9zB~)J@$XygAwp%Ad%Mr89-Yk^<%S;t?7m_8O1LiwaHw z@M6(WQF@jQ_6!HK`%C+t1ct5Dd=?ay!x25Ev8>Rz0&Lg_M&_oKWX5T>N{$ee6{03F zm1m0)>^K`?YlJ*!mU)jgk@UjbiEQAY#SJ->@|dETY$k$?h2uUjxr(7i(gN$lQh1cbBed1Fhi_id_?Bb7)rdE6F!|XnQ`hONW{o$ zxaC@HCA(EIXHTdiZi#EJ&G5%0aQfs|Sa#|f^La;B0>nMY_PZR(qGufiOe-C_yO;@| z`r+?m<7lU()B{&sn^)jR*oeLTD42{2_p#%gQfWA%W3kRegb)P|Dej3?+$e${3g5#D z$?W*MDBTgKeXWTvCSs!+COx+{c>Tiq#oQfcfZF>Pxiy@d(&0aFgcIpbvIZ#1bcmJq z56nfQ{(dnJGm72YkJegA({)yknfCuO@p+snWrs`Tyv2*5t-f-xxM_&d!VjTWc@gn1Z39_>B%%r@1 zF9XG)sPM@YnCDFZElvR;Lv@9zJar*=0A@-TgNf2{3eJJ@0O>T~9C^}>+XoV*a;y;~ zMsiZG^ci^r+2g~dk4fr;YT?$Jmop|-wgXO4(KkJR_-KSdkLo9?#vi?sBH~(2l)J29 zgG*>H;D?XZ5$u9O%iHzZQIWAaKi`ae zD!C?0?Xf4($>3Ow;-D=jR5XJP$M^eQQ{DB^I>2{wdwPB}l2rH{8FaXL+&z2yhGr_~ z%~kfOd!stoaOm&U?Q6$_tUTV$Sa&9Rh$9z1?H9)(&#x}#TGm+Ql4k9fSgXW3HuNxK zz?vJK8;a1{C)ep-bH(t?jq@{F_b=(*aP%N2`rA{7fI$^<8$;XsqmqOM5;NWp3{3HP zZ74GU6hHY1qQaSEzfS@iKi}G&zO69K719i%JUKG7AaSdFpP4AHE7^<)R;H%=T?I=V z@IG0J*~&1n8jx~(ztVMI-TiU!jo)t#Rl44Geg7}}bH3a^`O|Uo15y@+{|>3xO4af@ zEzpPaT>!|go-RAn9THSZfab<*?n6(mJ)=xxaj7?9nsi&#v!!$NVRowc3a5I8rvUER zS<`3xriyIq%iQOnSBSVxGHMg(O=3Qo`DXovL)hPJJ{R#jOIWM7_8v7|Mg@XWA%kOh z$m!=W1`q1Qfq9MB$9p{T(QKMZvJX4;(^aatM)wZgT zwEDT@6Q#ddpb0IOt{|`HeQ--d>DS^pWM~S23?>KjT3X-yhT-OmQl>>4qB6T}6wU zKMfzTaV!ufgwBgY1-%uZ1UW?syZQd6K-o!WvGU4&OY(qfJ68&3wkeuC^Q~A7wT@Q@OfSQsadThYC1>#5)Is`(o*`gT?sK9&k z{75GyF|8R5(c!G)Q9W{oQ}@hbiGO;DY(>GWLF(AN zLixOum!fbSMbwul1O>@`QIv19?OXNtOknQnW#WR_5MQ=T&ay%x`FvC6llu&j-gZg& z_>No;&TpPBILIQ`R4)iwTxah3^Zcq@&q8mZNcmKCGhorz6BNLd3!)5^2CWWm=s2e5 z)zxTE*(lP3WX5{dIG|l@&NP7x0ca$3&NPZFOj|`>VL+WD!HGQBV_THrl?F(9MFRma3|Nd71?61BN22r-7rnzxL zA+M+Z;k?P$dPN8R7wKukZuWvZp;vdT#t&87J>#fbRzqbe?)MXEBk>fxXrNyR2vpm7 z$wAe#wooJG)GtSnPYQVaj;doVc&Fy>jz3_KrIoX|eSB+RSCqQZ zw2fnbP*Bf}p&W9sdyW7GOHs3jGC#BM4LNR@u0vR#60(h{tx~65=>DNvwrDki90g!I z{%7Lm0BJI%5bY(d&H|}>Rn(&{c+Kv%+t`ABz=wOa&;z6egUQ|E|SqFf8 znuK({JRrpgmq8xvHdWK&Kzx8hLPWTDl;{_C?{OM3jt7M^?&^WTw43`SV1jE0M7X{z zV_LWJ+ToFT$=P1L`zd|*;omB+g&3Kv4W?)%gynB{CO8m@p~5euQhv@9%M(a7BgA=Kb!W7k(cVcgd7NWpM9jBj2eRNY9WgF?uI9N#E0!Z zI{6)4Nj@`0#82`RF1!+n%Q73>-xsQW*xXtFFSu2wUeT@4PfkKA6eP`|2y2}Iuin+5 zF(7JW07?Xi42Ti{7L60xQ4IQc@4}gk3w$2NCw|2Jm%>IFg$*Fc#uPgQ)|aP{!9adK zb3%Usvsp&*F%5c6OaAwp37by_^)sL9H32=r+O{E=)U-w@ElY=VB6EogZHl2z#3%kH zuR@=X*vys)6JqAYd=$Bpb+7~)3lR>|Vu0jF!9M&H)CD56NfNTG7A2n>HQ6t?kbr{& z4(J5{huBDP4RRsgD2^z2RA(uHg7RhMdgbo)JZtKk2^!54J#7w6&)b8p&8tHT8UKlSSS`sY#j}M(NB}|GK$gx`_UtP|JDjW9wqI^@LP`kW);4e7f0~DO~CA$&)=& zgfHGBAMU)UM`p2+UVC=?$@coy2;rHXcUAY)vynv{lw8k0_HVP+$$Qf|jrA#q=koIC z(0r7eo6~UkV1opW2#^J>i8NSiex(O52|@<@P$WXW#PNs9?+>>^Y>^MkzRrc}dR<#T0@@#kAvdra==N>-?$%gui zAEJn-Fdu(=UG4vw&^Awyw&c9nQWF3B_@`_qwz_}*PxXh_kNt(EHRLYiEPF;}9tYmE z+3A5r#qT2XXZFP={!Z{@XZ10VCB#98{i16O>>5qjD@ufXOk{`0 zxP`2G%n)B@98wWrEe|l&Fds*M0`0+>tLerwG#~F>iFfu@2kezueU5A%@Fubj?bN)W zP`Yy$l~h9Z|9q(E{$awpRS&-_zx=#=gRv`Tx9CIJhu*w7cL2(+fb94~?~uhW_?r{$ zW%2y~(*N1?%P;gvE|kds>vB+)ikc^sD7$CW5V=EglgBzY1|*v)x~K9a>_Ae7m=b`> zJl|geZsjN>CFM!!-%zb75ESw;YxA@xy49rMHvLxUT6)dN^1&{IQmN%>85VOk7UV>@ zEZ)MrXZJ-ihItEB)7#1O9L*zdFWk2s=uh-Cda!I_-bR#CDtJ;WD)s5@FdSMsS6KIQ z|B$6hr!Q-JMF~GVX2dSQBHNoxqnb)FPQ9RjgMif%w1|c*VhDzCz@$@mmDuoJkFK{m zu}cx-Nx8=L;QXwEZf8yJ`{Q&rRE^9BUh>+gL*-6a7xXv9vs7^;INa%lg*RwVh*qaA`C@;*&eg=ylxrI6si+al0(XllNhAsVBMA7k%qKyl-Y zb3V#=Q|3EA#l5rkW_kh5mZ7#(Y`j;z_S)C+^Vwnp!t*)+>CyxKwRxUmd$8z-2N3=vHSFUpSSnnt8OKN@}AZ|NBCjaJOcOBU-}at zJJS)mIC2*49o^6ws&u#V_OEX*+bWdG&c7z)&kjO_utaJb8zx7PH}ygMz1U-|#Si_v zIFSOXcBUt|hq^Y2UmA4RIy_8PJ*DBmq=l=dr$%>b zbhcP(Gc9HzgrAa;tM`ihY**8?pRHI2zKt(^9a-c(bD3!GFq*9^T_UH#&XTeYax7V2 zh;~P2v>t+-{XX+=s%M{@VaPbwI1HR4u4HsE)jxQ`puss5b1ph?eyVM}m%apEGJoeNNMOGA;vdEv(O<;(*)Nv5p8i-J2V&pq+m$&wTn;>=n>Iq#q(3erhA#<2jdKOAk)^0-s1mx zA75~Mpzt@|9ET6C z(eKf*ItMJrRf{4mQ#6ZvM&HB;=il=ldwJ^>&1gh3JgF>o#2l^YCu&x`F{CwvP(~nW zU;KxXP(>X`rL4G#RGF}~LWJh6Atj_z9c#lyH@mu>_q-^Mk|q%$oqtD%5B&E-`)=F1 zqGpl1Zkj|=()x4BbMAL14i(01wdZm&?$n#UsMehF!Slh+a$?X32m+}>739vKY%`%e zDNedZH)E`!)bMQanTi(=%W)k~-o~G>FFhjmVPECBzn6B)91p`C;mVDm^tgXh4}R{d zR$kQNdj)bevswezZQ%zVYX0|jY@qEu-;STTxLfF)^EHz>FWaf=gx3wbeBL466`96* z+y1t0v|M+=;?qC~;{Fnvhb8GJwAk3J$fA1JT5YKYtc+Ng{t*s+(xs4R%Jhsp6XAt z(sigffn}9Km|nZ6LxvCYVIVyn++CU+zLY+^Mbyd5G03=QzO*`rBMEyqP&& z`f_l$pNQQsLS^=gQ9gM?F`R$s8blD(N;8sX=256sYU7mZ7fy?kPie?QcVa{$H$NSY zYtJ&*tGIET1`$$jWJ=b?-AZ;Q0)lgV(UVk|+?xfdKH6aXok^wR_8$(sYYZ~U!CU7( zOxGUco-kjovmh+Pm7g{Wi<+dDR{dQhHk-k00)Ah#T3;3CK|fHU+Ao!Ju^JR8$~9`C z_`P7rO4b{GfD|JV?zO0GH2h}Ilm2?=jygSq4mT2N9eNl50lUg6SZB7?p$HYJH6!5z z?gRLHK}!ew2~M%Wy-)7`4LU5pIAqeLn3vqf)0d|KkglH>QPRQ6n*TWpzqM!d&W`$- zKGFn5o$NuV0I5rpeBo|!2Kdp+00_Z2(oLqyKG3;Vp}R5sRPVm#`=ti;Xz$v;5rxiE zJ?Y9`U#F=K*|^qt^tH#cqIPZT!iVEONZkqjtU)hyie=bJs8CbJch+Ivyz7$up;yG6 z9=Khe2J2Q^ihe`SOoIfzEri`igcshmfyWTCXts(n+Sx~lr5(lZ`;=3Gto;C4!|ifYrOJ}*w{fS82s#1o5|v@>=VgjW)7zn z@Hk)Uj1sZpx^dcu0p{EZ2Et5JL~HFLOj-?^PRRrBR;oaMD!INlAArI+frw2n0EFcL z7q&4EznlQ+aD^e_tZAjeHc^&y~XV_coi@l>VCTOc)Ks#eM|NU zyfb5Q45xdxtJfiW*wP5S2lITE_B1q?I;L~Y*{SaI9WjKf^WW#Dft!JM&K<~mGZ}vF zqHH{u;h_AbEyvxmR}}hT{||?cVmirVqeGidRVC%pMf(>Pn5;Gr&-upVny68g;WjEm zDZh#qbD-k8gD5kUmYp!5h4pO*H~qv&|F$=H(@Pc>XOux109*^8a3jfa64-w$T2x9& zaNpvEN5T52M&O|&8<_l?>MQOjh=$jE@qPbQ$2+QodD~JgJRu@Mrb@T^SZ??}{_NDK zmD7Xpvh^b0`)`ii{wneIRO)^3?SHFdBpGB!dx2L36vteGDQ&VcjN2%vF!mkdY@5P? z?~3b%E4GBJUtz;8KKO{P%6e7iNxrd_h-X)ib-@3k#I_<&LZb$#*ELIpeEVdbT6EVc zHfGfhf5H1Z9K97?aGYv%goB?lyyF~vc6CHWu0pr1$O*4od|5g8cTTS1?$^$b?3M}) zGa|>X+$efIMfe$a@4?ZhQMVOruZS$Vp7uR@exJzuBEK8H@5(-ZI9e_xmCr`%w4*9% zLitp>e4wy)nREA&h96U8ZZfg`7e@3a=H{BUNs-tj5&J|vAnu;;nyp$i4#ywA=Cmpi z-NMq7WJ_oJOGvW;qhOFF2a@1VaWNE#959O&A8VEoRc2K14PNR5$ z$z3UlwG`X>K(}9br5VkaZ2wMTfCMO5M$rX3r8yHHFLFJ7lqT#E?2#A~uQVvOT8xvR zXyJ_ZKboYkdPoV7NSaUh2!Z$NoU&tw$9bKj#_cC?q zuG{P2sy0a%B?Q~*y5f|7`3&1iK4|p6$IVd+_MF2?PN^C2pPIQ?wd2P)9*w~`KN+Al?htgELkuW?X;mR7mGW;dOK%ZE%WG#oVmf# zI=2|2wB#f!edH%5wKOv$1Xjm^hfoD+@-TiO7J1?t5$onv+E~UuQl?e}w_%l?h;^(9 zft_cSv4N~?7Ce!GxV46{V<3uHVGZOQK27MA*-;;Zqxc%E)ej%32_-p2m%I*bg+9xZ zzr@aFRCe3AE=e7qEp}Qh7Pp!%;Vc`F+9m%R67wuCWM^Nxw2^lbmf?icG>mp?J|Pm^ z=-W$CJL+|`EDk-XTzYCq;?s1=X&n7!8_EN~`~on10P~xU`A8M{6ejwMhH;A%frlnp zP1DUfa0}Oh69D;gj|MZN#brApWf&NFWIi?DpZvW_$pQzxT9ZRJZuv`hehrC9X%x z4?MZ&J8OVfGeA$XMUXE6`WEH@Cp3v86bC4JvdSu6C159^jBev3YFU;y@q`#MZ=X=3 zIxLu5exlf0Py-N+LdB4BZU^ic{or@^DS9?K{iB1eQnXm`%eq~Gd&4J^t|;3&Z=aK? zIpzIHyEazUP(0o%IGCIsp1FFr1wIq&;!jHq|`}ID7Q=!uVI%^mcjtGZqVAkW2uun2x zQH?Gwb&nj7-%+VZ!MA^xj8?)=HEMcm7QKMIz5pt^$VlS%JiHU zK;7BdvqD9H0MLc~PbcQU_p%VBh(s@CWS#@mjjB+@Lgbhua>HPDYh{J(eGz07lYEk& z1Y}kG!c?9WdP8@mdDHl$`WN>!X+`4Y#!WI5Wn=$ff|`iKeTlJ;8I`qNFQ?gWfty!j zyA*CmPEIMQ_~Y$lC0EP3yiLVj&AVtg$;;aY4{J4VW=ATkyU;q6>(1qMg&5e}3=g14 zMuH;8+EDRqxM2Li+M{EC6qc@O?c*W zVC8J|H`3$9o9L0XM;x;7Jc2FRj(Zm@$)}<j_xNTS# ze1U`c$HgqHp~3(NmTd+C07zTlZCv|5L-$X$QczyXtsaqZ$|>%U7(YSqsbZVu(fQr$ zB^5tJ%Fi{QY)qG4FX`f-Pv9l}+jC-V)1}r+ZaqMUd`c`n`~UDO4?WB)`^QAswB60- z3gySaqt2PwRHGjg%LOHBsYGa4+g)ZkG?WfM$Z?GQgBf2#5%I`dZH*0Um@ibI5^GEP z(z|xeKdxRv0i>MLTg6ceh;de4=HN&vcs00)v|_-`M(n?0>k&oloABOM*}h4myeUO& z-&FJWX~_ah(Szdn$4)2cek&~*^QM& z(BN*gsX{EOkk?tjGm7Op#u+O`tTiOEA$*p|#u^6Tz%I{qCH=Y@?R>;u>-_G*E-$sb z;9n)2)GEVC3&Q0nvUrGnj)i5BCSTs6?)``Je!nWDpS?VxtEPJ1^-9ddgi+JYPp{(s z87PS8*cdzw_)wU6IjRqzQlK<+k0ktw*3#ko@FT5dG7A+tHmiG zu}UP&5+)IvVJ#lfgcTarc|7)TY=8_OknEf2)U=9Dcb6m=a|7;7f@N`Fd2*`dM@TDA zbYbny0vVHv1%A*t-yV*ya>xG>pZ}n96gZ$Cz<Q#gf`_hq?#5HOZ7S7c$>fDY>+2yFB{g6OoCN_dF5(SM3E|q-RZN7Y#Mr zhEu1(ioAvExUe*jdw&WM{EN#2Riyq7F6IG080egEu=<*wYA}HuH{TJ z1S<=q4;@iXemufJHm)K&kD-gn@G}hblIiZnU*|4?(JgJ@bbpBp6S~G;1PBZBkA>Od zVEzJMhSxy+9z9Y0HBcA>^Vu2mohzij1|H^O&J&@% zdjhMfuw9$d0Jq~&2geeFoiF*`zKMQ%UdIJ4|6L5%$7yuZce`NCxBVuXM==%?QU7dx zXVl?sU9Z8n?w*VCiy^E^XMIDLN0VZDpuUtO-1oZNTcNl_KgNqTks;ZOe9o`)7p{C_ zU*W$NtSfj|c-fGI^AE7XZ4L2S^YDr7J<&*-~I0WKHMG76Y?M!u;b1D*(?I z0FVt4=0?VBkui9|M?q{uSG!51US|5)iuwu4$yMFjQ{1P06RGYw83AA z;n_Mp^}RoCD_?ku-?J`}=r`fpv3pK2zP0|?+pErUfh0qBDU6>(3{T5|HIPk0#1Wx& zLfGM=M>hR8JzK~jCsn^+%DZ^UDiyx|kr_&`_09^~WtWzbZ^XPiS(m-}oS!ogG!FhJ zj34A$?^&)r|L1?YX(+cqr0Qej?7f&5J5GV|xw9@;?JgR~nmQ8>2EQLUD?1Vqb|>`x z9sA<=FA7usb0_!L?-!RcYJOK2{qHwst|f4C>|bv1>g$)S4iz`vkBsU2hVkzV>xO&{ zb`2Zt2v9|}gnG3s4~EI!|Gpe>#rB>2lxI|hX)L8%bPrtj%kF#e#`X8lVEpcP@+Up2 z{@r@r>^?Zz{W!#BSF3|Zhw*m($2VQcLl;0f8!k?nG7foT8n{0StqBUNMGB^B53ps4xg7N$X)IyHgxw zPr<`So9deHfhPKd#Ift&)@desiB% zi^0>X&~oH52LFpRP?8+SQ!cbp+MjaqNKr+Dq}`Y5j1qIduuy{CWR}V}rILM^cw7#r zA>%EFv@5m$xB?lc%&c4+r^{^#u}u8$!}py63+oJDzL2#4=BaZUa;sX%Tc1gs# zeLYFrTVw!%pcybBbG_^@E<5XaY6H~)@Uo-*{qG;gL~TDUO&;`aAXQaPemoJ|yrq8U z)X1Is+mFJF22XXJG7ush9clmEHgsd!?I)$-}$=Ss}jmEJWzpRfJE?rG867+Aq_(M__*>gPS#N`Oo=2L>< zp1_}173bxX8oAQ44N=^vqUF+Cyi)HrZd0~H)zOaa;p$Ce^_-;GD5itf`fGi4!l|+L zkJ7$N&?sktW%Vh(xbGSCg3b1*R&%t-(X6m!W;So90WbCBkxtZ9G5To4dVaKYpWdze z@;nXO(i2JVB{#bV^_y6z*gJz3{I;hC#x>bz!xm(J^h#NF&R707vnc=8%wBL@^@Ik1 z5#!My^Nw|l<6lTXWY56iF{X$IixPO21`>Wq%?Vkv<>#%=luLQi)2V4G!nH%`fugaw z{$94JqvS#Bw24ymUuB3i8I%hLQffrJjed|~ykkn3V6Bc+nXftP3<304o?7M% z-i187rjQMg1t%SyGu%d9iN344qDI!i4^>Skx-JGZ85H!sSt$8#B(=3t+j&Cg8lgz` z>SmT(39V4y$^}-+V8AitcLZ*khf=&572bH{P&Mc^enC}gMDIt2$+1&q3`4p(JPL1wV$y@8vd68k0 zfwGH*i@H|dEB;ZY zUtEDb{akl_OL&==AjZ~cFj}U)(=ibe`Px!{X?Eeg6Xu$E)m&OR9F}k5z=Z7436#6- zW>Uy@bLz!};C zN^TTl&_9GZQ_?GZwyhsEcH8h8?S$I#EjM4cgr~5-eGop62@xeS44eZ)jsEVl`r(?} zxSk?^zA;@XkPX>I25@&*AbWdznDReT!^`CedzEkukYHAfv@HahQ$i2Syw`R0xoYaR zdFhtUA;Md7{@hr4?#*V*IY&1&{*k+f%Y4+%$XF5Z7v0Vht}>Ph_BA(5o7c6rbxtJl z&Fmo!VHQeU3M$D_kjo<>EPgOVvU#@2IR7kj<9T$J;0?@>-WeOuKTg7eckT3Kny-Oy zMU5pX+5?$JUh|4><&Nl0AR~DtVAq$>QS)D((!RW2&FONdfRuW!#(%2X%+%L8TTe^t zX=_G?qSYquNyXwXq34{GMndisn|a796Yg7{N__E0i=OUKFlX|OB^h$!O47B&_tN@t zi@p29b<+1WO~=qs-#Y_mf*#BbjU|-_{P*+nqEsUXbe~?B;}E(aHR_eFo9CLJ^k3hx zW%i(H=oF#tt?jO5uK{HOzc4phyjC|nGTe-(^(vrqtu-@LNNr;+&+>ODcVKb$(P}%!#l`+_l%y|8_nhNL3#v<)BFD0BF|(N87Mj>UMEiVruU<4s#fDtPr^)`_=eOk zzearx9v#)(+4#`^L23$}t{;9z!&Ugz5B-6VWPTT1&&xGkD|F$+4RYBozfj@RX(qe2 z_CJkCM7(_ErDMiLIQZ}>VfQ?hTH6by3}b3gdU7^0->4aebA^MXf_0g44F|t>>jeR< z`3dX^i+lK}l1?)+$a)h56BVQwNkel&+o!FJk#k{Pfp!O1D7uMj#>Z8dCs&8|q0P9n z^GD8wR$AJsKRC#o0c>y3&*r+18WgC?3g7Qh`M9v(sP5PydxPD~*KUUU%hoT!3)a;S z@A#>SSl{Mbyoqfb?|Sf%p&Uw1H=*mtlP(J=C2jWQI3=)XcSB4fj8&eY#)VL`piXpX zmTekx3A^->bEF)8ysKEAr;b^I7_*=j9Cgv|ZtUysp84z(ZLrHj8bl}S%Zw`VUfC+@ zjmusNUIBTuN#Uc8HHJ=Rmxl~5e6A`hlvewa1Dwn$YI+n}et%%NaiZ<2N(J&lps+{) zO8+4e8ewunL+Y-Pdz8Ef{J0k z{>PAynO0apLQ&QgZ`~{{)jWkd8@q>n8$KTPM5W@!cwE5c?LIiFMZT@TF(2Qot|8;+2WZqjK-8q<$tT~BT!Q)#IO5t+%vbR!;w zb-4S*2F#n7qDF(*Wu-X+>Bg+Iu&&}{7T9iu?34xFw+1`TO3QOjJ4jBgzD5viRUVNk zs>1gjvAb8>h3Q+lSG$&T{U}X68O=SOf>|o&`QUlfq2Y9-l)6QDvMH zGUKUm=TM-0_8x+kGu2GPVw2!H#rQC{phdki>Z?t z$3}49eX2M2v|i^TFSqHbw_}1y8G(e+9`?m+L!y64`l+>5ZH~GAXZaFe%X7Lc;ei?r zqBNni#LQ%`l$fS;Rzyl3G+i_aVbut8%u()-6pN$>BJs`U^$k}o= za#WiyM(!Pv``QyBpda6(A~k(NNgbVL>@osBqh=Rc&Hu$!;`64ZoV1kL?HNr4SC6y+ zTW;1sP1b14qii`%Vr(1iMLFzTLVjC{&}nL>-M>tm1D2=C)4ipqV(G6Fz2OI`5EBkl zr@TLz;jYXA%tL)uNubYO=+ya?WDeAI7etl=w%!z)ipX_dOVvgk6Zo(r&(bxV@}48) zrm`}^SJFKJrpx~SO_9HYj{ADNJYe`35+)chPf12}(`iD-d63-*b1PN~raU9;_KWd_ z=2oXvP#Z{^2Y||f&;9U9ZsYe}`PLb|adXs-#C^J-@1I&jU76W$PDHCe^eB=%UV^~ly&%d4&Pb5D|l{5MlYR~SUVKzT)t`AYR%aj(hv2N&&=ACMP&p)jQOwHBT+s}oyeS0U0Rvnp-SKG!`;sr% zCAJH`DNtJW%MDV6Q!UU8qdblIqUOz)zwbT|*WvVg=@}{tH|SuG;#U8{M37$}E%DSoUhO=KQ?K z`Qft8HlcG_8Saj->qFW5vg}OEf;6b9_NJLCDbqxNA*uoT)L1Yxl-|+?kJyAB`7xjO_Mf{{j=jjdup*Sq z%@k%3u16C9vtYtcK@R@KiPLYBS5iS#5S9v>69MGNdUvCb-zBr3bZOowXWyk&>C4+3 z1uVcphnd>dzg>+E-`|^UBT`g5dje7IYp9wMn-jCP4^K_GVB+nF8;&HTC3A;z9W#;> z(v2K@SSsnsh+zkFh$$;ea0iC+v z27^mau9oxJCrCME^LeK_vl}HkB9HAmTzT>ufRDYC!RvxWb}4q@Z<~WtzKWdF z5E5|KPkxSSQBw~)E*d0fgve7%?H;(KCgFfT%Fu%w)}ew}*R_Lv=VQ)L$u2 zGrkyPeHk8?b|vnMJ-_E#xkYfJjMp)cEbHw|TOHm!60wzn`Uu+9#T4oSW?lj_zn%ds zhU^OHO#vu=s1jEpH0^L`sy-7wmxO2TsyjOHPW9t!iyQs4fBK_oPDk@1-QHCiXE7#9-!8NkDg@@O1)=H_ddFDT1d2VQJt~TR(QhT) zr3><&W*>7KK2Tbu)ZMWued=Vzm6Ah>S3RaSo$4bq)$pO(Q`yX90O`$wZWFTebmXyb zd1`H7?ebf>f}f0||KBLEG2{1S3`7Y_H_9UCsbvXx;j~w49~6ZIw)$~m>%vH3@*dQO zmq_+sc=Mhk-{YS6>mRrts-gO-bnT1Yhfb94Uj3Z=MLpD8N-lW(NsVo8!FC%ediT`j zO|<#KkE*U;As zh}pXgrMhXrtg)GPSrFQ0$yqfsUHjZVAj6Nxa8ZbKJ(YV@y)e0p33M@zyi4-T{E9>{ zZru3WB9od7oc7ZPkkaX!)G8g3+vl2hYn5gkA4+%9_!0aKX1lvNq#TOeOq;uP-bVda zKdbug7W~Su`aRBQ?*$)U!*8WF7lIlsfBOhc-9RvT>5d6q(p+^5R$40H06&zL>Ua6` zH^&?a@VlQEm|SruQfdJd_FD?U+5=Ig{ub+vlwd-;=NGshA|% zq{E{P&V{yC+Z1aUb&Q2^B?psnqxQFdeSP^f-GTDfqS1K4@Ol^Zlkes&Wxa^}o!JK= z`o~Pp{Td6K42pQOw`1M-hJU?U?q&DsJM}(4F{lzn^BDBmNq~{&%J2qX=ol>?+L|wFlSVUvvg0*f#Po~PPItnyb=l&2J=gCzZ z&SR?-IS{f~MHyJ_E9)0EKev6qxa*Z;8q54;&|Qzj_kUwY4Ny#IiTRvY>3iE1TxgL8 ztYT5jh9A^`bDvBK6g{GIDUMqmL-^rV_VNw>18M(@;D+isN99o4Pu_uw2QU|I=Ov12 z+E1P(R(yZIfAzdk-eIZW;C%b1e`7zKwXo-Z&o_~2Vy2#W!MRpyF&GMdM!L;8@!b55 zWlS02W@tcx&vMp=qog_6U_?wWO+8O9v8%1X@^et}LBZ?N7@*R<(_*A1=c24V&x01y z)&Gy8a}Q_o|Nr>CgPGaMoaQ{ooXz==*k+jXA%xHza<1l3Ny^5^xuN7#jU-8hR6^RE zq9jyOpAI8QwUeRujljeyr5fou&3!``9t$>D?bYNk0Q-I z4@e~(GjZcF2SMTn>DF%?XCqIYMvgn*T}gXZ7|l5H-@i)(L&`J)nOKy6_1XO^wS!+w zA0lsgS_=D)T$B%9NXe5w*0ps*-muqxOe-cnwbbf0`&B{%cE1G5X^_+OoQXbs_@>p- zDoE+*zHrEdqgMLn9Ik*fDz1_o94V%&AN2&L5=86JC@z>xfhnC>DIb|JaOt#CF$qn9 z=^DBS&EQIV)~2lVQb~Fr9c$~OpExQhrJI;LRO*|#eL;1X1dh`ROjtP6v~e>GdEIM* z^L2=`@Sgc5eGK<83u$f;uG-U&lwvP2@y2I*j(dcp-8}v-W6fs*cSQRKv8Z@ibs6$b z%WL#^)h(L`y(XtibrS;`3XP^pAQ(&Bh3I0H(&rmAOK5*a5d(zu>&n4zX5^~{uV4=AU1ELf@zEt|miQFR%j>d6 ze~<=Dl6argl-ogYU6*#L3Zj~|E-!6cO64)>VdOe~Lei~81@39cR&Gbyga)3iqzNJW z@X0S0noQAYfD?ER+*z-pWk|bfUco&JW*R^QAB?}Muljk;=muB@d4j6+0q;s3f6h7n zlY##Na{tnkfqKk{SE>38Qd)19aN~|5L{nY)^6V*cQ-gS}uU~Nw59TJS7ouWk~O=^2NEfN9vZx%EAak(vfrc>x}FiIz8{0?E`gpM^L$|^p}kO2bxXs) z%ug0v>K~8q^U`-xa7QXGcu4>7uklT22+ub?OoK$@&q+NdA6_o0Pv*QG145ss*^o^meF*sn{?iCqytIR7}aR$^R=)LW%aY1+JwH& zkT>x~+4VeRMT@gpJwKnyY`mF^r6_LLz%}aUkU@kTbQ|Mkj8-nn1}vtx2?V?33?Qkb z+{nX>5dX~qg`0S&Uh2Z#dz}!VRxn~+w))~}ik2enpU~a5RjRb0I#(g-EW)+Bdbomm zNwLdoA8;@9Om>@PO2^Lwwpi-(JQ76FsKYZwqAB2G&ef*t{~nrge{fQlomIwUpYO2- zm$JJb-nq3tZ6tQ~%31q8w_Bvg97l`Fc9savAGtc97bL2bC(WG?$r#e}jy!eL3M{{% zod2zHs`Oxe?!_y3umlsxlY)N0X^9}fHxBzMjLSMTH4f``O(Kr2L^s~xQAFbRknh$Y zEJ2h9SmBr1*n{Jp3SAWaeq68&g|Y4bbs$*w^^054U}1GW=hTPYQgQ+{{$^gOb$)Ld z_HOYz0TR&QIsNPikWH4`MG=HYX3<|HHsl{H#-pO4^^cihpunxnJv(l)<6BN`Co2M+4@i zc8eXK5Ozb*Gb0D zNq!7Qxs4t-@@D7TLI)5PLFro41Th0nPDc}sBL6M4*lSC~vbPyT8CIe~EMCo0&V4Mk z1l#Y7v`#zqcek8U&W8(}-W^1#nlBGRb@TdcbtI(ze2shCmB(#5QWXVz=6&-+mGU>u zD~Y?vT3zNZDyFK#4UhL+eo$#IG>S3!?{)z38zYt z{U*VR>kf|eR8C$R^b)$R?XROnuAT)Cm0qo@3$*|S9fv>)*xZqyENL6E+KRGi6AM!U zD&Cb#jA!W=fX{VR1!PE=ty503m?%KS=U(pqamYj|XQD>=DM(=$c&ppS-e00bA*xZd zyjfd0`XvC={w*Ro1&LXtBwpVaH@Bd70kd#hyLvJjV^#)56Xq zI=vB;~_ZvcHGSyWu)GWg`QpU*5 zfhXJ9-EK~?GSr*H68@zxmz&TmL#V&9*ZHhG^g;PG)KFRoECBiFQxlrHG^BfS7){C3 zi=rB~x{_n$|CRtUx{`D%9?K!obtRb{1A4(OJNJ{B>K?Mso#op2Y9&0!HV`_1Tq`l) z*paIgGLrv9)()R*k>PZ0Q?O%*tXxoPutK4J9Hjmxn`z}pFKLSX1OGTS#P)QjE|*!c zAEQEG2*fMtonAbQeVnxro3iuiI=;}(iR8ws2hB1H!k-H(wH z%CO|e7d)dt$UdI#)<89J-xsX38(YeQ;JxCB_#QrCiY>E9F0&E@6Whq*P?qvC-*KI! zILTLiTdo-#YS!Ig_&mpOg|9HK9=*y^Kn|!*k&#gFp3IL1qhJj#NQtrEtcm;@IY1D+ zwRk>Yfgf_OOWCajw$29Pqkd7I}4cK!pQy8)SamYi_?p`?I^Z3EGf zEJ+#w1d#vzqo{NPJ4bVm_xKrFkcNIo^@ccEUmZ{!;>*MN7VQwzGkC{Ih{>drR=ns; za&&>g3<73lrL56r!jX`xADoY9<2iQfWA9|N_7|4ev1gBm-L>KF<M0#4l>FJ5Q7}A|YSmA#e7B zWH`LxZW6?kCkExsxB)WU4~m@k!zDb)O&3&{tORLxcmYFf zQY*8|R@3EcBMPRz|U94b^{} zLgWshp658C#ZB4ZokByfc+WMrB^O0Ys@#d;gQO=z!SRys!X9{wS6mgG>N(VpGxU8c zuu6asx3!KBy~~3S!UGJCY5^{`yka}18l5HDgUV%K+c--{1LyNHpmVeaN&$LR>*YBC zyY%<`EIBv7t9*YJQ$`D1PLNQUBy;F;8lwXio3wXW7S@KZrXukgIrFBT{O)?YmQ9W- zz6uLxDNw;LYsnIld<8@P`*x?w@Z9rMXukk@KC5E?(vW@>c8@Z3vuv*s4(>8O<72bp zBlpOpsOVY|^aB3sO*d~j7IpVHb=M7XnO3O(7KBG`*qxR4G?==lY3f`+hn&y3f9_)P zqEx=vaFY-^YV!Z2?3<}Dp7;<6DKa)QNZ-DEgNhPs4CYrbFHmoXjJ<+U!9X;{3v>qf zVFto2lkglf-1^fTLmyy@VhtLQey*n*b4YgytUClIq<CH4VF*hF!NF})PvE#g;^ZTJZI341)h1A_OWKE>b;dO{z6u|z4Ba?^70D%fZJTl2( znRW;kklW;=BGcSB2;IwPZ7o+nZY|-govTKtO$BTJ3!WnjM5-et?AWLyo~%aWza~r* zRzS-CoCxC}HJhAQ7A({+@(jUW(E_AGe?r{>R$BpS(9<!I6^_E<)LYN-nxf;t63 zjhn8hw6Wv>ri2^_$pplyOl?Uf-3j=gJL&HmzRD~gbO*5=<)k9RLlQvJM81?VUxomR z`-N%5qWR|sbW12I$$afCe_XNVkKw_=+h^`ATic98bR zqw>o~XRv(2bFYRDzRuA8#-Fl!fP@kaq@jS*i1$C^Ii^ydyT4lE=V!Or*$w$s1r?|s$>%=5}SUyZf|JbsknQ9xC_rEuh`j9kiaYqfY%Y004*h#&Ft z9`WBkEvuG!ymvJmU25HHSuR40S^8{&t+=`RGyvKH$U#pziyeVd&7cGqw3e9_9byv( zp#i0(pg~0$5;k~a|Go_wPmpwQzA1CqBy2#B3X&1B$%g5pc3}fDqvVFY#d;*Z^c$9L z*4rbd&Mw?{(i`|gFW*RPIWY{(p(GNN`G;QIqh)Ywf55|(9pd~J!I4?g3%?R?5M(V- z{(TwMqx$S!l}?>&Jp6jk&1lxmE3BKpGL^$*jhm-E2p-)b_QSk5|;cAx+hHjD} z`faS|y6f`E6s|f&9t-OJkN9dqaSMgR@3fO!2JrS6s+I(7wZ(lcWOZ27;=bmfYhBiW|tTs@8dI6i;fc>Yt7Qy!i_ zJp<-KYZ_-SpLMF9_wACs9Ic+ITj{5MTwchU>bw>X+^hEkaqgx#I|a>I1P(i{AM;?3 zdl1eOy9OMQJOumLR4$g$Li$#eLmUTVqGB%|9|}GEOiqT0p8b9P>+cKMW3)eyr0rP& zu}-IW12Q7+ZXauQ?_)V&M5Uc#Mq$tAOqr%mGWzVy# z-e1PaLwmOMzO%UOU88Fp8I<^>)`^%!`Szz32s;U70&pboNs{^T*+G=9?!>eFl()6C zh0w_ux83>NZ{|ulKimh;6WW|2YK;ordE$G0WM-*Ir zgO=L>+au?4$mdz^ajh3QXGh@i!d(&xAg0Q5opd#JWQjcV@-2hiE57TRXF~8} zp@Sy}_uwz7s!?sZI?GS*|NTS{9jjP~X`O!uD+3L6>|N|nsFeGknmOxXwVS~wqgw02 zsVY=&;6&}6c$rJ4w?^9{?wO8z$kv>viABq*ubZOTTJWKV@&uv~FG*I1lHed__6;i)Zza{ z;Ms2ip6UGWf(9w5=%#&pZ_Q<;O1-42T)`qX-_60k?SJphl7x>GW(qEZ{K-D07TXoH zs@OBWT>Ect=U91YbIJ(9V1lDnLBrWX%0p>$PNyBP<^7lU0 zzlN*Oxt~*EF!pe7Mf4AXniBZ4{l}8E|0#V;w?jUB_eSZUvi@a16PnKT)TF+_8^@ML zEU%L*?!IGIy7cXDGK^Cenmttdbn(!;K2v*6x0H6756QQofL2UGut6kdgC3xT9d18_ zyCm%zdqdUFTTf4Ys zrueaw0;?Vm$Oy2ScoULzK^j`^-Q{t>7nFbC0KEt@NeC{!Gu!xL+3!E_rg(MINaQo+ zgo7aenc%`_9lIDjDVO&r#+clz5&%i;{K=cP848Eq89h`^<0_0)W%v2T)tBNgjJ=Do zjIw!m?CiBiJJP;I!|MHLo30la+n?vuT(jIp&e_(|8i%Ok8Ky(#6U0HJ+bqecB9vZr zPXaBR`mKikWRr^$n$L1#s4|sT_s6=?$RE^F7eXGR(_+pxM=F2X@1t}4ft$~Vn+kG& zXFDBT4t2-R-_c2q)z}zQI{t*Lw9wjr^{-q)MWvo?PL*lf{p^Fu8Bg}Uz7wodRN;Yd zeBitthwoI6+N>MAee9Q#lQ3a(ZhR1WFLFKV$xd4PhwBp6`Yw2Kp22p<+(p^;6;|%k z?!3sHY!|}#yN&ILLkbM&?<*jPDzO17g=D;AEADfJDFti;jW53)7t;yd9eH*?;p(m+Q*q;Dv!(%O~x-(pJ?_^Z|_2ML`sL#YZNvo3HvrR5;|L)jk5US5L>VmX(!}y z+axuFSK>sji!z&?%(JkM$0lGYxY>4gHZ-L`7%Zq&?!0j9=VCC_wjgSBr2O$K4WFRj z)eBZTbYxWrv#^HB4CJ#aheuD8EkQAd5IZ_^sotLXg-u?H({;pRd<#Im+V}Fl?(;cJD-cI4_~?~Hx^(^lbBEQ& zZ83&i1hO#(#z(@|svkPav?@Tnb;8X5xDs!yR^^66F3e;| zTC`1h9on8(mcOoRc4JkVo~41-dqI)QAv+u@TBob*n)S$T@bfz?t@RTA+1co|SJ}z+ z<{#@iyTqmd1tuB2-7slj#TR#IkBrm&6J@r&%9ZhoRul?ywIZY%uhjBMS=dmsiq#@S z@oHWkamL0oJ35(q# zFl&!$w2G?CR%r$&06+0&8X67kt}*Y(#>Uhuw)_Yj#kj`sepM+gmOF!nL=6^+oftQ`} z2Q{{H*!7daVCk%1y^&YnIl43;0=6{pi_Xs4#-IY-^+colnPB~;x_5uJDYBO)P4w3d z5CPD^Qzn}acR8-S$);N>FZ-_KD2$gWc@iwtm@I6T0J_5$KS-HmAZ=Dy63-j?>Ot+Y zIy{zqA9ql+yVU=2ZGv7h|G;q3KLeFBS{#Pq2mkFcEnEu)*l(kFG%3c1oF ze=NW2ZS;C8Tw9YjgzYH)^*9DE?j(PBl84)*7i4G6$?CO=J)b5Pkn8!_XWXce-jyP~ zKT*<6v}=YMDKIp7?tu?ctw@r z)k3dU)`irC7GLb@SL-|J#n+V~>dUsui$#NVlb?q)_uk8Eb3LkNpK7NQ%7PKwK*+$Z z97!7i1;rqM;(gC3DMA0c;4nZLEJ0v#8N9yF2bkX-xN55x-uC|zdV%HB0RafpEg41v zpIqCyQ{2%;LWjtbwC@9%vH` z(YKZSeN3oKw#`T!IxW{A>xj)LIh}z%e?cuQL;UE(Q|Yp`My2zg5aKz?C3Lpx5?3ON za4qD2_HZh84w)$Tda9PdR>d|H$9xpiXf1=wU9D*wW3XjK`zixkPHPi>=)BaFSoXH2 z(i4CrcQU2Fo-J|q{?#$JiBqZtsA$cCuiiIKfxZqL!f_tAxU`9CvH2djj)$AHo9Fzd zynlSodN7*jwUyYvreYlQKHlhJR+?nYER+*>OX7?6J}cpYmrdXA7M!q6ZumQP)U~tg z%*z8I1)IwglB;qbEG}|c#bH|%nTx*8COM4=zXh7H4`C$FBZcU zB1Bm=vIG>1efJ%=d|GgZF0$urd#WSs065S9{0}4CU_xW)l3U-!^EmL*m4C}V5-hr; zX9M^a7UxNZh4IAy_x)iGLo$pxmEJC#q6%PIe8g+s)d=XdM0K2qS=q#uXcB=elSwp? zRGUBz7fIgmd@|2KyRD#i4=MB%VVVRJu(|(rev#FPMAz{UBLgxskt*mf@+CKImM*1} zqJEZvdi!&=7o9Yq&M&(L>X@vM*ZUPxSqe;$oQeBSL$F+6d2srCK4VVyruy5HVArxa ze5Qn4IY?oHs+isp{`zv$I0#?E!Uswz6o@H6KV`MDP8hq#FjEwQ{A5$Kas#B~?vL0c zC*dT>uYmB85MTUSuQcHjgi62K}$wxHkXp`afBt$J-CSp!@lMd3W&>oC5-XLii_$O@; zH0so~3{q7p{5AJZYo9kmMm4BAn<+{mR(bacN!P2bODnRF>V-XUsOHQc}znWU3UwT+#BnXImQdrsbAPCBze z-l0J#bw>*C-yq-JAn#9>8Ru(M%{4K0TcbYYM@(6#q}4=?>3Dy!N;8*j_ESu4u+BEO zIhD52ByD?bcgjJKoD#_Tc!LzJsIsim?qY|OPJ_J8oOJESo&Av;$xyA#T-w1%pEFLo z`pH&%C2br|TPNmJ4X_W-tSS#f+@~RUUq1XfSmIHRgu4LV%tfxND-p=5R%e{7WpD#r z+((v*-5HeuIwq>Y$vK_sXhD^2a~g}3+#o3Vr#pFps4rPAA6d#~Y${F*M`NMWW1TWO zF^M>tiE%_G9aF3Bs^*XOY;cR7GrXPe@=@S+DcwCST_sA!*}2Q~oBB;&j3VnvaGuB3d? zzmQ25(`mr#@PiMdKW${waHW4pDzL&=F)q=HX%vL%Vs( z*a6j@fe|a_KdZ?x^G-pyfmwvBQZm0iC{BUoW?SU7YomEpMqJoi|D)HP2Uzi-&7Y2~ z^RZzBuaES4fQ;TCz@vyr`x$qSDnSk}+HJ<292B#=D%#cxnd!TKk5$Zm9@W-r|1W}Q z%_=@Y@JYh8&XUl7pCe#=or|rQO)jSUN_5~6Ob-L*9+bESF5uBIv2xfR#%B@Q4m1a= z;Uw+bh_SvCbG1q$ZX-H62n(TN4`Kl`E)&{HyMqWU-zW##z;_IZ#M%npN z3%FD*kPHsg3S(i$NjS`qNGZHJ%Y?2yPu!&Y7(7EXah-J!tHcc5XhbQ_G)}jvdv*?3 zmqb3-l1$5TN(t6zw`!3eC5aWyDP$fFO|ukYF0k;4To{vocPLQIogZ>a1X>2+8Rw29 zaS?CLMI*-z4m%rK|Oh-`8Ivl1D9 zG>FB|9J`HAWJ)%#YHBT=w+Hv;ux)59t7Z>1Iz4Q`UCIzi17fUKds0NTh-PyX8ux37ajpL*Np3SP} z<3q2p&=5sVgDm%#LQEj|%~2eQfH@*-H*`snc~|DhZNQ&Jc*Huv4XI5b+1t6}N10;o z>e4spP$pk#ffjtJ24C-FZxLU=hhEb`IPd5ZcKGm~9XvF1ZYMJ>+#DoX`#b#7tE_7z zdyDTbeITJLZh+>ngPBBWusq}-Vm?THPxD=JD0y;N9B*)vy&D5j-X=@HJGUmkqgLpc zW)YQq4qOE^%lhHS`H51?dMM#}-a>!7-u&Rl4!-IZrOSHAvfDHVO@|85-n1FaA^ z&k`gGxbf@}g<1MFD>jDBg&OBosnyUZnOV(UG&q!7e~=u594Z7x&MW%kN-8 zD6Bmoreyn^!VVS^cym9HjNjT>yT%0=++b288%rUSlN6xI?i7&Knf2_fn3vL9t zZI7%gYN*TXc(rZqS@8+C-LMs=jEU;o8WN}x$l_qCoU*#aBvU3!T{(-@W&N#FO2mW) zN%b?~;3m2BEu`;|LJX_R<8Nniz6?c6qKAabV#!pEjIrvwdIiGHN>6~C-_LuJ-XFLEF@r)>z+K=`aI4ZRZ+*LbMI90jVpOl@B>e+y~TND zG9=KX*!_o+DpLKU3Y`UAb=?0g@+v-Y#VvLz(D!?y_lRZE}x&C?mXA&%w0crl5v;$s`!fWpDc}E3L`EZoxWR`vt{WWVuK6FMm!V zmUvRC?1VS1q)B>PqPj#AVB)0pWnlYy8zDjaZt)1BNStLNr7i(GyWG=)>Fkl%W_>%( zB=@uy{+c$vw0X5jAPJt^-=+LD;o`UR9?7aUELDu)rTu6u7qg) z0sR2%!ViggJ|LCc0ua>8S_`h*z*pcPpvLFAm43_;G5WD0C>a?rW)`JfM2rAhq^^7< z!(}B#Lb~99_-Rl#+-c*pboTz$`zAzI*Ur^o;E57yDoLB^2LT zPMXb*J5{r*7x}-y1FyHmgx8#YjXqFeOI*=i{r;kcF;-z49i8v3=8zoKSDXL)#kJ6z z*p5i^>#H9|)0dh$lrvu&xb@kr*=p)_-3m?kGkar8|BXdlQ*dv-QE%1R>^q->)jNAv zo4p>Wh*=LdTdC;ns<)NAUl?GtuW2*=UVXBnp851;>^;>`TubO}+SKn0wP()0t}Ha{ zzu;N1@hvXqGR$&c3Y9B`K3S0*RIHWW9vPld5Ul=+Kuu@WnEzHUfUCr@KM~lMr=)VV zO0+d4HTqUG9w#Y#51u-8A|Ri}diFf0z_4CD6{b|G{XsJPcE=P{Z7f-S)X_K@1P6|U z4OUq{PCs0-XWxlSPs|pRg|b!Q)70H%mG>1i-%q zL*hUiJ@-7~Hz^-O>H8cDfL|@JfgOB+3|R6eKV4Mb1accnC|{t^Q!d=4rUM9lEP&9aF9vCy-_;8aLTj zzHus6{7jV6yLZymyhc54YVGVFIHkEZap!w)*4EzQ!`JdYJvLy`{EMS+SC<#`7Pgy) z4fnBJ+xca`g;67ft!8zx;nH%j>d~xtc~!kQ>JQ_G`fD!k@nhZMw=(emRTao4bLOkf zD>mgJ(Zz;Y#a|Z=hpSq>qsrghD z6SWaT-hLLGvs0(wd)c4Fw(kc0p3$R@%<9I+jvhZg23f>;?L>yY4qn>~>P3Gr*!Oas z;!@q2Kfpo+H}OGNl()=5&_aEg1OUsR_W+h3-R!gv0W|zN%}1x2Mxzy)Ze9mm0a7fu+b(uwaak0n_k&E^6&*!$@`x5Q2hCGi|~2 zG5R^JqCrz?@KWS~o%G>|DREJ;F@o~ChNq~hO5M5?HBiXz-6V-}bdl2je?t!`cXWl) z_<7&WN@cxUE~?l@OP9?KO~=3xM~zw}Eyka|{E=HAE%GWhFkTkhSefioKHyqGqDpH= z!c-$nP5W1zwHEhx7&l5Clw6OLyNkaNnw*mp(kqA&sj1n9*QrvTSdB)QwcC2JSsZQf zNPL&dDYvLRiDk$WdPcsiohIW+u&dQlRB5Wn*7%VtX+AN4411HKFxUJ3R*xCdOHSy4 zj{(TK?tVpaE&4L1cqYImaNeCx>{rz1(ZhIfglELRfB4%sIt+?g#p+r^TLaJyvKO?+r(_8Aoe{h;PfAGkZj zJjEz4HV*zfp2B9D)?QXeo$2sV#F>lya?hJ61uR*d`hZ2fi04ZHE2UCR_fe;?wuux> z6Q|(%=dR0fz?UN$rVlCZWcV%`#M`S9)@3<&sL;jvwba{ zkx<1+4pbex1E**Qd0nxx+iJ_nvSJpxf0hIdurzqu? ze~PAb*_EnGT{x1jm=|qZK}?{V!VukOUEuM-1CE{@Wrt;$#uNIds8brKc%-D_QCrCy zcNR)h!ytHz5Z19h1SV)p&)bv<3Wu(q4w`f(q)Wl{eW!|cOny`oiKU8cb>#2qkGqM4 z<`dulE0WrB@)DB7n0tR<-pOvNiMtFt%6PtqL1y^}s)dKLZxfJ#Z;nby2d^yoHc0+9 z{-_4tl-c>z1M4^WQO>7g#Ja7cBtG6*=`K^w{N#8^?;EkukG}CikEHrlqhA`_WsVS& zrQ~9ngEVtpzJxmmtg^&|iqd~QJ?()R2{Z(zVxWI|G8Zzfj`dsjluoo-G^$tU7N<{BGs;v8f?sfEY;$^Tj5X0Jw0mocb~deTn4?&Rxa zO|S-zTm!LdbPgJw%-QC5xM&X87vP~6r2XOz-mE*1xIt8EIf2w!ajB!mvn{>8U#1x) zm%T?@+2g+P4qeC4d!Jxi-MXjAOFhpkgEm0In)9%@Tm10^#z6nlWUlSjAT~`GuhD)U z9_hil^6uLn%(}b6{=JH{WL}qoa=e&ccaL}$Fqrm|UzQy|ul$(QX~{5cGx|5Ecv0Eo z%=1)3WlaS2@LJe@8*> zcbaph^N-wA9v1$*56Zh?8w*38fksqjXMTjQi)RWyh5VV`ogEPN(<+h5fi)42^)&Bx zxJ{sNLNJ?VWh&R~vBaiiD`YSLiGCFHed$DS4lmda=>NYm@D3 z19rEz^8@8+-ldOPfGa2S21wH1E_*~}^G#FLt8+bomMuS4|Cv zDizR69^`Rm&zb8!hsF|5+nABB)1Z3VyKj=L#{|#=lN`lDcsK_-QegT;syJIylCYFL z_z+gXfi=!U+yp@ex{UKOD6*CB9Rez}+|W0N;b`UVkT2Q86$5zQ1QON~Kv3v;#7^}Gf6-35-4g|Wz!@`e_% z?%s`tWZ2O+KQXnRE8jR9&i;@)7Fp8`po9c*>lJVU3E8lOD5RSm*LEscDdGAi{6|Je zn~AsERQ9S%-YYy2&W0~fm8@BpSsYU+TqRVTDjIvGYBwpC&V*mx#AL42pJ$aTBvAW# z;?flH57qFeAsQE|%PV|cSX{_X%d!g{`);o6?tSGIYL zNnM4LA8Zt!0o=HilGPn1(4q={VDZ<7;?+~Cu{?3mE9XuQQnwJ6MJ%h7Qxp=+yL5M3 z4k)-yLWiu&29Gs#6`au3mvmdPXvb%EkTojkVz);xWd~F?QlPfN1cZ>6bHo?@m?Iw{ zrEPVj=><>zF}>y*!_YCmXh}dAe{t-nW3%iOHsUF`_9cMM z5jnybAZ1^X^%nBA1!Br|odPxfns-jo+B?5lg1=OMf*aIxjKpQA+-3#~nJ0|XVdG>? z$Fl+D+`5#QlUHfiWp+!7w}`tPHi1D-R}l6pe93+!tR^&*Z)94Tn4Z1yg$2Lap#WV| zXwVMTX)Im)Q?l_$frV9Z`v}h$Npq&CahTH6*<)z}$xcH1+|fqyVg*v?r5&}f?ayX^ zKWFFjF3j*UhrD2R69tK3j)!>I~h<!mNN zimR^jv0U*<5F$|w(Jw%D@?f2p`@AeoTdIP}spijiYB7I0eSI0=w~mQl!6eXOL#L9( zZ%Kr&9Q?w%Ufi_D?)Ki1UbAp6B$;`_&N&NRqiLS2sbhw!YiIu0d!j-B_X_N%YMYHQ zDlXiid0AF|`Y#0BCT=;6$7t~1DrIMF1d%T9k;%0T;>2<%?!hpYDZ*d@n{y5MrbXvk1jT3Bi=*|PGI4@}jU}!jj_XM7KZ8ujYxvoG;%oOY*MNkRyG=KcjYD{dbYt=w z?y0Nh6Ie-uWR}S;g40}_<(ME_;C`P)hnZhW&LU1y*0{S;oHeofy206T4hO}Jtyf{!7*v@j1? z#Dv&UChEb8B%go?BQ75G6??!#y=0(fvB+fa#n`gNgp=Z7f{&pbu~{bSB^G)3-NzK) z#kjIXe*32r7sTFRKjqv&1PVkC#TprlJkHBd;^IkFq`>!6v^OkCwTizOdcg<=q^7 z9EtlMXm=|M4uU5QSZmI8@Rp|(;zrR&i-3EWO}Sn;q9tc$dy&nnjhk57s?!(WDZ_>r!^OAMg)!SH=|NU6q*{F!bOjpD;KobIO z{2NNAmg}Yzr;8MXSc$xtssuXRZmEe$6mZ?^h&mK1P^|BgX;c2d2@Ykb$htM2TSEEz78c6v-r^QGQED+JKT1>l`Thz>_YpIwg7k@O-#?b@$720Z=j0MF&bzH~s9 zF_d?a0(Z7@ZxTbZIHn&Ct&%9vT_hnGa{l=R_y?13V|3-O-J%%!Vqj->-DbVQnHHbZ zd!A)!*NwO$q||p6z&(SCWz@`bVN;Py#1ON6akT-Bxv_tAk)OXdm{@pa1_Xo{ zL^oL^;A+*)Qe)ieY@RN)X&0gfsHD8@I^o76M7e6J5PELLO3p`_308&8W)XXEWBxl$TK4~88nlL8i{^R#>t z1NHZp$!oI%9~<2u|B9zN~Yp@p-bNayRsEp5)8xk*~*%dS7I| z>WrLeGlCeEzA}n`n3HC8^zn>Y+NZ`Vp@)lW)&kq&KdM^QD|CIDJ9l<%Lm@paY~kX* z;)&xKUGeXmP91UNY!VoMiu5fuqTOc@SI5%M&uft`HL#%3k zj+-wP1k5PCjTw9tGut&V+5AUWu3V|ET_dER{#c%jomRAG$1r7-nV)UuJD#hikvmr& zwzxK;bfBvPrWn>Qy-;Q|&!9*OjlN}2WwxxA^Gal64f3iLTLG7Qkpsnx=RVo=E`}$J zN5;+-k@w;se8}q6iHI#pGIn~)h#Z!S9WNibx3^3pr9P!~YO!v=s9tDaaYG>|^1$os zPiv#&`%U(9FY_nK2W}{|^ZYN=#N_O4^UJ8gjwyXpJNo|TvAMt1ZpR`e&t3adckMB2 zWWLxScJU&8`&AS|XS-&=S^Cjvn~TGr0;r7dQUUwio{cTnBHm~Gg6!b$l~j-WLh{fd ze=X2u360h#%d!zxl!b%7w8EzE$=VY2aJ^YtlY8kV=WN*%3GHEqFX?GpD0TZ@{b?HP zv(tClEMfTjOR^8;h#S(?Y>&{v>fFp>H`0|VG&SE5H)a0Q``t>Puu#3w9EC2~P61_t^V__&sY(xt$_`Jib&-ir{RvSRlIh z?_^q_pM<$cbg}tIt@_)vp!8F{2k)C?YRm5k;kysX0FGqVYH1 zIdZrrI~{t(YG$K^JgqBxv@(p`8HKZS?#BdHhN|dncNva7iHwdVaGvBj+oTFA7DbUX zw9JBew}S9@vaWTYubeuyM^jJR1FhLf(?8CIN@04`1E)qJ4Pdw7;!6(duem5SYR_%i ztM61Dk#$eT3UB37uODxvrYIDx%HvlUQZ7V+T;po$wgVx1s=!W|k=WFC`9dFtVbT7g z1UJXLTK&`lhlSlsh-X72)DiO8qcI!EXFB04!-;dYj+!}!YW+RB-qHXM(2!86`sVrTerPy7uSU? zS!2(AT@EhD?2f<8vu3N!=Iz>vm@f}+CMXo-rN%y(Qiy0$t>EwKrdgnjst>%1x4$y2LM zi89M@>IKTwBsp)d|BVcF$I0jyl&)E%ev>7$q6XKZMm1mi zq0j%zp9%AA-!5YG>wh~d{iQ8bWxOq?yHt?%n|LzxqtqVsqcz!pZzT1nt0Pw7Z~L5f z4_Il%t*Fb`Xa+BX08$$R`z_Wp5&9=BmTSfk;{gjZ$J~``~Y_&%lsaP@f z)?q(gP7h`!g5RDdSNgw{kq^r|%7B;hFpk!G#NTbo(H>GRXLdofe&^|0eY$!+I#_R8 z70Gs`QLwx7KKHaMGj-K1T^6S|m-wEy&0S@m1K1=s`fcJT@=H7=eh+eA=H*m1DO*&ITnt8t`OzWzbhuN>!(Us2FbBVZ zEUY;mtf#Z@`;{Hh`-R3AUOG3OLmfF_vG?t#9x8X$Zt>GB-kW%(oe)USQ3gWokGa3J z`(L*@!7P8CK^&=(y*?jlQ#V1=@@nmLDi!8u$)c^@#fMa4usYj7m zg<~^)0VCh9C(1om7q@5p$cs^V7z{Ps?d9}e>%xs;fm33snPb@OfsnvQw}hI?G*qHO zCw1Nb_~_a|XV=K#=YA3?6c`{kE4ro$0Ep8JBC?{gbU6p|4=WlNcPIpfYojuF%jpgH`C!NCBXVMj1Ln>s zJdXg1OUPqYNyxpT!#VO%^q+?2Q=d+MHhz_u0a5(7NI7y-pztEXK`EwWm(_gEE3nmG zr8(ZQ2J4V{k{0;0A`^j43UG;(h}$gN(>c0s<(LvHTvwHiEl(hw5LKny6%0MxDD7f8 z-+3ruF)sh(Ik(Rjs+1XaeC<^%N=|tf#@}lF%oo>Xz!eA9gkzeCokc)SY^FIiAFdQ`tNdUY%U3GpGf1CNc4Cx78_9ir z5m^rA`{qL1yQu+v7yiorMgBN=M|)f9SgKmm-}cbTiPT4_+?pUB2%r$#ElofjeG#|z z1G`z5X!iwkwA=6)TQ+pH=Aq8R*Kmthl*Qvc>n5>nqfRE}3i_{CYdyX(WT&U8^5Ya~ z?zC{A%BP@;?*Sou79wm*AO2o9yD&@u)v6}nN(U$_@B3Y4LFAwIzx1Q^;8_F%k7EyvN370T|O-u8gw|Xk5o!pBXO@vuUkObkGB*a0? z@d_Z5O`_qTFgg}?;)RmA8Ew~l@V|fz{5a5P6CP>ZBd1B&xy+PuAmWlRI!We|%SWnw zfHwEO>MG#gIuOUb9Z#th`PByzWziVeY0@pXMfjm{&|VbO3js5>elWn^rip-giEs`E z^>N(XSvR?<-)RA}wPU5%;+qU%`6UkvN*t%I#apL^kl^v1eS1l8v$)>9Md}L(Ik{ii zW1U9g{T$tt_c$dc_IWdGepmg1Apl4RXowg~O3;_VsdN6YN9%o;n5k<-mmcYye>`J5 z4VO=T^`Z=z(yz3+-|(1Dh#rbPLIm5D=3hjCyOSr$7!c5VtW`t}X+gyw^m%7!F5UnP*XNBoDRO>D{cicU=Y<6%~f_mBn#KSom1t ze>LnQ8e9+VBlG%QKboa7xRCvHm9$N`edTs_B1n4`Y|TXuEvH`u06aQjGADB$=WS8K zv0XbHEzYI72g1BiFcSm-!DpE^pDkc(_4DI;Q$}V{XYL`l;WS)6Zf~_o`^!lE z%ukV!5x+KRIB4V_oWhy^R@Vh#kB!?c`IW83=3Ly^a!HVdEl0_y!Tc#HAT$8A3RcNu zfJ#S2B-j{OcYHAGL#2mvsQfEHO;RBKov8LLB1ayS{W4EIej{y1RE0i~ZO*OOk(9s1 z3sc3oboP&i+PbAlz0LM^){zA_zZ%t34g~}rc>F*{$wxMMgD<{F8TV)dHH0Z$YSL@I zR#d&=3DJWBrY#GOvMBWSh_Y6F;KY7xigvKxc|#jljE(vy&pr8^G79A9`h<;Vr*8K6 zr>~yYW$Bc0X3FH<<~Lx=lQ!$M%3DXdxP!#6W%vAP9K+j6SvOhC*wg}g+e}T7K~>R} zDV04^Dg~<<2F6||ULZ=QTFvJ#rR724byLnmmfi@6+k4WHo2*}THhnQb)m4@^DlKvq zywwoo#D#R-4fvLn~-qNiV+6GY!!^yfZIMw$@rBjeb0C^ zuX}OR?mNBW)z{RE8>6)K+?=a9&ldBZ;mMW2u`sle__~*x$#bN~pML3k@{4FAkHh_o zQ8{09YolUODecZc0Mm0LO^V2Xmf4+N>oA|JeQ*mEU1dlAy<^m2=6$%@?`8FC6REeQ zSZWlO?krQQlzCxC>qRb<%*YIng@va>1hd2{dL}vPA%3HJzu9cq^Ma9OAf*gudFEm9 zl(x3ntUs!2<#$@#i)u}2YEzv`_M%DwDZq04xfpRUJ--xYNfJ)JXSH?k{qkS@yjCpbk!leO zs@HlJo-SSB@Qibg5VQ=^S$>9F1*uAqcc6_fgkCHe%^#@U|?5= zkr$dYPGevu8=S)wSjb=&g6<*LiH{c9Ev;@JrRP{l<8_1w@315|ZV#g3e;@cT|G}*P zLQ{@w9$M%_exJ)*u0)-c%|C&{hiz>6j!rc;ud|g_IK>?}eQIoEb+^hY7>(K=P-++r zupj4@S#;%IKG`Dw8@W2=3(q&Cf3%pg)m;rp4bB5^p)=J=naUK=#cfQuU*TO;#`RTh zE*I!!R&XyXpoaITT-MxjnJKJHZejJ_i#q@+#BahZiD z`bEw{ykilrgLk&fv~o%_^2gIP8hbjDUX-QGAIE{xPo)N$_w3KRr+lc`!up0I9YjW? z)i9Jduwxr)OX+ZAs5`(xd47(P6OHGySU~1{*@4@o>EURIk~RmO2eBGM zxKQ4Nd&*QLA#QJ^AxyehDfBkd3!7EwZdb6*Dw}>DW*!eWN($FOvrVkQ08h4-ztL5% zoXHJ{>n8jvZYePdc6t!G7XS+*?%mASk%QFc|C@k&a^#bD^m z@zHpG>gSC#vD5a5hyKt*RUWs6+gd|V=IXe-5Nzw{olrCW((BU z{=y|_XM`Vf^16nvGIkTAyUiQ!zZCJh+|ZJilcKLN+J%aUGC~QBAN#=~HlS1li?q6* z&dXPO?-JBRVgDD<-Ck%uU$u2D*qg*jPhJKJtFq22y5`L~C34bRpj^3|N1kzFxfv=1 zDHn9LwrlDwAMUR9E^X}nnph6oP_guf)Dd$`xru*JQ_4Fv#L1)-G6E`Rq-4t#Wc7tq z5Z+{+x>8EmdY>VKPT=~JI3A+mrYOa$ue7<`=Q`a5lvxgi$|0k9a)%pm*sy{mXoJO3 zvDnshSa7McsiE^<+PzmH)B_>K6v*}dM)WE;6b(-Fd^tiIxd`Cz2LQHrruyAZt^1uO zS$L>}S&@hoJ4DLp7~5_T61tJL$GV(h1F$Ei*hQ5ah*Hm1Uz=&pJpvHDy=A;fOv{~r z{5`7gqBT5tXT*a^!{C1Cv1Jc&uw(hvok>Gk@4I)t;mO6*lSxcV7rb-08)1_DzxZ8 zH7v)R{?Nt|qWBV0{Wt$T=*AnHg8fN|>_N?&V5pw{s{D)Unfy!sezBHnf?GMUVp!d3 z|NPW|E9C1Mzr>UKGpusvj5ek}_WU}ZaQN=WO}%%)j6y<)4a1 zq^9BQYW1LACIMQ;RdE=(4h@H?L9ZiT5e7oTf~s83KBUvSfY^wx7;MlUS6zl#7EbE_2I2 z%@*IB!y_{*BV%CGRdDQINU$iC;ROWSS`LL9+O>d9>g6Lx=-2BzR%^%5I&O z4}gQte~wN6fp_~Gf27o&RjvE{BKOLB)SEmt!iVe>e}nC3pvB;w)LFv)7HL9>iQc`U6ALsno*sn z$F-M1CXgb|Pq${05EPJ+Qz{)7%6_= zwsnn?z8p)9!yS!G(kf8e-qrcL6|HL5(x`PX^v_M!Mm!6&{iFD%RZ>S}v`6R+mi`Gs3Sf;V;u6ypjFAoG&ui;(x^WovAi|DPaj!*5sEO(aGhhv==2 zjjp7tDW_+n96=MjUt80&FX83%RNSX}7ao##XyQWS#m)k#xpKVaD`Y5?cRy|MfV;`Ak-E|a@+FV z7Li29ZD75F!UPNsyH9%ZjQ--tNcnM;+V9~;eJ!^4vy!O^&KbGn8m>b86Bjoni}Y`shU3d~H{+K6 zy%eT=++S&3Se+vL8uRO`dsyYB&na1S+eKhZn_qh^|KU+_sTtccX7*v+tJ+Jq`d4PI zhfEYl|LI@ZPL7z2k-bHb?Y1o8_wm)#o13b%T<| zr?+OCtzN3jwtRp6XBGL8U)`beYI5M$R+Gt59tl83-b?9ifK~a_aeBN?<`O?rF7{LQ zM)tNxn+`!acO2J4$geh%MvPw@PgPhtjak(ii>HCTQXZ=cQp6xR=K=ev)d>e2FUiJ5 ziFDwk^Ok+qHA;snx@m4@$;gPUCHp#lH7XOGgm7H_^ciP)i}z}S70!K&hk0^OY|>EM zU1`G=$$o2()shSJP`HEwa~Js>R%oh9Ok#U^FbL~J)HkcSI^|Ybem1ov!e*ga#hYj2 zrxd-~K5c)HJTXubk&k;s2qK%6;(288$s*;0NW+x&!!>)a;IqDeper#w>)+o9BCwv= z*T)DyUH2HT$*(Z0`W4miUb?aHZh|LXu`=o3dIA2F?Iar&_Vx)!Y4?VRt+cCb0&d1j z#xe;zi@7ouom`2zKFscooT*=DPaxrf`+}qHLrUSUeBfps2w}SE(`P?0E&+(XIfEX} z_k z*pV%hqI2Pv`?zSwOOX}z+D{n+r{@5cwC-kD=7nuH_G9PBcYp5L_SR{APmX17$-`YoBeB9}h@N zYb4|;a>I;I>Ax!#+*)&LQNpt5TUrCW{_P&JW?#5P4Ed(7<=R>8jJsP--vztqY~^1@>SWzTlI1h(Wwo3gck}w~X=)vN6bsaJ)Zt4P z&d5~!bwE)>nnXo~3{OU_d;-s5XF-j+i-M`z5C*F7&ugb=Jymh4wBL}tq?bOzxlq4M z&G$4%TMQmgOh#qh!c*-JECXbd^Fr`rdBRl>l=3nj`WICLuBg;k(BFhdXzHO@(x$K& z{_yoNlwDAam?dktIQ#{vu6o*8hiH})-K=W2-hgAKUG?5bXC zw@_`0GzxqvH3c80`K-~T))O;I3mpsPY_Ip(kH7vq1n8?=d52c3q}j+8?kBI zpRXb9vjlMe4M_9fr?NP9<1w|wKgh;@`G784-NfX zxl$wsmm0wd06^7~uchS;mFMc`>-#|-IU==O%_oVSeAlqpM@ivn&Szxe8Fg~dC<*{X z0xDEWif43z)IY3DU44yw{^~rTKtV2Ob*OQa4F0}v0G9uQs<@LAWgJ>7aw4_k4#W^-$kJ_HPvtvPtPw6k> z*Fb%K17wmZfBN_j`4d?^8f*Ib&s$E)1y+J2)2%%1wDpw{7C7#$ zbzUFQO7GZe99kRHnnrM`aS^`L!T*MlBl?j?qu6tAbAGbpe#pk~Y5^dC0PRa+f);C^ z8Y)Jd5f#=oJ#m?Po>ZUK*}p6P9QzjS$mtBbMUBiak#0?~0{aLO7(7Bj9!B3oZ=Oq~ zv=u2wm9p{4^O>H;P`zYNZT%?oiOxJB;dWC>Rbm$61Sr!mzI6GJI7&UeYL}_hzKzSd z?dHPrv1Gzlc;A?762-AzAe%EdJnr?Gd$IR~(t{?bRM?zEAJwOTooDZji{$R#pee?W zQzbU1iL&vcPw}&yBe2`?KNYB+*k5q^EF;mDAynA9HN`Z1ey0}k1U4Sgi+DPg==}{S zJ8~^Ww`-g|_z`P#;Mc&S>7F$7m*jpGg=BT_)Kx^MxFNCxY1oWi}S9Z*2-*VCJ ztIkhLM^~5wVWF6tYNkhHp3~dgdI@ zMP0VX;YVtOUV(hMOHuM*?jrYbpr+$)sjbF6+YmkWD-}ATa3BCI+qk&-*Ex5Vc5W7) zKOTJYszX6kaaT(AHl$t(-kUxq)*%t6RMAva5nq`C(vH=WWS#o4BXKc7#BLhF5%lv6 zQwLM5W9LAyb1+8=)mG+S=hKY4EBCr9Y1tjn-hIh*gsD5SWa#4~eUN6X9GOpgVmLibep2Ksb!AxP z-Izl4!3Q*Y<=dg?LQ`vpu^j{-;9Gm&cPFZ~brA1nqo2Y6AUGv7P=PMQ*!c~t3UN_P;v&mq0iW0=K_S8|H62{X2JB10 zo!Rs;<(%21lGE9e4|#dQPL7QjFtC=>`Q*iLtia48BG2?_?xp9nxFpSa8UJ;*nRUr0 zzUUcpF?<5oR>0<{HdqBZ7)nZSZ2*~BiY&n8FEj0Q-YCRmOJ-AAZqAmJ*wMVz$#$oL z%vqN=j@<0H9wL&d8U<7a2$UQJ>UKb7JL--VR)G0{MbVN;(P4tQwT`R|uN%QD-EUQQT#XGbdY2E{ofA(ZrJgc%Ae#IL_ z<&7QD-tGAEypzg>1w-H7cIhJxZ|8IW%4^^Skp(^-Ute8~nlj}020BWJYru8_xWnzJ zd`r6J8VjG*FQx-EI1Y*aA?oAcovYxTcI+aRbZxS`juh#blHe;Ckt#Eq8h$d&3?&<= zlVv|7DQD`@;gD@Nt1gbp=|fU3oArH}#_9OJ!31ZlY=X;?w8gLKm$H=}hxFRxX*i>Z z)gq`n9jJq`qD};NdwyL8(B~lN99viN{4Cu(Udf9ql zJXIyoRL?-h9k9!5L}0x}^YlBuSlw)){y1Rev)879o2KI;E4Q^k%ql$P{-BGcG~$rI z*@L&9vR7v6%x>M`4mOw*6s}ykQ8QqlB~-N&C~}#aolG=YfZk+p=Ymap1%1+BwHClY zG02RhPg;Q|@nz4U(yfx&H@}w`PEVR`#N<4fGy`fNk2>7AK49hu9?@ne%?>=CDaf&$ z;~bhn<(53YGXQ=NCI5ORY0h0(_Ei3wY`*iS>0+V9Hvt5o^a4G0)^qSNyOX!+mp8OhuR*+ZM+m$T8C$0~2P$2c9+56H-zn?fFp~&ZL|d;hBGW;e~gdre=LrQLF~1c+V{ zXb&>IlWLfE!bn*p_y$wYk4B8;+gB=>s9?7*KfsS zXvdDPT4x@zq{?INo;V?WaCWGP|5fF~ZtG8uJJO0&nsTT+9=UsRByjtmbYX-0kNuQO zg(~ z094%IqdBbYc-Hz=7T_oxfrx$O-Z7NOP5BJpvvu1UQOmie7lcpr_%(8;f?`@x&o)5% zW8zST=itQTB;glgF;+E=Bbyt`%_^>swmCfRE=sG!Cm~`%Er3%g>QCcT-N$%m!&P@V z7`61hSj|`s*ay+T|r7o+cRJT zbz|p~5q;Z6d2xSHHIn5GGJTK(!S%51)CTOPRXr3}5i`D}M= zBl)E*T+qdf8TJl89q9Lazet{lipmce_MTpM92Yb{y<6g*82F)9%_t=T<*3uydh-k9 z)`^S|%5m%V8x1bbb^P>?2}${As*f>K4lmd;NCnObY={N2R}k7a1nQMc1q|?@F;Edt zJ<0_uzZYnQZ`cDEvMqe{lR-6Eu*O=;iRCo^!n8t7@biuWJ(Z!pzcEUWquQ!$)S=O7 zMR?zf`y)Jp{O`jNi33GV3THgqWvXq?AV~K{mrY4_aGtl@>1{^YJ>xE#Do?%D&Df(l z+s0mtqqy$|%)|G)8sIxsuG5aIP8&{6$gkOl(_r0aD$fCAyMKX5jEXc$Z~$MvgYjDW zj;;&^nE=EdxAdEizwV#e;6l4l;p7o@$mVa4*BL3Tx&IjYFJHaeg`buJ>aAa!O=aBX z%(JcBUP3%aIBMhvz6b$ubgprn3027Z{DHF+VEguHb!{DW_R>^^-CjICR~}1~FS_8- zYgog0d6jRT1oy{(OW`4Du5C39eiDg5e-OFsvkY+MV8|BotbT597jL_yak#VL&lg?V zF}o+2HknsFuJ<~D>d54@b3g3AIiN=X_)Q0E0D}!YhV~EM5SRe)B38eMO0K^QfKX=_L?p$2L_}@R3^^6of`Oj?XhwO8++@6jz>#+99 zZGoLR2U?oeDz-(8^UMloVgqgB73~kzH;tBWiykR8u2)ldZXBWC(2&)59p7^PFx_+QQZ8(G?cK!I?yvga%Olo^L5`iLmGRhbLY<+>v`YBjGekziK{7{G}Qr3@| zrN3vwzI9AA?2&nYOWn7S5H(B2PO=|g3!kD_Qw1mmT=o-ujr<+_SYf?t zWaB(r*4y2I!v+4~hNG}!l%5CL<+Jt0(V#U`8nEUTs>fnQw^qtExs0G@xdG@S?@ajU zunjjB4BjTEl8~QG{a06)_VRaL?@r4(z#AQW-o`tgjOH&FH$B$u!sSzdPH^SD-CcL`=_>~V{#M61p{I?;3XG3%(j*vp_{)erkdHlt<6kT zoA$J?lNjE)yVX|=qifUOUJlzm*;Ls;w@n?-JmeptrVl^dUoQ42yXjh+egSlUgqb&U2c!nLK4gT|3=~>v=6@Z+PiCqZ=+j@+PBLtJzaYb z)KQ#1s#v?#)IwqW6gC`bPAo}-CJpumN|SteAZa;k1_RM3HLyk2%kD-xosy1Mz;)%} z%l0R<91GI&!GnqzO0Kn;9?56)P+A)s@2tJM#>cbp91>fZ`QD|q%dp!!1>*8;f2pQvN+t;C2L2Abk76N_1t&?E7`VKbM#{9}aoF z@1CHCoxlPPjb-35X5qOPOQXy+^&1?8T+&z(J1#z<3%V~VO3f*6>v04~ijc?^z)h>8 z*LA21l}Z3a8~V*|{lm8ptDSgY)3MI8)9SCyjMI5r@k;+7;c9wl*OI>JqprigF25ks zSF?U-I{&&1dwEUsSg^;g@_^KzWZkR`+(WOUhb|SA1zd=RGJup-2dET)4^=-9WPGJO z)96w`31pAnqe5*T5~%sFTC?s4_TF!ea6`Ahbwt%@-nzLLMAbJKxN<}Q6MF%*+k)BB zQ3AL=;KoR>$Q)rUabI8>2qRR*3oo7@pTvk$E<$M04=_$j84l8pWP$zO`yo1Uvz&|H z@|1UAMh!P%j#F&{>4;^pR^YAP@Qv~GutLXJRC~JVK7}-IzkE|iU92r#7)43oObpJ# zE&K%1``4kk2!a%`TGEt3EzC@k5EiBRPSMi>^&kZ)LkT{T=EzooIl^uIf#e5GeQE_F zmz)Dk`Osv1N?;iD<}roBa!s5%iYmP`CR=WQy{>+8e%7wxY-QS}hk=4%*w9TN-2r6F zCAOuJHtUpdc`ooGRF3{ih`fh1t0=HQ!J!JeWxrb0`#c`_Np^@ww_op8$F1aBq=qw8Hw;SgsNrGd$M2Iaz1v?Wcz4n}*+VDK#i4%SK z_&~fmYXTc%teZ0FI|Q?BQEa&pn?J^-+#}$bq32HJ1$;_`4cuv>MDR2P^!Y6RWCiDl zsFtY4b}7y41o82r4v#0ny>Q!`Shd?#{Sza$h~K`GQEfHs_}TH=a1QuxI?rKC#M{~Z zdBw8vn8zpmdtr(-mt=>p&uhMV&N1O)k+yz{7C%KVDVq++ufZUTif{6Yo4Q*r*%noQ z`q5%sd~>volQF1Q_1tj7SP^DfuG}w(|*g3 zhC5pj#S(ISL97UePN2QXyvUoh9Lnociy?CZ6$MW1a}a%z zkra9G_MMUyu+9c4Dl%q5Ep4ZqvQxB1a}`tG@&ibLaPWo0_8zsEPoUa~Qcc`@RoVHb zW9DbSWd!bvo2pVJ=e(6Z+MpG4slCM*2fC-;*7bZ#LSbM1o`@8`e#O~lHO>fr{>TA! zBXab|5c7Rk)iu6j6k~tf(oOy^{f%WbY!PVR#>yH{Q>M$nG z%nTyHr($<(%9d6N%s3f@eoEVBSVD@3Fv3OwEO720_V5Rqk+CYf%0~YwB z^*gh>gCu&^PU)Y~1kE6>oxan;<5Ru3f%xLS8o7cKq-Xkf#|JLm)=X^A{qImwk9+Z> zWQGidVL4ygA9v6<)8AUCaQmuLN=$E>N!z^6pZpZvL!V^2be}s#&>;yhYTt*?kxDt& zuj4;d-v}>dZnvz(X?3Qg}W~=;Pj?Y491$6skTDXw160+0~l3H^BbG>ZS@*>uXLw zmd4S9-kar89^V@oWmzfrM)619wx4bNAOI{7plNQpa%N?cnduIb=wiZ|(>Efo|pCZr+G z+csLcoaMIg=zB)(#j}jBygKDe3TSM5TCpLjxcx}|Ny!^sj<|9UVaJXvYfkYsZZs+D zaFi`Wj)$i!YYJrl2@o@~|LVhGM3=u~dtSBHV52+WDkr)){lH^UWDX(}qnx(q*s=&28l11{ zp_(i}X}1TRrBE1-E+ZMo{BmU%O|n2hrveO&zL@C=QE1`8yZ9&k9J!Vua$TaSvkb&6 zCT0wi7Y=rsSq^p!ll!d)!)4lda%9DzaH$M=^p(QgR5k+fh#m*Yjpas5w+Ca3)Kt+;MN~E8b_nC5wiLES8{k_Zgm^vC!p!UtaR^d*8SZ zSnGFh2+NTB?;1;My-S6fj1Yykuez793IqT#+(|Dd&HJ|_4rQR56&m1MtJ#gc^1EI$ zkA=NVGeu_|NEYrJsUeC1gWkO{W>Gvd$q?9|Vs69$nq#~adca8xxPizFyRKs!CHHY@ zq}WWyBmeq1PwL23MP`%C2fE@0!#5~IsXjag8RGlG%%%&2;x>_Ud{j3klz*+|N1Qsk zZ?EH>wUt*!zO~-d$hr)m=x5BzX1QQnGVaFb>H=*N) z9|K1qX27au{28?i9n{EEiTj3`d-j=}<>S;p2;|XxlHxXSqk&hn$V>M-N%alf=!u!U zg#|hoDCc8g$p$22q|Q z>gmuu{P;bhX##{s!5-3bl-?MO@pIU_3#@YzLc`Qc-TY`h3bVR->d?7h=H9DPH{Z&5 z_DW#{Ivycfvs8ysAihJgQ(zPRVWb&=iag1LCm3lYP^1Y|DglTYk+Sdy^dArgtA(Lf zhzweiI&GkUB`l_W5T)a?l6nFcbbrtcY~}Wy^-Rh$QBP*!rnlmola8dk)A^jBpMy(^ z5bpkXHLJ%O@yikG$&5pULh2U{TT8LUIMb#d#+nV)1%9T91Ku4q1LCaOe-B((?j&L* zw4Atney&4X6bwXTAaZwORZ33ksdz_=0_%It`c}+fO7Zf+lDRB^ey<3~1GwJg2TvrBu=TnhSi>2O)m(PzazHYEps6(7A<;!{=|l6lI2nAoE^kQrW{nyk07iUq(=0%W zTyg8WttvtTCHLp1g~pA;*c(HF4(xUf|9~4qSVSNO`LFACMU4dcsrdtdkQUrLOo11K zp|tzS({*=D3bzBCZTgRBg)Q12F_UUxv`IXo%9SrF6a+~8eCMt@rwdVX-s#`Xi>h=$ zSIR<^XE2DBGqBIU5_*H>n+BzddGJ{c=?;Jj5(lCHAfF+iy|qvqlPm5Y8m&=A(rP%P zrSo6OJ(QFHgU`G7w)Mt@2n}PZDXr?YHH3cZl~*p(Ue9ax3|~|~j5Ss7Epy+$Jn-;7 z>%fmmLW11BW+y^vtvWz&k+_09{h7J)!#C!zOYUKzp_50Ii_br-l3y?|iXkmxz(@>W zsis`N9=NnpS`~9p1b`CL4o#{bTJ|)5zjP>6w7~+PLaEyHQmxq#t;G;|Ooir*-RLtr z4HiXiEO7Kq<>*}u(miDKNhL?T#2ou68hKhXE_+b>POuC{Fs^n`+Z}snV)OBnu1r``qHneI-kKQ1M6MW6pJsfAR3)f#z%g>7@<)y^k@_KF^+Z4DG+ zmn~DS12x)M`}-M&7y7)!vqJ3WZ$sUlzTKT~&J|#LJB>|i^@10SEJ0VTK)RX>`qeSU zT|WlRf`O%T@`O5&2q4$ZgZ`_5O1K;|&<}qZP>46?J*vQrFDFj{z_6-W6gg|vw(|i} zKX~on?QLOHsorYMxoXXuz|TWii3juM&`#A4$t&}(Zr=qUSG3!DfQos+<3C^B?g^H` z-CqT3D30t@Rkpuj3Rl#&U)6a1DSEp`5eA93zr6%l8``NcBT(K5{2Z-;EXLf~jFOuR zjyW=~5}qj`#;S+lFIg*1ZgS;4^_33Ke}@{cZSX#83aA)ag|-UWX|~^&?>{f$UmUKf z8lA7dHm}|mqAafFR}Z}W?=qGt9G$3*)>u9kNIvm)#7rY%SFp{o z=SZBdU+Z(L6BGRhr}hQ|xSk}u^2X`WK$~c(|Ndqs<~KS9-qrqhziG7LPAT|kvBgi> z=hs6f6ED=AIoW8Hw-j+9b8w}Jd?6a)*~Am^fsg=&q`jU@;Ve{HQFG&`JQxOz5$jV{ zb4}QH5t`O$3`JtI3AjV_QcTLslG9?vqzg;eiZNUuoM4xfDbt&|6`nc=Ton;BrGh>K zx=8Z_T(QdjM!T-I=;?F|t3z3{eWCrAnDsL;U5U%XJeQKh?B_o|^0l&JzAhOZFn8QH zhFOSDoi5X+)wlh6_vjwpb)?Y4VcN;|vdK*Qt{UB;Gv=;2^m{-1-j1lb9G`8&PQJ;? zzbFf6hX%|gD36*yg{-HkiUB}J6v~;1MeU)qry4A`sR+;)D64x^M5PiUDfZH>Eb0=z zXu|x?EDh%Z*Yh2-ev}n9&YYkpJTe}^clbDxCVXXmtjlLZY4EdQd1SowUOBpSnZ-!X z4(D~B zpAk_{yA|%)cSsAx^oKW{imHL5Je&LzyhtS=WC!%AJ<>=707)l&pdhzwe(!DC6J^#c zgU_R2uhxSm08%Dx!$+F&gSO4rWP6W%RO+~?-lz0%c+~*)@b~kNt*y;nhBtJV4X(8{ zt3GPJrf6+wD0Sl%Bj)y_0t{H^rJjRJ#gZUsmQ6f4)unm^>359@dW%s2ybsdfW z#7v@2k#|qn8+TYtP56>=COgLH-`$rm|7C5X?}|s}KH7|TFAfPSDzbXo=ERpa-0T5X zJk)IHaJG6JzCQb!IGSZVE~!_SpZBkm4Im#V?ASJAB&mkYY+7WMzsaiGSjZOlAQvZ> z9h&w_Vf@d&ufNt{`yrwINmpRW%=f)l&>JMatk-7EA9WVu>wr4{qsiv#QM>kjo&RJM zUA{a7n+~o$&=ucb>-tljygne_xw(Ec3V2@g@+A<&(iH$gG&Alw5nn@dq9sokLP zKs63&(Vda%IeBu>U#rrr|8NS@nh=e%tMWFI%ta})!e_dO7u>XmJ$<`k7b1s`q8PhMAg1@(wj_|XN5~0P1)FJ zcFggcbLORj#(+%+jn||Jb9#N}V<)qy;O><2S#y`6Xx-yLKjxNJMoJNvr53p!xKy2Z z&x$s2(v__~J=cjWBgLV`#ENYrYx4TipJH}r4V#->K@CyIPKsB1_V)_iAZ>A%t}E{X zAt?Vx(YePn{l0(vz4I^(bDGo4oT*{f=6smL912NusOEgE=1@_}*ql#u45^$dq;jfM z(i}sSBq0@v)Th27l~nfI@1Om-KX%`b``UHi*X#Lwa_eufp%|adz_haO%@^+%Qiq_9 zsiI+ky%N6*PHBrZp*AhO~Sj^x82wgLgKC|GbHOux(& zDkV^=2?Zyza8UKl8W90Y;{IkmU#mLM>f0wf$wU{Ze&J)m*w8yp?Kh+Y<2ugk z7?vUVz(L9Z(5L&w;A6GGwf5IKe$Ao#W7ahfHUD>iuL=`<8K<2_8}JSB_>}vI{ZW3; zh1?|kFiye9NjeF7q-R(E!+<~4`^a?v9=m$hzd?sxHK}>g3Jtvn7LOm7G_iq@Wepf z6+srR!cEEE`pWy?u!>h-nDrAsk;hK!Pv5==seY+*Og4w*!Gz?jbaFU)lh86WfXIHs_THLRR8 z1XNZpyGiKA-1FSWJ(=6^<7aN9@e5|CaY2-GzcT9%DeX-I$x<%i!n{o<)oUz5+$6Yz zP40ZN!TZ>C?ma)*eXb_3x)k$Lr1hTA2lZ);+-Otp(7%OGqnDC`l%SD_dk&VyfvIvK zHDIwd8>9t06-KmqJ%8Bd_PwucnyDV>=9kdgAtm|mdzs)mAY%`+o!90-xs`_!cYb0jl9(CD0oT3U2s{bI4D21fHHZ^3vekN(2c z@fgU-+IT(Bdvx~0>7T4gyLsHtz2xC_jCdF_7-R9%2&lqkJO5oW7c?3xZLzabaCqrr zg>9Vl^Z0t#_aFD&GFHiwI02Qglqv$!39WCxJM+Ne0+zhOPM|1Bo-gsL^~HGB#=T|* zh=#(qBGS)MQfP51z}P~_4WWTMK)qDR>L9_&Gd=Ov3F*OAm^?PNKm`;m9ni{MxJML< z6&=0~Tr@9RNPNBb>4*G=P*=x=o}|}7#=1V(=cYKdoRM7c;1JYtL7@E{Y3^-*A;iYw zgSEQwzuTl(2oE4#f{R=2+=zRq>d*REK(hFKG|uh67axT|QZwD7UF97mb|;O`2Dm+d zk=EES1sl%B5p&40WbbXuH4eJV!C-lp%C(jEvU}ewd&R5st*sUpAaBMdNx|s8GPIn1 zK=F6!=mCwh8{&7+1lX4N?mCn4pRrq}eg!9_s3uNgi(02kDR)?Bm8HZ{*HXt1%3`*p z#VJlMePryGv`mD!t5>9L+7Wppry3I%*9P%~a-RjFsK!LFbr`Gxt&+@62*+{#GLb)H z;a&^gHE0oMgbDO(czh zD#3yBTV?KOl3h*kSqW)(f8Zt8rBB-79UzXE>!l)#$;zpyLJGJRmo3eQDG#Auwfb-v zS(yw-xd*D82o9JyBgJx!U39-BLohGWM9Wi{q*J?!Fpt@UL52_&Nlh+`u~*l`G4c>b zPL&_1j~C8XdYn_`fj)$vLoq?0vO#T$~#KP6W)4qFK#hGZHn-)b1 zvj+uRC#1zwUDA&H8P*6lAtyt``LlVS&2%@l=!LClfF?@ zDOvb>qA9v^fCxUdCJ;l$WgYZDRkl_W@6miWtNFj z7L!HC8j9)rlR;gC{dK&%OpJwB{v;~~u_Z}PV-%99alVo)8{wMh%CXPAXB3doV7Y~( z-$!IGzIVM1mAkkhDTbE6u^)88M5IYB^KmOVbD12w<)E^jK|YDLqCdi=j&Rx}=O;_O*-720PUG6#5! zNsvr2L{#kD1jo8d;?|m^HcqA8L#$x}W{nW7;UV{;%d+_hyBf7fCQN{{z2zZxiwTeV z)R1i>fF_{JXw$o#W}p!`k=w*j0g!%c0UlNnc8V{)FSsVM)1PdD3V?8ue#C@x_5}a{ z5nTaZfG~(6!n0O?!H)p|&^a+ZrpU9JN($f}Wh$cQA$ny20Zbrw)k*={qz0|i8g*nB zh_s6xhFunu`I3I+{x#jW+H&dz)&bxY8r7Q7c=H4dRwJ6P*i>Q$pl#s79WO+?jZ%#S z3-!rnyc0Tg<>iht+x7lIXtVa3!7@xz6iX$xmMU6X+(8~ZFQT{xF=T>77eEWc017y_ zcny%VfmtkoZkAp~+5jEgV;9>2!S8~_LF1Pm!TXI->5y8#QW9{NY_TpN$ceCy)iKbY zwGhp0xhj)sz{OmTL>s@DL zl{#uh`^mk!MqIsU;HOy*VMVi!J(6&TF*2=_0@5 z9Yh_(bm2q=d>Dw>h{FL=Oo)AF<~bsqD72R1P!9pnL7NI`kEVMb9I?#{c!U)17ddcnz z(i&gM(6GZ7Ycwl-sa+Hackc@z>)+hpC)ZDARBs|;)Fl^LoxT@P%y2b#j}T{s=$};N zZ63;1)Z4Qf^`mycVI`!9Z{yAj>1h>+(3yAMcs7LBAdYw(n8itAWNsQq^gUR zDJDyOTHP|{{f>2WG3E6mF~#J%5Vt!@Bf>EbAz{0jC{hA|vXqDWaHz`wpuAwrQ4%2& z0T8cRdEz=NS*zIOaU$3y%=q!C;-u%;OfSO2l3=kR4|F9tCXFK#+Xh}<0c6=iT@(`6SS%?e?3sWE)TF4!QJYty}0@b4+2(eU?hs8cA& zZU{sG000h(UORvKOJgk$3F3pu00cw?k$K2-Xwi%R89(_gDXrcN4S!Ctt*h(S@*-sJ z31~mi7o+ht4TC`4F>gFQ4hlhw-tc&piGoN0z-}V^Wd5uFx00}0AZxh-A~>dw{J1sk zS+ZbqK1=3@+rx(Cw8u;_L0;>ag^Y1GKP-+M7Nps8k=rM!cUrIJl?)Clg9booNc>mm;OSRM%D}Lnpd}aw zO*9zEXSF@XQA0~e=w`BOuoenordUOPFes3$F~-uu`6eB3-?na3ML-o%nJH+ zuJ#+AsLI zDmj=-xAr8ro~?;ipbqa$sxU=o`Eq6xh$3{^L@&I+hWO2v_yQ*oOKnx&EKV<;KqT;x zhp{5iC9z`W+Pd%_!j>qy`Ay<@!X{WGrbv98buv<0Ty^n{$5QPhM7n*fjs{Aj~u| zAxJ}4W;{bY4H)s4*gTfsQX~HJ?tEAFFo?lJJkmMXz7-j&LD#8zwsyAW%ijM1ln>zr z6Q0kGYrp5c*ujtjO=d<=+Y5+QpIbLc=JAUz-yd&DOdKneG!HWZAnaS|((*-*WZYtl zjt*;FzrzyAq}zH*K%=QG`ag2H=sn*rvO@4NA)oex1ypbkX4idmJ_qA0MS7E+e8PAF zb%=yWos_U_I}<9#BAgyttA({4{OCI|SSVax@#E)@glT-V4Hj!Jl-l)A@|q2J)<&Xj zP12~QJR4mWi9UIuHIzUaDrO=>e9OboBH2V_0#hx#X~%zVcLPo&*+%q_B-&@k!DUK& z{1K`6@V(#i(JE9xaP#botK-ThVUrp3l9ONLOyUI1UmG8P*?H*Ct9H#SQ1B4n zc|e_wRxot>(D>XKo(I69@@A+Y0Ht6l@a-VS_);U^jj6~`QAG>kHP$-23mzmQy2@y_O8*-hbp5-pU1>pzjo9i_)tM|XWUB98yCZT z(~iP1)|46RSMb*z?zRkoI^w^qls+)LM(Zm9is`8V0jqv|F4FHF9O zk~U;Jy4U}z#jlAMg}tG~?bXXKhV592t&{df8ez0;WJh3Kpil>oWrSa3_!ZYl(xr`- z@~pO3ZEH->NugLeId&<}gp2OW7Nihtp)O`y6loXDlGqR#x^RY7R99dN#h8uhv}c<5 z8HcKz^fN{n$B#DU^-dkrHR=Nij3hPV8Bug$=Z9oN4F0kM**!bDHnOap>|wZ5EJa%( z9)DE#S_)}B-bP9`rm$Y#6T{PwAGY_n5j?Li)uXUKFH9kN%vP&{y!w7hg4NKgRgr>= z$cBh`fSeT0$6=W;>!H?c&ZWH=^uyx1HY7G+{sr0xOSR)!!DeBk9yqhA&06@?k>cS#a!iEjbMDPHG z_)FXHp8U}#69$5U3?r?olhN(jppiNsjxJ3fGj@l%k1Ik@jJEyVmBK$Ag-!!~9fv56e$} zSr?;mDgB~&xG+&~H5LL9CvQ=LMaYC~Lb26+#u=XN>YYERJ<65!V)!lIhjo)ICMPQe zZZwG|?HHwBq>Kn;fkz*qc&Diwq4jGy7RfV{BE<79HKkl@P+5B$W78Rp!c^!*n0mUzi2igxKV zU;W6>I@?EjHofOU`G-}RY}h$I1l0+pAUyyGMoxJJhXYAz)Iy|*Ai31#0M$h#+Ol$xTv8p!-HF!?DIjwcXa^aO-##*LFRbdX5X&bxS7u#G~`1k z4s1EyG_7(aX^Z$u_+rHGvNRh`+eJd<`E2xzK17ZQz#^kk#ZU6!*2vnpieP07`6G3* zvcmOdFZOg;r*iG0Mwsyi|L(Bk`AMC}6fbQ1KgzQG!lz+JbcltOpy!L+Ic3G9p!mE~ zmJSAUlf#j!{nMt0GZX`T^^(Sl>t^QHG!(8x9a2iD8mlg~_-+2`6aVu?jPH_s^w#47 zzaW@bO>J?BhMmj|JL{2dBzDBvQD(Dd~s{W+)+AaPK#a+tX*k9eNf`IrNpVx6;e6Cf0G%(b6 zr|y6!@vf$)~K#Awo zv$nYPxbLU)OtWm=`FK@F7BF*YCcV=pxh+LamTKV5nmg z3#W7I<%(JMZwMf|lf|4o4ULSkzJZ{}{45R6g6cGHc7;$l821{8sY!TFN~;Fm>EFAQ zoIMf~2ELARBY5KR)Vw3W6851@2C-n!17z`C4J2TvN^)5f)uz=nAE{^u*{aX31W`wkXHXntku|BIw)sXkzkrz&d z*vO6?zSHg=Q!n5qJ@ni0pf*dMqduFm3Q8nkH-QmON=XPbWONvO$ps)& z)R-;0`y&Wqu@SEq5Qmxo!N1EDGe&)fy z9PuoOw3_lqv8OxzqCQ&*gc&B>iubB=>^Z-uD ztt_t4Z@%8x$gqGkA=SOIcVdb8@7131s~+Rf2_<|5b==M(QVNPax{&GC2vl+)))A@b zG>G0>n%soE(uY)71V}LiBqfN;{v08a?aLOO5f^62R)wrdbh_Cm#UZBd-4_`r6*G0; zU)fkyj3?%gv^G=BRS!4AujE!5wp8`Wh*x@M$97p$ibdlW^qU`0vR$q2f3A$r7}Mz@ir*8+qzGjMQiV8|9q8&;y>(o>M!?oS+ARtuE{_2t35n97ew zsu{y@Umd{QLvm?J0^w)=tfIfA1p6x<_Y(q7K&qx*U`r8m9Cg`JJa$Yeu%Tgfw^jYC zGw*z5-j!y!p5OxhzWF1YWW_LMzG;kntDSDN4V;CBp4H!Vd~--d0dOh8#8k5z_Je>0 z@EM+D; z3=!Anh?Y7V!;7y~HdPw_LF}o<=hnAdw`J9RDf~+@*(6q4epbY&=O&&pj;=Mni{nwL z;?nd&!@NC0CD_L2%bm*TKSeH^Tbb5dnQ#EC$sZW3ys!(GZnB!H$^)BiA>O!VJhpwv z5X5tLt%7Mtt_d!k#FN%-R2q$u7B=xuT{52clgJeivXHGXqtsiPYPgl@xR7z2k$>4`I(EDAz2^86oWMpWQr z5kK8D%?sL;aXCi2x zzYRPeC$h1Y_4~SH8^c00J16;uiJ4_?r@t&bRkf|R_5Aa^i?$5WO5-zr;%93hGwU9C z;|%F^i98jcP!q_G&CZC;Ryb5qyB|Qcrf&aDH{U=Nuc4Gj)vW?+`oOtQnYpcf$aI>m zTwu-BfSmGFNxUW8R~C0ir)ZlZa&=8&mM0kyv0ui7*AYKE7viUL8Z8sN`+_E~SHH=k z?|wNi|D_E+*Cn4R%6rMoOTndD5@7-U;Nkg)`c0;^Rx4vxgQEq5o{r-tk;K3YD)d)cx^dVRP(>Yj6R6Gsi{V1 zUHTDbSDq2?^Zq;8YZ76ULw>{QN07O>X#cWSoeK9l;9lJ(OZ38RxjS8xywh_RV?_`x zRw2ZJQxDQ#96kKSDD#Cw#)pR)MNH9lg~Qtw`v1_c?UgUILeL0loT)K7IuJVqTrD$W zz}Da7%fD-M{Y&Psmg-BA>gD6Gc z{Mt3k!rOWmZ~EO8omG#gAmaJy2N4Z58W&BFJ=eos~dig~gRj8(ts z=*ASil$G;G{%_7|yYPgPVooc}UjQ81h&X>r|3a6UcyL!y$|^esm#LZ!qAj%S$9h{S zKppyChj_T*b#7>+j)f$`UX^(3T0y!UEa|P_=~C(G2UD}7(zI2uVgxd7I3sH-eFP~5 zk1D*ju}d;A-^_UQ(t1J7VDNTDPk^&j)7Q%gQFNF>h<&aoVjCSbA#prQ3PTnzYLpG2 zz&CC?(K8ku3;Mp~(>51e#oO}E8)1=o=%(~b?azIQIq1f*-~*K}3}0Vg8^lWL-fG>t zJn4B&ElOmYt%qC5N_K{#c_IcnY4~AbsVg^Ptb|(Sg%^N+r51cr@I`Fh+xe<1?NwWL z+qf0|?8vmQwVq1fq)V=#Gb{eD+D#Fu9ct#upbX&;853El@Rk|D3U6sZ%W!hysAX2g z3lH>)9+4#N<#;|KehR+}&0o6YyM6qfU1VfZwb6JTD#iO9*v|CW7su#4YtMB*dwWSgUv(iZ&wgE5rR(s#| zZkYc<054KxBVxC8Y_1_@FK~LXN|D!`oJ(C?^!cp@k45j=fa~4D@zHwF;CY$t1JbCrg z%L?jBd(5L(@4?Or_djSYRaOUV%}m8p!b0AD(Qi#P(n(`0v5{KU|~hzr01sstV-PvhwS2trI*f+NX`9&e~?3o=cmvj z%8CuDk!kKMZq*Kg)J33Uk@|Fw)dJ_0u?&6f_#o!t&bey+K#r|5*XIRc%*@aalSb;2 z9#1VvY2`#ZxZX@Wznxv_J4i(6i*ybZu2NNQB;;_%vBjXbhRPy|U(|p_$&=f>IgI$# zSeM@d`)_wA;C^)R&L`{oeO0sQSig1rVPnawTav|}3T~Wiy;-Awrs~+Y9mJZ?=NzE- z(Wa$~o!g$w19}$mg@a1)PKemQ7pQ;;6FJE)_#Z?m{!Oq*qO^6&VUYgIJ3(k$NO@zm`86;Ye z*`Ti|U1SCESo@hGEJBhp+CcijE>qM;@Trw2$0e>#Ddx8PuQGs)-lf7*@hgkerFB2q z6tsyR+8zCi@h#!|G*?X|?VCbzWOi|DZ0g+{mZ#XpU$Y~H8vWN%UsZAw)_?8LYXl%( zpuEU*m*mpo_(4Hs;45R)cbPB+ak)yH_Z#ikHWl7hZ(O6o&n|F6!NN+;`Cl%Z`fKJ@ zlA2n?E{O#I-FRnZ&O>?|A?jSf6~1m=tw>>jkREr4X6LD5@Pw>1byli65{yHpbv_0$ zg=b+bFRotif2|wkHBSyGTwe}LPa&QNprm`fV|FC^`7mI-i0hzP(b+7QaluU9dgJ5) z5J4tz@`kfy;|#C9+-b>Hs)PAAyT#?6&*x@oyxLuumZrGrKFOnN8k5IGwuc6umvC*E z)kVi{>+2TNoFSu0%6{Bp=k|Xj_Ko>h{~Y}SJSgMNewO5j+hfmRs8`Ur9@weTxAiNV zR?>=JYbMW>xLT&dZ_x{X{ST`tQ+MirRS&Sg+nZ2wO?sDSCH-6RVd#J5BiH8$JyiXw z_!0Z{QwcKp~_<&*B5&fEUk=jp+QU)P6% z1!<12MT~BL9?VyXzL11!yqmks(htj%zcrR}@^;d7@wWM)!0aotWi#fQCeiPBMapf* z4z;9cKgBg4$So~PDY7YYAvEl}OgqbM4J>gSwbsuHd3pLo#`x))uJiEZB8DyPY&dCg zK(TlVpGy!pgGcov{sxa)fB74apiC<_D42|m5!^}Ay5R?@FTDkjB5GTDV(|&yKTa-9 z!7}qTF<0>ymflVe)}Xzcud6zAiq4%k(!Gtz-(w+C>7Ui^e#h;YwQ*9B=^dMqnV31D zuZ?=}tz*Nn2WQKKUtKngCmr}q@pa7cmAQJ)HX1a;He6m3Vs{G`Jb)9KY>grNz>(&n8&+;*B@xjZ(i;S zb_&(rO{pjG0!`kZSX>~DwDuzKS%ki!Gubq|Oo{llUMG1Pqm6DjLNSRQ5D2#m zleczWwqqB~H;tTJ^Q%Jz#PQDVD%nN4`c6=x=d(+8xf4pErzCb&!K$9$@1OBX z%Cg6HjM;3+=7$nO4$-}yKI{t@tN9zuKBB*H2!ofA_WUUKM{IN-JnQ_(@2}2Ei?6K5 z)(fq93u+t4%zouk)R9(@csPY4lV!sN{&A26jp-)N&(pOUJ%V;y*h_P9+#fW&lvhNb zR`p`8J1I3xt7K5}0xK;g#9lQfGVgESW7DF>XvO8VA>*FuM}wUs{=3aYAK}_j#Re-1 zKerd|>vi$9%5?HB`47KwHr`YJp#kT(q1+`Quq&>QjZBfOT$sm7+pg20Q3krh#+Z-y z@FE+Ok`D(xnrrWzIk1;!Hu>JIuhX%cz%AyOOW0$j?LZm1(QQ?aKWi;WIFB#M?nNTZ zwaW6GDZP6CoZ*O7qrxP{px$>T1i|9St{#r z@1tJEfOI(x5@j~}${4%B3rdP+OSieX5ZZU$8vnFwh%)z_;WZL{U#m_{HmN_5$XFwy&DW^f_`T5BpYg2f}OPNbVOEUI}?AZx`%c_uh#>7v!9y(LoK z`qj0Dn*M>(RW=B(zx86$8!+8tpVM@PQwfi@BJ5wunI@@zjh1}w=v>&Lklu2FE&i`c z{^68Xh8D}&Q-cs(VdPnaTB>ikw;DKuWlS>&gvlc0rHoRF&*wJf_}A|axj>%{jm2xd zi_nZ7C83@yI2={S4$+%}#Xx5N5xbaqkxG!e^(w))*_K&+x7_ndwWVb+dlYG9nLwkT7~JuPB!VCuGTlli&Ht4A z^pGzS%(BzTvPEeV1ZfK0&i2Y#pd2gbMOYnCsfzz&_Ozesra%`cQYJKxIeTkzgCrZLaC6 z-dck|r8Y9n${m z?p%8Br7dw)&{7cZ8fH>WjrPMs$hU(!1M^cNoDScRD$4X6i(2Lvt14H(zh0FR!84oX zjL_iv7P}nzF^JlrL73Hs5olkkOHy5w7M&I=UfAV+fynQZ9bPLq$xTCzMr7)1rDmTb z1fhZxZS{tZ)@9@kxuPTY7O&AY#uva!(}_^}-c-+V+IWnM=;*w29X9IW_jl@sIhp;m z;c(M#?f8v)JDrHxpx6MiWv!d7+|rFu(x=w^n7mMHiGyJ^L01DCX_`B=94i#qii1ld z9LrdCo{7P_?Ts=<7r}q?osd}-LuF^xMJ{LxSt`u_vN9Kh*|4@$SmOQNeMR35y}|ZJ z!vtRO8?X{i$j1(}qLcrAmtzmaOTV6bDlt3fchDN|q-F5C<#(TV>);gp=I{4}obHf< z-IFH|eO~CK{rvpwF^zWQzq)a?<-0eIE%r90^Mk9=p7MCQG*~mp)pUA3yL1cqEyuTsy_Kmc{m|ym% zMlINo8Lw1X+JX!px!oXM~9&nkOUfZ8eQEQyz<;dY4P)<5tCms|l-Qm$1Ga3+)TRL1B%4Cu#X z52PU%no%`WRQtE07Fj$0u#rm*na755vl>c~v8sagTxx4T#qfZrDtG5B#}GvEu3u@+9g|kX#{E)!iB#de1CRYMGji>Mb%DcfLH+u z;W>(y;{$xl2gV0@2KH)LyglZ<0zNYV`s#Bs-`d*&i*{C<0O2R>1=57eGG8V|p#04P z{+prxciK1_0RLLGOCwJd!Q+~iy3(K!6wg+b*=OF}zg@OO?cr#;*(pu&^{V@`m?dv4 z16)!4E1q!jUk*paJG`aOdd5C08Ddk(u_q$#wz%5g-WQdJ{WLxhtlZ$D3AeL&5;rF1 z>T&p8t61=Yn%r#VqcKO*Jo|mEvyZBgi6v2HtjvJLQ|-+BSU0$(FN zwYMJYN7(R9Py0ii`PzA}k4}K~ruedX^~M+uRj+?LFx-gIXEx2ZRv0R3ycAT8%=ut!xp_xrVK*0@klAqy*D|>Z4vFK1HW@3Z zf`T=_f_e7>qFli2dsYjxv?sK<#TEJRg+1zVD){QTU6|wPkx`xAkn*alM%?DxmmFs7 zidH?R8pZ5ws#~(r!WXL`uSi;@So6_^cicj5#xOWdh!3POH6w%h6x$c zjzuzGY_r!wCr6)h5S7dqu~34t`@Al)kMG!9AwO=?gRM6E#RxKu4TB&zzBR7jFeoE^ z+D4}nqPWEt<@0aBucKS|qKq_w`4rG6E@5x0oc8pkUG;z=Fh%{_A6}hiE$7g5Ma)#Q z)H)l_bioWn%DJ`BO31p(%THo_rSrNEkXrG_OeerQfo)t#e8xz%&3}d;p6snD=x~G5 zNkGO*CSeo6DkIfUV3kb(&rTz>_A1tZ^6^MrAtwq1iHLJ}t@5$F@7VXTo#b<&s*NV+#>8UsLRy=(@4pF7)v6NDymk(#*{v94WN+}TM-j|fgEYOg{OH`XzY@|W|9YI_ZzhLTD}H`p3~ zfZ#ns@7(yjSv0_UYEJ;zzBQsSK5)ZlCZdQYF2qm z#vaTb;_(YJ4kc`tH)NOfnaS$#Dm7YDWg8mLd6zxO;9bHE*b+y2%((8v_fhxY z(A``?!+nKl9q36$W~OJhPhV4*CcXNKH{=jP?RV|abD!#e93x7T9pyNcucH3^KyZUM z;j4%^#}o1WwRH5-Je!&B+Cp_AG zcludpf!!1K#Ediw=S7-d%a^J{rc)oahU}+&8yuYAQr|urWDuPEV6(xI>E%|(`TP&*yi7KDE^pH!L%K)QsZ7$q&tsf#Be|C zws!1kh>KRfl+fh~d1D;I3ybvRHN8od%|q)4k>S>BX@JFv z6)gbz0T%twem6AEoMC59GPY7M7U~2Ed(ex8MSZ*#4>NR$O$zZW7@1MdYpHmm}F0dy_r3STctf@3vie*JWA8TV8DGBV`)IQGC@ zEs+Fhpe|CCUTh_Hlr%D|3y)NIdr0BuA?Aejm_2|#vFVVLa7amDxut~w*b0AEn$E$l zlYanw0Gc2V`fCr$@{h0BNBqkXRZi1vVSkQen@>?JnIOfke%Sz9qpf$WJZ?kORXnOxm}$PYq6?Y%!!c&}w-5BD3~8Y(L4^JLsLy9S4|JT>%#YlMbANiCx5 zNT9>k-mR#$da_5-T*ya=);446RE@|r3sfxtF z{&vvF7FDT1XAln_dYVdz0juHe%NbW@ne~r{lo7h^d~fty4cmieQmq8YnV@2uV5;Bg z8QK|zC=9Owd-o{U)08xkBb*s*q*>!8$Di1`}H2vkdP9@TfVL9xMBHG2NZlx6a5AjTnEk`HwTaMAOo zoryU4e%v41PttKZdA6TcdaW(&zjM(S$h_{v`nOw(yRyLCLlAPyNAscNe}5t5hzySB z3nvzKUkEK5X#U;39D>`zu5;(z;PEKL=W(&6LDe#p#3X_)YOcE!`4pjU8Om-l{jg-c z>$>xi_vP!fRT;G_%arq8>}s{wm`8GaVQ{Hr?~s%C zt(Dy#ZwJI?lda-6MP5*JK1u%j^h|R(wdU6Tk>yWwpB@c`B-B0EDE@Q-U&4DTZ^%?T z{B&YZ_Torx%Rk!mb$sFQ6V_Tr%UOllDY1ned+S!vRbD({>krAzm#}8H0I^Zq>_4t$ zv3v*CyaCyb0+4?{@84%(Ty1~Z07C3c!?oDxVC;4O+DmQON&z&f)TE6TzPDSos3*V2 z=+EOA1}W@GXW0X-{L0&LV-am;f@LZBT@e$kiyc3umUYXn?aXfb?Dg-AkQF%OX&tQ? ziXN+=a};kVkA-5MylKvkoqZIy(&ApaA|63)G=3!BkyARm=Y~vu<#iv!2)CotEwk96 zcwfhOagC}!zpmLMa4tKFi%X8ubtV^P(CR@~B%4BBTwPYNVC+_+XFqjzS$ZX^*88HE zUfh}8-VvER)4J$-ZMPK3d1vGw*hc1Vlhu_sShDw=@nyF&r#YW*RFB=1xbc>-E&j3n z_)>Y9(%m`b<9U0Y_=+9#ubMu7f6rUvI|g$e`AU_bbgZ}5Oz2%^_&e1HiDNZyTVH%R z`(4d9&+3N58S3r##8+)9<$uD&%>^~h&*6J2H{#u|Hl%@x_!Dqcu3mH$7H)YNTRe2F zvSHHkj-Y_5cR6MAQzk7Xivn`M2t)w3+@5u(%R+jxwp#MqZ^UC|!APdsVYr7a3>}09 z01@wdE0-f~E@tFmZ!!YYgK}DHk=DqKV3e8(aAkp(F ztiaH+13Rf5?t6Ui$q;;YQio~@SMV-X7h)E5$2-zSzp6!+>S-HBv-=|^LStrkH`4xv z?8X|O2@3NFn=CzQIU8c^q!iZaD^~B%s_N8^=L_kmnm>sjF7FOebSqDJ$_(b&PTFwW zdk<6lo_HVf&qvu&XIrjB_;2F-%Q&D3%1)WzzE<~T z?}@$G4!_smuEepRod+bY7-jU44*VEW_KMAe@A*19Ks@rQy!VDODz-)E#{S^wqj>)q z`lg5HWA%bMC?2~ARimA0LYn19kwfhTglb!8ZuBEyexks4q zMe2hyQdcT$_i28T6GW6#R}|WX?Us8niwZyQ&oa`ox_&rUgn4vjDKhRAzVEr-mtxG* z_&l5$ye@F(_ljDw=PgIA&(3MoLxV)YIt!|IZaRz7Kee>MUVO}NwjSZyTd~xvu<&{!&K(Iy6AH;h1`sLq@ zD_r{I5LYLnM)4}_WOz|PrWPju)>w#v!sj=>UO%N*YooQ^>AXa$x1&UHAcNjJ_-k zB^G>E+_yC)QyC-0T!^ear!(NTNfoedIp9FlCJ-1#HeW9gO9gFrhuwdDT87O-A%boIMeC z^?xfeIJ%Lz6C@{6|HY(R@yHM}cXa$o`RrJBjGH(AiM!aD^77@?m1~1aPSWRf^FO@& zpykLJKh2&TV!A9Te7`rlPj>1_`&&D;WB(7ftueKJ`{SlGe+dQvIks}fN4Hpm);7SN zdq&1(dD0ng-+H19ww7hTL_9VxZR^^nr6FG55@Qs_BK#jk_Z^qS!^Z&}6#)?x+yfO5 zO-;?ca)9C<;WjG+x2EN))GS3DXb#-7a*wpaZDl3youf=`xiW1!s-I@X3Vr;c2_RW6-+l_6i4`+d35^5}_<7LGv~niHziJNMegng|$z8k{eTccI;I6BQ0&Q0XouzSn z?=rgbHs7xyKZB`d;A)*86UJFyrw*ls6?{H-NO#xOt$1({1}4wQdl2vAxo-k{k4^mK zb!Bh}=07oo(R)){9j~x+Bi|+Qdv9mkixd1%(d%ZAaCkFT)-WcbA~B+wAc zdl``=B7GzWqt|5aim?n>uehx}R$x(^AH_=n(DD4|F#o_raqNuOf2Ek$xnTq1HOpUn zinDJ!>Gj7Q9`GBJ%lP-cbRLTJOrbaeM#?wJo#uD5ecsg2^t0fMnOKnmSGfVL8KF~W z;m8h`4`K^3q`9HH3eG12O)8)MWN3Q?)s+`0?ao3&1YVwuQm>U~$67}LUSQH19J@Mx zQclDNoM=F(8{4uu-m?DYt1bD~C^DUuJZ5TzB447?$_^PQz_x$W`;G_tRgv=G3tW90 zB{}2WLnjhek|fBc;@_A_eBRsB4oYiMmC+V@zBxd#Kh^n#YW=)l7&m23Y(}#3L_-w6 zGHMtBC+!bHi9?j~4RZFWF7k)>Wos|v8-g5BW99W>0(MC;!V>ozhfE|)G~4fvDe2i4 ztESF;uGLya?O1^gzlCQ%Aj^tHK`iw))q$u54wN3}gJ^aoO~0Il1biU~?w5#a{@}PC zbTp)gL-IIneuB}L%|z)HPb1A_t~-S#KDK71oKtV&nK+@Fcznzuyb~lUJ!E}KWc}rs zdG!u~8qeNT^er^E-s}qDU|W6PNle>Q$g~55?Mgh@0So}LQ=E%e_AEFF>w{;}AaA>S z=hYO(tNQe8{PwaeOuon}|okKodwILN|a44wyqYO^@TWphrzALC&uz$$@ za7lKGf=lRul%ux0h^tCxxuVvWWwvcBBWgGbx9|UBJ=m<|X;QOvJNofh7oA#>aKZ2e zC&2Eb`S17gOdm(Ssg#;!O1&YV=zu5xC`U`O++NFk($*9QrGHtLjZ1-1Vf5m$5of*O zV_6?T_NgVP)j`gdS^oyagJTf_=KM#)nOU^uC3@tnP2se;g*cNZJC=83#CPUK6pCsl06ai8UcT7ZMMwtOsVIu55CLgL zMMY7B?~lWo^+z*}2xSSZx_01|?defBg_0k$ zcE&{dKaGF+bo@|NUl`R?S{*yBgi|1enVv^KAI?CaN<`-1_P^idvQsX|dsUtG_SdLC zdd}&}bOR|N(YHcd_2hGp_b;}5tB>7iGBHZ_@ywEMF_W6NiBTJ{%kzyuB^u^e)!nt) zRRf;Z{Bc&$-%fqIh9P{+-i7R*Z+`xVdDHf>pdT_$E20bzv2Hx~yA>IQ3kdIC5ECtA z$`a7hIRbt`Wc2a(1m83&uiB^c1H$t?RPy{@vH`RvuG;m@Pi?p3jsk*S$q<(b-y#Jo z2~$%X-sb9$yq}zd9)kIG7yGs$L<#1KkP{n?G9aLHsiNH!k(5lyRSNRkGIs(&ERh1A zCqoQ+x%0^^2mD`b<%x+Vk$?Z!be+T3VW^kl(-q*^-eE#Z%X<${Q;rWO zpyze@f1}&v3BHQFmQte;i^+*@ouAV}C+_`b?SiGNEhTlCCpVf@EHKX$C5A!V< z8ON#I#RFbNS7BnZ0($cDdIol1P%AU~Q)1b7`s@maSF6m-1oTeo4JSH?nyTaEHKL{W zLT}E(QP#p;B9I~kAn+Mrj$Y+LP8eYkqGTuK7o8#%MHO79@Sd$W zVrB%CR%Gb-_=-yiIsjQtr9TWm(rqrD(iR^(hD4M?P}ItsV$~hV{QJG4HMJrO34BTh z)XjR4K59i5ng0k}M#IQ;-ls%P$a=5(MfCpwY&Z%HE+<+aH&pXa+>#%nUiST}l(0rJ zz1sFZVv$7Y)HSe~|2Mc*dHT)QS6sy7wYYYE=xtpwBgA^oBQ0iM1rjaE6-7+9$Hl>6P>( zbat{3isMcl)!jn)Hy}i!kA)P=Kw%Y*La|c?EWCI=_=HgH*14lYC0Hk(pUxgaDHu{_ zR|D&8ChmLhD*bWU?>MKiF1O+5J>l9(@b?k;Am?jlB5msJd*~N<&0B2Hg0*QO zCrf|uUI*5ZELkky>NHz5cn%yLan1E2hkVFNlY6$a)mVr3mNU7|$xS3pU}N|alzESt z&)<3NnW1GXi4wjpk!0gwUdeYG4=x2DgQ-&6EUDWVnN6zjL;jx} zh{`Jev4qRGPglF{a?*>vX$jiK-dpW1pQ9b_pJNM0N%wW2ub;bXJ!f)~)99Ow1DgXp zzl@Z|2zRrj|5XYnvBW)Dd}GuFB|(9FK*c$lV0h>Cy!>kn}WzK=#MBna8$3F%Z; z-!X^QRNRTW?ru~ZclK1*Yc8ZHw{NUc(_ z)ivuyX~RP_}53&KIkYEB>|q_#v0l| z{d=xZu4s${U;AZ7@aCjkIZv?yz4_U%$l0xDe9z=4i4OPCq{a9oKC2kjH-hHe*Y3OA zz^*np*~Oo)tu>$$>{PD{*)LEgwM$E{$^IxVG89TyjsU%+v$uwWJ~rR5OVg-R8hNJZ zviX<8d!g&nY+=xG_pC*gpy3+pL$La4Qku|lhm3{g^EL553}Q1NyE6269rB;D?Gr^0 z<3BX3_iNvE$`>P|$|**RQ$%Hn;6MIPKVK(=q94khc&KGy z=cyI+LE0c0^s7N9a%o85NkPF9tDf9%pdxzjlSy@8qq$_atAt0xr998SS3iqr-dhte z@CE%^xJQmRV2E+n+Q7#k>1h$lei`@5FZMr+51&FyTmz|#$G_fnzuxWZ>Tu)mXVD9fS+%_a zGs|#4k@zl@;H28S;ystx=>=2rX}2do$k%}Sz(P}?TmP(Upmy>!ncY5^p#nM*PPI1@ zieGB1z*BB#fE6#xp4-(IMr*0tL}D0`D_9>VzoPFoKT-&x^LDvNU>=*>)B#?FWhdKE_qR{R2JShZiL6e zYOJtYuv545pIq1$2C)1@LO)H(x$8P%OxFj3-T zzW!ykQVm!228a~YwF-Gb30_aZSSR-^&=DO?!+6xnCF4s!q&+qMMgjvH5L{l+RJ4<)Qh1NhOSqgSk-=1?PpY~I) zo>rO9zbAbCmIn8u&r8u4^R-E`wMt`J?sLBfn0$Mu+*02;?0Kwpf7_0oSNnw*voSoX z)d#~cAn98nt=x!mlhz@L`0fPbAjEYJDa9JJDN(@f2h|Ff12i4e`e2ij@-)|~5BwkN z)QulEfeHdS&wSsE^Gq(j3iCP&OhT}rAz~h^1r7jx`lIvh@s}e#m6^eTYr$Qlyu7## zRs@}?%&U>E<^K`!TX{{)Y0rbLe|y;U`P)^QdAjE|=~rPRlYybO3?&wRZ2Xx3PL=&q z@@4Fb!t)sD74QxSVp-g3DV!AGauW2pxchP5L!2vbl{kEd>&Yqmz$=YaFN7jp&0i_P zRND5Q^S4DHx^5-eAd4m6Zf*=e3{T(^E?7evtR+y_Fvw`#IRh>2QCi$EapO0qX}G{q%_Q*6@C&RNdPuYMR%jYq>(;Z zhn!?ocLMM;9dd|ZuiOm6$$Ck&+`&yP)8l(MkpYZJ_CI&t0G!zk;ryh(6Nofl9L*p= zt>TeRPDT);56a%06vyWhA~(~$174IWU;TwxX{fS!<|i4^k^AB{hSXWHB8GY(vg|DSVG^^0u+=j0g5!j9*WHk}DD)Z@dI4O-lmx z06B30)f~)d(=xFh9`=I8O_;_ZdpfurKjFc|UeujLKoZJ##cYIjTD#(aUuck96?~9l z8{rP)8T?S9b#g`$hGco zg!z={CsLsb>tv6C*gix`f|0i$2iO&oqWWo@|H?@9t-&0k;jQo#oEA%;u0|8yVDgwP z48a;G{U}@xEI@BfW;^0MZi1YWxJ!8|>}v*)_2m8e3v}}HLaL!gG(0h5u$>`Mw&~=l zBjoCX>Nlq&ue-dwRhXev{bXF_oYR?H>oFgbyCCmzO4jXGh*|rW6^$Xs&d#Ng_R+`1 zcA1x*I*~qSg4Nd^_5cTcM}e9Bms*%n-e->G~_bWm*@)MjRTUj`RHjxtZ*> z69!`~bqmn54}fF_nnWn006yxC$1oByAx02hfu6)=JN7=%wlfj#@`nSWu@AP-t)NLw zkU@DLe2?IE8YYk+^s!>WG~cQ4f`|E4MX9$QLReXxUug$v?(Gy`)lBZADT}A$`JX%M zGRcVsfe$*N_r^JA$p*oxEkhmpv5lD*$UZ{x9<->@5}I$`-a>XXQI?5;5g2$rM#F$f zY%fTs`#Cae#6Cfg1-9-n6`?~0Rs-|~oEGk(j)^h4nnm7+ynERfdriZJ_3 zmN4f|a(u#yz`U_XVzYpZ^XGPDRkxLRz2v1=!L-`a*|&G7z+hT_@+w>6#P|r`eGB&@ zzfR%*_LV|`!SwE|_2Qw+H%Rx2lZ%(Gs>r+!oJ2ObvCs4@ z&s3{Fjt^YnA#@WEMDe5^Fl9#fXavhx78=qnBKlAP;(VVPU6;Qmaa3+ywRM9Jy~m2$ zQPQ;q?zA+jaSgq~TR1%kS6n!KyJMty<{RpPVyy?4X!nT62ju%DKeTL;w1o|GOTgCu z>^r$S%OUM4YUcR{4DV?Ytu?a3XqC+=)+aI~^KXVjTwz7#$UimX<_f>3g`h(0^|rO@ zIG|;lS0%FWN4*o)DeJ)a#CNAamvnaie&1uk;}!-`8wjZ=@f8_3pikscKm5{FQIxBO ztcY~E0DMi2k4GWl97dK#H2{ah&$x*7XuGi~SoIe+q!Nw)chfdd27# z;Z-D7uFc1eLt3LCwgn{i1*yH_h&US#ABd!CSZRsx@n;QR17l1v{_s$mNFx?eHz;J% zC+tiWnkQMFc8q!UOR2`y^#{x6^9~|#o1b&r-4mR09?Wqhav^5;_Y(Mn8d8Gw_z!w{ zIeR(W-2>Pa&}DS=M*trS0o$zLEvUE}F9x(g+pslA;71j_%jDFB1o&nJoyCmH+UE^T zrN8Qpdlrz&V$w7Bd1J-Wo+ZHPfvNQW(qi`0N=MShb<>vt*IohmKB7aS8|b~vv{rgL z9Rf=qN&lFTR!fIxiNV^VZ&pBHvE8Y04ZNGZsRJWv#Sp&D1Sq@$NF|5bZ$l4UdFzi* z>s}DO!sOLH)QtgKQG>4l2%MKQLl~K_6;465;q+e6jxM~6l*#)ci?+=l#f&EaAdGGP zs};5vR)l1*aN}8-E>j&OU451;+-assZ9%B5A^i5jaULgs%*cp9&~kg>bgCK`&q?YG z;;ELH<&ce(qF9R=8iLVWuJmPVn<5%yWl_1gTC+mRE7Ho9j@%U9Ge6PN8(713G)u^= zb6LL=E%J0-$Z92Ntj3pw5#!#XAWsWF?$76M;VG-Jc9;g=55os71A_pCrg-rEWk@cQ z=OPnGL~uJW3oir#&jUcV+uTR9OmY1jq*;K#QPoQgsLw3At`Eec9i;HZ$)}643C7nC z_~W*UZgX%aY!zje7=8Frl<~0W4o6ACXc4J`yKt-IPR{9)hb5p5i-{ z(%WgJb&aK`8RyD)ieH&4ze+BwIlEv(@W+c(`%PMOVklE~lT1 zGXSz>(RFd2^{Tz~^X8nYB;~76ZdqpiRRdt!qlU=4+&5wyZagZx`kOyHwjKunrXbXg z1l2fvc|Qwu`vow7qzdIeQkS`_ZOU`-;QCLhK_uSSr+IS`QaihMbJgJNZDZ?FYc_)S zGoJ6}0WVS0l*gu^Akjr}P5nI?HUu#Ix^sJ+Axx@NBX^!{*%d+ynK3nC76QUQkkvMp z7X&;tXjBa-*FDA3dwiHmKTWY7tRZ3t&MmHm&`7Kbz;RVYhzC0_+i3puJg%5`ysiT) zz2+_3ejny|9P`_BiHSWmbHQ&8L7E|i5!F4dE*OrXr_>;Sf1v!An?`#t<@QRjP066R zu%@R>o(ME}odMUfZChmWk(W8i(=gpKxQQ)a%QS~$7?1H`+X|CgmC4;gZr8p5m8t-m zAGSFkws|XoU3lAD0GUn~+Skb)9*1q80T3x>`#D=aO#slHw{u0U)AlhR{!AM|(&5^4 zySHtp-OY{&NnjLj=V!D-@Xe0TOfUi6K|OP|2H#rI3u13y??CX-Uvrt_9qA#^ry(-ee!A&02n6pgfQ5vy7))+%Sr*cc&xQ$J3}Ycepu#uG9wqL4;PvTFnRC&Laa-UHT*yIiC z8Uj>@_QHSZmG1%Ds)2u+^-5C6BIdwfKq&8@6CVRehkYkP)F7)@Kt!hMp((g6T{Uib za54u1vV%sno)EoEV3Wb6^F)$Ag1W=+DX1=+Cd3XMtaSB7IJOLP5j54;A49EiVpZ2{ zz&^LC9-pne2GK0gP82CiefCIF^nDo2V&IN!e)U9!_I!dTKMSk6=%=-7T9-Fk*E6iz zcm`0_W4id%n&SC;#!R{LIFZYT>p-a0MW=J)skQc#dAttOXN*K2r%}#Eax~lHp}-7C zWEd!pJQ>n!(#By!jscxt?ri}~t)O@*2%xa?)C!E}!`Xq4Fy06R&^m5vc_RA^b84r# zj)HjJLWTx;KL3~jv`Tn>0E2vh@f>6TZMG+O47<;ergtVFe^Aev%;`GDbN;XW2hG6m zb~8{Z?gYm37ADYw%nj^O<22Y%cvX%gnV$qetK|Im%JHx{anQ?Xb>C)D12~t z_K*|$&0}&t4kT+2jbKQDs(C)DoxB|(rkU@ewjtov4pS{W3dk`$@;R0O_XyS6^}asO zVE)qbhSn?6l2=F6f%k@B$&eqhL6BAL%buR8yKrg5a0XbJ8 z5nMhPH4W~g07aR#P7<{?Xs)D^I>+D7J)!k8^>x8_Yng93*lMpW5`Yij^>8%j83}I3 zPqj7`97#NH?%$e8I{k)?dc*ci2TJz7x&L>mMam&q>8)q*TdCBqpM=5>HZU%z?z73M#{-p8-&Up9s)*DGQr*&BG;qHkB)~SluU{F3} zZw{>TmdmNRNvK^l0R50V8R9ez7N1gex9jb!42>htMWJ~r(8Hie@EgQQqd85VH36t> zPHrxB*fyWic`|6j#lcF8n5NjAVyHN$^uwfih6}`Mq`Yk&n&?1bJUBRJF{XiV-QTic0$D0tgSWRz zp2j0KnirY`qNz!Kmjwnf zR*nRgPQrB~()SZhmt?<5{>`evIUF6yZIqx|vCKP#Ah7qK3l!*zE8tx?ysI~M=7MxW zxT24`r<%w~c8*acqQwkqeT_I2yYm~trzwijH^|+ETO8ef$X$K|*ic;LM#A1mlPJ3C znlG2;zU|YWn1XcmQMv3N;*Ui=TX02H+6t~>V!1yY*$9FOLN^8Bk$qp0AI?T=1STUs zqA|ON*sJfjHtL!-cZcRkycM@X{g;8X-r1aKpphE*%?8LC0NMcYP?N6hN`TbOxT5AM^sz%P{J5Nmj9dX%NY6lk+fak*Y^Mv;=0zl<24!jvh zg86>nBKLM;;CaTu#c7}}`r!5@U<>~=Wg6HJe`t&5I!C@(eG3>#hSZTE6w-n1(S->l zL%JUvZh%%tFG0$dA>l{gxBQ2`Sfg7EFjs>O}o6&%xqm2CSUuXslcsJV&$UpM73( z3V&I=(LcYu|Gvu_wFP*Z1o6{Wol0)_tvYyf=K`W_7dN3YxvzCFahfdv5KWFZ-tc@@8(>mt1`!f93JZO95r<8OGgO zluIcoDAW(#5QO#D3*B@J3o}co)RnmWqR3z_) zvrZqVPb+hu3)a_Yv#xAb4cV~MjW)U_sPp!MwLsrT*H&M~borgzCweVHc2 zPsk^UKxJ`=!9A!=A|J_sSe<4cS2Cn4bD?C&LP&Sr$C5a0<(-%0wT0!e_S*TNuO;Ec zOk2TOn~fcN9>|G&cUzXuf4nrzyW47k*_XbQ%d+qC3_kd1WBjOl;?pTwCI7ad^_G{^{f~m&3Blrbf(=4R?Vi`Qi@ zD}B_6aw?%HH9y-Q)g>!+LX zlQvFmv3KiGK|Kb)8cQDKHom%DrC9&UvS1Zj7w@I-Bk{UioesCom?IbmSgrKKt|v1S z`F{&7k-T)SF|P_5PwDl;6k|90kXLWT45n$Nw~0?>%FgiJ4Zhur`tN zxDqbPar$OopKlM>>37n3VYo_rr})04bm~-LK5kLeK|@^s!Oo$8MkZI z@d$BXu#Q#9MuFU9;NF+^^YbTjiBr=n-+PfW9`74I>h%;p2Dfr%+H;z$-2o*mtlm*> zK5%KGTx6MRw%fJYN<zq53C9F9%kg z6Lt$7D;O2I_1o@hOu59%A2H=sEg$O0hY_EC&B8V7NoV2`?c`oK%bc%|7z>ILJ5%Ax zE+o6ZN_V`pY&lj~n-w~ye(_jOt(s5#&ffWU|Bw0c%Gp9+tJv9^vy2pDm^T7fk{xPA zNcZe9H4oX&GMy%;K(lJV{~p4zUNdDhedW*xXbSh@G;O_RTe!8?{q-9;9YtnkBF$rQ z#UTaZ1T@v3T5^rSeZnS*qYb56!S75dBR9EdZuVA=!<`stb-Yu3k=ifcs zoHwo_W_I^uP_@K^MiEj3rvfW*?euTMjZUapNx-d*Q?q&*wPTK%UVhw4YYd_0^j-eb zOqTCa#ywVPADz^bVKW!ThusgG?U=y`2!EjodP3E$zibOfHi%yjCV&er?xJ~k%5e+( zP~-L&Cj(u!(6b5UNpFq^X+#98Ofd(biD|SSixrOz_Pg4-w_uL;w6ePr^H#Zu&Cr+% zk>d;fFjGgS!3u{Tv(;R_D5J?9VLX{33<)gL4HNX z)u_buoA6@4Lr7j+7^h4$=0z6EMMPuJS3{y|fp~-kRNu0Y`-cHL7bh0JVt`aTC`BI@ z*Tu|uY&EkV+CTYn#l?fwKzeu8sCM&%f>O{$k9WFn0y{qxe}-jH63Ql}zG}yI|p4)--CB|4`I*jf{vOvllF-pDHz}!I3=|wf8i^n&&PHv(@`W*lNQn3`ai4 z!}YiivN}FlGZ#+t4~p!!|1`P%BqMyi^bRw)Q~!1--=_7U%-a43-JVt9!18Y*^U=Q! zvvx0p74^%xQ|p`0TPl-(jj=@zCPMFAbi5do_o!s)(|e0ixs&HdW5pg09qTO$zZ6Pb zyPVN7x?3KumJ-E+;xdSy=guIEzl3Jzh9$`o`{WhLaT!5k)`FXA0>Zx>1;C#pN85@) zgzNzx<1hURCxMZ<&T0Y@KK*Frci{&;mI4Z^ToPGpds@X*IQRmm%$sQ!RLYxR|6EQH zP1QiO4FzZabyD=feKo}z3byFR?}(@0e42Fc1v;TWJ)c8Fb(q|u8^%5w+#2c9Z0=c? zRUddO7hap{d#m9(L|n#7Dacr>RdSAT-r9P zL7xkQuO@7>`!dM1<557hphPP=-Wq+xw)LG@r%UMX>^a}@l8-L0)Ns5wJcL2_U5Q$>MkhA4dtE{8PS6}kEdV4o7*+=90ujP#hL%@lOqe>w0dY#4#}TXkiLW# z35C?x_ojW!xmCiHI#g_kTZLYlQ5aFk_n%0A8V#wp*!rxQ)!GL&82M0o8VY0AjT9_weV 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

    *N@dga`j48> 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ÏgK5 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

    lUn#F(Ir6EzNK=fm3yKp$$I7l()Cwu@Kjr=vg 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

    bD&AyR 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 z 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%0D8qG;Ul@q!T*|O~flGZpXGY`~!R@UsyOh3Ql==o zP2Z}4pFcG6t>E#ZI=IG`8AEwU1xM%3?-*J#1%ofho&WxdKCmCV(_m5_P93RhokA#` zw*lodWWRDlU*k&Te=Fvaw`rx*Z8iz zsw^IQ^FO$I0cQ2LLD>U`O)3UXi~jz&qrv|0civPm1&Kb_3AC`O%DsGu*Ufr3%s`)Ew9sxnXA_ZJv+QZNPRM^zW+Ya`64RBbcdMHCMQ1J7u!4q zNpxRYmhGj1gyd`*94a3r0jovH>zPXr6J81G;=qop&r`uI|IUwu2lhqt;#Kn2BR?7E z@TIi~W9%Y)WJA8e94(RH6U(~;f^jV=@_L+ppFMAsxh16uJ-l4YF8gqzPTKTcvAp|O?T~YM@2{G%G_RNq3kR&u)eG2c+qxm~j~7$i z1Ngd<#__W@Jc0z`aVFBGV$Vei|0JoCDzn8&;Spf@HIY@@CcpLDG9mk(XtED=~rk)@t zREZyF1^b$dXPOo~ zQuW3)Ja{K)2(z5@4D-UT9CbNxTg^nV1lg^<&O%nBPSc8jnMWa4BR+M(#cBRKFFZy> zy{6qkqjPHaA-}A)@F`AiCU_(QXHq11BQWH6{a*M@Z08i(jr{cN)~9G4IgwxjK;cy$ zPE2bxnvi!Rxv~X}U)4&e3GFVsAq1O~4iZ*Eqe27%*x{@x8zlh>!4qT(H3XxD^Hka3 z<&%VcIFSMMS6Um#zeIEZ@L#u_9n4(bOVql6gWTlo!$fNcf!p4tUTrkaZC6}BC-4$a*9p||yk34I>u3bWk-kC@ubU>3>%g#RcR0wr8`-PU4Rymy&jS6b^Y~T`B@wicI!99`tP31Pa z2_b+wGceBe*8s|BD4&`;f5`)xflUR3GkT&Af1OuiAEbZ<2r03W3~4}Hvj5px$M4$%5H&|M{sI&F z$z2xz&qsOY)zYIlD}1VjmO*C#r!%S>$JEJ| zLk)+oY4a_Pb+f$=(5{-*`M|EEQHLw8`D$P(iU+fXKLBiEeiuoJu|!I`LInl-8X+_8 zN+-vkG|bf2@W_LQiPq4YIfJMTCbwxm%7xx)-Of|lyb`_gSR6q#<%JCq8seU*s5|PP z{^EEBIE<@C{U(4t?D2@6_a{Bt+z+x-r*5k1(Ez71nnNvhMhb-=<7!a;-{bbi1}_E_75_ z4uIsP|8n49H&Csec!r6;^{B=<*93x*TqpTbll`S52nm=v?IUu)1|~R%+=_w(Q3W$P2HF zqusGb6x=WRNtr&HF56V}T4uBE7vaNUc)HtNe;p-n`I7aF6vZJ(r)^ygYwFZnxmWW} ziUPB7EpN0@z@ssq$w<}>WpX26wA*wYn4GYP3JqTl5Wj&CqGS0D6aXp%1D=WVF7Y2Z zB?m4?g1o^C_zEu0v%`cAq0j#TiE8};^FW(8XZ=$1>zB-3BSwLWu)!LBdlBEA8-q_p z0emY~qv#ZJ(urMITESkC*QPIN^Bu7VaJ!dz6L9A|9^g4M=XS$6Pjo<51b{>WiUmFx zhqDN*m*5@Zn{Y3}PZ|6?-ZpP3P>pC2PuFoza&sTdP#dU_A+mF}Uw@nv8JqWd)ac^M z^tbIyN>{TSUEr$Fq^qobeBTOa`DdCq0%++aCgK>3yg75mhfNm-@vHz1*3zS8GKe9L(fH*q=JZ{oj@H? zqKM*ve$=!}tbpt^K5TzV%!LczK)r!Bi=>$D&xlLQF+3g8d{B&CV15`8p}k_E+XV#P zNY({dhO)fu{+Z%Fn0YyXu#Tgj8X4EI{k%Xs%Q^UZd6am_! zVBkh*K-#a-dMG@=o1;H*6UNgt9e3svh^2K#8QW?vV+!Na^&hjqgu8npJGvqHke{TV zG0ZInI8+}t6eWhhh^TKM$C--Hl%({%)Khq?t(l~8tSP>#>RcyL|Ec8zG{dHMNj+S+ zS#!7uo>4mwM?E1H&lBp*o{YhPYgadgnSB zE1mXr(aRhm@a$KhPs9Mna*4j3MQPzcK*g9VF-zN~7?o&H2} zEQAqi310SE>eJ{=7Qod;%R^+J^{xf5LNGUXwi~qD$ijEtK_O>J3~)*(+0I1t?R8EQ zt3bO_U;G5BT$+@~Ki=w+5rdPx`DN^e-D|8u&`z-Kda*Bb*YN{3D< z4u*6#w9XBf8_5wC=VB{;*#LZS~thEg=KQk{|biScsAe{_u~=x|(aXEQhb z3O`N2ml6nvRw{A}1>0#18+TSMzeCj>78H>9Z-Bt@E>U#gssVAB%9XZAsjX^IDo?TM zaU)Z#6B&H+9?SywB%Rl9>g_;p(B7G|rAqOsVR6a0&Z=?up}ahL&f?$qTGj`oFL|_4S`qIUv?xh7FU&`Uq)KF z-`vP(+-Wp(FR$N(oVnc8b`>!?3b>r4Y`n5$ek5?t2;RSz^3{$YJBm7fdeeBj-+KK! zz5`D~5rKx#H}7dWg>)f-FZfo1_6M$Fo8gL|4z2@(J)0jw!aY=9mqzx~;SV>bXsYb- zBU8EUUWbWZ5qNNjzUi}8PSF0;M+xFLIe_CYKI^k5qaw#?*zZ$z8QRA%)ECkpeaocT zncZzGYX^#HAgj zc#JGh3+hm^tlbH?!Rw1};EvE3P`)}_sA2Kz6(h4ZOs$FdtQh2_Kzt=R;AEzbpV!3K zdU9gza{jmDg&jgyBF%9;mD*X6997U|y3qwr-PR z%KL!$0NcMVT6w+lla_Sa-D%Oh4l9H=5zTYbwUBxsHvm-Qd1UvBjVDhIKc)LIBlk2I z$%#Y}ZG{aLaXj|t@|b#*zfbXnllI%ugh;7W72K4REHvY+Z7Z`w1-#LF|AH zm^i0UO_9m^1H7zW5+eFB8c^Hw_M9w$$`zMdOnN|05}=#gK`UEQJ;W^uLKW0%ey(&x zGj}z!w`xKAzAXKiW%_acN=Os$dGF~wM`o?gc@eQ$Kc;}3&R3Vn3*CcNMHQMn+NX`Z z)P*f|N$2vJx_x6~~@n@pD(g#dd_kB}3t5`Wd>%t%TPpp(IPZZ}!`oQQf{#11=d*Q?Z9@Y;; zx2dgdfU-4Jr?~b&&Z$Tni@YO#rwX1P4~DQK(D*{ucYo!YuzRlL4pN4>SLq$wLhg_G z@AR(yy!GqekZiN*9NjdJKTpJaP^8QC=ac<5x%a>Z*Pyt9XTj(7BFvOBM@fvY-px1! zw>B6_X!wj*D3?dh>n&_Nlpm1zN%fOEfk(RQF8x_Fl(h{4SuqOzp+8#lDlDfm!y@6y zfuN+eyr%|e4g5e*e1E}AQfc7W!NEWFO^UdEJ$GkyJCLnZGIA2Q8Pe4Vn#PwWW=F(;1(Pc5jPD{2~)1UyUPF`{QdJy176D?^iN6E;kQ;aarO>X?(S(1Q3DhERu*W)LZQ4u|RFoiD(%-W}C5*!0n82 z$%sh9;KD%gwG1R4C1UA-FI#NT$vP`%BNbB$$0~_P$i*V@LgAKGM!B97NN#=fh~+?XRGw)ei$i&ptpt@Bh+GjFF*q z!-MXQ6$bSzkp7#9l%_zH0J}*@Rptg2+;s$rsnD=<2%F_(HK(c$hjl7VV!Yno->*X8o!OiO;71 zrRs7vpzP+K63mRM3X|hn9tY) zjs4E(EEgMDL}tQn5sF<++Xl!mRrCmt3H_rUfg(BLIzy-<|^at zhi2>B%txD^fAznyIE9QbS6c&;DP8XrFE#f+qs|29r}2j^cUH9-Zk7106dRVyN#d() zkNk6ycR+Hv^#=ptI?6=2qs%4R^>K;+#YM=CNZs@H>WtQNC0<81K&L`+#e%XUD46Ee z(k1Jt>f^g{bKpDGAau-`>sHc{*B zOb4KSiy|=X1Bzl^5*=NhPtB<5F;fgiFhwWwdJ+&Up)8iAg3X^>icjk`0C;a{pG*zJzatZ&!7#!!EieL#|+Uzr4oEDDZ z1#oyFEXzntl^o1On(FfHKkf#I$u8v(^@1C=n z3TS*c4KO@lWSKr)7T_;q6*~vOCtVJt{NWlJlQ85SB|GoCnMJ(1%lfNGkLRs*VVdbq zfoIx61REm(ZUCz=hmkf>BSEs)I&7qqO!Lf2yr8|*>hy+IsNX~-A5^thl7kL57@GbzJ+yk5C)WM{QFopLl0bED@RFdP1uh&t0 zMP94gI#KIeac{Dp*eRIesma-LHP$@h{1v%6^;WI+SRNPRaQr4CkFvp zT`PnFMi)>iMe+pnh&{RwRK`1ajxYbcvp&uItyolX!(o&6kmQpir zG9UT!Oq>Ts@Ci^P(`j}9ckyxU(7QNs(R#MTJ2g$O3=rW-h;j>q+~2ggSZ#Gltgmwf z5gUUJzKGiNcX+HkPRaXoKt{hHQ8`5U#f(IM6#sC zkC<8<^6Sthr$`khv&s>ZO#Z_k?zWag`yOI=$4W$F8N;$Wlt1GM1#j_iF??hl6k{#l z8p~mF-(;%7=sml}KP!9#`D!30%JJjqzRbbv+$75nScTdsVah9axoXD~8X7mFwv&ju zTKbpH+~0d~qS5TvdHEd2%ko+y0_+VkcFUaWn8H)6_?2viJTg(HWuE$O^P{yd7+`i^ zLC(=nPA-!3heDOMQSg`Ff%`NrOyY{{dOCPM5SbV-p+IT0vp{a!VKVHt@-u?(Sz!hm z{`G0NtqGBtK(HG*{sOe*414f`ONRUfnr>_TumYrDDhsK%Bpb(2q7dbnsY;eZdX~#e zNBD=ot>S64+sB)0(`iUM{t~@WE45*6iEY`94H5Wv**d544|wCXV=-`xCX0Qci+}M z3J7pQhQ7B6jd;W@tY5{euX6UaxuVPG12Wfs+$|0zUIEjwI4zRMN!xFIAz^WZOMoh| zsuwoU$_YSKgG+r68LOa}rnO2E(}JM|aBIuI#+g$tSjvgm z8-vr7namOR=ama=DmDjgR%(lpOH}fMk(o64=)SC@<=2noMB@9A(QQ}895gr7Wd2kW z2e8VKiAZ;QIcdBEaD~-wuiViLL5$i6+9MAx7*C}s@9`)~u3o+jmX`~z%0MgSg=$K! zmYLs@C&_&Ptu*sSD^s$L!%$MTbiduZTNymuFIdQ-KFenEIwMh|cbAoV|6|AZ)e?p0d3RaX! zjP~s46I%~QW>9A@N4h=Z%)d^I$?&fl^N))KqObvawN@8$f~3b*6chTv3bath5+I1{ zbk%*n6;tq44h+YrM6V4}8lQc&=lPPIBDfmmTdnA6N^IuTe%fn*;^|u-{`q=qLNZsL z0Es*@Q+(#Q5*CT&Ggt2j;F5a4XbzqQ6J$1qu#Z>vL0lqxDDB^{b-l2Z*mS9Yd!B2S zS%94XW9U5mq5k7Ijyv4p-1pAe>+bBm_dI)tkfiJxLMkiVSx3elk{Rqai^BbU|Ap`4^Zh4bt8HMV@6Mt zhdb<6*U^Dr1*4V4OWIVDsV{4utm{GyV4j2!_f6a!;-fo39v#rcnkc_LhEf>TA8MC( z65``#`=dxwh+~`KnEc@nlFm*wh>*M4&R{P-VmfXM7QtS1R+1=_3;bJwJPVQXPXbfd zSQ$KF86aDbBl^CB=)0Tf9(&s;tep?RF5b`<`s)I9&Gspl3EU~AQK=&+FOGH;ZLvk8 zb_0^WS_V=$9tY{Vhek|p2#VWdx3S`$gDCMf+Lu|C*!8&9v~pi*abguuzM*}fig!2( z0yC01F;_BM4+M{f8~lg9Mkg<6+<5!o{aJ41z(cFSuPn;;XcjY3i|>Lp7$^Fn3mWIm z074d+06rU}|3F=o(HOc)KXmn~J358t+D&&zI9kFi;p+R&YxJIOfAZX*p6*IsZnUbh ze;u*mXhx)y#Acp{jwx2)b}eyLh&c_Nk%m697Y&&#m>s^7@^d2J4jtki{M833^`G>U z$3~!9#6!H9CsF3nXtUMuctmHD$%aq`+m$F$w%5Lyn`Q!+z?Sz(YOGKa(GDG#?xggP zyW)wfMkP0a5ZE@)e}$`=~Hjedfbty2w* z@(hMzL#Q6X2eW1(29PJYVg=UdP%ui9Lk_ZjCG9`KS$%CPt(J}<3vbSi`$4^rLoTK4 z#`b~KAXM1XocT+&2j($VC!V6k?Mz$`H>H>s_`Ysx)+BN>ZL2&z>I8mOS&0O-^p)Rg#6LaxY7$nIs6@{Ik@XwFlVWGH5vYmV z8bcAbe$#ykH$yjs90KjSgdJ;SpNoHO+l+w3$V>3q{ILBZZIYqT+$qW`bE@s7=DY0> zNHpURxhNiD=}T8B&pJ{0Cwm&~^~ct$|Lq;Bz4)~(p}Gtq>=6uSDVp#MWS`@{bLvsgS1(nx2q4|D0ttX*e7FV_LU5by+Z27 zW~i1oD!>@~WKScbEYZ(xw?RT50A&_~UnO~b6X&`zUWx+6=$-+`Yd&Wd+ihQYC6HeKj3&LP z<7}Nf*cel-V#PbDUxN}>Pvfgzi?zL}3}z^84c|Q37gW~IjCl)DUZu;2OZ{`kE;uuO z=%O_vm1HCo-hiR0I54T=K};blb?)sM{;e{)P@@v$OH;DwES~?UgmImgfv$v+I^@de z`8dBKn;e0jbwuZA6p|ljXRc;wwO>(GO_X*JrZd=wyM?Foh6gszu(?CmSRx6&;l~xrCoiKOwZ`OV!`+ z?tuchsq65MI@$4nKHvRX*HG_VPkP2Xqk5^wp(V*t1QbtX)(=B*7AokW7=e0?yFd6z za0@ipUO0kVlF@@M#`d88J5)bbZv3DKl3Q7|%$w`E>)dp`MJy{0mv(x#Cfk=6O*=s^ z5e^&;&?lnm?qawj*T6Bw=nPGzmEPg05;0VU*xy2-X`w-z4>t-q%uIW^YViR>j@XRo z(6QZDB9(*57U!Esp(5CUu;S3XV)WltaLnT}Ow}k$63b=C1&6O`5D|Bj4dpP`zQtAe zn$Y$TgRk)QOCe*C6(ZICDHyCLUpQg1cEXR*lkfJhc_sd06$ZO)nv~)i0Y4>a&@uFb z-#vZn2qoy0JevL2+dpfh)5rcAdMd~;$i$)EH3ywenq+C97LU+-rf`4J{+KAnacaqW zB0D{-lY-Lm?VA11fSVt8Ua>>bYL-jr$i+If^#qS2%Y-)yY4(I7>DiY39{Koj z`-f{*tUdbnH!sqQPdIzs$N-nWXjvQf=zfk`-`?#wwu?qGOP%aaBI~A5gRSodO&XQ5 zv6Sf&g;x{Rvm)3PAq?vG^Ny{l8&^YRRZE3-Xg)XVcqP)onrL(!SYN-?kA9Ii#mXnu zGr+lRFzVxqK0?EKlR7ktUCGU>Cxt@u3Ck>Z%3po253wIwpG~&r3x51us#!^?t2|%TFNzYS4ve?jOGl({FeUu=2dmPH&Qn z@p@~B9^I|!ttPC}m8M@4Wq9r_vW}(VI0m?W1UM5Q1Xd^cz*+O(KWxz>kvb#M-pBrU z6~5Z!Vl8Occl~l9Rj1mW0j8GfUq5U!Nefev*L%O zio$p}@0rq(+_?-ENu5hu5b+vLvOl|gEN1QjPcG&|ROKqn4d^mCrvDsorwqjV^RP}9 zkSeB2K&F9JJ8gBg1w3%g_Q=`k!uVK*cI`CkeY8ok6Y_V4%L4D97qXh)_09f!Jy*~} znb#)21()#NFVF7PkP1zEJeAVf8-thndl~!Ze)$KxuRKLkU_YPTMk|dV`z3TaGFwy$ z-ZxIYRGaqo`oViVvKF(A?<=3A(E9#+^dVqQ6<%h3_-acJgG@dH8N1vbz68P}N31PG zzm%l~xt;v^i56cmj#3*tzA$;Sv|DFgH}T)68GP@p*Kw?OD@a8~(JpyMcisQ3a9_6nS{!RY`t~#t*YxVrbtuInTLrymO;| z2=_2dd`ZuX8&0aj#3JHuap1!F!SB_?`lwqK*FiX?b=-DDB#^oPk?W1#6J=G>b@#O) z7I&sR2RFMuKH;?Bo>RjsMr0JbnJEiw!N_E0-_(W8h@6sQ_1JvVGWXxW~^M{3-ezMu{!+wum*sDPLG_I6WBd8JIl{-i3fs0nZd>{C8mMxK#G4DF36<0DYT4#{> zH{V`~DD-tHuDac$fJ>*;z07P8sPd@glLRk$F^T-+oNB;MaN_3WH@pnl{ZN(4V+pq& z#?A&SmYb&RkRfHWDiX~`LHCV{UW1|5Bw@0CCXw~!d9t^_bW4g&@VjcjhhjAeR9aUb z7h|bV?}-wO=ZXbgDelnbwC44i`XxD>A6z(X-lx+4gTAGO_iVp?^n$S9S93a*PXgq; zLjO0hLG4C)(HnVFkB1nq+qF0)Dt?At&F?nV$Qgb3LhoJs0|FE5$FUwJTdCmsw78XI zU2yb^n77lc${+PQl`sA7!+xP2WFP(z@u0u4Ib;gPxrVX#7KxKpwQ;woxn)L)F-G5i zU#MrUE&f-(V0@qI{p{y2s_T}6$;V@J0LfH32nZ$%F6`*zbH}-p+I9Ao!8FYjyRQ*d zt?>n3_|ki;zCmO~!sfVauh!g4mvj87WD=nUS2&^mK&Z_Y(3R07Dllv)UN-|dX@>(i z|DQu)k%`W%(vu)DpZ+&|BPraVJh!;deen@ecB@LB|MLH2w@3XaLH~pJ%Z#l;NFWLR zI?)x8>Pw90^1E_vc-&ewEJa)(T|{!(b3xYtDA=!2PeB_mmm&K|Ki9MZwaxNbJxQ{^ z8Bp2R%?3~evIMe9jM^LUe)S2FtPH_1IWB{6Gjk-1Zd)HvcgEBtUiej2t9Z#8;Lc>2 zKNV@K%<|sOu(wU~S&6(5&uhNga5EAEok>zKzCu~se8S~SD497TPeb-g?Nq^rA|`O| zKScwk%i?>2bN>X3hcHmQb}p+O4uw1Xoo#aKIxwCK(PBMJf6^>0l)^{kA$z_^(Y_f9 zB_}K8%sr1!dRUfNl^Bb%*H&WRis!C3&P5{glC&>kKk`)l?isOe<_C)g$bV90^n9s$ z&iPf|m>pLvEX;@%%9~;-%u2UsU74^=LGxI`jf>`9nboPFMaXc$8US`sC!=~1;%%}i z*$+ucjXIzL=?oX^@84}FfYOo;+QGB$%&LUv>?>p5DUEvvRg2s0!T$ApQB`fl=*tI4 zYUIw<$zE;4a$g?OXO$!eu>3?D*tu|1h8SDa6Pp(&%urh@<2#E6O)DDX=-0E159H6U ztj%Sd>`2ixY3A0lXBn49=<>1L=5jTE$0QjD75H&_<%Ggr&kx}ll>$aQiwWm3_t<=8 zWT+BjcZ!CY>O8pciP}`}p1!nLK1_C3@U5A#Va)^M7MI7EoY@+K-;NjXw?4b-?A8e1 zo=>eS8R^1y%Njj4VR|76Zs!hYGNs|kD^mC99$ubT$wgizC^PobePeT&d0*#Uu&Diu z_mL4b)G&#>&>dG6J)UPl~L*^1~U#J97!{hWT^y!gd>i ze*ggtZ~J1#5u)YllTS~XxuKv64h+2apuI{*A)9$EZJKxy0Ymb^Cpy( z#8{biUsBkxPr9v3@P5O!LBpCMpD;UvQ5FdQh*BB8!|0uX-yT#rO>i)z{aTz7t7WQP#iZG7Gvb8|4aYyUe;+3Z#u12TsS za2$o#&3M0?*v*t|sM`X`aG^GX+u_$ZI!z0Y)haU%1fp(>jz4B8Mnwbu=EOY{WyG=_S!w+}53 z%$~k;UR{88RIC`i6Y33t(CdLezxCzGRSp-y<%nbk|0kZTsx$5z)xP<|Q&T7)P<G%jqitSvBxR70^jc4)Jh# z5Dt8P0}L4hPyof7BvRMxhJ2B_pIys)FX;ZY< z{7Hb(EU2;I?uE8At~qgjyzg%eeX>{vD2(pMsO0S_65saMFJ$3Bli%KZs!nMllgstccC`zQyzkY^Xf7I z;dG8a{llc?>?%3O2Ui3BB;UC<8cPke?cBab4ZU<&dHXpAY=e$vTx0&;kyaK7K#r4= zatTNe6Bs3qp`JvgVW5)et1vJ{;TxnkK=y4wk{hG)0G&=N8N3$c9VXO;=6DC;Z87E1 z(%@W(WYImwq>ILnRRSHg3~vC~u)L8Off=L3rHd36KfHcUL$LfJ7VAzHH()a7xGUh1 z5j+oG4!^6ord(E+G=>8#5^p%p2|H|uaxBtQ`)0i?*a*)tPUg1iR(RjTc@g?K?=S4Y7p=ml-`Y4kH1JP7=IY9c~^2JO9{u*vwV|hwWzW;Kq0$@b)vw>oRJf?E(XZ zk4qu{fk9L`t@Pv(TSY_yXam)&RnG{FunBFgrAe41%pGR#Lc$Va#Di#m1BzQ3uJ;+g31Io+b*$n4ZUz zNpRjg0E}VI#47)r=aX09e`W^I7Y1CwA%=yNZ?@j@bJv-^SZYfq?7prWM3gb%L)R8$ z>o+@_#*x2UvD7I=Dc&TuqKp$HZ9i}4TdpL z4|^X?q~*C;V-N4*r0RBX1-E&^&g)oC9F4UXVVoIuxfl zNKD=W9WZ5inFQ=R8bl_(3uo}#7ftIqR~m?L4I*!%uMa;A8{$OV`^rZDQ$UN>-1s1- z(hSfTd~gLTXsg8E{u`dc&BlnKCwl7qvqxg<>v-lsyMN$=8VSP#LS62~)KzW`Qy!&y z0Pbv=CXN_hReEMrVW+`jaco&H&-^RDyf&F5k+z6c)4$&rc8N)N?iTZX%Efa*r|X2~ zZb1O-PwgLzdmK-t?T6WSI}#5%>%q93;7TVXq78(ATmR$~lbihj~Qo}pz2 zoFc4p%~FRtX>gB`>^7VW{0hHay##z$)RA^ZK^2uADl{!FU0-Pcw8ODl_bMRUnA&=! zPx^T9T1YmYLj)Vu`r0sx!T_^-tOQm}r-d~?^_PfgF>Z_8yA`g3qG{lL)~@v|E=O%j zjSYO@?eGu?wngC|`mjl=@h>|Ae+D1jK$IODj8%o$a(TZf0gDPSBZ7u!AMS?k6F8t}#OJJ90(JmB_~1Dcz7K}$2OT{BT8xm@=Q(EX zyRzE%TMDtyOHX@3zyJQ)X(O=p56-9!Tmit(X`g{GeYCrMOqjvsJ9465yzC5l&xT~E z58m+!Y5@>bs&wu}(454(RrdO47BEC=sZ_!>CW~_#@OfB^Wf0Uj$+Y>#&Z{IPlW`g8 zKg@c&{n296o#+-1dElkH-Zy!GqzGInL2S162HU@2%R^Xx;Ju*z0!+(*X$1aBAr8^c zoTU+dCvX$AcH*k~&$`MjBzp*pO8+-DMvC@ZyN7??8QsAkwnCrRKH$92lUHt#(t__b z#z}vc&-(e)zhx1#HCqc(NENU{f7-|V8r3poA9+rOt)s5`xQJxkSp#meUn3k&#{fjyH3J!E+$27U3| z4%)~9J+tE3k~aU{(FUm|7O&1(dY3Sf2O9shKYtVT99M%>V3pzvF;1Rudp%tk!5z1a zyVqz~H7Bu1Gt5ZA7m>R1enPkvyi)MR$VfYA=MKIe z3&7n6xhabv4{&`G-~bc6u-|v>qv3^FQGItkI~uUCK2O*lf_igLj4>AE3(6S^yH@Xn zeC_Up`V(X55*w&Jatq(}`R}xew#3$~pZqr^t6JFbZai$8-60xKAHd@6x)Q@Ae8zcB z{^T$sa*-IOx3jfEISb?t?sNtpCu<%anpt-#L|`Y_o%so`Ey~9l==cb@BrJmt-ZNo7 z^yvVF{2!POz`=WnvFE*0I>2=uAgmNLBJ*tTi$kcDI^zr8nF^EdJ*3QVcHVkGt8LVB z@AU;spa;v*uqVd5k)wSJlTVHotpVI1#gdNGiR!?dCGg-bfQaUNAbq3fm*%H8hE!{S z`2;?G1gEzKu)x~$xmCutRq$Fm#~Iw_ZcBqaKt0|SaY`~oautUjV; z2%#0jJX^+PYasXsAa6$i&*>coupcqF`3>-Ph8pd8FfCU&%-tI=010->1BMk63BAMG zCzb{gENaE$0yyTp!`!**CD@=jdie5W5KBnir;=TSN9Z<;cGkFUL>&5z*9PE|LAcW_ zip~O8ta!p8umM}?EZ5{gi~ThWMEROybyM^vw|epwIPz9!fb{6D{%3Ua zL`jOswxrs6`18TkR!=26Mi}WkC)HJ!r~Ng6yKC^E9)KAG452`q)lgY10NaPdXy(8; z)&Onb*~gJ(UEuY~-r_Y$0Xz%02#0@|pGGPR=endK8|;qLW7YPTAEI512e-Ht=yH9L zhrf~r1{wT3Z4hn3)+%=gD2&AYOFN4`Q5cTg;vF!4T1dsA6pDogY8Y<`y^B2nk(r9f z2Dba~Tm0P3!FT}*bl7F9+<-?zgd=fg7^eduD*!GZnk^fkY`PC@7Y=Lt5sduI7`C^( zqkl>A(_`gkndU>~4W48V&I5?g+xL-ive{}9cRd+Z=r4<8+15XrWwYIIynK=OB`u%6 z8SnthF=fk|fBk$6!b{y)y4IU3R59nd_M4ltefsys!}t(xb|Vf%%2JgbV;mLz4I+5@ za>dM%Ya5+_x?m%Kp{rN{uE@N&{T=Z^7YOKGrDYkkwh^kw!hCVU+6!Gt9}HOu7H%yT z@g`EXH@*!RTh+_GZn&a<1E~}J6z@zCeI|!!nlj8IBXkvGKy3`|jNK1%g-9OVIj@zf zsFu9!&tRH{p3xH7v!9S{?T;?_lN6ZVSuqR7x91N1wPxncH(Wp>_P+4Fi1Yl(wkx)= z!YiT22^efWQ;}TpCl;N?7tsM!unVvFe!hMZlp-R1WbHB(2z`Kg{DNgoJ%uWr|8Gn| zX!r&lW%+NxEY*5cSA@;NQ^+>QB8glDM5RHttuyIl6hBDJzSj#<_n^BdVO`vvB&_B8 zSUebOP{o|gkr%+RPH|l;?QXeR>CY*IG+$ zlIa+~En($E9fy9zhRRO|QJJia#cu?X;`0b+Kc?j0^-sxXW3+$Uu5L|o>tOGTc6x7T zl+nv>+?!qRBG!v+`w+B6Z`bQj}x=Qc710wDNuhi;9v zEq|?;(X+0vZmT($&#qdEbBNlfbeUc8PWh{9uuq*4LEU;S@wMzfHr=86Uv6e43mwut z@3;)M%c+q+r6f2;(Z`>mNl2-HQeTvmxj})|YpC!Cpl6HYcanXxn19pMc)?U}nu!V- ztSPGOI?}UCNxgkIt@&r#YtE=3KW#5N{*B#!xj=};MtOdyMWtE^2OH6Na(e2ON{Z-u z3g){goA?7UiA3bnQUkAX?a8uDGUn%*-PanG*}th$d9sPy6&{|sU&}B*lFap!7Ou?k zUjLfAQ!Yh4_%3?U3LlVNEK8)LF!{{t_cPsisDM!~pZsQpA4y7+Sy(!}K9V|ea{lsC z3d0Nhmpr$pJ(hB|7g&c4h}s3$x+hqYve?GS@e$TL-34H*4cb0O|8b#(BlhBjq;0nG zerit0nnUr8-om*XLxkd+e7xl~vv9jPH{A)uVWPVkOQibFafNy*7FW%`Nxs(i2*_ zGv7(mTFvvbhOjVFFGxQbd+SXcC!+AgTbQl*{K1y#Z0(zzHRVW27c?Z%DSK>Mv14aB zeqmU|i%@NC_9k08eN+d(L-_j8 zt`eC9^QvR-p#ih)WS0>RJqnhL9nl}19v+xXO4IH0(v*8{V}hMs?@>lAJ-2UCJL&x( zYXUh&;s8DtSC^j@dz$)oi_mENYw`Lrc)O53Fo2X{dtr|^xNDo-I75$>TFhQGfb=J4 zgI z(j0h65qLn z=Kyo&^nuG^9FJokkOPDhZ)LfE)Wc#>erRvDVlxxyCR4YdWi zhxCj*GTXvNwZRIh7ab}~&odz6$9p^@J>I08lcAtXQOt%}skzgS<)}iNY>*Q5>ayDV zUSdK(I>ezJj28wlzuyZ|k(G%ev#-FAfQqw-)zNwyk}`D=yXkO_6bFWKJJ z6PqH{beyWTs-hTzK>8n(FI}n%V-DT2w0s&hp{I%`X`Bp0ZQRXx@`qD}pquw|3PAi| zPo<=)!3ar>A~*d@z%!pDDH>05t*kTBAJ|k4De^SWdP3>&utU4hA>)54RogUxne+oi zl^0VA;Y{8zsyaP)>Vp0_mpq2xP2|%Xvbn_sE;~G7d_KTEoh06IMFd|S_%li+Aj2^B zEB9re3UGx-WQx>iC|Ti#XXzwlxCDad4-4W>jF&b=4pIM_-l#&8oF&CX{D>d*uF)x} z@=4`8?Ig-PTh|RV8s-7`s#Sj}x0OYiM3$#9JkuNpVnn?mtCmEbRqrg}@E1mU{GVe+ zN5?VE7sRHxM2=P~dy}j%Lf^d&F5P(Ts9}R^6gl{6O`vV=J^3l5BR%PY@GL^r@1*0j za(4=79sfCB5aBvyl%-<8pH4Pdu8y09dk#nq`2G}38|Rj!2C|h@4{F5i(Y9JB7In6= zM;Q%%zBR&_nSET9Q3@+xl5OPiUvC8Wqa)h83V+DTIxCJvh13{=A~&#NwTOg37$_rc&Krk^URLX+zs z^`yV`yvR4YEN__961#RjwM8Qaa6}>d<80AZ7L3i|WqWYWxRofFhM&t|p6f>|jhC-+ zUR1ten1LMne)e@}URgt^{RpJdh>lxf?y?@X^ZS#X(2_6r^oh~ALVRn2l4Ta4#A1Z- z&o*Jjn$M=wqa1IBRP~xJr!*AIeIovXM3t|Z8Hsjtca}lpB*Q|ZenwR`FCWWt+%g}A=EOp{`DOp#r8 zelDLv3Jf*og_;n{eq;dAWYby=)}m`*YGra#?125%*BASZ9suV^W(;sN2DP*&u$>q( zvPcZ-8SuZ#sM24clTb0BDSWEc(*}O%JD#Sq!OgrbT(Kx_o4#_hAywKi3|?;%w3!Yt z$4NxeDKMCh;&!qw-!aR-Wn}r}1pZD$7+D=*q!`-vP@3Gw{B$+-jN{P@>H9a!n4;LB(KQaaFyXNRH8Lc(- zWzvdf<+{opr$Nm(9Tr^BiPTHMJ!zwJqfW~2tc2fYI;2T1)#V7!T|(DuV;a$&Ip8TX03GtS4gzTn(Awe0f5Je8oo<^jR6G<}j&RnC1#7 zIAwnaE@rc?6Z1Pe3>7@fazHy6q5mzOMlnm?#H^9c^G?C)sj}o;%BYfk(CzDQ3_Ax= zcj7#M`J;+GSBS(*1It|(lY52JP}&AIMTpVEN{(tH$anQ}pm@BJBTGL?=o&8l(mnyE z|Malo*4|D=#EG?}gn@y>sujG?Ve>qVSp1clo7nYvNv&ST##@hlqsH&CApZ3%MD;?R zet9Y4!ni=d34BMXMp19&S@Xlr+^98 z)unBx{&KsCR*R{7adNWUAju ziyBVz+SkIb(%%OlhDWI!>vdc`Q0a^OcikE7>yoMO>rm13D_;_qpoH$h$MyTIIjhR7 zv$-8Z14-&q@Zp{eefsc0oQ~Z{{kUkOL>h!^q&Q(91k0sA0`2f z>dxbJcN5}is7WwHZ|VUmQHbsMCNaZZ_z65LE}+%d<*-1C2&!Tb(?gnI!P3D^UCglOntRI~dJq9f4`J zg-AmSCy4t7#M|1Yd96kfBT!g^N>bg!_|WEJf++0-OHkqSl1O&J=xjrLRZ^@@1wO}% zW^}8*_s^=hZ?8tm?4z9hWS7vCP?`j;0>+bd4RbRLX+1ByCr#cA!Wjvd*M~U9X5T*{ z4$T&0XcG(WYo!n;;+@Us{}SHMno~kYa(0^kboIrIKr6k8%1Kpv*Lyr7YaBetSF|P% z11tq#w9nj_u?0uHSv@ef{p5fhv+RXb7n)=xE^{}WwA27Uo&;)GfS1Kuj@YIR11w4V zrucD&F(6%c8q%ATW-twLGJ;?*1qn1Xm}4+KBMp^Cn&$jjrH!Peflz6vP(HKPRXvUK z0l){(R?2V+3q2vq?BLUbbS?=S7Da&cA_Hy6v}tCSG@hYgqiUoSnl|}>Iy6vX{#t18 zp7PDF9||vuUP!&dw2yKLt+b&5O`OL1-wZIUwt2|9uo_yl(CFL|_;J$ln`V<6{mPMF zx+f()FJcm1aJwR@MGLQ;y2SSQSw%A!mn;&h7)Q}2uP{9Jqj6ZyP((ov|tz#uoE>daN|z*))vOy%XXr~iHG zdoQq}v9%W3#o(&RVr$oJHbqV6oeqkAC0fKER~E3t+_gi5JikYUUv~bMxU*iZC8Kan zY+`qB<1*O4 zXlg}VtrVB5ZmdNe+e^cJ40Fp^Mbv?-n6*N7>7rwEGC~__Vc|eFGaxzMEHiqjZ}n9n zpvtwAEKDGLMa>xAHm)xAj~()_HSE%Gv{VFZ@TBRdxKnu+Yue8u>QiIH4;J*2G=F}< zxn%N`w^EQJMh&jy-*A71Hq|jwXP^)`ziFsp z8B|_!h4$m&?8)3h4Nj5GNUDlJ8~DNA>vVW|hMr<+`!e)$ux-=*6x9-n(Z9t?{eR7M zoo17L_kTL6-nREP^O~s|OacXH+b*N*9C_Y=C#Z+)&8`#B$R)8CcSCK$rqmP1H9uO; zq6v3Hk^OXowK*TD%I*o~4B8b>SHR1`^H7RM2rye?X)KhhuCee|KMEoH%>C!tYY)K) zGX+5WDn- zcG4GX*#4#O?8}(A3ynjmH!GhJA}Gope@&5375n1FH!+I4Of3BCO2T$K zp<){7kj8aot!so;p&Zwa5B^H)@wI_jTDy74vBQ(NO0OGJ&vF7 z@fV*{=FZ$7UTu=*^IN zf;SiSTQ7_^%M!gss)!7nC|)>ynAp!UA<3*b1bgWr%nD_(>NBT!GWp)`uQyD;rUBe$ z_0Fdp3u?j?M^bjt>B}Q-h;JLzHi`937TsAZ=&3zdpp$t+) zh#33cQRnd!7%Ur2yO-|3s5o6$(kZ0E_iBj+JNID!Mw1)+1mI`;q?-ex{4$p4L>;QK zro1X(zF4YXWd9<**Yk2>)L^ExZ+nU`>m!f?zUYvr89B3Na0iryd**3tW3k16;c504 z=&8;iI#{67B>eJ-WH@!k{7Ib0XHylWiE8O{^NFG4T)O5J8ckud7pD_!r$fk_OqGsh8x0i2YX7rFe(Nd2n%+p(plx-Sah`A9r!-%-`$QUh?J1)r z(rawfo*sEnt>6cv3fsJ4^1JrOt2U^?C9F)wmmkGjv>S!KBvZJVbdTNV*t5C0J^Y3@ zK;O`J@QU3-W{zPhuNUnid}8@tZjg^BQqwVU&9bnPQ7EY)!$mjGVXvN^Zq>)1$VR~Z zFc+9GO;!KXIQ&exHs)SAK_2N!LQNhcL#A<{(9Ne?YG7u)wl(vL`Ha~ zO7670D~Cy{{b%8rftd*~|I3fq?kN9@3BTNPPO~+siFcfBKv_zPRqRuf%LB`(?u$HC zPbYe$z)op*{0K=Bh0oN=E{hwMhJOpaXEegfI01PFI%we=2lpL)HA66m&QU<`zom1#>cjUKUSag|7|L)XUN^83n)8T`bZ5uHf$n+@vb+L zW9-ytJlgAv@+mT!gbWLW6y}KR}k>uVLtxo_^ zIS5C3Pc`JSLGDM_2JdJGCUP^_#qD^B{GpFJ-88<)`i6IeddV&xPKlGM z#_M?YqfsdT*t0{_|Rl2X77i%(Y?yG1fmFF#*`YkVs{~&Ce1-u#BM++Q}Hx+S;!5I#=zdxv%$ONVLvc8D-G6%l>S zorP=UO3=J0kGOhNrn76WIY)fOME&J}f##Oh%hh!#M5=^lyzA^K{WD4F~v z_OVcAp`%338rW19`;I^UQ$=D<0lUF$CTftR6@lGpPlC{!9CtN^z4?I z>GAXhId=ty2s!de3}Jb62TZ@8+~-=$ph?s7M`s8SSzu%*9zs4K;P!vjuF+zMEU<|=6CEw7YE||MWONXbqNv$j4TfXq2Do%8}^w(Tzq68pWkbfCpkoh#q z$(NQ6M^UrSU8$(}^TQd8N3B*M6VfWMUpbF2V@?e9$g2e91B&-s2IM<8WqnXV4*98A znq$F*b!E1rv2r>@^r?mxKO{(xggCs6nI@5EmW6``@|D|I%!?3uMHl`lSF#_%R@}?A zhbWemQZc(?2Tf(nJ^;w_vPc6s@vlk zEx-$Uh^AFr0)rSTJ<+4Zk}*!Rj&fX8ki`WlT)y&lk}YSa`h^ecr=E!Eo=2C$3c*@e zqBwZa{_&3(n>vJI>1b&VB3n_#Y~>QbgF+I6rMmxY4H$=-0$QUP#XT;!i8lI^2AakG zv7Pm_|GCKk{noC5xeJwO|3zI-%`eJRFsOhd8Wb(tK%Ge#N;AxZ={slDdKe44c-r)A zvYJ`GUNIXGgSedVP=ufS1Lgir%6A(28V%N6to4Io5~9WzqX649?1==u{Wics6d z+elY4s?wIPtUb!)g7I1+6r-P9#lT{;u7I{$;1qDk0Ma<%Hr%7JdhH>@S_hp%Rop+I zuz;;B+QTuG{Q|+#@Fq>JWi|3)X5kg&y~eIL;jjS`;_h`yuBBY`NEKPFhn}qd&=3fY z5n^{vf;Bu~XrmF>2iR%K%B6r&wQA)kkI8zZp%FSV>RcnG7$?bPcO2bNfo#(1#@06N zk=>;T4VVLcf9k&G2f9QQ{;@W;*U<5vLQYx~?K2pnOX6075)Nr+B>Vjjd`_$PFEgJ2 zZ4`V>Az>CpyW3y1py>OoAA{(4SX0e_8=%Knv*Tp^-U1m{1knitTnaZN1MA~Hn{Qti zybtMy57Oj*y9W-t9)n9smQ*%hw-MwM%zX!RLy&Dn7v9(A(KKSBY6sLAiJG+P$JYhD z&-qwVfJ4F{D_hd_;e-KE2HzVt7GK zcK{-tH-;a-;O)Cz)@j*Mh&8{6thysLel&P{{J zjimR){b+_!OCZuaYP1%4!)&VWAo>A!vw%j{crP0-?{JSA@LQAXkOj$G%-sGo>-X_2 zxUI2an#~mSlDlo(UHi$O`n>b4Xb|RA-Ip;s+F8l9v5tZmj#IWjt+zcoUeHq&Xm>ti z8kT3tTO0);iuH7V(b{nI-2L!e*7iV&1twT0e;h z$$%Fe!Wxe2%r@JwrK8dGGcr|at}zbK7Q}wRnbO-6oS5q}<$77?Xs0mA#F|T2`MRvO}Y645XOw8L7wr;I7e;#B) z!D!S|&OjKl?LpzR?Tj{gk&2#~w{146TXHU`!JNWf)aNfLL|z(7Tr9AE z`<&u1Ve2&`tzu~>^LF5F4Sv!ih6UdBGFFq&a2jna{-EKbKyfgSHT4M2J|_7!s7hpK zCNvCR%!m9sR(N-nyJ>wGMynA;X1UJHJFowUzA}{%5Ir4QB)>+sl6mhR5Z$E1)?o|$ zK?7Ocs4veWHoNa<^0W7xzicG$S7guWzxPtQi=0DtU7I7U=$>%$XX(}aY4|9!mdm*+#`poQurlGZB=B*A!LA!c z9!Jq`xFVw8{;5*#o8>nDz*FCVI!O0wVe8q$@P4D&z;7Q=4>oOA*i(Z5wNt>nqE_x; zgJM@1brq4=$NtoP8+A~XIlx5c!6G*FtSqyLX`hqGigc4k#_F=oCFBzLcFHk;A!LcJ zO{dX&h-zzWDDG&68A`-|vc!Co9Q-1;_IVCF{hVy^YcR0`va2^oAI12Iy3t1-80q^9 zXS*gh@4h+K$c_I4XIv2|)CDeo;GKB#wc2BDr3?`l46t@XTXw;{Y}#3eUY$R_Q{VFX zil=_9V8>h&jOyDVm=ZR^?hakU*lKNFraWy;+l_BC5Rj6~N`Ne}B3-_Qymt`Lv{rub zonIzv@YA2V>Co@22j^7=Jhz?IwlKZZ>OI{Lb`eyXl9&HJw5SpV1qcU}UDUyU3}LHd z?z`0#n5dkeRVon$*QD{ZC2V}dp2wWQNK`jKPet5QUZqzw7&&B z*MH$OddznjC=H-j4e=f}&1nmC2(3q?wDr$I#kO9vNTZrHn8(Mj+~h>b^&c?Ikt8xl zQhsC5CN=03KI^{JUWQY>bpXa}f)BQ?^rH;=OCt-8I~AiI+X7W@Z-W$unVAkyiUe^v zuGCKgp|v}oSlQmTu!YMa4HC-gKLJs96Q4f9s!A=39z`_j0c@tJnvjI21HWt(2%tyo z`GRqpnDF%{m1aQxd;pQ>&dk*Ps_hi&aS7ibp9AskRunwB=S#&}30f3m{#%P$2`A{l}=Z zV^_t{tl^LwYK?O;uU54(-+#AICV7?@Ar5Oa%BR0!-pQ>nKNz3I?wJ-gfu9%;bZXxq6eZOlt^N4?_v&JJ}Jef+SkK&B) z#A?3#89;Ecd*u7^-LLEE`bdWJ|DPPATQDbL@O!uCE&r9lWcX9dbvMR!6ih6>pyrp@ zwp$oS(}-0x)MK&Vit?9;WBxFyAIX-$136a*jjJ> zBtL+QxJrPT*XwpI8q43P^~vA#JvIh#Sx3f@J2gLp3j%w@5w(7qP2QOvA`3lv)-F*R zO|HxfmDxTOQmfUyjK@rn&5$5)GCb`7HzfNO+Akk*n#m(^&24eL&QHkn>n$2z5B@?_ zRMU6 z;TS*l@KHW?%+~Dk9hyxZ^;hzQd@)J=M}metWn;#?lUTFWQiTP*L^VyOxRbcen|7}(H-LaQ>p73`~PHzpe|BSVNlOHtq zY~gslMyQ=mp)@0rj%`KFtNKZipO#I}bkofTuiTekXeHGE0~HAqVqana+}A(~b2uPWxYiCh&f?G(pn1t(An z4^HrmT2vuhMF|@TjQ>JCt9Pkzvj*cogzeSmh{e^Mquv+z+*2lVA&tR6MVac)4|KEPe?Xg~R?D*ahl39`a1t118DOi8NRcOiv`%j2jJ$}pW~-SvZK z;0kLDIe1c_L5t5I7v-8kXZ4TKDY#LuvF~K8~TZagFw_#vQ`9oTP@BhX-A$`CbA zGaw*@sTkNB4u4p7H|R{1aO$HfnPVSpG`wCtk*pd`!=^oF{5R_xK7%423UFueLOz94 zQ^Yb-feG?qLWGed#W-`*x7non-qrDG^*caxU z!cfxSd6WeW`GrW%Sxn~JpgvVG=1JDpq^!zBC8W+kA}Hr$NFOOCc7DX6jQm!jV~&h0 zr_|*~JT^U1Q+Nd1wjyP_vpF97lpMI3sZ|dvna=>i(V3)2US#N3WvE(xh3mhRhAS>z zZcnAUByzbM#6i@pb=VN8NdnEn;E2GQrFzVFgu;(4Krz+=_rtITvCkliRg^Y4`d#BS zY8};?#rE@j_GyEJR+v;GWG7?vQ;ec!r@XNs3U+9^WTCgbb34q0qlSaN@cumW)+f*t zZ_ubj-Pnop`I$B-X27Z1!2A+mKP1HFT$4GBwg) zuzW8L`Vk#q#SGbwFG~-}p9zCqr&PRlrFD12G?Jd0__}eWu~yamoxEzlC9cou8IxW& zsg$|)+fnt_s|oulCDVi46V4G3-1B`s^2E4iF z`f_OVqQm>8Dd2P=ye~nyi$2rIi(DEg?`NM#3NlX^T{8A*pW6b;@r~$iB;XfO48n^ z@r&23I5cLe-~f$c{z_|}hn<&f3lsE5geSMlf88MvXR#$?czQx(UA`E^!Xf(Y?klUc zt>f6z*Bi@?O{&}eIc{MWEhmQns#dIQpjXRQ`Z>MC$Bh?#4k?9%LnF0oIS&AhYE zvxBURT+nSNx*>TKz_T`>*jDU+2W@4jlyK^mS!Lb$fNXRl`Fdn0zT=HR3JE3wN|}Qq zXy62(JP-_#F_p^0JJetoFgwU7+3}~6KbF|PSoS=f%eXZit;f}63Dw2xo z5>fyW4oO3+@O(e;=q2+#MBSA&*+_8!J_L*g>JuiKC9`1>%u#AbIPDaPsJyPcEv$GM za{;;(G0iS3p43v2tQgFCehAR7jlIE@5P-bIB?-L=$=Ih{ozt(F3qWoj6dsDx2EGJ` zredumLFdL8lQO`>KzcKyGQTS}0|(HJ44h*bVo!RS&Jwu%-KR@#a*$f!kQrJ52Yw;IDT(Z8 zEv&b>!5t$00sob_044Q~S3TtozlK2co3O0uK304s^A$&E2EXBOsN!G%@T~%{-_adLkjk`px-$oxLXEq{IepRT zIC3&IqB3bZIVBhj@gkB?^m>=#irm4E(?cMv%|pe!4fgtd;AIBlkj|Q66gu6y8a3R= z5Ud{eWFgj$z<@b0A(3+KlyzZX785jGrykm=-VPZJA?cq3Qa!gUxbvlwl7X#`Moh*K zA`z+&2Twe~p9;W?7g*p?+>~kD3?vPkq*Atct7rywhfO|pShQ0Z(j5rtx}OWhcpBh< z;AmML0BsoqI=#TVXG2`K_c(-Qav1;NbgZxXg?9&fWi)++#te$G?2lSwjPA$ifRDBU z8MS)@`C`zmX;>*a_QV`KRR=diz@BMX#)0()%BJP8%6mTc*U(#x7Bw&9VnYDcnfaAS zpv^llCDNB$B+)Rcl#xSxM5HM`L2D!$miUqkusUW4zwlce#-~%=vFr}C6j|g-ig!f7-8!P^LCP%fNO>83r^DUB@MZyEh za4x{7p#f?T3$bW~L<-@f+}TwHLAC-Kku7#j@vIDx8!k7p!}u>9+-L)eg&{YZx8Cr- zj@=QuF+oEN)hmB%2EsYhV)L@qVgSY~gUaX3#~R1gMbf@zB<}Z*zuty6EU-xH|+}fN7LVX{Cs3$|1 zMiY)QsE8w>x?r|UccwM3bsR9|K4g5Ll`CK}e1l%f<>ugI^2i|rlu{G!@RcZnRELN z&TB~S1>J0?R-i%f)%C=0U;F0cQBiG2xXOXdLfse|n|@gVcc!ZExPaMH+b0aMlkR^u z0W_i@9Kk61%nlDzA1#%W`X7UbdFk%z-ttxf36bVIol-9(!B!7`I+L zV848Dy9~zhT7yV)m4H_EObx9Mhb>tB0$=}Q>hw%#W=THjN<>9`I+<7mDU(ZcUx7EV zwz87apAcH%-c<*J9O?DVNec;W6q`%VfImwQLEDuzh zv)!o&!psFfDNm9Q!0t^zp(r+Zo_*ADk||LaC@)D@xt$}Dr=`K2yt7OS$ZpCMy7dBl z5&?*%L1SH1+UIWPb#yEHnhrUT0_R-G{31{7@!P(s!(5A}@ycFfb4Igsw_b8{2~5#T zPQ|Uk2J3vm?fw-KzYj?(E1ViZpz$VBduTEXSBjFZcH~bc@xBk5o^xADHo$)w@@Xz5 z@QAWC%6ozwnX;KCqNEPmlJg9UFR*;3$uBehH3Oz;{{mQ^VipPHVQL321qq)k2`0K(OABHj4kuq$#j1n@t!@dd_Ip}cA!Pnx z)^kj4y4O$K=u~_5$gs$vNeztd!*^872pU9$(jHP6MOQlXWB>+so~SS&YAAAQBKEc` zY^pdo4T#fa!lN<}*|(E?LII0ICUfmL?+0fB_CL}KvDd7+jE3Sldqe7d8lwaJ)cW_k zs|w2U_eZT0ZA!R`m@~^10c)9uZ~RR+w%2i?G&F&Q?CPMjK^$ub@b?jGsONT~`r~PP z{1PKq&#mO;b8FEci%3WEDF(qjkOn>BIM_lx#;`*!&2l%QGjD=K{KX4Dk*fZzJnASa zam9C^4ML}+8aJ`O(MW27D!Dkx5*vWATcRm4ApCJ$pT(2rj7{6J7~6X?-z~e*T2Et9 zSFIDTy{iY)%1BF|f9D+P48Cfg$zX{ASig6NI>W#6sHFw2aLR)?x0`!y`-Mj=DT@`L z-*0?i5}=OwJKC{D{Q8uD7R~s(>&!$@9(0UCKg&fEQFm$S?dE8{9f+vlibBma9I=S2 zSTTH1Z?{809H2=J#N|CExizVI6fp}#_Zu8x-9mFuImxk`m$ zij&WY^$mS?ilG!pyDPqDBYihc;FaI2eakD+ITh0WA$BflF1(%Nyb5l$;J-_a4s!pt zR!SPO{0YCeWB4JW>r9Dco0j~-O8Z}#0ojKmBFtD}GuoxB`_u}$+-ZHFQ zo|!nk=w2N)&thtUc%k&55|`>>*I!_hZQb>neF)A-@VQU^!k^w%Sb;v zQ6`tpXJh~5jVIoP%w7eYD=&xfx6|!OIe4szKm!VI$xEIzUG4w}|Zj@Fc498!No{VP7T(tI;A2{H6 z&g6^YM}~+sK%OiPxwPrXHVsqbsF59HQwCyY8lV zT3duP84@2s9ym6U+*rMz_!y0YJ<{3CPco^l`#kguHl4>cxkx|%F)!q3chm4AEw;PX zRx9_Gd}44q&|C*W-o2T^JA#qcS*fC_qIx}OsCzMs)G|xXs~(dPEbzzYuCb*^H_^88 zDq+dx_D5OyH|#wJR)uRE85N0}-rVIz_qHGkj-_dT6LS0hMpG@h^q$G3%U@CNnicmL^yv)kt)LW8jzJ;X8I~|hF z75IXNRoR=u9~8>)jjj6LU81P!+ep&WBc0VHYYX|fmuf!SV>oM!=*~L@BP#>fU34xx z-;#ad25E-fXLA4WJ#+4Mju<~fD_q7_;~?@yOS81 z?~`kX=c$EUa=a(fwUHgYB@!1ryiVV;>sG68Z?=L}1j%|DaB#jvSMwWP@ zzHzHYh10OA{XpjHQUBvKiRd!-!%rDe8i@Q1G0~jc3l>K34oG=i)ak@~B#0CEml|bi zEga8dSzEa~M=P#()T`Bj$bQub5wwr$j;gd#ytr?DpG=GA;Rw1MMTKfuA24aM==I!b z9oELWfwG(uboJNi?HfR__ejemcl)Q*MpB=Kp!DNXrgRoP8%Atltj6uy_aRq*OOZ*@CKPWOm^-stLV$zbz**F+ zXHWaLI*Nn+gAP_9Qk&7{ltLdVY=e4hVOYJ(Cd{rM9FGer7WTvy*HQS;g9zwMll=hGrWyu$h z^B~Y{KNWoGWNj#HXyL9_c&&EFz^L*_9(6kn_RMKXa{}+NbAnXxKZ>g5jJ#(w60GVA zj$GE?-kc~VP2$bnp`t8SML`R!Azj@MR2<#(Dq{t+d6(Qe)Dy0|oAnk7i&HQ;fFs0X zwy-Y-WH~lg_jx3ppvWyNea;Rp)YWw)@m4I~l;i&QlCzYEWQB~yiotqCeGnQROv^cU z3%et6MWU#bepqHmspX88qUWwQS#tU25oP=}2Ac}Jk&bC@F4)+rP-(hSg|voxo;6V} z22smixEy zY96Qd-2*Y?Qx>F`-TxLrgY3~=v4;w4Cg&H+BgRp1*&@ao#ZSR~^C!9X-?KQ?UxD}4Y!$rFC_rR{X}KWR8u^u zTH-_At-*T5_p<&P>#)-O@6(N;knxX$=?}ysgB12f%p1=jYb=+1+u`y@58_kN^eggD z5I^9?Cz+*}l~q?h=Q*d9ZZw6gzKO7`xc%{6onO(N+nyR8*Y}4KQXfvv{vYen5ygDo zvZZl*u`gNP^;1jJ?h3Wg?3HEfyFWiCYW%)`YHj}S_uTu~)ALqsEr+|SqZO{7+gktq zx3xI<%BsEX_}{_q&+nhx+fUCtM~JzIgiYPKNI<&pD^43hTo@j z9xME4bsi^%MJ#}lY3Kz!qPTQ{pisZM5UbpSSR|_NFj^olj)&%{53zW~sgF=%81-n5 zg5%;-8MH~--)m!xxM-UqNt!5A`%kGO!lS$?Og#M-sR@p7Ywd*RkY&&7J28EkC9<-l zmuLnlDkt<$pO44;j;1s??Q?PK`;X__WsC3#r6^-^-$-Sx84;_~(K%KG*73QEsuc}9Nq?Z<^Vb<5>H-?Z$nR|F0z z?6POJYu>S}8WDNMOfr*rDf|XGyRcC^X79Hd+vpPO5^itrSaaW-0l&6ys_OYhEv$-lT5$2(~l^r+!;`4*w`6V?p4?wQvZ5St(S%C*{o~k~VqFue|#a4c`Mx8jjG25H>|9o+{^ZL)Y%j3;IU)^wu`x9R2 zn<`8`FUfk7_uBV9R^9JyO@4_KiY89eJyD}xWM4epB+b&v>QEU*cVxg`2DKc#moY+vI3>h^>wk>u2xI!iu3U-as` z7IvieZyjju`uAI)HR#e-w~QC?%JylS$u=!R>c4AMDpu6pj(?Ib1Dyd-AvBs*8&Gkh0?Q`kl97IyQ|;`gP3#A`FezCc!shFE~4LL;b=x zm>m;fs1~}vlJ1bRmsAGT33b}S@Jrs@RGrYwF}Ywdj?UQ=?Y)c-r26P-fdD&SM5oG| z&{TMiE`i*}qv>yr;bPdDvxm7I={<}aojN`}nU@}B-44jSWRzc9+qtbvu{EuZ(akLt zWi&Mv{Ju5!gp453It>Wg(El2Mk zSY&T_MtgF@YG<=)!Jh4Z+UGke@hCaUrQY9!fC{M$0{3(}p`p3ES+)`8o0XSW%G zcl}X5y!6{*C#BT9NbY9;fc?9jR0^?3;f}VZm|$eujooB6M3h-szuWWp%fi~@CDD=e zHR*lk#j5H3Lq0mYnaO($XEpl^TQ<8{6GO$C4d1dnO)n%)Ul$PRGWisgwVS(b+IUXkq^^~^sgsVG2pRZA|OkCvR^*v42rS7m>7 zPHJ}77F`vSW(Yl!bk)mDw~5G4R1jjgv)CdFvsy?bhcYh<56GC<0^DAs9l1Q<9b=5T Odoi`fN|%P_(*FSCzNSb3 literal 0 HcmV?d00001 diff --git a/phaser-3/3.80/minimap-1-demo/index.html b/phaser-3/3.80/minimap-1-demo/index.html new file mode 100644 index 0000000..db3fdb7 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/index.html @@ -0,0 +1,23 @@ + + + + + Phaser 3 - Minimap 1 Demo + + + + +

    + + + diff --git a/phaser-3/3.80/minimap-1-demo/jsconfig.json b/phaser-3/3.80/minimap-1-demo/jsconfig.json new file mode 100644 index 0000000..3688ce1 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/jsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "module": "es6", + "target": "es6", + "checkJs": true + } +} diff --git a/phaser-3/3.80/minimap-1-demo/src/components/common/index.js b/phaser-3/3.80/minimap-1-demo/src/components/common/index.js new file mode 100644 index 0000000..3818d81 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/src/components/common/index.js @@ -0,0 +1,31 @@ +/** + * @typedef Coordinate + * @type {object} + * @property {number} x the position of this coordinate + * @property {number} y the position of this coordinate + */ + +/** + * @typedef {keyof typeof DIRECTION} Direction + */ + +/** @enum {Direction} */ +export const DIRECTION = Object.freeze({ + LEFT: 'LEFT', + RIGHT: 'RIGHT', + UP: 'UP', + DOWN: 'DOWN', +}); + +/** + * Utility function to ensure we handle the full possible range of types when checking a variable for a possible + * type in a union. + * + * A good example of this is when we check for all of the possible values in a `switch` statement, and we want + * to ensure we check for all possible values in an enum type object. + * @param {never} _value + * @returns {never} + */ +export function exhaustiveGuard(_value) { + throw new Error(`Error! Reached forbidden guard function with unexpected value: ${JSON.stringify(_value)}`); +} diff --git a/phaser-3/3.80/minimap-1-demo/src/components/events/event-bus-component.js b/phaser-3/3.80/minimap-1-demo/src/components/events/event-bus-component.js new file mode 100644 index 0000000..1653cd1 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/src/components/events/event-bus-component.js @@ -0,0 +1,13 @@ +import Phaser from '../../lib/phaser.js'; + +export const CUSTOM_EVENTS = Object.freeze({ + ENEMY_DESTROYED: 'ENEMY_DESTROYED', + PLAYER_DESTROYED: 'PLAYER_DESTROYED', + PLAYER_SPAWN: 'PLAYER_SPAWN', +}); + +export class EventBusComponent extends Phaser.Events.EventEmitter { + constructor() { + super(); + } +} diff --git a/phaser-3/3.80/minimap-1-demo/src/components/input/input-component.js b/phaser-3/3.80/minimap-1-demo/src/components/input/input-component.js new file mode 100644 index 0000000..a14c57b --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/src/components/input/input-component.js @@ -0,0 +1,63 @@ +import { DIRECTION } from '../common/index.js'; + +export class InputComponent { + /** @protected @type {boolean} */ + _up; + /** @protected @type {boolean} */ + _down; + /** @protected @type {boolean} */ + _left; + /** @protected @type {boolean} */ + _right; + + constructor() { + this.reset(); + } + + /** @type {boolean} */ + get leftIsDown() { + return this._left; + } + + /** @type {boolean} */ + get rightIsDown() { + return this._right; + } + + /** @type {boolean} */ + get downIsDown() { + return this._down; + } + + /** @type {boolean} */ + get upIsDown() { + return this._up; + } + + /** @type {import("../common/index").Direction | undefined} */ + get directionKeyPressed() { + if (this._left) { + return DIRECTION.LEFT; + } + if (this._right) { + return DIRECTION.RIGHT; + } + if (this._up) { + return DIRECTION.UP; + } + if (this._down) { + return DIRECTION.DOWN; + } + return undefined; + } + + /** + * @returns {void} + */ + reset() { + this._up = false; + this._down = false; + this._right = false; + this._left = false; + } +} diff --git a/phaser-3/3.80/minimap-1-demo/src/components/input/keyboard-input-component.js b/phaser-3/3.80/minimap-1-demo/src/components/input/keyboard-input-component.js new file mode 100644 index 0000000..a73b0c7 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/src/components/input/keyboard-input-component.js @@ -0,0 +1,43 @@ +import Phaser from '../../lib/phaser.js'; +import { InputComponent } from './input-component.js'; + +export class KeyboardInputComponent extends InputComponent { + /** @type {Phaser.Types.Input.Keyboard.CursorKeys | undefined} */ + #cursorKeys; + + /** + * @param {Phaser.Scene} scene + */ + constructor(scene) { + super(); + + if (!scene.input.keyboard === undefined) { + console.log('Phaser Keyboard Plugin is not enabled, KeyboardInputComponent will not work properly'); + return; + } + this.#cursorKeys = scene.input.keyboard.createCursorKeys(); + + // handle automatic call to update + scene.events.on(Phaser.Scenes.Events.UPDATE, this.update, this); + scene.events.once( + Phaser.Scenes.Events.SHUTDOWN, + () => { + scene.events.off(Phaser.Scenes.Events.UPDATE, this.update, this); + }, + this + ); + } + + /** + * @returns {void} + */ + update() { + if (this.#cursorKeys === undefined) { + return; + } + this._up = this.#cursorKeys.up.isDown || false; + this._down = this.#cursorKeys.down.isDown || false; + this._left = this.#cursorKeys.left.isDown || false; + this._right = this.#cursorKeys.right.isDown || false; + } +} diff --git a/phaser-3/3.80/minimap-1-demo/src/components/movement/grid-movement-animation-component.js b/phaser-3/3.80/minimap-1-demo/src/components/movement/grid-movement-animation-component.js new file mode 100644 index 0000000..3634a78 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/src/components/movement/grid-movement-animation-component.js @@ -0,0 +1,97 @@ +import Phaser from '../../lib/phaser.js'; +import { GridMovementComponent } from './grid-movement-component.js'; + +/** + * @typedef IdleFrameConfig + * @type {object} + * @property {number} LEFT + * @property {number} RIGHT + * @property {number} UP + * @property {number} DOWN + */ + +/** + * @typedef MovementAnimationConfig + * @type {object} + * @property {string} LEFT + * @property {string} RIGHT + * @property {string} UP + * @property {string} DOWN + */ + +/** + * @typedef GridMovementAnimationComponentConfig + * @type {object} + * @property {GridMovementComponent} gridMovementComponent + * @property {Phaser.GameObjects.Sprite} phaserGameObject + * @property {IdleFrameConfig} idleFrameConfig + * @property {MovementAnimationConfig} movementAnimationConfig + */ + +export class GridMovementAnimationComponent { + /** @type {Phaser.Scene} */ + #scene; + /** @type {Phaser.GameObjects.Sprite} */ + #phaserGameObject; + /** @type {GridMovementComponent} */ + #gridMovementComponent; + /** @type {IdleFrameConfig} */ + #idleFrameConfig; + /** @type {MovementAnimationConfig} */ + #movementAnimationConfig; + + /** + * @param {GridMovementAnimationComponentConfig} config + */ + constructor(config) { + this.#scene = config.phaserGameObject.scene; + this.#gridMovementComponent = config.gridMovementComponent; + this.#phaserGameObject = config.phaserGameObject; + this.#idleFrameConfig = config.idleFrameConfig; + this.#movementAnimationConfig = config.movementAnimationConfig; + + // handle automatic call to update + this.#scene.events.on(Phaser.Scenes.Events.PRE_RENDER, this.update, this); + this.#scene.events.once( + Phaser.Scenes.Events.SHUTDOWN, + () => { + this.#scene.events.off(Phaser.Scenes.Events.PRE_RENDER, this.update, this); + }, + this + ); + } + + /** + * @returns {void} + */ + update() { + if (this.#phaserGameObject === undefined || this.#phaserGameObject.anims === undefined) { + return; + } + + if (this.#gridMovementComponent.isMoving) { + // check to see if we need to play an animation + if ( + !this.#phaserGameObject.anims.isPlaying || + this.#phaserGameObject.anims.currentAnim?.key !== + this.#movementAnimationConfig[this.#gridMovementComponent.direction] + ) { + this.#phaserGameObject.play(this.#movementAnimationConfig[this.#gridMovementComponent.direction]); + } + return; + } + + // stop the animation if needed + if (this.#phaserGameObject.anims.isPlaying) { + this.#phaserGameObject.stop(); + } + + // update idle frame if needed + if ( + this.#phaserGameObject.frame.name.toString() !== + this.#idleFrameConfig[this.#gridMovementComponent.direction].toString() + ) { + this.#phaserGameObject.setFrame(this.#idleFrameConfig[this.#gridMovementComponent.direction]); + } + } +} diff --git a/phaser-3/3.80/minimap-1-demo/src/components/movement/grid-movement-component.js b/phaser-3/3.80/minimap-1-demo/src/components/movement/grid-movement-component.js new file mode 100644 index 0000000..fa61be6 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/src/components/movement/grid-movement-component.js @@ -0,0 +1,147 @@ +import Phaser from '../../lib/phaser.js'; +import { EventBusComponent } from '../events/event-bus-component.js'; +import { InputComponent } from '../input/input-component.js'; +import { getTargetPositionFromGameObjectPositionAndDirection } from './grid-utils.js'; + +/** + * @typedef GridMovementComponentConfig + * @type {object} + * @property {InputComponent} inputComponent + * @property {EventBusComponent} eventBusComponent + * @property {import('../common/index.js').Direction} currentDirection + * @property {Phaser.GameObjects.Sprite} phaserGameObject + * @property {number} gridTileSize + */ + +export const GRID_MOVEMENT_EVENTS = Object.freeze({ + INPUT_STOPPED: 'INPUT_STOPPED', + CHANGED_DIRECTION: 'CHANGED_DIRECTION', + GRID_MOVEMENT_STARTED: 'GRID_MOVEMENT_STARTED', + GRID_MOVEMENT_FINISHED: 'GRID_MOVEMENT_FINISHED', +}); + +export class GridMovementComponent { + /** @type {Phaser.Scene} */ + #scene; + /** @type {Phaser.GameObjects.Sprite} */ + #phaserGameObject; + /** @type {EventBusComponent} */ + #eventBusComponent; + /** @type {InputComponent} */ + #inputComponent; + /** @type {import('../common/index.js').Direction} */ + #direction; + /** @type {boolean} */ + #isMoving; + /** @type {boolean} */ + #startedMoving; + /** @type {import('../common/index.js').Coordinate} */ + #targetPosition; + /** @type {import('../common/index.js').Coordinate} */ + #previousTargetPosition; + /** @type {number} */ + #gridTileSize; + + /** + * @param {GridMovementComponentConfig} config + */ + constructor(config) { + this.#scene = config.phaserGameObject.scene; + this.#phaserGameObject = config.phaserGameObject; + this.#inputComponent = config.inputComponent; + this.#eventBusComponent = config.eventBusComponent; + this.#direction = config.currentDirection; + this.#isMoving = false; + this.#startedMoving = false; + /** @type {import('../common/index.js').Coordinate} */ + const currentPosition = { + x: this.#phaserGameObject.x, + y: this.#phaserGameObject.y, + }; + this.#previousTargetPosition = { ...currentPosition }; + this.#targetPosition = { ...currentPosition }; + this.#gridTileSize = config.gridTileSize; + + // handle automatic call to update + this.#scene.events.on(Phaser.Scenes.Events.UPDATE, this.update, this); + this.#scene.events.once( + Phaser.Scenes.Events.SHUTDOWN, + () => { + this.#scene.events.off(Phaser.Scenes.Events.UPDATE, this.update, this); + }, + this + ); + } + + /** @type {boolean} */ + get isMoving() { + return this.#isMoving; + } + + /** @type {import('../common/index.js').Direction} */ + get direction() { + return this.#direction; + } + + /** + * @returns {void} + */ + update() { + if (this.isMoving) { + return; + } + + const directionKeyPressed = this.#inputComponent.directionKeyPressed; + if (directionKeyPressed === undefined) { + if (this.#startedMoving) { + // fire event so we can stop animations since there is no input + this.#eventBusComponent.emit(GRID_MOVEMENT_EVENTS.INPUT_STOPPED, this.#direction); + this.#startedMoving = false; + } + return; + } + const changedDirection = this.#direction !== this.#inputComponent.directionKeyPressed; + this.#direction = directionKeyPressed; + + if (changedDirection) { + this.#eventBusComponent.emit(GRID_MOVEMENT_EVENTS.CHANGED_DIRECTION, this.#direction); + } + + this.#isMoving = true; + this.#startedMoving = true; + const updatedPosition = getTargetPositionFromGameObjectPositionAndDirection( + this.#targetPosition, + this.#direction, + this.#gridTileSize + ); + this.#previousTargetPosition = { ...this.#targetPosition }; + this.#targetPosition.x = updatedPosition.x; + this.#targetPosition.y = updatedPosition.y; + + this.#eventBusComponent.emit(GRID_MOVEMENT_EVENTS.GRID_MOVEMENT_STARTED, this.#direction); + this.#phaserGameObject.scene.add.tween({ + delay: 0, + duration: 300, + y: { + from: this.#phaserGameObject.y, + start: this.#phaserGameObject.y, + to: this.#targetPosition.y, + }, + x: { + from: this.#phaserGameObject.x, + start: this.#phaserGameObject.x, + to: this.#targetPosition.x, + }, + targets: this.#phaserGameObject, + onComplete: () => { + this.#isMoving = false; + this.#previousTargetPosition = { ...this.#targetPosition }; + this.#eventBusComponent.emit(GRID_MOVEMENT_EVENTS.GRID_MOVEMENT_FINISHED, { + direction: this.#direction, + x: this.#phaserGameObject.x, + y: this.#phaserGameObject.y, + }); + }, + }); + } +} diff --git a/phaser-3/3.80/minimap-1-demo/src/components/movement/grid-utils.js b/phaser-3/3.80/minimap-1-demo/src/components/movement/grid-utils.js new file mode 100644 index 0000000..469df72 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/src/components/movement/grid-utils.js @@ -0,0 +1,29 @@ +import { DIRECTION, exhaustiveGuard } from '../common/index.js'; + +/** + * @param {import('../common/index').Coordinate} currentPosition + * @param {import('../common/index').Direction} direction + * @param {number} tileSize + * @returns {import('../common/index').Coordinate} + */ +export function getTargetPositionFromGameObjectPositionAndDirection(currentPosition, direction, tileSize) { + /** @type {import('../common/index').Coordinate} */ + const targetPosition = { ...currentPosition }; + switch (direction) { + case DIRECTION.DOWN: + targetPosition.y += tileSize; + break; + case DIRECTION.UP: + targetPosition.y -= tileSize; + break; + case DIRECTION.LEFT: + targetPosition.x -= tileSize; + break; + case DIRECTION.RIGHT: + targetPosition.x += tileSize; + break; + default: + exhaustiveGuard(direction); + } + return targetPosition; +} diff --git a/phaser-3/3.80/minimap-1-demo/src/game-scene.js b/phaser-3/3.80/minimap-1-demo/src/game-scene.js new file mode 100644 index 0000000..0c99926 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/src/game-scene.js @@ -0,0 +1,107 @@ +import Phaser from './lib/phaser.js'; +import { DIRECTION } from './components/common/index.js'; +import { EventBusComponent } from './components/events/event-bus-component.js'; +import { KeyboardInputComponent } from './components/input/keyboard-input-component.js'; +import { GridMovementAnimationComponent } from './components/movement/grid-movement-animation-component.js'; +import { GRID_MOVEMENT_EVENTS, GridMovementComponent } from './components/movement/grid-movement-component.js'; + +const SCALE_FACTOR = 2; + +export class GameScene extends Phaser.Scene { + constructor() { + super({ key: 'GameScene' }); + } + + preload() { + this.load.pack('assetPack', 'assets/data/assets.json'); + this.load.animation('gemData', 'assets/data/animations.json'); + } + + create() { + const mainBg = this.add.image(0, 0, 'background').setOrigin(0).setScale(2); + const player = this.add + .sprite(220 * SCALE_FACTOR, 220 * SCALE_FACTOR, 'characters', 55) + .setOrigin(0) + .setScale(SCALE_FACTOR) + .setName('player') + .play('walk_down'); + this.cameras.main.setBounds(0, 0, this.scale.width * SCALE_FACTOR, this.scale.height * SCALE_FACTOR); + this.cameras.main.startFollow(player); + const playerEventBusComponent = new EventBusComponent(); + const keyboardInputComponent = new KeyboardInputComponent(this); + const gridMovementComponent = new GridMovementComponent({ + inputComponent: keyboardInputComponent, + currentDirection: DIRECTION.DOWN, + phaserGameObject: player, + gridTileSize: 32, + eventBusComponent: playerEventBusComponent, + }); + new GridMovementAnimationComponent({ + gridMovementComponent, + phaserGameObject: player, + idleFrameConfig: { + DOWN: 55, + LEFT: 67, + RIGHT: 79, + UP: 91, + }, + movementAnimationConfig: { + DOWN: 'walk_down', + LEFT: 'walk_left', + RIGHT: 'walk_right', + UP: 'walk_up', + }, + }); + + // Example of how to listen for movement events from player game object + // playerEventBusComponent.on(GRID_MOVEMENT_EVENTS.GRID_MOVEMENT_FINISHED, () => { + // console.log(player.x, player.y) + // }); + + // Example of how to get JSON data from cache + // console.log(this.cache.json.get('quests')); + + /* start of code for camera minimap */ + // create a new background image that we will apply special effects to, this image will not be shown on the main camera + const mapBg = this.add.image(0, 0, 'background').setOrigin(0).setScale(2); + mapBg.postFX.addColorMatrix().grayscale(0.8); + // create a 2nd camera that will be a zoomed out version of the main camera (birds eye view) + const minimapCamera = this.cameras + .add( + this.scale.width - 230, + 10, + this.scale.width * SCALE_FACTOR, + this.scale.height * SCALE_FACTOR, + false, + 'minimap' + ) + .setOrigin(0) + .setZoom(0.16); + // ignore any game objects we don't want visible on the 2nd camera + minimapCamera.ignore([player, mainBg]); + + // create icons for map + const playerIcon = this.add.circle(player.x, player.y, 20, 0xff0000, 1).setOrigin(0, -1); + playerEventBusComponent.on(GRID_MOVEMENT_EVENTS.GRID_MOVEMENT_FINISHED, () => { + playerIcon.setPosition(player.x, player.y); + }); + this.cameras.main.ignore([playerIcon, mapBg]); + const questIcons = []; + this.cache.json.get('quests').forEach((quest) => { + console.log(quest); + const icon = this.add.image(quest.x, quest.y, 'questIcon').setScale(2.5).setOrigin(0); + questIcons.push(icon); + }); + this.cameras.main.ignore(questIcons); + + /* end of code for camera minimap */ + + // temp code to allow removal of quests + const qKey = this.input.keyboard.addKey('q'); + qKey.once(Phaser.Input.Keyboard.Events.DOWN, () => { + questIcons.forEach((quest) => { + quest.destroy(); + }); + }); + } +} diff --git a/phaser-3/3.80/minimap-1-demo/src/lib/phaser.js b/phaser-3/3.80/minimap-1-demo/src/lib/phaser.js new file mode 100644 index 0000000..1cf6072 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/src/lib/phaser.js @@ -0,0 +1 @@ +export default window.Phaser; diff --git a/phaser-3/3.80/minimap-1-demo/src/main.js b/phaser-3/3.80/minimap-1-demo/src/main.js new file mode 100644 index 0000000..cc37706 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/src/main.js @@ -0,0 +1,18 @@ +import Phaser from './lib/phaser.js'; +import { GameScene } from './game-scene.js'; + +const gameConfig = { + type: Phaser.WEBGL, + pixelArt: true, + scale: { + parent: 'game-container', + width: 688, + height: 544, + mode: Phaser.Scale.FIT, + autoCenter: Phaser.Scale.CENTER_BOTH, + }, + backgroundColor: '#5c5b5b', + scene: [GameScene], +}; + +const game = new Phaser.Game(gameConfig); diff --git a/phaser-3/3.80/minimap-1-demo/src/types/phaser.d.ts b/phaser-3/3.80/minimap-1-demo/src/types/phaser.d.ts new file mode 100644 index 0000000..b416946 --- /dev/null +++ b/phaser-3/3.80/minimap-1-demo/src/types/phaser.d.ts @@ -0,0 +1,116274 @@ +// DO NOT EDIT THIS FILE! It was generated by running `npm run tsgen` +/// + +declare type CameraRotateCallback = (camera: Phaser.Cameras.Scene2D.Camera, progress: number, angle: number)=>void; + +declare type DataEachCallback = (parent: any, key: string, value: any, ...args: any[])=>void; + +declare type ContentLoadedCallback = ()=>void; + +declare type CreateCallback = (bob: Phaser.GameObjects.Bob, index: number)=>void; + +declare type EachContainerCallback = (item: any, ...args: any[])=>void; + +declare type LightForEach = (light: Phaser.GameObjects.Light)=>void; + +/** + * A custom function that will be responsible for wrapping the text. + */ +declare type TextStyleWordWrapCallback = (text: string, textObject: Phaser.GameObjects.Text)=>string | string[]; + +declare type CenterFunction = (triangle: Phaser.Geom.Triangle)=>Phaser.Math.Vector2; + +declare namespace Phaser { + namespace Actions { + /** + * Takes an array of Game Objects and aligns them next to each other. + * + * The alignment position is controlled by the `position` parameter, which should be one + * of the Phaser.Display.Align constants, such as `Phaser.Display.Align.TOP_LEFT`, + * `Phaser.Display.Align.TOP_CENTER`, etc. + * + * The first item isn't moved. The second item is aligned next to the first, + * then the third next to the second, and so on. + * @param items The array of items to be updated by this action. + * @param position The position to align the items with. This is an align constant, such as `Phaser.Display.Align.LEFT_CENTER`. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function AlignTo(items: G, position: number, offsetX?: number, offsetY?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `angle` property, + * and then adds the given value to each of their `angle` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `Angle(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `angle` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function Angle(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of objects and passes each of them to the given callback. + * @param items The array of items to be updated by this action. + * @param callback The callback to be invoked. It will be passed just one argument: the item from the array. + * @param context The scope in which the callback will be invoked. + */ + function Call(items: G, callback: Phaser.Types.Actions.CallCallback, context: any): G; + + /** + * Takes an array of objects and returns the first element in the array that has properties which match + * all of those specified in the `compare` object. For example, if the compare object was: `{ scaleX: 0.5, alpha: 1 }` + * then it would return the first item which had the property `scaleX` set to 0.5 and `alpha` set to 1. + * + * To use this with a Group: `GetFirst(group.getChildren(), compare, index)` + * @param items The array of items to be searched by this action. + * @param compare The comparison object. Each property in this object will be checked against the items of the array. + * @param index An optional offset to start searching from within the items array. Default 0. + */ + function GetFirst(items: G, compare: object, index?: number): object | Phaser.GameObjects.GameObject | null; + + /** + * Takes an array of objects and returns the last element in the array that has properties which match + * all of those specified in the `compare` object. For example, if the compare object was: `{ scaleX: 0.5, alpha: 1 }` + * then it would return the last item which had the property `scaleX` set to 0.5 and `alpha` set to 1. + * + * To use this with a Group: `GetLast(group.getChildren(), compare, index)` + * @param items The array of items to be searched by this action. + * @param compare The comparison object. Each property in this object will be checked against the items of the array. + * @param index An optional offset to start searching from within the items array. Default 0. + */ + function GetLast(items: G, compare: object, index?: number): object | Phaser.GameObjects.GameObject | null; + + /** + * Takes an array of Game Objects, or any objects that have public `x` and `y` properties, + * and then aligns them based on the grid configuration given to this action. + * @param items The array of items to be updated by this action. + * @param options The GridAlign Configuration object. + */ + function GridAlign(items: G, options: Phaser.Types.Actions.GridAlignConfig): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `alpha` property, + * and then adds the given value to each of their `alpha` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `IncAlpha(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `alpha` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function IncAlpha(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `x` property, + * and then adds the given value to each of their `x` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `IncX(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `x` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function IncX(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have public `x` and `y` properties, + * and then adds the given value to each of them. + * + * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `IncXY(group.getChildren(), x, y, stepX, stepY)` + * @param items The array of items to be updated by this action. + * @param x The amount to be added to the `x` property. + * @param y The amount to be added to the `y` property. If `undefined` or `null` it uses the `x` value. Default x. + * @param stepX This is added to the `x` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `y` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function IncXY(items: G, x: number, y?: number, stepX?: number, stepY?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `y` property, + * and then adds the given value to each of their `y` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `IncY(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `y` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function IncY(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects and positions them on evenly spaced points around the perimeter of a Circle. + * + * If you wish to pass a `Phaser.GameObjects.Circle` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param circle The Circle to position the Game Objects on. + * @param startAngle Optional angle to start position from, in radians. Default 0. + * @param endAngle Optional angle to stop position at, in radians. Default 6.28. + */ + function PlaceOnCircle(items: G, circle: Phaser.Geom.Circle, startAngle?: number, endAngle?: number): G; + + /** + * Takes an array of Game Objects and positions them on evenly spaced points around the perimeter of an Ellipse. + * + * If you wish to pass a `Phaser.GameObjects.Ellipse` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param ellipse The Ellipse to position the Game Objects on. + * @param startAngle Optional angle to start position from, in radians. Default 0. + * @param endAngle Optional angle to stop position at, in radians. Default 6.28. + */ + function PlaceOnEllipse(items: G, ellipse: Phaser.Geom.Ellipse, startAngle?: number, endAngle?: number): G; + + /** + * Positions an array of Game Objects on evenly spaced points of a Line. + * If the ease parameter is supplied, it will space the points based on that easing function along the line. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param line The Line to position the Game Objects on. + * @param ease An optional ease to use. This can be either a string from the EaseMap, or a custom function. + */ + function PlaceOnLine(items: G, line: Phaser.Geom.Line, ease?: string | Function): G; + + /** + * Takes an array of Game Objects and positions them on evenly spaced points around the perimeter of a Rectangle. + * + * Placement starts from the top-left of the rectangle, and proceeds in a clockwise direction. + * If the `shift` parameter is given you can offset where placement begins. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param rect The Rectangle to position the Game Objects on. + * @param shift An optional positional offset. Default 0. + */ + function PlaceOnRectangle(items: G, rect: Phaser.Geom.Rectangle, shift?: number): G; + + /** + * Takes an array of Game Objects and positions them on evenly spaced points around the edges of a Triangle. + * + * If you wish to pass a `Phaser.GameObjects.Triangle` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param triangle The Triangle to position the Game Objects on. + * @param stepRate An optional step rate, to increase or decrease the packing of the Game Objects on the lines. Default 1. + */ + function PlaceOnTriangle(items: G, triangle: Phaser.Geom.Triangle, stepRate?: number): G; + + /** + * Play an animation on all Game Objects in the array that have an Animation component. + * + * You can pass either an animation key, or an animation configuration object for more control over the playback. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If this animation is already playing then ignore this call. Default false. + */ + function PlayAnimation(items: G, key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): G; + + /** + * Takes an array of Game Objects, or any objects that have a public property as defined in `key`, + * and then adds the given value to it. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `PropertyValueInc(group.getChildren(), key, value, step)` + * @param items The array of items to be updated by this action. + * @param key The property to be updated. + * @param value The amount to be added to the property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function PropertyValueInc(items: G, key: string, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have a public property as defined in `key`, + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `PropertyValueSet(group.getChildren(), key, value, step)` + * @param items The array of items to be updated by this action. + * @param key The property to be updated. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function PropertyValueSet(items: G, key: string, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects and positions them at random locations within the Circle. + * + * If you wish to pass a `Phaser.GameObjects.Circle` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param circle The Circle to position the Game Objects within. + */ + function RandomCircle(items: G, circle: Phaser.Geom.Circle): G; + + /** + * Takes an array of Game Objects and positions them at random locations within the Ellipse. + * + * If you wish to pass a `Phaser.GameObjects.Ellipse` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param ellipse The Ellipse to position the Game Objects within. + */ + function RandomEllipse(items: G, ellipse: Phaser.Geom.Ellipse): G; + + /** + * Takes an array of Game Objects and positions them at random locations on the Line. + * + * If you wish to pass a `Phaser.GameObjects.Line` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param line The Line to position the Game Objects randomly on. + */ + function RandomLine(items: G, line: Phaser.Geom.Line): G; + + /** + * Takes an array of Game Objects and positions them at random locations within the Rectangle. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param rect The Rectangle to position the Game Objects within. + */ + function RandomRectangle(items: G, rect: Phaser.Geom.Rectangle): G; + + /** + * Takes an array of Game Objects and positions them at random locations within the Triangle. + * + * If you wish to pass a `Phaser.GameObjects.Triangle` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param triangle The Triangle to position the Game Objects within. + */ + function RandomTriangle(items: G, triangle: Phaser.Geom.Triangle): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `rotation` property, + * and then adds the given value to each of their `rotation` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `Rotate(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `rotation` property (in radians). + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function Rotate(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Rotates each item around the given point by the given angle. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param point Any object with public `x` and `y` properties. + * @param angle The angle to rotate by, in radians. + */ + function RotateAround(items: G, point: object, angle: number): G; + + /** + * Rotates an array of Game Objects around a point by the given angle and distance. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param point Any object with public `x` and `y` properties. + * @param angle The angle to rotate by, in radians. + * @param distance The distance from the point of rotation in pixels. + */ + function RotateAroundDistance(items: G, point: object, angle: number, distance: number): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `scaleX` property, + * and then adds the given value to each of their `scaleX` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `ScaleX(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `scaleX` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function ScaleX(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have public `scaleX` and `scaleY` properties, + * and then adds the given value to each of them. + * + * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `ScaleXY(group.getChildren(), scaleX, scaleY, stepX, stepY)` + * @param items The array of items to be updated by this action. + * @param scaleX The amount to be added to the `scaleX` property. + * @param scaleY The amount to be added to the `scaleY` property. If `undefined` or `null` it uses the `scaleX` value. + * @param stepX This is added to the `scaleX` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `scaleY` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function ScaleXY(items: G, scaleX: number, scaleY?: number, stepX?: number, stepY?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `scaleY` property, + * and then adds the given value to each of their `scaleY` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `ScaleY(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `scaleY` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function ScaleY(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `alpha` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetAlpha(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetAlpha(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `blendMode` + * and then sets it to the given value. + * + * To use this with a Group: `SetBlendMode(group.getChildren(), value)` + * @param items The array of items to be updated by this action. + * @param value The Blend Mode to be set. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetBlendMode(items: G, value: Phaser.BlendModes | string | number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `depth` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetDepth(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetDepth(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Passes all provided Game Objects to the Input Manager to enable them for input with identical areas and callbacks. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param hitArea Either an input configuration object, or a geometric shape that defines the hit area for the Game Object. If not given it will try to create a Rectangle based on the texture frame. + * @param callback The callback that determines if the pointer is within the Hit Area shape or not. If you provide a shape you must also provide a callback. + */ + function SetHitArea(items: G, hitArea?: Phaser.Types.Input.InputConfiguration | any, callback?: Phaser.Types.Input.HitAreaCallback): G; + + /** + * Takes an array of Game Objects, or any objects that have the public properties `originX` and `originY` + * and then sets them to the given values. + * + * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetOrigin(group.getChildren(), originX, originY, stepX, stepY)` + * @param items The array of items to be updated by this action. + * @param originX The amount to set the `originX` property to. + * @param originY The amount to set the `originY` property to. If `undefined` or `null` it uses the `originX` value. + * @param stepX This is added to the `originX` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `originY` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetOrigin(items: G, originX: number, originY?: number, stepX?: number, stepY?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `rotation` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetRotation(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetRotation(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public properties `scaleX` and `scaleY` + * and then sets them to the given values. + * + * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetScale(group.getChildren(), scaleX, scaleY, stepX, stepY)` + * @param items The array of items to be updated by this action. + * @param scaleX The amount to set the `scaleX` property to. + * @param scaleY The amount to set the `scaleY` property to. If `undefined` or `null` it uses the `scaleX` value. + * @param stepX This is added to the `scaleX` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `scaleY` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetScale(items: G, scaleX: number, scaleY?: number, stepX?: number, stepY?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `scaleX` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetScaleX(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetScaleX(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `scaleY` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetScaleY(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetScaleY(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public properties `scrollFactorX` and `scrollFactorY` + * and then sets them to the given values. + * + * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetScrollFactor(group.getChildren(), scrollFactorX, scrollFactorY, stepX, stepY)` + * @param items The array of items to be updated by this action. + * @param scrollFactorX The amount to set the `scrollFactorX` property to. + * @param scrollFactorY The amount to set the `scrollFactorY` property to. If `undefined` or `null` it uses the `scrollFactorX` value. + * @param stepX This is added to the `scrollFactorX` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `scrollFactorY` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetScrollFactor(items: G, scrollFactorX: number, scrollFactorY?: number, stepX?: number, stepY?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `scrollFactorX` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetScrollFactorX(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetScrollFactorX(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `scrollFactorY` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetScrollFactorY(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetScrollFactorY(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public method setTint() and then updates it to the given value(s). You can specify tint color per corner or provide only one color value for `topLeft` parameter, in which case whole item will be tinted with that color. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param topLeft The tint being applied to top-left corner of item. If other parameters are given no value, this tint will be applied to whole item. + * @param topRight The tint to be applied to top-right corner of item. + * @param bottomLeft The tint to be applied to the bottom-left corner of item. + * @param bottomRight The tint to be applied to the bottom-right corner of item. + */ + function SetTint(items: G, topLeft: number, topRight?: number, bottomLeft?: number, bottomRight?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `visible` + * and then sets it to the given value. + * + * To use this with a Group: `SetVisible(group.getChildren(), value)` + * @param items The array of items to be updated by this action. + * @param value The value to set the property to. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetVisible(items: G, value: boolean, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `x` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetX(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetX(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public properties `x` and `y` + * and then sets them to the given values. + * + * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetXY(group.getChildren(), x, y, stepX, stepY)` + * @param items The array of items to be updated by this action. + * @param x The amount to set the `x` property to. + * @param y The amount to set the `y` property to. If `undefined` or `null` it uses the `x` value. Default x. + * @param stepX This is added to the `x` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `y` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetXY(items: G, x: number, y?: number, stepX?: number, stepY?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `y` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetY(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetY(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of items, such as Game Objects, or any objects with public `x` and + * `y` properties and then iterates through them. As this function iterates, it moves + * the position of the current element to be that of the previous entry in the array. + * This repeats until all items have been moved. + * + * The direction controls the order of iteration. A value of 0 (the default) assumes + * that the final item in the array is the 'head' item. + * + * A direction value of 1 assumes that the first item in the array is the 'head' item. + * + * The position of the 'head' item is set to the x/y values given to this function. + * Every other item in the array is then updated, in sequence, to be that of the + * previous (or next) entry in the array. + * + * The final x/y coords are returned, or set in the 'output' Vector2. + * + * Think of it as being like the game Snake, where the 'head' is moved and then + * each body piece is moved into the space of the previous piece. + * @param items An array of Game Objects, or objects with public x and y positions. The contents of this array are updated by this Action. + * @param x The x coordinate to place the head item at. + * @param y The y coordinate to place the head item at. + * @param direction The iteration direction. 0 = first to last and 1 = last to first. Default 0. + * @param output An optional Vec2Like object to store the final position in. + */ + function ShiftPosition(items: G, x: number, y: number, direction?: number, output?: O): O; + + /** + * Shuffles the array in place. The shuffled array is both modified and returned. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + */ + function Shuffle(items: G): G; + + /** + * Smootherstep is a sigmoid-like interpolation and clamping function. + * + * The function depends on three parameters, the input x, the "left edge" and the "right edge", with the left edge being assumed smaller than the right edge. The function receives a real number x as an argument and returns 0 if x is less than or equal to the left edge, 1 if x is greater than or equal to the right edge, and smoothly interpolates, using a Hermite polynomial, between 0 and 1 otherwise. The slope of the smoothstep function is zero at both edges. This is convenient for creating a sequence of transitions using smoothstep to interpolate each segment as an alternative to using more sophisticated or expensive interpolation techniques. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param property The property of the Game Object to interpolate. + * @param min The minimum interpolation value. + * @param max The maximum interpolation value. + * @param inc Should the values be incremented? `true` or set (`false`) Default false. + */ + function SmootherStep(items: G, property: string, min: number, max: number, inc?: boolean): G; + + /** + * Smoothstep is a sigmoid-like interpolation and clamping function. + * + * The function depends on three parameters, the input x, the "left edge" + * and the "right edge", with the left edge being assumed smaller than the right edge. + * + * The function receives a real number x as an argument and returns 0 if x is less than + * or equal to the left edge, 1 if x is greater than or equal to the right edge, and smoothly + * interpolates, using a Hermite polynomial, between 0 and 1 otherwise. The slope of the + * smoothstep function is zero at both edges. + * + * This is convenient for creating a sequence of transitions using smoothstep to interpolate + * each segment as an alternative to using more sophisticated or expensive interpolation techniques. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param property The property of the Game Object to interpolate. + * @param min The minimum interpolation value. + * @param max The maximum interpolation value. + * @param inc Should the property value be incremented (`true`) or set (`false`)? Default false. + */ + function SmoothStep(items: G, property: string, min: number, max: number, inc?: boolean): G; + + /** + * Takes an array of Game Objects and then modifies their `property` so the value equals, or is incremented, by the + * calculated spread value. + * + * The spread value is derived from the given `min` and `max` values and the total number of items in the array. + * + * For example, to cause an array of Sprites to change in alpha from 0 to 1 you could call: + * + * ```javascript + * Phaser.Actions.Spread(itemsArray, 'alpha', 0, 1); + * ``` + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param property The property of the Game Object to spread. + * @param min The minimum value. + * @param max The maximum value. + * @param inc Should the values be incremented? `true` or set (`false`) Default false. + */ + function Spread(items: G, property: string, min: number, max: number, inc?: boolean): G; + + /** + * Takes an array of Game Objects and toggles the visibility of each one. + * Those previously `visible = false` will become `visible = true`, and vice versa. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + */ + function ToggleVisible(items: G): G; + + /** + * Iterates through the given array and makes sure that each objects x and y + * properties are wrapped to keep them contained within the given Rectangles + * area. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param rect The rectangle which the objects will be wrapped to remain within. + * @param padding An amount added to each side of the rectangle during the operation. Default 0. + */ + function WrapInRectangle(items: G, rect: Phaser.Geom.Rectangle, padding?: number): G; + + } + + namespace Animations { + /** + * A Frame based Animation. + * + * Animations in Phaser consist of a sequence of `AnimationFrame` objects, which are managed by + * this class, along with properties that impact playback, such as the animations frame rate + * or delay. + * + * This class contains all of the properties and methods needed to handle playback of the animation + * directly to an `AnimationState` instance, which is owned by a Sprite, or similar Game Object. + * + * You don't typically create an instance of this class directly, but instead go via + * either the `AnimationManager` or the `AnimationState` and use their `create` methods, + * depending on if you need a global animation, or local to a specific Sprite. + */ + class Animation { + /** + * + * @param manager A reference to the global Animation Manager + * @param key The unique identifying string for this animation. + * @param config The Animation configuration. + */ + constructor(manager: Phaser.Animations.AnimationManager, key: string, config: Phaser.Types.Animations.Animation); + + /** + * A reference to the global Animation Manager. + */ + manager: Phaser.Animations.AnimationManager; + + /** + * The unique identifying string for this animation. + */ + key: string; + + /** + * A frame based animation (as opposed to a bone based animation) + */ + type: string; + + /** + * Extract all the frame data into the frames array. + */ + frames: Phaser.Animations.AnimationFrame[]; + + /** + * The frame rate of playback in frames per second (default 24 if duration is null) + */ + frameRate: number; + + /** + * How long the animation should play for, in milliseconds. + * If the `frameRate` property has been set then it overrides this value, + * otherwise the `frameRate` is derived from `duration`. + */ + duration: number; + + /** + * How many ms per frame, not including frame specific modifiers. + */ + msPerFrame: number; + + /** + * Skip frames if the time lags, or always advanced anyway? + */ + skipMissedFrames: boolean; + + /** + * The delay in ms before the playback will begin. + */ + delay: number; + + /** + * Number of times to repeat the animation. Set to -1 to repeat forever. + */ + repeat: number; + + /** + * The delay in ms before the a repeat play starts. + */ + repeatDelay: number; + + /** + * Should the animation yoyo (reverse back down to the start) before repeating? + */ + yoyo: boolean; + + /** + * If the animation has a delay set, before playback will begin, this + * controls when the first frame is set on the Sprite. If this property + * is 'false' then the frame is set only after the delay has expired. + * This is the default behavior. + */ + showBeforeDelay: boolean; + + /** + * Should the GameObject's `visible` property be set to `true` when the animation starts to play? + */ + showOnStart: boolean; + + /** + * Should the GameObject's `visible` property be set to `false` when the animation finishes? + */ + hideOnComplete: boolean; + + /** + * Start playback of this animation from a random frame? + */ + randomFrame: boolean; + + /** + * Global pause. All Game Objects using this Animation instance are impacted by this property. + */ + paused: boolean; + + /** + * Gets the total number of frames in this animation. + */ + getTotalFrames(): number; + + /** + * Calculates the duration, frame rate and msPerFrame values. + * @param target The target to set the values on. + * @param totalFrames The total number of frames in the animation. + * @param duration The duration to calculate the frame rate from. Pass `null` if you wish to set the `frameRate` instead. + * @param frameRate The frame rate to calculate the duration from. + */ + calculateDuration(target: Phaser.Animations.Animation, totalFrames: number, duration?: number | undefined, frameRate?: number | undefined): void; + + /** + * Add frames to the end of the animation. + * @param config Either a string, in which case it will use all frames from a texture with the matching key, or an array of Animation Frame configuration objects. + */ + addFrame(config: string | Phaser.Types.Animations.AnimationFrame[]): this; + + /** + * Add frame/s into the animation. + * @param index The index to insert the frame at within the animation. + * @param config Either a string, in which case it will use all frames from a texture with the matching key, or an array of Animation Frame configuration objects. + */ + addFrameAt(index: number, config: string | Phaser.Types.Animations.AnimationFrame[]): this; + + /** + * Check if the given frame index is valid. + * @param index The index to be checked. + */ + checkFrame(index: number): boolean; + + /** + * Called internally when this Animation first starts to play. + * Sets the accumulator and nextTick properties. + * @param state The Animation State belonging to the Game Object invoking this call. + */ + protected getFirstTick(state: Phaser.Animations.AnimationState): void; + + /** + * Returns the AnimationFrame at the provided index + * @param index The index in the AnimationFrame array + */ + getFrameAt(index: number): Phaser.Animations.AnimationFrame; + + /** + * Creates AnimationFrame instances based on the given frame data. + * @param textureManager A reference to the global Texture Manager. + * @param frames Either a string, in which case it will use all frames from a texture with the matching key, or an array of Animation Frame configuration objects. + * @param defaultTextureKey The key to use if no key is set in the frame configuration object. + */ + getFrames(textureManager: Phaser.Textures.TextureManager, frames: string | Phaser.Types.Animations.AnimationFrame[], defaultTextureKey?: string): Phaser.Animations.AnimationFrame[]; + + /** + * Called internally. Sets the accumulator and nextTick values of the current Animation. + * @param state The Animation State belonging to the Game Object invoking this call. + */ + getNextTick(state: Phaser.Animations.AnimationState): void; + + /** + * Returns the frame closest to the given progress value between 0 and 1. + * @param value A value between 0 and 1. + */ + getFrameByProgress(value: number): Phaser.Animations.AnimationFrame; + + /** + * Advance the animation frame. + * @param state The Animation State to advance. + */ + nextFrame(state: Phaser.Animations.AnimationState): void; + + /** + * Returns the animation last frame. + */ + getLastFrame(): Phaser.Animations.AnimationFrame; + + /** + * Called internally when the Animation is playing backwards. + * Sets the previous frame, causing a yoyo, repeat, complete or update, accordingly. + * @param state The Animation State belonging to the Game Object invoking this call. + */ + previousFrame(state: Phaser.Animations.AnimationState): void; + + /** + * Removes the given AnimationFrame from this Animation instance. + * This is a global action. Any Game Object using this Animation will be impacted by this change. + * @param frame The AnimationFrame to be removed. + */ + removeFrame(frame: Phaser.Animations.AnimationFrame): this; + + /** + * Removes a frame from the AnimationFrame array at the provided index + * and updates the animation accordingly. + * @param index The index in the AnimationFrame array + */ + removeFrameAt(index: number): this; + + /** + * Called internally during playback. Forces the animation to repeat, providing there are enough counts left + * in the repeat counter. + * @param state The Animation State belonging to the Game Object invoking this call. + */ + repeatAnimation(state: Phaser.Animations.AnimationState): void; + + /** + * Converts the animation data to JSON. + */ + toJSON(): Phaser.Types.Animations.JSONAnimation; + + /** + * Called internally whenever frames are added to, or removed from, this Animation. + */ + updateFrameSequence(): this; + + /** + * Pauses playback of this Animation. The paused state is set immediately. + */ + pause(): this; + + /** + * Resumes playback of this Animation. The paused state is reset immediately. + */ + resume(): this; + + /** + * Destroys this Animation instance. It will remove all event listeners, + * remove this animation and its key from the global Animation Manager, + * and then destroy all Animation Frames in turn. + */ + destroy(): void; + + } + + /** + * A single frame in an Animation sequence. + * + * An AnimationFrame consists of a reference to the Texture it uses for rendering, references to other + * frames in the animation, and index data. It also has the ability to modify the animation timing. + * + * AnimationFrames are generated automatically by the Animation class. + */ + class AnimationFrame { + /** + * + * @param textureKey The key of the Texture this AnimationFrame uses. + * @param textureFrame The key of the Frame within the Texture that this AnimationFrame uses. + * @param index The index of this AnimationFrame within the Animation sequence. + * @param frame A reference to the Texture Frame this AnimationFrame uses for rendering. + * @param isKeyFrame Is this Frame a Keyframe within the Animation? Default false. + */ + constructor(textureKey: string, textureFrame: string | number, index: number, frame: Phaser.Textures.Frame, isKeyFrame?: boolean); + + /** + * The key of the Texture this AnimationFrame uses. + */ + textureKey: string; + + /** + * The key of the Frame within the Texture that this AnimationFrame uses. + */ + textureFrame: string | number; + + /** + * The index of this AnimationFrame within the Animation sequence. + */ + index: number; + + /** + * A reference to the Texture Frame this AnimationFrame uses for rendering. + */ + frame: Phaser.Textures.Frame; + + /** + * Is this the first frame in an animation sequence? + */ + readonly isFirst: boolean; + + /** + * Is this the last frame in an animation sequence? + */ + readonly isLast: boolean; + + /** + * A reference to the AnimationFrame that comes before this one in the animation, if any. + */ + readonly prevFrame: Phaser.Animations.AnimationFrame | null; + + /** + * A reference to the AnimationFrame that comes after this one in the animation, if any. + */ + readonly nextFrame: Phaser.Animations.AnimationFrame | null; + + /** + * The duration, in ms, of this frame of the animation. + */ + duration: number; + + /** + * What % through the animation does this frame come? + * This value is generated when the animation is created and cached here. + */ + readonly progress: number; + + /** + * Is this Frame a KeyFrame within the Animation? + */ + isKeyFrame: boolean; + + /** + * Generates a JavaScript object suitable for converting to JSON. + */ + toJSON(): Phaser.Types.Animations.JSONAnimationFrame; + + /** + * Destroys this object by removing references to external resources and callbacks. + */ + destroy(): void; + + } + + /** + * The Animation Manager. + * + * Animations are managed by the global Animation Manager. This is a singleton class that is + * responsible for creating and delivering animations and their corresponding data to all Game Objects. + * Unlike plugins it is owned by the Game instance, not the Scene. + * + * Sprites and other Game Objects get the data they need from the AnimationManager. + */ + class AnimationManager extends Phaser.Events.EventEmitter { + /** + * + * @param game A reference to the Phaser.Game instance. + */ + constructor(game: Phaser.Game); + + /** + * A reference to the Phaser.Game instance. + */ + protected game: Phaser.Game; + + /** + * A reference to the Texture Manager. + */ + protected textureManager: Phaser.Textures.TextureManager; + + /** + * The global time scale of the Animation Manager. + * + * This scales the time delta between two frames, thus influencing the speed of time for the Animation Manager. + */ + globalTimeScale: number; + + /** + * The Animations registered in the Animation Manager. + * + * This map should be modified with the {@link #add} and {@link #create} methods of the Animation Manager. + */ + protected anims: Phaser.Structs.Map; + + /** + * A list of animation mix times. + * + * See the {@link #setMix} method for more details. + */ + mixes: Phaser.Structs.Map; + + /** + * Whether the Animation Manager is paused along with all of its Animations. + */ + paused: boolean; + + /** + * The name of this Animation Manager. + */ + name: string; + + /** + * Registers event listeners after the Game boots. + */ + boot(): void; + + /** + * Adds a mix between two animations. + * + * Mixing allows you to specify a unique delay between a pairing of animations. + * + * When playing Animation A on a Game Object, if you then play Animation B, and a + * mix exists, it will wait for the specified delay to be over before playing Animation B. + * + * This allows you to customise smoothing between different types of animation, such + * as blending between an idle and a walk state, or a running and a firing state. + * + * Note that mixing is only applied if you use the `Sprite.play` method. If you opt to use + * `playAfterRepeat` or `playAfterDelay` instead, those will take priority and the mix + * delay will not be used. + * + * To update an existing mix, just call this method with the new delay. + * + * To remove a mix pairing, see the `removeMix` method. + * @param animA The string-based key, or instance of, Animation A. + * @param animB The string-based key, or instance of, Animation B. + * @param delay The delay, in milliseconds, to wait when transitioning from Animation A to B. + */ + addMix(animA: string | Phaser.Animations.Animation, animB: string | Phaser.Animations.Animation, delay: number): this; + + /** + * Removes a mix between two animations. + * + * Mixing allows you to specify a unique delay between a pairing of animations. + * + * Calling this method lets you remove those pairings. You can either remove + * it between `animA` and `animB`, or if you do not provide the `animB` parameter, + * it will remove all `animA` mixes. + * + * If you wish to update an existing mix instead, call the `addMix` method with the + * new delay. + * @param animA The string-based key, or instance of, Animation A. + * @param animB The string-based key, or instance of, Animation B. If not given, all mixes for Animation A will be removed. + */ + removeMix(animA: string | Phaser.Animations.Animation, animB?: string | Phaser.Animations.Animation): this; + + /** + * Returns the mix delay between two animations. + * + * If no mix has been set-up, this method will return zero. + * + * If you wish to create, or update, a new mix, call the `addMix` method. + * If you wish to remove a mix, call the `removeMix` method. + * @param animA The string-based key, or instance of, Animation A. + * @param animB The string-based key, or instance of, Animation B. + */ + getMix(animA: string | Phaser.Animations.Animation, animB: string | Phaser.Animations.Animation): number; + + /** + * Adds an existing Animation to the Animation Manager. + * @param key The key under which the Animation should be added. The Animation will be updated with it. Must be unique. + * @param animation The Animation which should be added to the Animation Manager. + */ + add(key: string, animation: Phaser.Animations.Animation): this; + + /** + * Checks to see if the given key is already in use within the Animation Manager or not. + * + * Animations are global. Keys created in one scene can be used from any other Scene in your game. They are not Scene specific. + * @param key The key of the Animation to check. + */ + exists(key: string): boolean; + + /** + * Create one, or more animations from a loaded Aseprite JSON file. + * + * Aseprite is a powerful animated sprite editor and pixel art tool. + * + * You can find more details at https://www.aseprite.org/ + * + * To export a compatible JSON file in Aseprite, please do the following: + * + * 1. Go to "File - Export Sprite Sheet" + * + * 2. On the **Layout** tab: + * 2a. Set the "Sheet type" to "Packed" + * 2b. Set the "Constraints" to "None" + * 2c. Check the "Merge Duplicates" checkbox + * + * 3. On the **Sprite** tab: + * 3a. Set "Layers" to "Visible layers" + * 3b. Set "Frames" to "All frames", unless you only wish to export a sub-set of tags + * + * 4. On the **Borders** tab: + * 4a. Check the "Trim Sprite" and "Trim Cells" options + * 4b. Ensure "Border Padding", "Spacing" and "Inner Padding" are all > 0 (1 is usually enough) + * + * 5. On the **Output** tab: + * 5a. Check "Output File", give your image a name and make sure you choose "png files" as the file type + * 5b. Check "JSON Data" and give your json file a name + * 5c. The JSON Data type can be either a Hash or Array, Phaser doesn't mind. + * 5d. Make sure "Tags" is checked in the Meta options + * 5e. In the "Item Filename" input box, make sure it says just "{frame}" and nothing more. + * + * 6. Click export + * + * This was tested with Aseprite 1.2.25. + * + * This will export a png and json file which you can load using the Aseprite Loader, i.e.: + * + * ```javascript + * function preload () + * { + * this.load.path = 'assets/animations/aseprite/'; + * this.load.aseprite('paladin', 'paladin.png', 'paladin.json'); + * } + * ``` + * + * Once loaded, you can call this method from within a Scene with the 'atlas' key: + * + * ```javascript + * this.anims.createFromAseprite('paladin'); + * ``` + * + * Any animations defined in the JSON will now be available to use in Phaser and you play them + * via their Tag name. For example, if you have an animation called 'War Cry' on your Aseprite timeline, + * you can play it in Phaser using that Tag name: + * + * ```javascript + * this.add.sprite(400, 300).play('War Cry'); + * ``` + * + * When calling this method you can optionally provide an array of tag names, and only those animations + * will be created. For example: + * + * ```javascript + * this.anims.createFromAseprite('paladin', [ 'step', 'War Cry', 'Magnum Break' ]); + * ``` + * + * This will only create the 3 animations defined. Note that the tag names are case-sensitive. + * @param key The key of the loaded Aseprite atlas. It must have been loaded prior to calling this method. + * @param tags An array of Tag names. If provided, only animations found in this array will be created. + * @param target Create the animations on this target Sprite. If not given, they will be created globally in this Animation Manager. + */ + createFromAseprite(key: string, tags?: string[], target?: Phaser.Animations.AnimationManager | Phaser.GameObjects.GameObject): Phaser.Animations.Animation[]; + + /** + * Creates a new Animation and adds it to the Animation Manager. + * + * Animations are global. Once created, you can use them in any Scene in your game. They are not Scene specific. + * + * If an invalid key is given this method will return `false`. + * + * If you pass the key of an animation that already exists in the Animation Manager, that animation will be returned. + * + * A brand new animation is only created if the key is valid and not already in use. + * + * If you wish to re-use an existing key, call `AnimationManager.remove` first, then this method. + * @param config The configuration settings for the Animation. + */ + create(config: Phaser.Types.Animations.Animation): Phaser.Animations.Animation | false; + + /** + * Loads this Animation Manager's Animations and settings from a JSON object. + * @param data The JSON object to parse. + * @param clearCurrentAnimations If set to `true`, the current animations will be removed (`anims.clear()`). If set to `false` (default), the animations in `data` will be added. Default false. + */ + fromJSON(data: string | Phaser.Types.Animations.JSONAnimations | Phaser.Types.Animations.JSONAnimation, clearCurrentAnimations?: boolean): Phaser.Animations.Animation[]; + + /** + * Generate an array of {@link Phaser.Types.Animations.AnimationFrame} objects from a texture key and configuration object. + * + * Generates objects with string based frame names, as configured by the given {@link Phaser.Types.Animations.GenerateFrameNames}. + * + * It's a helper method, designed to make it easier for you to extract all of the frame names from texture atlases. + * + * If you're working with a sprite sheet, see the `generateFrameNumbers` method instead. + * + * Example: + * + * If you have a texture atlases loaded called `gems` and it contains 6 frames called `ruby_0001`, `ruby_0002`, and so on, + * then you can call this method using: `this.anims.generateFrameNames('gems', { prefix: 'ruby_', start: 1, end: 6, zeroPad: 4 })`. + * + * The `end` value tells it to select frames 1 through 6, incrementally numbered, all starting with the prefix `ruby_`. The `zeroPad` + * value tells it how many zeroes pad out the numbers. To create an animation using this method, you can do: + * + * ```javascript + * this.anims.create({ + * key: 'ruby', + * repeat: -1, + * frames: this.anims.generateFrameNames('gems', { + * prefix: 'ruby_', + * end: 6, + * zeroPad: 4 + * }) + * }); + * ``` + * + * Please see the animation examples for further details. + * @param key The key for the texture containing the animation frames. + * @param config The configuration object for the animation frame names. + */ + generateFrameNames(key: string, config?: Phaser.Types.Animations.GenerateFrameNames): Phaser.Types.Animations.AnimationFrame[]; + + /** + * Generate an array of {@link Phaser.Types.Animations.AnimationFrame} objects from a texture key and configuration object. + * + * Generates objects with numbered frame names, as configured by the given {@link Phaser.Types.Animations.GenerateFrameNumbers}. + * + * If you're working with a texture atlas, see the `generateFrameNames` method instead. + * + * It's a helper method, designed to make it easier for you to extract frames from sprite sheets. + * + * Example: + * + * If you have a sprite sheet loaded called `explosion` and it contains 12 frames, then you can call this method using: + * + * `this.anims.generateFrameNumbers('explosion', { start: 0, end: 11 })`. + * + * The `end` value of 11 tells it to stop after the 12th frame has been added, because it started at zero. + * + * To create an animation using this method, you can do: + * + * ```javascript + * this.anims.create({ + * key: 'boom', + * frames: this.anims.generateFrameNumbers('explosion', { + * start: 0, + * end: 11 + * }) + * }); + * ``` + * + * Note that `start` is optional and you don't need to include it if the animation starts from frame 0. + * + * To specify an animation in reverse, swap the `start` and `end` values. + * + * If the frames are not sequential, you may pass an array of frame numbers instead, for example: + * + * `this.anims.generateFrameNumbers('explosion', { frames: [ 0, 1, 2, 1, 2, 3, 4, 0, 1, 2 ] })` + * + * Please see the animation examples and `GenerateFrameNumbers` config docs for further details. + * @param key The key for the texture containing the animation frames. + * @param config The configuration object for the animation frames. + */ + generateFrameNumbers(key: string, config?: Phaser.Types.Animations.GenerateFrameNumbers): Phaser.Types.Animations.AnimationFrame[]; + + /** + * Get an Animation. + * @param key The key of the Animation to retrieve. + */ + get(key: string): Phaser.Animations.Animation; + + /** + * Returns an array of all Animation keys that are using the given + * Texture. Only Animations that have at least one AnimationFrame + * entry using this texture will be included in the result. + * @param key The unique string-based key of the Texture, or a Texture, or Frame instance. + */ + getAnimsFromTexture(key: string | Phaser.Textures.Texture | Phaser.Textures.Frame): string[]; + + /** + * Pause all animations. + */ + pauseAll(): this; + + /** + * Play an animation on the given Game Objects that have an Animation Component. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param children An array of Game Objects to play the animation on. They must have an Animation Component. + */ + play(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, children: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[]): this; + + /** + * Takes an array of Game Objects that have an Animation Component and then + * starts the given animation playing on them. The start time of each Game Object + * is offset, incrementally, by the `stagger` amount. + * + * For example, if you pass an array with 4 children and a stagger time of 1000, + * the delays will be: + * + * child 1: 1000ms delay + * child 2: 2000ms delay + * child 3: 3000ms delay + * child 4: 4000ms delay + * + * If you set the `staggerFirst` parameter to `false` they would be: + * + * child 1: 0ms delay + * child 2: 1000ms delay + * child 3: 2000ms delay + * child 4: 3000ms delay + * + * You can also set `stagger` to be a negative value. If it was -1000, the above would be: + * + * child 1: 3000ms delay + * child 2: 2000ms delay + * child 3: 1000ms delay + * child 4: 0ms delay + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param children An array of Game Objects to play the animation on. They must have an Animation Component. + * @param stagger The amount of time, in milliseconds, to offset each play time by. If a negative value is given, it's applied to the children in reverse order. + * @param staggerFirst Should the first child be staggered as well? Default true. + */ + staggerPlay(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, children: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], stagger: number, staggerFirst?: boolean): G; + + /** + * Removes an Animation from this Animation Manager, based on the given key. + * + * This is a global action. Once an Animation has been removed, no Game Objects + * can carry on using it. + * @param key The key of the animation to remove. + */ + remove(key: string): Phaser.Animations.Animation; + + /** + * Resume all paused animations. + */ + resumeAll(): this; + + /** + * Returns the Animation data as JavaScript object based on the given key. + * Or, if not key is defined, it will return the data of all animations as array of objects. + * @param key The animation to get the JSONAnimation data from. If not provided, all animations are returned as an array. + */ + toJSON(key?: string): Phaser.Types.Animations.JSONAnimations; + + /** + * Destroy this Animation Manager and clean up animation definitions and references to other objects. + * This method should not be called directly. It will be called automatically as a response to a `destroy` event from the Phaser.Game instance. + */ + destroy(): void; + + } + + /** + * The Animation State Component. + * + * This component provides features to apply animations to Game Objects. It is responsible for + * loading, queuing animations for later playback, mixing between animations and setting + * the current animation frame to the Game Object that owns this component. + * + * This component lives as an instance within any Game Object that has it defined, such as Sprites. + * + * You can access its properties and methods via the `anims` property, i.e. `Sprite.anims`. + * + * As well as playing animations stored in the global Animation Manager, this component + * can also create animations that are stored locally within it. See the `create` method + * for more details. + * + * Prior to Phaser 3.50 this component was called just `Animation` and lived in the + * `Phaser.GameObjects.Components` namespace. It was renamed to `AnimationState` + * in 3.50 to help better identify its true purpose when browsing the documentation. + */ + class AnimationState { + /** + * + * @param parent The Game Object to which this animation component belongs. + */ + constructor(parent: Phaser.GameObjects.GameObject); + + /** + * The Game Object to which this animation component belongs. + * + * You can typically access this component from the Game Object + * via the `this.anims` property. + */ + parent: Phaser.GameObjects.GameObject; + + /** + * A reference to the global Animation Manager. + */ + animationManager: Phaser.Animations.AnimationManager; + + /** + * A reference to the Texture Manager. + */ + protected textureManager: Phaser.Textures.TextureManager; + + /** + * The Animations stored locally in this Animation component. + * + * Do not modify the contents of this Map directly, instead use the + * `add`, `create` and `remove` methods of this class instead. + */ + protected anims: Phaser.Structs.Map; + + /** + * Is an animation currently playing or not? + */ + isPlaying: boolean; + + /** + * Has the current animation started playing, or is it waiting for a delay to expire? + */ + hasStarted: boolean; + + /** + * The current Animation loaded into this Animation component. + * + * Will by `null` if no animation is yet loaded. + */ + currentAnim: Phaser.Animations.Animation | null; + + /** + * The current AnimationFrame being displayed by this Animation component. + * + * Will by `null` if no animation is yet loaded. + */ + currentFrame: Phaser.Animations.AnimationFrame | null; + + /** + * The key, instance, or config of the next Animation to be loaded into this Animation component + * when the current animation completes. + * + * Will by `null` if no animation has been queued. + */ + nextAnim: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig | null; + + /** + * A queue of Animations to be loaded into this Animation component when the current animation completes. + * + * Populate this queue via the `chain` method. + */ + nextAnimsQueue: any[]; + + /** + * The Time Scale factor. + * + * You can adjust this value to modify the passage of time for the animation that is currently + * playing. For example, setting it to 2 will make the animation play twice as fast. Or setting + * it to 0.5 will slow the animation down. + * + * You can change this value at run-time, or set it via the `PlayAnimationConfig`. + * + * Prior to Phaser 3.50 this property was private and called `_timeScale`. + */ + timeScale: number; + + /** + * The frame rate of playback, of the current animation, in frames per second. + * + * This value is set when a new animation is loaded into this component and should + * be treated as read-only, as changing it once playback has started will not alter + * the animation. To change the frame rate, provide a new value in the `PlayAnimationConfig` object. + */ + frameRate: number; + + /** + * The duration of the current animation, in milliseconds. + * + * This value is set when a new animation is loaded into this component and should + * be treated as read-only, as changing it once playback has started will not alter + * the animation. To change the duration, provide a new value in the `PlayAnimationConfig` object. + */ + duration: number; + + /** + * The number of milliseconds per frame, not including frame specific modifiers that may be present in the + * Animation data. + * + * This value is calculated when a new animation is loaded into this component and should + * be treated as read-only. Changing it will not alter playback speed. + */ + msPerFrame: number; + + /** + * Skip frames if the time lags, or always advanced anyway? + */ + skipMissedFrames: boolean; + + /** + * Start playback of this animation from a random frame? + */ + randomFrame: boolean; + + /** + * The delay before starting playback of the current animation, in milliseconds. + * + * This value is set when a new animation is loaded into this component and should + * be treated as read-only, as changing it once playback has started will not alter + * the animation. To change the delay, provide a new value in the `PlayAnimationConfig` object. + * + * Prior to Phaser 3.50 this property was private and called `_delay`. + */ + delay: number; + + /** + * The number of times to repeat playback of the current animation. + * + * If -1, it means the animation will repeat forever. + * + * This value is set when a new animation is loaded into this component and should + * be treated as read-only, as changing it once playback has started will not alter + * the animation. To change the number of repeats, provide a new value in the `PlayAnimationConfig` object. + * + * Prior to Phaser 3.50 this property was private and called `_repeat`. + */ + repeat: number; + + /** + * The number of milliseconds to wait before starting the repeat playback of the current animation. + * + * This value is set when a new animation is loaded into this component, but can also be modified + * at run-time. + * + * You can change the repeat delay by providing a new value in the `PlayAnimationConfig` object. + * + * Prior to Phaser 3.50 this property was private and called `_repeatDelay`. + */ + repeatDelay: number; + + /** + * Should the current animation yoyo? An animation that yoyos will play in reverse, from the end + * to the start, before then repeating or completing. An animation that does not yoyo will just + * play from the start to the end. + * + * This value is set when a new animation is loaded into this component, but can also be modified + * at run-time. + * + * You can change the yoyo by providing a new value in the `PlayAnimationConfig` object. + * + * Prior to Phaser 3.50 this property was private and called `_yoyo`. + */ + yoyo: boolean; + + /** + * If the animation has a delay set, before playback will begin, this + * controls when the first frame is set on the Sprite. If this property + * is 'false' then the frame is set only after the delay has expired. + * This is the default behavior. + * + * If this property is 'true' then the first frame of this animation + * is set immediately, and then when the delay expires, playback starts. + */ + showBeforeDelay: boolean; + + /** + * Should the GameObject's `visible` property be set to `true` when the animation starts to play? + * + * This will happen _after_ any delay that may have been set. + * + * This value is set when a new animation is loaded into this component, but can also be modified + * at run-time, assuming the animation is currently delayed. + */ + showOnStart: boolean; + + /** + * Should the GameObject's `visible` property be set to `false` when the animation completes? + * + * This value is set when a new animation is loaded into this component, but can also be modified + * at run-time, assuming the animation is still actively playing. + */ + hideOnComplete: boolean; + + /** + * Is the playhead moving forwards (`true`) or in reverse (`false`) ? + */ + forward: boolean; + + /** + * An internal trigger that tells the component if it should plays the animation + * in reverse mode ('true') or not ('false'). This is used because `forward` can + * be changed by the `yoyo` feature. + * + * Prior to Phaser 3.50 this property was private and called `_reverse`. + */ + inReverse: boolean; + + /** + * Internal time overflow accumulator. + * + * This has the `delta` time added to it as part of the `update` step. + */ + accumulator: number; + + /** + * The time point at which the next animation frame will change. + * + * This value is compared against the `accumulator` as part of the `update` step. + */ + nextTick: number; + + /** + * A counter keeping track of how much delay time, in milliseconds, is left before playback begins. + * + * This is set via the `playAfterDelay` method, although it can be modified at run-time + * if required, as long as the animation has not already started playing. + */ + delayCounter: number; + + /** + * A counter that keeps track of how many repeats are left to run. + * + * This value is set when a new animation is loaded into this component, but can also be modified + * at run-time. + */ + repeatCounter: number; + + /** + * An internal flag keeping track of pending repeats. + */ + pendingRepeat: boolean; + + /** + * Sets an animation, or an array of animations, to be played in the future, after the current one completes or stops. + * + * The current animation must enter a 'completed' state for this to happen, i.e. finish all of its repeats, delays, etc, + * or have one of the `stop` methods called. + * + * An animation set to repeat forever will never enter a completed state unless stopped. + * + * You can chain a new animation at any point, including before the current one starts playing, during it, or when it ends (via its `animationcomplete` event). + * + * Chained animations are specific to a Game Object, meaning different Game Objects can have different chained animations without impacting the global animation they're playing. + * + * Call this method with no arguments to reset all currently chained animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object, or an array of them. + */ + chain(key?: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig | string[] | Phaser.Animations.Animation[] | Phaser.Types.Animations.PlayAnimationConfig[]): Phaser.GameObjects.GameObject; + + /** + * Returns the key of the animation currently loaded into this component. + * + * Prior to Phaser 3.50 this method was called `getCurrentKey`. + */ + getName(): string; + + /** + * Returns the key of the animation frame currently displayed by this component. + */ + getFrameName(): string; + + /** + * Internal method used to load an animation into this component. + * @param key The string-based key of the animation to play, or a `PlayAnimationConfig` object. + */ + protected load(key: string | Phaser.Types.Animations.PlayAnimationConfig): Phaser.GameObjects.GameObject; + + /** + * Pause the current animation and set the `isPlaying` property to `false`. + * You can optionally pause it at a specific frame. + * @param atFrame An optional frame to set after pausing the animation. + */ + pause(atFrame?: Phaser.Animations.AnimationFrame): Phaser.GameObjects.GameObject; + + /** + * Resumes playback of a paused animation and sets the `isPlaying` property to `true`. + * You can optionally tell it to start playback from a specific frame. + * @param fromFrame An optional frame to set before restarting playback. + */ + resume(fromFrame?: Phaser.Animations.AnimationFrame): Phaser.GameObjects.GameObject; + + /** + * Waits for the specified delay, in milliseconds, then starts playback of the given animation. + * + * If the animation _also_ has a delay value set in its config, it will be **added** to the delay given here. + * + * If an animation is already running and a new animation is given to this method, it will wait for + * the given delay before starting the new animation. + * + * If no animation is currently running, the given one begins after the delay. + * + * Prior to Phaser 3.50 this method was called 'delayedPlay' and the parameters were in the reverse order. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param delay The delay, in milliseconds, to wait before starting the animation playing. + */ + playAfterDelay(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, delay: number): Phaser.GameObjects.GameObject; + + /** + * Waits for the current animation to complete the `repeatCount` number of repeat cycles, then starts playback + * of the given animation. + * + * You can use this to ensure there are no harsh jumps between two sets of animations, i.e. going from an + * idle animation to a walking animation, by making them blend smoothly into each other. + * + * If no animation is currently running, the given one will start immediately. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param repeatCount How many times should the animation repeat before the next one starts? Default 1. + */ + playAfterRepeat(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, repeatCount?: number): Phaser.GameObjects.GameObject; + + /** + * Start playing the given animation on this Sprite. + * + * Animations in Phaser can either belong to the global Animation Manager, or specifically to this Sprite. + * + * The benefit of a global animation is that multiple Sprites can all play the same animation, without + * having to duplicate the data. You can just create it once and then play it on any Sprite. + * + * The following code shows how to create a global repeating animation. The animation will be created + * from all of the frames within the sprite sheet that was loaded with the key 'muybridge': + * + * ```javascript + * var config = { + * key: 'run', + * frames: 'muybridge', + * frameRate: 15, + * repeat: -1 + * }; + * + * // This code should be run from within a Scene: + * this.anims.create(config); + * ``` + * + * However, if you wish to create an animation that is unique to this Sprite, and this Sprite alone, + * you can call the `Animation.create` method instead. It accepts the exact same parameters as when + * creating a global animation, however the resulting data is kept locally in this Sprite. + * + * With the animation created, either globally or locally, you can now play it on this Sprite: + * + * ```javascript + * this.add.sprite(x, y).play('run'); + * ``` + * + * Alternatively, if you wish to run it at a different frame rate, for example, you can pass a config + * object instead: + * + * ```javascript + * this.add.sprite(x, y).play({ key: 'run', frameRate: 24 }); + * ``` + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * If you need a Sprite to be able to play both local and global animations, make sure they don't + * have conflicting keys. + * + * See the documentation for the `PlayAnimationConfig` config object for more details about this. + * + * Also, see the documentation in the Animation Manager for further details on creating animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If this animation is already playing then ignore this call. Default false. + */ + play(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): Phaser.GameObjects.GameObject; + + /** + * Start playing the given animation on this Sprite, in reverse. + * + * Animations in Phaser can either belong to the global Animation Manager, or specifically to this Sprite. + * + * The benefit of a global animation is that multiple Sprites can all play the same animation, without + * having to duplicate the data. You can just create it once and then play it on any Sprite. + * + * The following code shows how to create a global repeating animation. The animation will be created + * from all of the frames within the sprite sheet that was loaded with the key 'muybridge': + * + * ```javascript + * var config = { + * key: 'run', + * frames: 'muybridge', + * frameRate: 15, + * repeat: -1 + * }; + * + * // This code should be run from within a Scene: + * this.anims.create(config); + * ``` + * + * However, if you wish to create an animation that is unique to this Sprite, and this Sprite alone, + * you can call the `Animation.create` method instead. It accepts the exact same parameters as when + * creating a global animation, however the resulting data is kept locally in this Sprite. + * + * With the animation created, either globally or locally, you can now play it on this Sprite: + * + * ```javascript + * this.add.sprite(x, y).playReverse('run'); + * ``` + * + * Alternatively, if you wish to run it at a different frame rate, for example, you can pass a config + * object instead: + * + * ```javascript + * this.add.sprite(x, y).playReverse({ key: 'run', frameRate: 24 }); + * ``` + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * If you need a Sprite to be able to play both local and global animations, make sure they don't + * have conflicting keys. + * + * See the documentation for the `PlayAnimationConfig` config object for more details about this. + * + * Also, see the documentation in the Animation Manager for further details on creating animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If an animation is already playing then ignore this call. Default false. + */ + playReverse(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): Phaser.GameObjects.GameObject; + + /** + * Load the animation based on the key and set-up all of the internal values + * needed for playback to start. If there is no delay, it will also fire the start events. + * @param key The string-based key of the animation to play, or a `PlayAnimationConfig` object. + */ + startAnimation(key: string | Phaser.Types.Animations.PlayAnimationConfig): Phaser.GameObjects.GameObject; + + /** + * Reverse the Animation that is already playing on the Game Object. + */ + reverse(): Phaser.GameObjects.GameObject; + + /** + * Returns a value between 0 and 1 indicating how far this animation is through, ignoring repeats and yoyos. + * + * The value is based on the current frame and how far that is in the animation, it is not based on + * the duration of the animation. + */ + getProgress(): number; + + /** + * Takes a value between 0 and 1 and uses it to set how far this animation is through playback. + * + * Does not factor in repeats or yoyos, but does handle playing forwards or backwards. + * + * The value is based on the current frame and how far that is in the animation, it is not based on + * the duration of the animation. + * @param value The progress value, between 0 and 1. Default 0. + */ + setProgress(value?: number): Phaser.GameObjects.GameObject; + + /** + * Sets the number of times that the animation should repeat after its first play through. + * For example, if repeat is 1, the animation will play a total of twice: the initial play plus 1 repeat. + * + * To repeat indefinitely, use -1. + * The value should always be an integer. + * + * Calling this method only works if the animation is already running. Otherwise, any + * value specified here will be overwritten when the next animation loads in. To avoid this, + * use the `repeat` property of the `PlayAnimationConfig` object instead. + * @param value The number of times that the animation should repeat. + */ + setRepeat(value: number): Phaser.GameObjects.GameObject; + + /** + * Handle the removal of an animation from the Animation Manager. + * @param key The key of the removed Animation. + * @param animation The removed Animation. + */ + globalRemove(key?: string, animation?: Phaser.Animations.Animation): void; + + /** + * Restarts the current animation from its beginning. + * + * You can optionally reset the delay and repeat counters as well. + * + * Calling this will fire the `ANIMATION_RESTART` event immediately. + * + * If you `includeDelay` then it will also fire the `ANIMATION_START` event once + * the delay has expired, otherwise, playback will just begin immediately. + * @param includeDelay Whether to include the delay value of the animation when restarting. Default false. + * @param resetRepeats Whether to reset the repeat counter or not? Default false. + */ + restart(includeDelay?: boolean, resetRepeats?: boolean): Phaser.GameObjects.GameObject; + + /** + * The current animation has completed. This dispatches the `ANIMATION_COMPLETE` event. + * + * This method is called by the Animation instance and should not usually be invoked directly. + * + * If no animation is loaded, no events will be dispatched. + * + * If another animation has been queued for playback, it will be started after the events fire. + */ + complete(): Phaser.GameObjects.GameObject; + + /** + * Immediately stops the current animation from playing and dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing. + */ + stop(): Phaser.GameObjects.GameObject; + + /** + * Stops the current animation from playing after the specified time delay, given in milliseconds. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param delay The number of milliseconds to wait before stopping this animation. + */ + stopAfterDelay(delay: number): Phaser.GameObjects.GameObject; + + /** + * Stops the current animation from playing when it next repeats. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * + * Prior to Phaser 3.50 this method was called `stopOnRepeat` and had no parameters. + * @param repeatCount How many times should the animation repeat before stopping? Default 1. + */ + stopAfterRepeat(repeatCount?: number): Phaser.GameObjects.GameObject; + + /** + * Stops the current animation from playing when it next sets the given frame. + * If this frame doesn't exist within the animation it will not stop it from playing. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param frame The frame to check before stopping this animation. + */ + stopOnFrame(frame: Phaser.Animations.AnimationFrame): Phaser.GameObjects.GameObject; + + /** + * Returns the total number of frames in this animation, or returns zero if no + * animation has been loaded. + */ + getTotalFrames(): number; + + /** + * The internal update loop for the AnimationState Component. + * + * This is called automatically by the `Sprite.preUpdate` method. + * @param time The current timestamp. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Sets the given Animation Frame as being the current frame + * and applies it to the parent Game Object, adjusting size and origin as needed. + * @param animationFrame The animation frame to change to. + */ + setCurrentFrame(animationFrame: Phaser.Animations.AnimationFrame): Phaser.GameObjects.GameObject; + + /** + * Advances the animation to the next frame, regardless of the time or animation state. + * If the animation is set to repeat, or yoyo, this will still take effect. + * + * Calling this does not change the direction of the animation. I.e. if it was currently + * playing in reverse, calling this method doesn't then change the direction to forwards. + */ + nextFrame(): Phaser.GameObjects.GameObject; + + /** + * Advances the animation to the previous frame, regardless of the time or animation state. + * If the animation is set to repeat, or yoyo, this will still take effect. + * + * Calling this does not change the direction of the animation. I.e. if it was currently + * playing in forwards, calling this method doesn't then change the direction to backwards. + */ + previousFrame(): Phaser.GameObjects.GameObject; + + /** + * Get an Animation instance that has been created locally on this Sprite. + * + * See the `create` method for more details. + * @param key The key of the Animation to retrieve. + */ + get(key: string): Phaser.Animations.Animation; + + /** + * Checks to see if the given key is already used locally within the animations stored on this Sprite. + * @param key The key of the Animation to check. + */ + exists(key: string): boolean; + + /** + * Creates a new Animation that is local specifically to this Sprite. + * + * When a Sprite owns an animation, it is kept out of the global Animation Manager, which means + * you're free to use keys that may be already defined there. Unless you specifically need a Sprite + * to have a unique animation, you should favor using global animations instead, as they allow for + * the same animation to be used across multiple Sprites, saving on memory. However, if this Sprite + * is the only one to use this animation, it's sensible to create it here. + * + * If an invalid key is given this method will return `false`. + * + * If you pass the key of an animation that already exists locally, that animation will be returned. + * + * A brand new animation is only created if the key is valid and not already in use by this Sprite. + * + * If you wish to re-use an existing key, call the `remove` method first, then this method. + * @param config The configuration settings for the Animation. + */ + create(config: Phaser.Types.Animations.Animation): Phaser.Animations.Animation | false; + + /** + * Create one, or more animations from a loaded Aseprite JSON file. + * + * Aseprite is a powerful animated sprite editor and pixel art tool. + * + * You can find more details at https://www.aseprite.org/ + * + * To export a compatible JSON file in Aseprite, please do the following: + * + * 1. Go to "File - Export Sprite Sheet" + * + * 2. On the **Layout** tab: + * 2a. Set the "Sheet type" to "Packed" + * 2b. Set the "Constraints" to "None" + * 2c. Check the "Merge Duplicates" checkbox + * + * 3. On the **Sprite** tab: + * 3a. Set "Layers" to "Visible layers" + * 3b. Set "Frames" to "All frames", unless you only wish to export a sub-set of tags + * + * 4. On the **Borders** tab: + * 4a. Check the "Trim Sprite" and "Trim Cells" options + * 4b. Ensure "Border Padding", "Spacing" and "Inner Padding" are all > 0 (1 is usually enough) + * + * 5. On the **Output** tab: + * 5a. Check "Output File", give your image a name and make sure you choose "png files" as the file type + * 5b. Check "JSON Data" and give your json file a name + * 5c. The JSON Data type can be either a Hash or Array, Phaser doesn't mind. + * 5d. Make sure "Tags" is checked in the Meta options + * 5e. In the "Item Filename" input box, make sure it says just "{frame}" and nothing more. + * + * 6. Click export + * + * This was tested with Aseprite 1.2.25. + * + * This will export a png and json file which you can load using the Aseprite Loader, i.e.: + * + * ```javascript + * function preload () + * { + * this.load.path = 'assets/animations/aseprite/'; + * this.load.aseprite('paladin', 'paladin.png', 'paladin.json'); + * } + * ``` + * + * Once loaded, you can call this method on a Sprite with the 'atlas' key: + * + * ```javascript + * const sprite = this.add.sprite(400, 300); + * + * sprite.anims.createFromAseprite('paladin'); + * ``` + * + * Any animations defined in the JSON will now be available to use on this Sprite and you play them + * via their Tag name. For example, if you have an animation called 'War Cry' on your Aseprite timeline, + * you can play it on the Sprite using that Tag name: + * + * ```javascript + * const sprite = this.add.sprite(400, 300); + * + * sprite.anims.createFromAseprite('paladin'); + * + * sprite.play('War Cry'); + * ``` + * + * When calling this method you can optionally provide an array of tag names, and only those animations + * will be created. For example: + * + * ```javascript + * sprite.anims.createFromAseprite('paladin', [ 'step', 'War Cry', 'Magnum Break' ]); + * ``` + * + * This will only create the 3 animations defined. Note that the tag names are case-sensitive. + * @param key The key of the loaded Aseprite atlas. It must have been loaded prior to calling this method. + * @param tags An array of Tag names. If provided, only animations found in this array will be created. + */ + createFromAseprite(key: string, tags?: string[]): Phaser.Animations.Animation[]; + + /** + * Generate an array of {@link Phaser.Types.Animations.AnimationFrame} objects from a texture key and configuration object. + * + * Generates objects with string based frame names, as configured by the given {@link Phaser.Types.Animations.GenerateFrameNames}. + * + * It's a helper method, designed to make it easier for you to extract all of the frame names from texture atlases. + * If you're working with a sprite sheet, see the `generateFrameNumbers` method instead. + * + * Example: + * + * If you have a texture atlases loaded called `gems` and it contains 6 frames called `ruby_0001`, `ruby_0002`, and so on, + * then you can call this method using: `this.anims.generateFrameNames('gems', { prefix: 'ruby_', end: 6, zeroPad: 4 })`. + * + * The `end` value tells it to look for 6 frames, incrementally numbered, all starting with the prefix `ruby_`. The `zeroPad` + * value tells it how many zeroes pad out the numbers. To create an animation using this method, you can do: + * + * ```javascript + * this.anims.create({ + * key: 'ruby', + * repeat: -1, + * frames: this.anims.generateFrameNames('gems', { + * prefix: 'ruby_', + * end: 6, + * zeroPad: 4 + * }) + * }); + * ``` + * + * Please see the animation examples for further details. + * @param key The key for the texture containing the animation frames. + * @param config The configuration object for the animation frame names. + */ + generateFrameNames(key: string, config?: Phaser.Types.Animations.GenerateFrameNames): Phaser.Types.Animations.AnimationFrame[]; + + /** + * Generate an array of {@link Phaser.Types.Animations.AnimationFrame} objects from a texture key and configuration object. + * + * Generates objects with numbered frame names, as configured by the given {@link Phaser.Types.Animations.GenerateFrameNumbers}. + * + * If you're working with a texture atlas, see the `generateFrameNames` method instead. + * + * It's a helper method, designed to make it easier for you to extract frames from sprite sheets. + * If you're working with a texture atlas, see the `generateFrameNames` method instead. + * + * Example: + * + * If you have a sprite sheet loaded called `explosion` and it contains 12 frames, then you can call this method using: + * `this.anims.generateFrameNumbers('explosion', { start: 0, end: 11 })`. + * + * The `end` value tells it to stop after 12 frames. To create an animation using this method, you can do: + * + * ```javascript + * this.anims.create({ + * key: 'boom', + * frames: this.anims.generateFrameNumbers('explosion', { + * start: 0, + * end: 11 + * }) + * }); + * ``` + * + * Note that `start` is optional and you don't need to include it if the animation starts from frame 0. + * + * To specify an animation in reverse, swap the `start` and `end` values. + * + * If the frames are not sequential, you may pass an array of frame numbers instead, for example: + * + * `this.anims.generateFrameNumbers('explosion', { frames: [ 0, 1, 2, 1, 2, 3, 4, 0, 1, 2 ] })` + * + * Please see the animation examples and `GenerateFrameNumbers` config docs for further details. + * @param key The key for the texture containing the animation frames. + * @param config The configuration object for the animation frames. + */ + generateFrameNumbers(key: string, config?: Phaser.Types.Animations.GenerateFrameNumbers): Phaser.Types.Animations.AnimationFrame[]; + + /** + * Removes a locally created Animation from this Sprite, based on the given key. + * + * Once an Animation has been removed, this Sprite cannot play it again without re-creating it. + * @param key The key of the animation to remove. + */ + remove(key: string): Phaser.Animations.Animation; + + /** + * Destroy this Animation component. + * + * Unregisters event listeners and cleans up its references. + */ + destroy(): void; + + /** + * `true` if the current animation is paused, otherwise `false`. + */ + readonly isPaused: boolean; + + } + + namespace Events { + /** + * The Add Animation Event. + * + * This event is dispatched when a new animation is added to the global Animation Manager. + * + * This can happen either as a result of an animation instance being added to the Animation Manager, + * or the Animation Manager creating a new animation directly. + */ + const ADD_ANIMATION: string; + + /** + * The Animation Complete Event. + * + * This event is dispatched by a Sprite when an animation playing on it completes playback. + * This happens when the animation gets to the end of its sequence, factoring in any delays + * or repeats it may have to process. + * + * An animation that is set to loop, or repeat forever, will never fire this event, because + * it never actually completes. If you need to handle this, listen for the `ANIMATION_STOP` + * event instead, as this is emitted when the animation is stopped directly. + * + * Listen for it on the Sprite using `sprite.on('animationcomplete', listener)` + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_COMPLETE: string; + + /** + * The Animation Complete Dynamic Key Event. + * + * This event is dispatched by a Sprite when an animation playing on it completes playback. + * This happens when the animation gets to the end of its sequence, factoring in any delays + * or repeats it may have to process. + * + * An animation that is set to loop, or repeat forever, will never fire this event, because + * it never actually completes. If you need to handle this, listen for the `ANIMATION_STOP` + * event instead, as this is emitted when the animation is stopped directly. + * + * The difference between this and the `ANIMATION_COMPLETE` event is that this one has a + * dynamic event name that contains the name of the animation within it. For example, + * if you had an animation called `explode` you could listen for the completion of that + * specific animation by using: `sprite.on('animationcomplete-explode', listener)`. Or, if you + * wish to use types: `sprite.on(Phaser.Animations.Events.ANIMATION_COMPLETE_KEY + 'explode', listener)`. + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_COMPLETE_KEY: string; + + /** + * The Animation Repeat Event. + * + * This event is dispatched by a Sprite when an animation repeats playing on it. + * This happens if the animation was created, or played, with a `repeat` value specified. + * + * An animation will repeat when it reaches the end of its sequence. + * + * Listen for it on the Sprite using `sprite.on('animationrepeat', listener)` + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_REPEAT: string; + + /** + * The Animation Restart Event. + * + * This event is dispatched by a Sprite when an animation restarts playing on it. + * This only happens when the `Sprite.anims.restart` method is called. + * + * Listen for it on the Sprite using `sprite.on('animationrestart', listener)` + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_RESTART: string; + + /** + * The Animation Start Event. + * + * This event is dispatched by a Sprite when an animation starts playing on it. + * This happens when the animation is played, factoring in any delay that may have been specified. + * This event happens after the delay has expired and prior to the first update event. + * + * Listen for it on the Sprite using `sprite.on('animationstart', listener)` + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_START: string; + + /** + * The Animation Stop Event. + * + * This event is dispatched by a Sprite when an animation is stopped on it. An animation + * will only be stopeed if a method such as `Sprite.stop` or `Sprite.anims.stopAfterDelay` + * is called. It can also be emitted if a new animation is started before the current one completes. + * + * Listen for it on the Sprite using `sprite.on('animationstop', listener)` + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_STOP: string; + + /** + * The Animation Update Event. + * + * This event is dispatched by a Sprite when an animation playing on it updates. This happens when the animation changes frame. + * An animation will change frame based on the frame rate and other factors like `timeScale` and `delay`. It can also change + * frame when stopped or restarted. + * + * Listen for it on the Sprite using `sprite.on('animationupdate', listener)` + * + * If an animation is playing faster than the game frame-rate can handle, it's entirely possible for it to emit several + * update events in a single game frame, so please be aware of this in your code. The **final** event received that frame + * is the one that is rendered to the game. + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_UPDATE: string; + + /** + * The Pause All Animations Event. + * + * This event is dispatched when the global Animation Manager is told to pause. + * + * When this happens all current animations will stop updating, although it doesn't necessarily mean + * that the game has paused as well. + */ + const PAUSE_ALL: string; + + /** + * The Remove Animation Event. + * + * This event is dispatched when an animation is removed from the global Animation Manager. + */ + const REMOVE_ANIMATION: string; + + /** + * The Resume All Animations Event. + * + * This event is dispatched when the global Animation Manager resumes, having been previously paused. + * + * When this happens all current animations will continue updating again. + */ + const RESUME_ALL: string; + + } + + } + + namespace Cache { + /** + * The BaseCache is a base Cache class that can be used for storing references to any kind of data. + * + * Data can be added, retrieved and removed based on the given keys. + * + * Keys are string-based. + */ + class BaseCache { + /** + * The Map in which the cache objects are stored. + * + * You can query the Map directly or use the BaseCache methods. + */ + entries: Phaser.Structs.Map; + + /** + * An instance of EventEmitter used by the cache to emit related events. + */ + events: Phaser.Events.EventEmitter; + + /** + * Adds an item to this cache. The item is referenced by a unique string, which you are responsible + * for setting and keeping track of. The item can only be retrieved by using this string. + * @param key The unique key by which the data added to the cache will be referenced. + * @param data The data to be stored in the cache. + */ + add(key: string, data: any): this; + + /** + * Checks if this cache contains an item matching the given key. + * This performs the same action as `BaseCache.exists`. + * @param key The unique key of the item to be checked in this cache. + */ + has(key: string): boolean; + + /** + * Checks if this cache contains an item matching the given key. + * This performs the same action as `BaseCache.has` and is called directly by the Loader. + * @param key The unique key of the item to be checked in this cache. + */ + exists(key: string): boolean; + + /** + * Gets an item from this cache based on the given key. + * @param key The unique key of the item to be retrieved from this cache. + */ + get(key: string): any; + + /** + * Removes and item from this cache based on the given key. + * + * If an entry matching the key is found it is removed from the cache and a `remove` event emitted. + * No additional checks are done on the item removed. If other systems or parts of your game code + * are relying on this item, it is up to you to sever those relationships prior to removing the item. + * @param key The unique key of the item to remove from the cache. + */ + remove(key: string): this; + + /** + * Returns all keys in use in this cache. + */ + getKeys(): string[]; + + /** + * Destroys this cache and all items within it. + */ + destroy(): void; + + } + + /** + * The Cache Manager is the global cache owned and maintained by the Game instance. + * + * Various systems, such as the file Loader, rely on this cache in order to store the files + * it has loaded. The manager itself doesn't store any files, but instead owns multiple BaseCache + * instances, one per type of file. You can also add your own custom caches. + */ + class CacheManager { + /** + * + * @param game A reference to the Phaser.Game instance that owns this CacheManager. + */ + constructor(game: Phaser.Game); + + /** + * A reference to the Phaser.Game instance that owns this CacheManager. + */ + protected game: Phaser.Game; + + /** + * A Cache storing all binary files, typically added via the Loader. + */ + binary: Phaser.Cache.BaseCache; + + /** + * A Cache storing all bitmap font data files, typically added via the Loader. + * Only the font data is stored in this cache, the textures are part of the Texture Manager. + */ + bitmapFont: Phaser.Cache.BaseCache; + + /** + * A Cache storing all JSON data files, typically added via the Loader. + */ + json: Phaser.Cache.BaseCache; + + /** + * A Cache storing all physics data files, typically added via the Loader. + */ + physics: Phaser.Cache.BaseCache; + + /** + * A Cache storing all shader source files, typically added via the Loader. + */ + shader: Phaser.Cache.BaseCache; + + /** + * A Cache storing all non-streaming audio files, typically added via the Loader. + */ + audio: Phaser.Cache.BaseCache; + + /** + * A Cache storing all non-streaming video files, typically added via the Loader. + */ + video: Phaser.Cache.BaseCache; + + /** + * A Cache storing all text files, typically added via the Loader. + */ + text: Phaser.Cache.BaseCache; + + /** + * A Cache storing all html files, typically added via the Loader. + */ + html: Phaser.Cache.BaseCache; + + /** + * A Cache storing all WaveFront OBJ files, typically added via the Loader. + */ + obj: Phaser.Cache.BaseCache; + + /** + * A Cache storing all tilemap data files, typically added via the Loader. + * Only the data is stored in this cache, the textures are part of the Texture Manager. + */ + tilemap: Phaser.Cache.BaseCache; + + /** + * A Cache storing all xml data files, typically added via the Loader. + */ + xml: Phaser.Cache.BaseCache; + + /** + * An object that contains your own custom BaseCache entries. + * Add to this via the `addCustom` method. + */ + custom: {[key: string]: Phaser.Cache.BaseCache}; + + /** + * Add your own custom Cache for storing your own files. + * The cache will be available under `Cache.custom.key`. + * The cache will only be created if the key is not already in use. + * @param key The unique key of your custom cache. + */ + addCustom(key: string): Phaser.Cache.BaseCache; + + /** + * Removes all entries from all BaseCaches and destroys all custom caches. + */ + destroy(): void; + + } + + namespace Events { + /** + * The Cache Add Event. + * + * This event is dispatched by any Cache that extends the BaseCache each time a new object is added to it. + */ + const ADD: string; + + /** + * The Cache Remove Event. + * + * This event is dispatched by any Cache that extends the BaseCache each time an object is removed from it. + */ + const REMOVE: string; + + } + + } + + namespace Cameras { + namespace Scene2D { + /** + * A Base Camera class. + * + * The Camera is the way in which all games are rendered in Phaser. They provide a view into your game world, + * and can be positioned, rotated, zoomed and scrolled accordingly. + * + * A Camera consists of two elements: The viewport and the scroll values. + * + * The viewport is the physical position and size of the Camera within your game. Cameras, by default, are + * created the same size as your game, but their position and size can be set to anything. This means if you + * wanted to create a camera that was 320x200 in size, positioned in the bottom-right corner of your game, + * you'd adjust the viewport to do that (using methods like `setViewport` and `setSize`). + * + * If you wish to change where the Camera is looking in your game, then you scroll it. You can do this + * via the properties `scrollX` and `scrollY` or the method `setScroll`. Scrolling has no impact on the + * viewport, and changing the viewport has no impact on the scrolling. + * + * By default a Camera will render all Game Objects it can see. You can change this using the `ignore` method, + * allowing you to filter Game Objects out on a per-Camera basis. + * + * The Base Camera is extended by the Camera class, which adds in special effects including Fade, + * Flash and Camera Shake, as well as the ability to follow Game Objects. + * + * The Base Camera was introduced in Phaser 3.12. It was split off from the Camera class, to allow + * you to isolate special effects as needed. Therefore the 'since' values for properties of this class relate + * to when they were added to the Camera class. + */ + class BaseCamera extends Phaser.Events.EventEmitter implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.Visible { + /** + * + * @param x The x position of the Camera, relative to the top-left of the game canvas. + * @param y The y position of the Camera, relative to the top-left of the game canvas. + * @param width The width of the Camera, in pixels. + * @param height The height of the Camera, in pixels. + */ + constructor(x: number, y: number, width: number, height: number); + + /** + * A reference to the Scene this camera belongs to. + */ + scene: Phaser.Scene; + + /** + * A reference to the Game Scene Manager. + */ + sceneManager: Phaser.Scenes.SceneManager; + + /** + * A reference to the Game Scale Manager. + */ + scaleManager: Phaser.Scale.ScaleManager; + + /** + * A reference to the Scene's Camera Manager to which this Camera belongs. + */ + cameraManager: Phaser.Cameras.Scene2D.CameraManager; + + /** + * The Camera ID. Assigned by the Camera Manager and used to handle camera exclusion. + * This value is a bitmask. + */ + readonly id: number; + + /** + * The name of the Camera. This is left empty for your own use. + */ + name: string; + + /** + * Should this camera round its pixel values to integers? + */ + roundPixels: boolean; + + /** + * Is this Camera visible or not? + * + * A visible camera will render and perform input tests. + * An invisible camera will not render anything and will skip input tests. + */ + visible: boolean; + + /** + * Is this Camera using a bounds to restrict scrolling movement? + * + * Set this property along with the bounds via `Camera.setBounds`. + */ + useBounds: boolean; + + /** + * The World View is a Rectangle that defines the area of the 'world' the Camera is currently looking at. + * This factors in the Camera viewport size, zoom and scroll position and is updated in the Camera preRender step. + * If you have enabled Camera bounds the worldview will be clamped to those bounds accordingly. + * You can use it for culling or intersection checks. + */ + readonly worldView: Phaser.Geom.Rectangle; + + /** + * Is this Camera dirty? + * + * A dirty Camera has had either its viewport size, bounds, scroll, rotation or zoom levels changed since the last frame. + * + * This flag is cleared during the `postRenderCamera` method of the renderer. + */ + dirty: boolean; + + /** + * Does this Camera have a transparent background? + */ + transparent: boolean; + + /** + * The background color of this Camera. Only used if `transparent` is `false`. + */ + backgroundColor: Phaser.Display.Color; + + /** + * The Camera alpha value. Setting this property impacts every single object that this Camera + * renders. You can either set the property directly, i.e. via a Tween, to fade a Camera in or out, + * or via the chainable `setAlpha` method instead. + */ + alpha: number; + + /** + * Should the camera cull Game Objects before checking them for input hit tests? + * In some special cases it may be beneficial to disable this. + */ + disableCull: boolean; + + /** + * The mid-point of the Camera in 'world' coordinates. + * + * Use it to obtain exactly where in the world the center of the camera is currently looking. + * + * This value is updated in the preRender method, after the scroll values and follower + * have been processed. + */ + readonly midPoint: Phaser.Math.Vector2; + + /** + * The horizontal origin of rotation for this Camera. + * + * By default the camera rotates around the center of the viewport. + * + * Changing the origin allows you to adjust the point in the viewport from which rotation happens. + * A value of 0 would rotate from the top-left of the viewport. A value of 1 from the bottom right. + * + * See `setOrigin` to set both origins in a single, chainable call. + */ + originX: number; + + /** + * The vertical origin of rotation for this Camera. + * + * By default the camera rotates around the center of the viewport. + * + * Changing the origin allows you to adjust the point in the viewport from which rotation happens. + * A value of 0 would rotate from the top-left of the viewport. A value of 1 from the bottom right. + * + * See `setOrigin` to set both origins in a single, chainable call. + */ + originY: number; + + /** + * The Mask this Camera is using during render. + * Set the mask using the `setMask` method. Remove the mask using the `clearMask` method. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask | null; + + /** + * This array is populated with all of the Game Objects that this Camera has rendered + * in the previous (or current, depending on when you inspect it) frame. + * + * It is cleared at the start of `Camera.preUpdate`, or if the Camera is destroyed. + * + * You should not modify this array as it is used internally by the input system, + * however you can read it as required. Note that Game Objects may appear in this + * list multiple times if they belong to multiple non-exclusive Containers. + */ + renderList: Phaser.GameObjects.GameObject[]; + + /** + * Is this Camera a Scene Camera? (which is the default), or a Camera + * belonging to a Texture? + */ + isSceneCamera: boolean; + + /** + * Adds the given Game Object to this cameras render list. + * + * This is invoked during the rendering stage. Only objects that are actually rendered + * will appear in the render list. + * @param child The Game Object to add to the render list. + */ + addToRenderList(child: Phaser.GameObjects.GameObject): void; + + /** + * Set the Alpha level of this Camera. The alpha controls the opacity of the Camera as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The Camera alpha value. Default 1. + */ + setAlpha(value?: number): this; + + /** + * Sets the rotation origin of this Camera. + * + * The values are given in the range 0 to 1 and are only used when calculating Camera rotation. + * + * By default the camera rotates around the center of the viewport. + * + * Changing the origin allows you to adjust the point in the viewport from which rotation happens. + * A value of 0 would rotate from the top-left of the viewport. A value of 1 from the bottom right. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Calculates what the Camera.scrollX and scrollY values would need to be in order to move + * the Camera so it is centered on the given x and y coordinates, without actually moving + * the Camera there. The results are clamped based on the Camera bounds, if set. + * @param x The horizontal coordinate to center on. + * @param y The vertical coordinate to center on. + * @param out A Vector2 to store the values in. If not given a new Vector2 is created. + */ + getScroll(x: number, y: number, out?: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Moves the Camera horizontally so that it is centered on the given x coordinate, bounds allowing. + * Calling this does not change the scrollY value. + * @param x The horizontal coordinate to center on. + */ + centerOnX(x: number): this; + + /** + * Moves the Camera vertically so that it is centered on the given y coordinate, bounds allowing. + * Calling this does not change the scrollX value. + * @param y The vertical coordinate to center on. + */ + centerOnY(y: number): this; + + /** + * Moves the Camera so that it is centered on the given coordinates, bounds allowing. + * @param x The horizontal coordinate to center on. + * @param y The vertical coordinate to center on. + */ + centerOn(x: number, y: number): this; + + /** + * Moves the Camera so that it is looking at the center of the Camera Bounds, if enabled. + */ + centerToBounds(): this; + + /** + * Moves the Camera so that it is re-centered based on its viewport size. + */ + centerToSize(): this; + + /** + * Takes an array of Game Objects and returns a new array featuring only those objects + * visible by this camera. + * @param renderableObjects An array of Game Objects to cull. + */ + cull(renderableObjects: G): G; + + /** + * Converts the given `x` and `y` coordinates into World space, based on this Cameras transform. + * You can optionally provide a Vector2, or similar object, to store the results in. + * @param x The x position to convert to world space. + * @param y The y position to convert to world space. + * @param output An optional object to store the results in. If not provided a new Vector2 will be created. + */ + getWorldPoint(x: number, y: number, output?: O): O; + + /** + * Given a Game Object, or an array of Game Objects, it will update all of their camera filter settings + * so that they are ignored by this Camera. This means they will not be rendered by this Camera. + * @param entries The Game Object, or array of Game Objects, to be ignored by this Camera. + */ + ignore(entries: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[] | Phaser.GameObjects.Group | Phaser.GameObjects.Layer | Phaser.GameObjects.Layer[]): this; + + /** + * Internal preRender step. + */ + protected preRender(): void; + + /** + * Takes an x value and checks it's within the range of the Camera bounds, adjusting if required. + * Do not call this method if you are not using camera bounds. + * @param x The value to horizontally scroll clamp. + */ + clampX(x: number): number; + + /** + * Takes a y value and checks it's within the range of the Camera bounds, adjusting if required. + * Do not call this method if you are not using camera bounds. + * @param y The value to vertically scroll clamp. + */ + clampY(y: number): number; + + /** + * If this Camera has previously had movement bounds set on it, this will remove them. + */ + removeBounds(): this; + + /** + * Set the rotation of this Camera. This causes everything it renders to appear rotated. + * + * Rotating a camera does not rotate the viewport itself, it is applied during rendering. + * @param value The cameras angle of rotation, given in degrees. Default 0. + */ + setAngle(value?: number): this; + + /** + * Sets the background color for this Camera. + * + * By default a Camera has a transparent background but it can be given a solid color, with any level + * of transparency, via this method. + * + * The color value can be specified using CSS color notation, hex or numbers. + * @param color The color value. In CSS, hex or numeric color notation. Default 'rgba(0,0,0,0)'. + */ + setBackgroundColor(color?: string | number | Phaser.Types.Display.InputColorObject): this; + + /** + * Set the bounds of the Camera. The bounds are an axis-aligned rectangle. + * + * The Camera bounds controls where the Camera can scroll to, stopping it from scrolling off the + * edges and into blank space. It does not limit the placement of Game Objects, or where + * the Camera viewport can be positioned. + * + * Temporarily disable the bounds by changing the boolean `Camera.useBounds`. + * + * Clear the bounds entirely by calling `Camera.removeBounds`. + * + * If you set bounds that are smaller than the viewport it will stop the Camera from being + * able to scroll. The bounds can be positioned where-ever you wish. By default they are from + * 0x0 to the canvas width x height. This means that the coordinate 0x0 is the top left of + * the Camera bounds. However, you can position them anywhere. So if you wanted a game world + * that was 2048x2048 in size, with 0x0 being the center of it, you can set the bounds x/y + * to be -1024, -1024, with a width and height of 2048. Depending on your game you may find + * it easier for 0x0 to be the top-left of the bounds, or you may wish 0x0 to be the middle. + * @param x The top-left x coordinate of the bounds. + * @param y The top-left y coordinate of the bounds. + * @param width The width of the bounds, in pixels. + * @param height The height of the bounds, in pixels. + * @param centerOn If `true` the Camera will automatically be centered on the new bounds. Default false. + */ + setBounds(x: number, y: number, width: number, height: number, centerOn?: boolean): this; + + /** + * Returns a rectangle containing the bounds of the Camera. + * + * If the Camera does not have any bounds the rectangle will be empty. + * + * The rectangle is a copy of the bounds, so is safe to modify. + * @param out An optional Rectangle to store the bounds in. If not given, a new Rectangle will be created. + */ + getBounds(out?: Phaser.Geom.Rectangle): Phaser.Geom.Rectangle; + + /** + * Sets the name of this Camera. + * This value is for your own use and isn't used internally. + * @param value The name of the Camera. Default ''. + */ + setName(value?: string): this; + + /** + * Set the position of the Camera viewport within the game. + * + * This does not change where the camera is 'looking'. See `setScroll` to control that. + * @param x The top-left x coordinate of the Camera viewport. + * @param y The top-left y coordinate of the Camera viewport. Default x. + */ + setPosition(x: number, y?: number): this; + + /** + * Set the rotation of this Camera. This causes everything it renders to appear rotated. + * + * Rotating a camera does not rotate the viewport itself, it is applied during rendering. + * @param value The rotation of the Camera, in radians. Default 0. + */ + setRotation(value?: number): this; + + /** + * Should the Camera round pixel values to whole integers when rendering Game Objects? + * + * In some types of game, especially with pixel art, this is required to prevent sub-pixel aliasing. + * @param value `true` to round Camera pixels, `false` to not. + */ + setRoundPixels(value: boolean): this; + + /** + * Sets the Scene the Camera is bound to. + * @param scene The Scene the camera is bound to. + * @param isSceneCamera Is this Camera being used for a Scene (true) or a Texture? (false) Default true. + */ + setScene(scene: Phaser.Scene, isSceneCamera?: boolean): this; + + /** + * Set the position of where the Camera is looking within the game. + * You can also modify the properties `Camera.scrollX` and `Camera.scrollY` directly. + * Use this method, or the scroll properties, to move your camera around the game world. + * + * This does not change where the camera viewport is placed. See `setPosition` to control that. + * @param x The x coordinate of the Camera in the game world. + * @param y The y coordinate of the Camera in the game world. Default x. + */ + setScroll(x: number, y?: number): this; + + /** + * Set the size of the Camera viewport. + * + * By default a Camera is the same size as the game, but can be made smaller via this method, + * allowing you to create mini-cam style effects by creating and positioning a smaller Camera + * viewport within your game. + * @param width The width of the Camera viewport. + * @param height The height of the Camera viewport. Default width. + */ + setSize(width: number, height?: number): this; + + /** + * This method sets the position and size of the Camera viewport in a single call. + * + * If you're trying to change where the Camera is looking at in your game, then see + * the method `Camera.setScroll` instead. This method is for changing the viewport + * itself, not what the camera can see. + * + * By default a Camera is the same size as the game, but can be made smaller via this method, + * allowing you to create mini-cam style effects by creating and positioning a smaller Camera + * viewport within your game. + * @param x The top-left x coordinate of the Camera viewport. + * @param y The top-left y coordinate of the Camera viewport. + * @param width The width of the Camera viewport. + * @param height The height of the Camera viewport. Default width. + */ + setViewport(x: number, y: number, width: number, height?: number): this; + + /** + * Set the zoom value of the Camera. + * + * Changing to a smaller value, such as 0.5, will cause the camera to 'zoom out'. + * Changing to a larger value, such as 2, will cause the camera to 'zoom in'. + * + * A value of 1 means 'no zoom' and is the default. + * + * Changing the zoom does not impact the Camera viewport in any way, it is only applied during rendering. + * + * As of Phaser 3.50 you can now set the horizontal and vertical zoom values independently. + * @param x The horizontal zoom value of the Camera. The minimum it can be is 0.001. Default 1. + * @param y The vertical zoom value of the Camera. The minimum it can be is 0.001. Default x. + */ + setZoom(x?: number, y?: number): this; + + /** + * Sets the mask to be applied to this Camera during rendering. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * + * Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Camera it will be immediately replaced. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Camera will use when rendering. + * @param fixedPosition Should the mask translate along with the Camera, or be fixed in place and not impacted by the Cameras transform? Default true. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask, fixedPosition?: boolean): this; + + /** + * Clears the mask that this Camera was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Sets the visibility of this Camera. + * + * An invisible Camera will skip rendering and input tests of everything it can see. + * @param value The visible state of the Camera. + */ + setVisible(value: boolean): this; + + /** + * Returns an Object suitable for JSON storage containing all of the Camera viewport and rendering properties. + */ + toJSON(): Phaser.Types.Cameras.Scene2D.JSONCamera; + + /** + * Internal method called automatically by the Camera Manager. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected update(time: number, delta: number): void; + + /** + * Set if this Camera is being used as a Scene Camera, or a Texture + * Camera. + * @param value Is this being used as a Scene Camera, or a Texture camera? + */ + setIsSceneCamera(value: boolean): void; + + /** + * Destroys this Camera instance and its internal properties and references. + * Once destroyed you cannot use this Camera again, even if re-added to a Camera Manager. + * + * This method is called automatically by `CameraManager.remove` if that methods `runDestroy` argument is `true`, which is the default. + * + * Unless you have a specific reason otherwise, always use `CameraManager.remove` and allow it to handle the camera destruction, + * rather than calling this method directly. + */ + destroy(): void; + + /** + * The x position of the Camera viewport, relative to the top-left of the game canvas. + * The viewport is the area into which the camera renders. + * To adjust the position the camera is looking at in the game world, see the `scrollX` value. + */ + x: number; + + /** + * The y position of the Camera viewport, relative to the top-left of the game canvas. + * The viewport is the area into which the camera renders. + * To adjust the position the camera is looking at in the game world, see the `scrollY` value. + */ + y: number; + + /** + * The width of the Camera viewport, in pixels. + * + * The viewport is the area into which the Camera renders. Setting the viewport does + * not restrict where the Camera can scroll to. + */ + width: number; + + /** + * The height of the Camera viewport, in pixels. + * + * The viewport is the area into which the Camera renders. Setting the viewport does + * not restrict where the Camera can scroll to. + */ + height: number; + + /** + * The horizontal scroll position of this Camera. + * + * Change this value to cause the Camera to scroll around your Scene. + * + * Alternatively, setting the Camera to follow a Game Object, via the `startFollow` method, + * will automatically adjust the Camera scroll values accordingly. + * + * You can set the bounds within which the Camera can scroll via the `setBounds` method. + */ + scrollX: number; + + /** + * The vertical scroll position of this Camera. + * + * Change this value to cause the Camera to scroll around your Scene. + * + * Alternatively, setting the Camera to follow a Game Object, via the `startFollow` method, + * will automatically adjust the Camera scroll values accordingly. + * + * You can set the bounds within which the Camera can scroll via the `setBounds` method. + */ + scrollY: number; + + /** + * The Camera zoom value. Change this value to zoom in, or out of, a Scene. + * + * A value of 0.5 would zoom the Camera out, so you can now see twice as much + * of the Scene as before. A value of 2 would zoom the Camera in, so every pixel + * now takes up 2 pixels when rendered. + * + * Set to 1 to return to the default zoom level. + * + * Be careful to never set this value to zero. + */ + zoom: number; + + /** + * The Camera horizontal zoom value. Change this value to zoom in, or out of, a Scene. + * + * A value of 0.5 would zoom the Camera out, so you can now see twice as much + * of the Scene as before. A value of 2 would zoom the Camera in, so every pixel + * now takes up 2 pixels when rendered. + * + * Set to 1 to return to the default zoom level. + * + * Be careful to never set this value to zero. + */ + zoomX: number; + + /** + * The Camera vertical zoom value. Change this value to zoom in, or out of, a Scene. + * + * A value of 0.5 would zoom the Camera out, so you can now see twice as much + * of the Scene as before. A value of 2 would zoom the Camera in, so every pixel + * now takes up 2 pixels when rendered. + * + * Set to 1 to return to the default zoom level. + * + * Be careful to never set this value to zero. + */ + zoomY: number; + + /** + * The horizontal position of the center of the Camera's viewport, relative to the left of the game canvas. + */ + readonly centerX: number; + + /** + * The vertical position of the center of the Camera's viewport, relative to the top of the game canvas. + */ + readonly centerY: number; + + /** + * The displayed width of the camera viewport, factoring in the camera zoom level. + * + * If a camera has a viewport width of 800 and a zoom of 0.5 then its display width + * would be 1600, as it's displaying twice as many pixels as zoom level 1. + * + * Equally, a camera with a width of 800 and zoom of 2 would have a display width + * of 400 pixels. + */ + readonly displayWidth: number; + + /** + * The displayed height of the camera viewport, factoring in the camera zoom level. + * + * If a camera has a viewport height of 600 and a zoom of 0.5 then its display height + * would be 1200, as it's displaying twice as many pixels as zoom level 1. + * + * Equally, a camera with a height of 600 and zoom of 2 would have a display height + * of 300 pixels. + */ + readonly displayHeight: number; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + } + + /** + * A Camera. + * + * The Camera is the way in which all games are rendered in Phaser. They provide a view into your game world, + * and can be positioned, rotated, zoomed and scrolled accordingly. + * + * A Camera consists of two elements: The viewport and the scroll values. + * + * The viewport is the physical position and size of the Camera within your game. Cameras, by default, are + * created the same size as your game, but their position and size can be set to anything. This means if you + * wanted to create a camera that was 320x200 in size, positioned in the bottom-right corner of your game, + * you'd adjust the viewport to do that (using methods like `setViewport` and `setSize`). + * + * If you wish to change where the Camera is looking in your game, then you scroll it. You can do this + * via the properties `scrollX` and `scrollY` or the method `setScroll`. Scrolling has no impact on the + * viewport, and changing the viewport has no impact on the scrolling. + * + * By default a Camera will render all Game Objects it can see. You can change this using the `ignore` method, + * allowing you to filter Game Objects out on a per-Camera basis. + * + * A Camera also has built-in special effects including Fade, Flash and Camera Shake. + */ + class Camera extends Phaser.Cameras.Scene2D.BaseCamera implements Phaser.GameObjects.Components.PostPipeline { + /** + * + * @param x The x position of the Camera, relative to the top-left of the game canvas. + * @param y The y position of the Camera, relative to the top-left of the game canvas. + * @param width The width of the Camera, in pixels. + * @param height The height of the Camera, in pixels. + */ + constructor(x: number, y: number, width: number, height: number); + + /** + * Does this Camera allow the Game Objects it renders to receive input events? + */ + inputEnabled: boolean; + + /** + * The Camera Fade effect handler. + * To fade this camera see the `Camera.fade` methods. + */ + fadeEffect: Phaser.Cameras.Scene2D.Effects.Fade; + + /** + * The Camera Flash effect handler. + * To flash this camera see the `Camera.flash` method. + */ + flashEffect: Phaser.Cameras.Scene2D.Effects.Flash; + + /** + * The Camera Shake effect handler. + * To shake this camera see the `Camera.shake` method. + */ + shakeEffect: Phaser.Cameras.Scene2D.Effects.Shake; + + /** + * The Camera Pan effect handler. + * To pan this camera see the `Camera.pan` method. + */ + panEffect: Phaser.Cameras.Scene2D.Effects.Pan; + + /** + * The Camera Rotate To effect handler. + * To rotate this camera see the `Camera.rotateTo` method. + */ + rotateToEffect: Phaser.Cameras.Scene2D.Effects.RotateTo; + + /** + * The Camera Zoom effect handler. + * To zoom this camera see the `Camera.zoom` method. + */ + zoomEffect: Phaser.Cameras.Scene2D.Effects.Zoom; + + /** + * The linear interpolation value to use when following a target. + * + * Can also be set via `setLerp` or as part of the `startFollow` call. + * + * The default values of 1 means the camera will instantly snap to the target coordinates. + * A lower value, such as 0.1 means the camera will more slowly track the target, giving + * a smooth transition. You can set the horizontal and vertical values independently, and also + * adjust this value in real-time during your game. + * + * Be sure to keep the value between 0 and 1. A value of zero will disable tracking on that axis. + */ + lerp: Phaser.Math.Vector2; + + /** + * The values stored in this property are subtracted from the Camera targets position, allowing you to + * offset the camera from the actual target x/y coordinates by this amount. + * Can also be set via `setFollowOffset` or as part of the `startFollow` call. + */ + followOffset: Phaser.Math.Vector2; + + /** + * The Camera dead zone. + * + * The deadzone is only used when the camera is following a target. + * + * It defines a rectangular region within which if the target is present, the camera will not scroll. + * If the target moves outside of this area, the camera will begin scrolling in order to follow it. + * + * The `lerp` values that you can set for a follower target also apply when using a deadzone. + * + * You can directly set this property to be an instance of a Rectangle. Or, you can use the + * `setDeadzone` method for a chainable approach. + * + * The rectangle you provide can have its dimensions adjusted dynamically, however, please + * note that its position is updated every frame, as it is constantly re-centered on the cameras mid point. + * + * Calling `setDeadzone` with no arguments will reset an active deadzone, as will setting this property + * to `null`. + */ + deadzone: Phaser.Geom.Rectangle | null; + + /** + * Sets the Camera dead zone. + * + * The deadzone is only used when the camera is following a target. + * + * It defines a rectangular region within which if the target is present, the camera will not scroll. + * If the target moves outside of this area, the camera will begin scrolling in order to follow it. + * + * The deadzone rectangle is re-positioned every frame so that it is centered on the mid-point + * of the camera. This allows you to use the object for additional game related checks, such as + * testing if an object is within it or not via a Rectangle.contains call. + * + * The `lerp` values that you can set for a follower target also apply when using a deadzone. + * + * Calling this method with no arguments will reset an active deadzone. + * @param width The width of the deadzone rectangle in pixels. If not specified the deadzone is removed. + * @param height The height of the deadzone rectangle in pixels. + */ + setDeadzone(width?: number, height?: number): this; + + /** + * Fades the Camera in from the given color over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param red The amount to fade the red channel towards. A value between 0 and 255. Default 0. + * @param green The amount to fade the green channel towards. A value between 0 and 255. Default 0. + * @param blue The amount to fade the blue channel towards. A value between 0 and 255. Default 0. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + fadeIn(duration?: number, red?: number, green?: number, blue?: number, callback?: Function, context?: any): this; + + /** + * Fades the Camera out to the given color over the duration specified. + * This is an alias for Camera.fade that forces the fade to start, regardless of existing fades. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param red The amount to fade the red channel towards. A value between 0 and 255. Default 0. + * @param green The amount to fade the green channel towards. A value between 0 and 255. Default 0. + * @param blue The amount to fade the blue channel towards. A value between 0 and 255. Default 0. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + fadeOut(duration?: number, red?: number, green?: number, blue?: number, callback?: Function, context?: any): this; + + /** + * Fades the Camera from the given color to transparent over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param red The amount to fade the red channel towards. A value between 0 and 255. Default 0. + * @param green The amount to fade the green channel towards. A value between 0 and 255. Default 0. + * @param blue The amount to fade the blue channel towards. A value between 0 and 255. Default 0. + * @param force Force the effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + fadeFrom(duration?: number, red?: number, green?: number, blue?: number, force?: boolean, callback?: Function, context?: any): this; + + /** + * Fades the Camera from transparent to the given color over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param red The amount to fade the red channel towards. A value between 0 and 255. Default 0. + * @param green The amount to fade the green channel towards. A value between 0 and 255. Default 0. + * @param blue The amount to fade the blue channel towards. A value between 0 and 255. Default 0. + * @param force Force the effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + fade(duration?: number, red?: number, green?: number, blue?: number, force?: boolean, callback?: Function, context?: any): this; + + /** + * Flashes the Camera by setting it to the given color immediately and then fading it away again quickly over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 250. + * @param red The amount to fade the red channel towards. A value between 0 and 255. Default 255. + * @param green The amount to fade the green channel towards. A value between 0 and 255. Default 255. + * @param blue The amount to fade the blue channel towards. A value between 0 and 255. Default 255. + * @param force Force the effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + flash(duration?: number, red?: number, green?: number, blue?: number, force?: boolean, callback?: Function, context?: any): this; + + /** + * Shakes the Camera by the given intensity over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 100. + * @param intensity The intensity of the shake. Default 0.05. + * @param force Force the shake effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + shake(duration?: number, intensity?: number | Phaser.Math.Vector2, force?: boolean, callback?: Function, context?: any): this; + + /** + * This effect will scroll the Camera so that the center of its viewport finishes at the given destination, + * over the duration and with the ease specified. + * @param x The destination x coordinate to scroll the center of the Camera viewport to. + * @param y The destination y coordinate to scroll the center of the Camera viewport to. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param ease The ease to use for the pan. Can be any of the Phaser Easing constants or a custom function. Default 'Linear'. + * @param force Force the pan effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is, + * the current camera scroll x coordinate and the current camera scroll y coordinate. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + pan(x: number, y: number, duration?: number, ease?: string | Function, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraPanCallback, context?: any): this; + + /** + * This effect will rotate the Camera so that the viewport finishes at the given angle in radians, + * over the duration and with the ease specified. + * @param radians The destination angle in radians to rotate the Camera viewport to. If the angle is positive then the rotation is clockwise else anticlockwise + * @param shortestPath If shortest path is set to true the camera will rotate in the quickest direction clockwise or anti-clockwise. Default false. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param ease The ease to use for the rotation. Can be any of the Phaser Easing constants or a custom function. Default 'Linear'. + * @param force Force the rotation effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is, + * the current camera rotation angle in radians. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + rotateTo(radians: number, shortestPath?: boolean, duration?: number, ease?: string | Function, force?: boolean, callback?: CameraRotateCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * This effect will zoom the Camera to the given scale, over the duration and with the ease specified. + * @param zoom The target Camera zoom value. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param ease The ease to use for the pan. Can be any of the Phaser Easing constants or a custom function. Default 'Linear'. + * @param force Force the pan effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is, + * the current camera scroll x coordinate and the current camera scroll y coordinate. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + zoomTo(zoom: number, duration?: number, ease?: string | Function, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraPanCallback, context?: any): this; + + /** + * Internal preRender step. + */ + protected preRender(): void; + + /** + * Sets the linear interpolation value to use when following a target. + * + * The default values of 1 means the camera will instantly snap to the target coordinates. + * A lower value, such as 0.1 means the camera will more slowly track the target, giving + * a smooth transition. You can set the horizontal and vertical values independently, and also + * adjust this value in real-time during your game. + * + * Be sure to keep the value between 0 and 1. A value of zero will disable tracking on that axis. + * @param x The amount added to the horizontal linear interpolation of the follow target. Default 1. + * @param y The amount added to the vertical linear interpolation of the follow target. Default 1. + */ + setLerp(x?: number, y?: number): this; + + /** + * Sets the horizontal and vertical offset of the camera from its follow target. + * The values are subtracted from the targets position during the Cameras update step. + * @param x The horizontal offset from the camera follow target.x position. Default 0. + * @param y The vertical offset from the camera follow target.y position. Default 0. + */ + setFollowOffset(x?: number, y?: number): this; + + /** + * Sets the Camera to follow a Game Object. + * + * When enabled the Camera will automatically adjust its scroll position to keep the target Game Object + * in its center. + * + * You can set the linear interpolation value used in the follow code. + * Use low lerp values (such as 0.1) to automatically smooth the camera motion. + * + * If you find you're getting a slight "jitter" effect when following an object it's probably to do with sub-pixel + * rendering of the targets position. This can be rounded by setting the `roundPixels` argument to `true` to + * force full pixel rounding rendering. Note that this can still be broken if you have specified a non-integer zoom + * value on the camera. So be sure to keep the camera zoom to integers. + * @param target The target for the Camera to follow. + * @param roundPixels Round the camera position to whole integers to avoid sub-pixel rendering? Default false. + * @param lerpX A value between 0 and 1. This value specifies the amount of linear interpolation to use when horizontally tracking the target. The closer the value to 1, the faster the camera will track. Default 1. + * @param lerpY A value between 0 and 1. This value specifies the amount of linear interpolation to use when vertically tracking the target. The closer the value to 1, the faster the camera will track. Default 1. + * @param offsetX The horizontal offset from the camera follow target.x position. Default 0. + * @param offsetY The vertical offset from the camera follow target.y position. Default 0. + */ + startFollow(target: Phaser.GameObjects.GameObject | object, roundPixels?: boolean, lerpX?: number, lerpY?: number, offsetX?: number, offsetY?: number): this; + + /** + * Stops a Camera from following a Game Object, if previously set via `Camera.startFollow`. + */ + stopFollow(): this; + + /** + * Resets any active FX, such as a fade, flash or shake. Useful to call after a fade in order to + * remove the fade. + */ + resetFX(): this; + + /** + * Internal method called automatically by the Camera Manager. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected update(time: number, delta: number): void; + + /** + * Destroys this Camera instance. You rarely need to call this directly. + * + * Called by the Camera Manager. If you wish to destroy a Camera please use `CameraManager.remove` as + * cameras are stored in a pool, ready for recycling later, and calling this directly will prevent that. + */ + destroy(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + } + + /** + * The Camera Manager is a plugin that belongs to a Scene and is responsible for managing all of the Scene Cameras. + * + * By default you can access the Camera Manager from within a Scene using `this.cameras`, although this can be changed + * in your game config. + * + * Create new Cameras using the `add` method. Or extend the Camera class with your own addition code and then add + * the new Camera in using the `addExisting` method. + * + * Cameras provide a view into your game world, and can be positioned, rotated, zoomed and scrolled accordingly. + * + * A Camera consists of two elements: The viewport and the scroll values. + * + * The viewport is the physical position and size of the Camera within your game. Cameras, by default, are + * created the same size as your game, but their position and size can be set to anything. This means if you + * wanted to create a camera that was 320x200 in size, positioned in the bottom-right corner of your game, + * you'd adjust the viewport to do that (using methods like `setViewport` and `setSize`). + * + * If you wish to change where the Camera is looking in your game, then you scroll it. You can do this + * via the properties `scrollX` and `scrollY` or the method `setScroll`. Scrolling has no impact on the + * viewport, and changing the viewport has no impact on the scrolling. + * + * By default a Camera will render all Game Objects it can see. You can change this using the `ignore` method, + * allowing you to filter Game Objects out on a per-Camera basis. The Camera Manager can manage up to 31 unique + * 'Game Object ignore capable' Cameras. Any Cameras beyond 31 that you create will all be given a Camera ID of + * zero, meaning that they cannot be used for Game Object exclusion. This means if you need your Camera to ignore + * Game Objects, make sure it's one of the first 31 created. + * + * A Camera also has built-in special effects including Fade, Flash, Camera Shake, Pan and Zoom. + */ + class CameraManager { + /** + * + * @param scene The Scene that owns the Camera Manager plugin. + */ + constructor(scene: Phaser.Scene); + + /** + * The Scene that owns the Camera Manager plugin. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene.Systems handler for the Scene that owns the Camera Manager. + */ + systems: Phaser.Scenes.Systems; + + /** + * All Cameras created by, or added to, this Camera Manager, will have their `roundPixels` + * property set to match this value. By default it is set to match the value set in the + * game configuration, but can be changed at any point. Equally, individual cameras can + * also be changed as needed. + */ + roundPixels: boolean; + + /** + * An Array of the Camera objects being managed by this Camera Manager. + * The Cameras are updated and rendered in the same order in which they appear in this array. + * Do not directly add or remove entries to this array. However, you can move the contents + * around the array should you wish to adjust the display order. + */ + cameras: Phaser.Cameras.Scene2D.Camera[]; + + /** + * A handy reference to the 'main' camera. By default this is the first Camera the + * Camera Manager creates. You can also set it directly, or use the `makeMain` argument + * in the `add` and `addExisting` methods. It allows you to access it from your game: + * + * ```javascript + * var cam = this.cameras.main; + * ``` + * + * Also see the properties `camera1`, `camera2` and so on. + */ + main: Phaser.Cameras.Scene2D.Camera; + + /** + * A default un-transformed Camera that doesn't exist on the camera list and doesn't + * count towards the total number of cameras being managed. It exists for other + * systems, as well as your own code, should they require a basic un-transformed + * camera instance from which to calculate a view matrix. + */ + default: Phaser.Cameras.Scene2D.Camera; + + /** + * Adds a new Camera into the Camera Manager. The Camera Manager can support up to 31 different Cameras. + * + * Each Camera has its own viewport, which controls the size of the Camera and its position within the canvas. + * + * Use the `Camera.scrollX` and `Camera.scrollY` properties to change where the Camera is looking, or the + * Camera methods such as `centerOn`. Cameras also have built in special effects, such as fade, flash, shake, + * pan and zoom. + * + * By default Cameras are transparent and will render anything that they can see based on their `scrollX` + * and `scrollY` values. Game Objects can be set to be ignored by a Camera by using the `Camera.ignore` method. + * + * The Camera will have its `roundPixels` property set to whatever `CameraManager.roundPixels` is. You can change + * it after creation if required. + * + * See the Camera class documentation for more details. + * @param x The horizontal position of the Camera viewport. Default 0. + * @param y The vertical position of the Camera viewport. Default 0. + * @param width The width of the Camera viewport. If not given it'll be the game config size. + * @param height The height of the Camera viewport. If not given it'll be the game config size. + * @param makeMain Set this Camera as being the 'main' camera. This just makes the property `main` a reference to it. Default false. + * @param name The name of the Camera. Default ''. + */ + add(x?: number, y?: number, width?: number, height?: number, makeMain?: boolean, name?: string): Phaser.Cameras.Scene2D.Camera; + + /** + * Adds an existing Camera into the Camera Manager. + * + * The Camera should either be a `Phaser.Cameras.Scene2D.Camera` instance, or a class that extends from it. + * + * The Camera will have its `roundPixels` property set to whatever `CameraManager.roundPixels` is. You can change + * it after addition if required. + * + * The Camera will be assigned an ID, which is used for Game Object exclusion and then added to the + * manager. As long as it doesn't already exist in the manager it will be added then returned. + * + * If this method returns `null` then the Camera already exists in this Camera Manager. + * @param camera The Camera to be added to the Camera Manager. + * @param makeMain Set this Camera as being the 'main' camera. This just makes the property `main` a reference to it. Default false. + */ + addExisting(camera: Phaser.Cameras.Scene2D.Camera, makeMain?: boolean): Phaser.Cameras.Scene2D.Camera | null; + + /** + * Gets the total number of Cameras in this Camera Manager. + * + * If the optional `isVisible` argument is set it will only count Cameras that are currently visible. + * @param isVisible Set the `true` to only include visible Cameras in the total. Default false. + */ + getTotal(isVisible?: boolean): number; + + /** + * Populates this Camera Manager based on the given configuration object, or an array of config objects. + * + * See the `Phaser.Types.Cameras.Scene2D.CameraConfig` documentation for details of the object structure. + * @param config A Camera configuration object, or an array of them, to be added to this Camera Manager. + */ + fromJSON(config: Phaser.Types.Cameras.Scene2D.CameraConfig | Phaser.Types.Cameras.Scene2D.CameraConfig[]): this; + + /** + * Gets a Camera based on its name. + * + * Camera names are optional and don't have to be set, so this method is only of any use if you + * have given your Cameras unique names. + * @param name The name of the Camera. + */ + getCamera(name: string): Phaser.Cameras.Scene2D.Camera | null; + + /** + * Returns an array of all cameras below the given Pointer. + * + * The first camera in the array is the top-most camera in the camera list. + * @param pointer The Pointer to check against. + */ + getCamerasBelowPointer(pointer: Phaser.Input.Pointer): Phaser.Cameras.Scene2D.Camera[]; + + /** + * Removes the given Camera, or an array of Cameras, from this Camera Manager. + * + * If found in the Camera Manager it will be immediately removed from the local cameras array. + * If also currently the 'main' camera, 'main' will be reset to be camera 0. + * + * The removed Cameras are automatically destroyed if the `runDestroy` argument is `true`, which is the default. + * If you wish to re-use the cameras then set this to `false`, but know that they will retain their references + * and internal data until destroyed or re-added to a Camera Manager. + * @param camera The Camera, or an array of Cameras, to be removed from this Camera Manager. + * @param runDestroy Automatically call `Camera.destroy` on each Camera removed from this Camera Manager. Default true. + */ + remove(camera: Phaser.Cameras.Scene2D.Camera | Phaser.Cameras.Scene2D.Camera[], runDestroy?: boolean): number; + + /** + * The internal render method. This is called automatically by the Scene and should not be invoked directly. + * + * It will iterate through all local cameras and render them in turn, as long as they're visible and have + * an alpha level > 0. + * @param renderer The Renderer that will render the children to this camera. + * @param displayList The Display List for the Scene. + */ + protected render(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer, displayList: Phaser.GameObjects.DisplayList): void; + + /** + * Takes an array of Game Objects and a Camera and returns a new array + * containing only those Game Objects that pass the `willRender` test + * against the given Camera. + * @param children An array of Game Objects to be checked against the camera. + * @param camera The camera to filter the Game Objects against. + */ + getVisibleChildren(children: Phaser.GameObjects.GameObject[], camera: Phaser.Cameras.Scene2D.Camera): Phaser.GameObjects.GameObject[]; + + /** + * Resets this Camera Manager. + * + * This will iterate through all current Cameras, destroying them all, then it will reset the + * cameras array, reset the ID counter and create 1 new single camera using the default values. + */ + resetAll(): Phaser.Cameras.Scene2D.Camera; + + /** + * The main update loop. Called automatically when the Scene steps. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected update(time: number, delta: number): void; + + /** + * The event handler that manages the `resize` event dispatched by the Scale Manager. + * @param gameSize The default Game Size object. This is the un-modified game dimensions. + * @param baseSize The base Size object. The game dimensions. The canvas width / height values match this. + */ + onResize(gameSize: Phaser.Structs.Size, baseSize: Phaser.Structs.Size): void; + + /** + * Resizes all cameras to the given dimensions. + * @param width The new width of the camera. + * @param height The new height of the camera. + */ + resize(width: number, height: number): void; + + } + + namespace Effects { + /** + * A Camera Fade effect. + * + * This effect will fade the camera viewport to the given color, over the duration specified. + * + * Only the camera viewport is faded. None of the objects it is displaying are impacted, i.e. their colors do + * not change. + * + * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback, + * which is invoked each frame for the duration of the effect, if required. + */ + class Fade { + /** + * + * @param camera The camera this effect is acting upon. + */ + constructor(camera: Phaser.Cameras.Scene2D.Camera); + + /** + * The Camera this effect belongs to. + */ + readonly camera: Phaser.Cameras.Scene2D.Camera; + + /** + * Is this effect actively running? + */ + readonly isRunning: boolean; + + /** + * Has this effect finished running? + * + * This is different from `isRunning` because it remains set to `true` when the effect is over, + * until the effect is either reset or started again. + */ + readonly isComplete: boolean; + + /** + * The direction of the fade. + * `true` = fade out (transparent to color), `false` = fade in (color to transparent) + */ + readonly direction: boolean; + + /** + * The duration of the effect, in milliseconds. + */ + readonly duration: number; + + /** + * If this effect is running this holds the current percentage of the progress, a value between 0 and 1. + */ + progress: number; + + /** + * Fades the Camera to or from the given color over the duration specified. + * @param direction The direction of the fade. `true` = fade out (transparent to color), `false` = fade in (color to transparent) Default true. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param red The amount to fade the red channel towards. A value between 0 and 255. Default 0. + * @param green The amount to fade the green channel towards. A value between 0 and 255. Default 0. + * @param blue The amount to fade the blue channel towards. A value between 0 and 255. Default 0. + * @param force Force the effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + start(direction?: boolean, duration?: number, red?: number, green?: number, blue?: number, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraFadeCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * The main update loop for this effect. Called automatically by the Camera. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Called internally by the Canvas Renderer. + * @param ctx The Canvas context to render to. + */ + postRenderCanvas(ctx: CanvasRenderingContext2D): boolean; + + /** + * Called internally by the WebGL Renderer. + * @param pipeline The WebGL Pipeline to render to. Must provide the `drawFillRect` method. + * @param getTintFunction A function that will return the gl safe tint colors. + */ + postRenderWebGL(pipeline: Phaser.Renderer.WebGL.Pipelines.MultiPipeline, getTintFunction: Function): boolean; + + /** + * Called internally when the effect completes. + */ + effectComplete(): void; + + /** + * Resets this camera effect. + * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event. + */ + reset(): void; + + /** + * Destroys this effect, releasing it from the Camera. + */ + destroy(): void; + + } + + /** + * A Camera Flash effect. + * + * This effect will flash the camera viewport to the given color, over the duration specified. + * + * Only the camera viewport is flashed. None of the objects it is displaying are impacted, i.e. their colors do + * not change. + * + * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback, + * which is invoked each frame for the duration of the effect, if required. + */ + class Flash { + /** + * + * @param camera The camera this effect is acting upon. + */ + constructor(camera: Phaser.Cameras.Scene2D.Camera); + + /** + * The Camera this effect belongs to. + */ + readonly camera: Phaser.Cameras.Scene2D.Camera; + + /** + * Is this effect actively running? + */ + readonly isRunning: boolean; + + /** + * The duration of the effect, in milliseconds. + */ + readonly duration: number; + + /** + * The value of the alpha channel used during the flash effect. + * A value between 0 and 1. + */ + alpha: number; + + /** + * If this effect is running this holds the current percentage of the progress, a value between 0 and 1. + */ + progress: number; + + /** + * Flashes the Camera to or from the given color over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 250. + * @param red The amount to flash the red channel towards. A value between 0 and 255. Default 255. + * @param green The amount to flash the green channel towards. A value between 0 and 255. Default 255. + * @param blue The amount to flash the blue channel towards. A value between 0 and 255. Default 255. + * @param force Force the effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + start(duration?: number, red?: number, green?: number, blue?: number, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraFlashCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * The main update loop for this effect. Called automatically by the Camera. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Called internally by the Canvas Renderer. + * @param ctx The Canvas context to render to. + */ + postRenderCanvas(ctx: CanvasRenderingContext2D): boolean; + + /** + * Called internally by the WebGL Renderer. + * @param pipeline The WebGL Pipeline to render to. Must provide the `drawFillRect` method. + * @param getTintFunction A function that will return the gl safe tint colors. + */ + postRenderWebGL(pipeline: Phaser.Renderer.WebGL.Pipelines.MultiPipeline, getTintFunction: Function): boolean; + + /** + * Called internally when the effect completes. + */ + effectComplete(): void; + + /** + * Resets this camera effect. + * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event. + */ + reset(): void; + + /** + * Destroys this effect, releasing it from the Camera. + */ + destroy(): void; + + } + + /** + * A Camera Pan effect. + * + * This effect will scroll the Camera so that the center of its viewport finishes at the given destination, + * over the duration and with the ease specified. + * + * Only the camera scroll is moved. None of the objects it is displaying are impacted, i.e. their positions do + * not change. + * + * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback, + * which is invoked each frame for the duration of the effect if required. + */ + class Pan { + /** + * + * @param camera The camera this effect is acting upon. + */ + constructor(camera: Phaser.Cameras.Scene2D.Camera); + + /** + * The Camera this effect belongs to. + */ + readonly camera: Phaser.Cameras.Scene2D.Camera; + + /** + * Is this effect actively running? + */ + readonly isRunning: boolean; + + /** + * The duration of the effect, in milliseconds. + */ + readonly duration: number; + + /** + * The starting scroll coordinates to pan the camera from. + */ + source: Phaser.Math.Vector2; + + /** + * The constantly updated value based on zoom. + */ + current: Phaser.Math.Vector2; + + /** + * The destination scroll coordinates to pan the camera to. + */ + destination: Phaser.Math.Vector2; + + /** + * The ease function to use during the pan. + */ + ease: Function; + + /** + * If this effect is running this holds the current percentage of the progress, a value between 0 and 1. + */ + progress: number; + + /** + * This effect will scroll the Camera so that the center of its viewport finishes at the given destination, + * over the duration and with the ease specified. + * @param x The destination x coordinate to scroll the center of the Camera viewport to. + * @param y The destination y coordinate to scroll the center of the Camera viewport to. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param ease The ease to use for the pan. Can be any of the Phaser Easing constants or a custom function. Default 'Linear'. + * @param force Force the pan effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is, + * the current camera scroll x coordinate and the current camera scroll y coordinate. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + start(x: number, y: number, duration?: number, ease?: string | Function, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraPanCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * The main update loop for this effect. Called automatically by the Camera. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Called internally when the effect completes. + */ + effectComplete(): void; + + /** + * Resets this camera effect. + * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event. + */ + reset(): void; + + /** + * Destroys this effect, releasing it from the Camera. + */ + destroy(): void; + + } + + /** + * A Camera Rotate effect. + * + * This effect will rotate the Camera so that the its viewport finishes at the given angle in radians, + * over the duration and with the ease specified. + * + * Camera rotation always takes place based on the Camera viewport. By default, rotation happens + * in the center of the viewport. You can adjust this with the `originX` and `originY` properties. + * + * Rotation influences the rendering of _all_ Game Objects visible by this Camera. However, it does not + * rotate the Camera viewport itself, which always remains an axis-aligned rectangle. + * + * Only the camera is rotates. None of the objects it is displaying are impacted, i.e. their positions do + * not change. + * + * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback, + * which is invoked each frame for the duration of the effect if required. + */ + class RotateTo { + /** + * + * @param camera The camera this effect is acting upon. + */ + constructor(camera: Phaser.Cameras.Scene2D.Camera); + + /** + * The Camera this effect belongs to. + */ + readonly camera: Phaser.Cameras.Scene2D.Camera; + + /** + * Is this effect actively running? + */ + readonly isRunning: boolean; + + /** + * The duration of the effect, in milliseconds. + */ + readonly duration: number; + + /** + * The starting angle to rotate the camera from. + */ + source: number; + + /** + * The constantly updated value based on the force. + */ + current: number; + + /** + * The destination angle in radians to rotate the camera to. + */ + destination: number; + + /** + * The ease function to use during the Rotate. + */ + ease: Function; + + /** + * If this effect is running this holds the current percentage of the progress, a value between 0 and 1. + */ + progress: number; + + /** + * The direction of the rotation. + */ + clockwise: boolean; + + /** + * The shortest direction to the target rotation. + */ + shortestPath: boolean; + + /** + * This effect will scroll the Camera so that the center of its viewport finishes at the given angle, + * over the duration and with the ease specified. + * @param radians The destination angle in radians to rotate the Camera viewport to. If the angle is positive then the rotation is clockwise else anticlockwise + * @param shortestPath If shortest path is set to true the camera will rotate in the quickest direction clockwise or anti-clockwise. Default false. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param ease The ease to use for the Rotate. Can be any of the Phaser Easing constants or a custom function. Default 'Linear'. + * @param force Force the rotation effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is, + * the current camera scroll x coordinate and the current camera scroll y coordinate. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + start(radians: number, shortestPath?: boolean, duration?: number, ease?: string | Function, force?: boolean, callback?: CameraRotateCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * The main update loop for this effect. Called automatically by the Camera. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Called internally when the effect completes. + */ + effectComplete(): void; + + /** + * Resets this camera effect. + * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event. + */ + reset(): void; + + /** + * Destroys this effect, releasing it from the Camera. + */ + destroy(): void; + + } + + /** + * A Camera Shake effect. + * + * This effect will shake the camera viewport by a random amount, bounded by the specified intensity, each frame. + * + * Only the camera viewport is moved. None of the objects it is displaying are impacted, i.e. their positions do + * not change. + * + * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback, + * which is invoked each frame for the duration of the effect if required. + */ + class Shake { + /** + * + * @param camera The camera this effect is acting upon. + */ + constructor(camera: Phaser.Cameras.Scene2D.Camera); + + /** + * The Camera this effect belongs to. + */ + readonly camera: Phaser.Cameras.Scene2D.Camera; + + /** + * Is this effect actively running? + */ + readonly isRunning: boolean; + + /** + * The duration of the effect, in milliseconds. + */ + readonly duration: number; + + /** + * The intensity of the effect. Use small float values. The default when the effect starts is 0.05. + * This is a Vector2 object, allowing you to control the shake intensity independently across x and y. + * You can modify this value while the effect is active to create more varied shake effects. + */ + intensity: Phaser.Math.Vector2; + + /** + * If this effect is running this holds the current percentage of the progress, a value between 0 and 1. + */ + progress: number; + + /** + * Shakes the Camera by the given intensity over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 100. + * @param intensity The intensity of the shake. Default 0.05. + * @param force Force the shake effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + start(duration?: number, intensity?: number | Phaser.Math.Vector2, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraShakeCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * The pre-render step for this effect. Called automatically by the Camera. + */ + preRender(): void; + + /** + * The main update loop for this effect. Called automatically by the Camera. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Called internally when the effect completes. + */ + effectComplete(): void; + + /** + * Resets this camera effect. + * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event. + */ + reset(): void; + + /** + * Destroys this effect, releasing it from the Camera. + */ + destroy(): void; + + } + + /** + * A Camera Zoom effect. + * + * This effect will zoom the Camera to the given scale, over the duration and with the ease specified. + * + * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback, + * which is invoked each frame for the duration of the effect if required. + */ + class Zoom { + /** + * + * @param camera The camera this effect is acting upon. + */ + constructor(camera: Phaser.Cameras.Scene2D.Camera); + + /** + * The Camera this effect belongs to. + */ + readonly camera: Phaser.Cameras.Scene2D.Camera; + + /** + * Is this effect actively running? + */ + readonly isRunning: boolean; + + /** + * The duration of the effect, in milliseconds. + */ + readonly duration: number; + + /** + * The starting zoom value; + */ + source: number; + + /** + * The destination zoom value. + */ + destination: number; + + /** + * The ease function to use during the zoom. + */ + ease: Function; + + /** + * If this effect is running this holds the current percentage of the progress, a value between 0 and 1. + */ + progress: number; + + /** + * This effect will zoom the Camera to the given scale, over the duration and with the ease specified. + * @param zoom The target Camera zoom value. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param ease The ease to use for the Zoom. Can be any of the Phaser Easing constants or a custom function. Default 'Linear'. + * @param force Force the zoom effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent three arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is, + * and the current camera zoom value. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + start(zoom: number, duration?: number, ease?: string | Function, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraZoomCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * The main update loop for this effect. Called automatically by the Camera. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Called internally when the effect completes. + */ + effectComplete(): void; + + /** + * Resets this camera effect. + * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event. + */ + reset(): void; + + /** + * Destroys this effect, releasing it from the Camera. + */ + destroy(): void; + + } + + } + + namespace Events { + /** + * The Destroy Camera Event. + * + * This event is dispatched by a Camera instance when it is destroyed by the Camera Manager. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('cameradestroy', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.DESTROY, () => {}); + * ``` + */ + const DESTROY: string; + + /** + * The Camera Fade In Complete Event. + * + * This event is dispatched by a Camera instance when the Fade In Effect completes. + * + * Listen to it from a Camera instance using `Camera.on('camerafadeincomplete', listener)`. + */ + const FADE_IN_COMPLETE: string; + + /** + * The Camera Fade In Start Event. + * + * This event is dispatched by a Camera instance when the Fade In Effect starts. + * + * Listen to it from a Camera instance using `Camera.on('camerafadeinstart', listener)`. + */ + const FADE_IN_START: string; + + /** + * The Camera Fade Out Complete Event. + * + * This event is dispatched by a Camera instance when the Fade Out Effect completes. + * + * Listen to it from a Camera instance using `Camera.on('camerafadeoutcomplete', listener)`. + */ + const FADE_OUT_COMPLETE: string; + + /** + * The Camera Fade Out Start Event. + * + * This event is dispatched by a Camera instance when the Fade Out Effect starts. + * + * Listen to it from a Camera instance using `Camera.on('camerafadeoutstart', listener)`. + */ + const FADE_OUT_START: string; + + /** + * The Camera Flash Complete Event. + * + * This event is dispatched by a Camera instance when the Flash Effect completes. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('cameraflashcomplete', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.FLASH_COMPLETE, () => {}); + * ``` + */ + const FLASH_COMPLETE: string; + + /** + * The Camera Flash Start Event. + * + * This event is dispatched by a Camera instance when the Flash Effect starts. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('cameraflashstart', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.FLASH_START, () => {}); + * ``` + */ + const FLASH_START: string; + + /** + * The Camera Follower Update Event. + * + * This event is dispatched by a Camera instance when it is following a + * Game Object and the Camera position has been updated as a result of + * that following. + * + * Listen to it from a Camera instance using: `camera.on('followupdate', listener)`. + */ + const FOLLOW_UPDATE: string; + + /** + * The Camera Pan Complete Event. + * + * This event is dispatched by a Camera instance when the Pan Effect completes. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerapancomplete', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.PAN_COMPLETE, () => {}); + * ``` + */ + const PAN_COMPLETE: string; + + /** + * The Camera Pan Start Event. + * + * This event is dispatched by a Camera instance when the Pan Effect starts. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerapanstart', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.PAN_START, () => {}); + * ``` + */ + const PAN_START: string; + + /** + * The Camera Post-Render Event. + * + * This event is dispatched by a Camera instance after is has finished rendering. + * It is only dispatched if the Camera is rendering to a texture. + * + * Listen to it from a Camera instance using: `camera.on('postrender', listener)`. + */ + const POST_RENDER: string; + + /** + * The Camera Pre-Render Event. + * + * This event is dispatched by a Camera instance when it is about to render. + * It is only dispatched if the Camera is rendering to a texture. + * + * Listen to it from a Camera instance using: `camera.on('prerender', listener)`. + */ + const PRE_RENDER: string; + + /** + * The Camera Rotate Complete Event. + * + * This event is dispatched by a Camera instance when the Rotate Effect completes. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerarotatecomplete', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.ROTATE_COMPLETE, () => {}); + * ``` + */ + const ROTATE_COMPLETE: string; + + /** + * The Camera Rotate Start Event. + * + * This event is dispatched by a Camera instance when the Rotate Effect starts. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerarotatestart', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.ROTATE_START, () => {}); + * ``` + */ + const ROTATE_START: string; + + /** + * The Camera Shake Complete Event. + * + * This event is dispatched by a Camera instance when the Shake Effect completes. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerashakecomplete', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.SHAKE_COMPLETE, () => {}); + * ``` + */ + const SHAKE_COMPLETE: string; + + /** + * The Camera Shake Start Event. + * + * This event is dispatched by a Camera instance when the Shake Effect starts. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerashakestart', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.SHAKE_START, () => {}); + * ``` + */ + const SHAKE_START: string; + + /** + * The Camera Zoom Complete Event. + * + * This event is dispatched by a Camera instance when the Zoom Effect completes. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerazoomcomplete', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.ZOOM_COMPLETE, () => {}); + * ``` + */ + const ZOOM_COMPLETE: string; + + /** + * The Camera Zoom Start Event. + * + * This event is dispatched by a Camera instance when the Zoom Effect starts. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerazoomstart', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.ZOOM_START, () => {}); + * ``` + */ + const ZOOM_START: string; + + } + + } + + namespace Controls { + /** + * A Fixed Key Camera Control. + * + * This allows you to control the movement and zoom of a camera using the defined keys. + * + * ```javascript + * var camControl = new FixedKeyControl({ + * camera: this.cameras.main, + * left: cursors.left, + * right: cursors.right, + * speed: float OR { x: 0, y: 0 } + * }); + * ``` + * + * Movement is precise and has no 'smoothing' applied to it. + * + * You must call the `update` method of this controller every frame. + */ + class FixedKeyControl { + /** + * + * @param config The Fixed Key Control configuration object. + */ + constructor(config: Phaser.Types.Cameras.Controls.FixedKeyControlConfig); + + /** + * The Camera that this Control will update. + */ + camera: Phaser.Cameras.Scene2D.Camera | null; + + /** + * The Key to be pressed that will move the Camera left. + */ + left: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will move the Camera right. + */ + right: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will move the Camera up. + */ + up: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will move the Camera down. + */ + down: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will zoom the Camera in. + */ + zoomIn: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will zoom the Camera out. + */ + zoomOut: Phaser.Input.Keyboard.Key | null; + + /** + * The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed. + */ + zoomSpeed: number; + + /** + * The smallest zoom value the camera will reach when zoomed out. + */ + minZoom: number; + + /** + * The largest zoom value the camera will reach when zoomed in. + */ + maxZoom: number; + + /** + * The horizontal speed the camera will move. + */ + speedX: number; + + /** + * The vertical speed the camera will move. + */ + speedY: number; + + /** + * A flag controlling if the Controls will update the Camera or not. + */ + active: boolean; + + /** + * Starts the Key Control running, providing it has been linked to a camera. + */ + start(): this; + + /** + * Stops this Key Control from running. Call `start` to start it again. + */ + stop(): this; + + /** + * Binds this Key Control to a camera. + * @param camera The camera to bind this Key Control to. + */ + setCamera(camera: Phaser.Cameras.Scene2D.Camera): this; + + /** + * Applies the results of pressing the control keys to the Camera. + * + * You must call this every step, it is not called automatically. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(delta: number): void; + + /** + * Destroys this Key Control. + */ + destroy(): void; + + } + + /** + * A Smoothed Key Camera Control. + * + * This allows you to control the movement and zoom of a camera using the defined keys. + * Unlike the Fixed Camera Control you can also provide physics values for acceleration, drag and maxSpeed for smoothing effects. + * + * ```javascript + * var controlConfig = { + * camera: this.cameras.main, + * left: cursors.left, + * right: cursors.right, + * up: cursors.up, + * down: cursors.down, + * zoomIn: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.Q), + * zoomOut: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.E), + * zoomSpeed: 0.02, + * acceleration: 0.06, + * drag: 0.0005, + * maxSpeed: 1.0 + * }; + * ``` + * + * You must call the `update` method of this controller every frame. + */ + class SmoothedKeyControl { + /** + * + * @param config The Smoothed Key Control configuration object. + */ + constructor(config: Phaser.Types.Cameras.Controls.SmoothedKeyControlConfig); + + /** + * The Camera that this Control will update. + */ + camera: Phaser.Cameras.Scene2D.Camera | null; + + /** + * The Key to be pressed that will move the Camera left. + */ + left: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will move the Camera right. + */ + right: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will move the Camera up. + */ + up: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will move the Camera down. + */ + down: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will zoom the Camera in. + */ + zoomIn: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will zoom the Camera out. + */ + zoomOut: Phaser.Input.Keyboard.Key | null; + + /** + * The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed. + */ + zoomSpeed: number; + + /** + * The smallest zoom value the camera will reach when zoomed out. + */ + minZoom: number; + + /** + * The largest zoom value the camera will reach when zoomed in. + */ + maxZoom: number; + + /** + * The horizontal acceleration the camera will move. + */ + accelX: number; + + /** + * The vertical acceleration the camera will move. + */ + accelY: number; + + /** + * The horizontal drag applied to the camera when it is moving. + */ + dragX: number; + + /** + * The vertical drag applied to the camera when it is moving. + */ + dragY: number; + + /** + * The maximum horizontal speed the camera will move. + */ + maxSpeedX: number; + + /** + * The maximum vertical speed the camera will move. + */ + maxSpeedY: number; + + /** + * A flag controlling if the Controls will update the Camera or not. + */ + active: boolean; + + /** + * Starts the Key Control running, providing it has been linked to a camera. + */ + start(): this; + + /** + * Stops this Key Control from running. Call `start` to start it again. + */ + stop(): this; + + /** + * Binds this Key Control to a camera. + * @param camera The camera to bind this Key Control to. + */ + setCamera(camera: Phaser.Cameras.Scene2D.Camera): this; + + /** + * Applies the results of pressing the control keys to the Camera. + * + * You must call this every step, it is not called automatically. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(delta: number): void; + + /** + * Destroys this Key Control. + */ + destroy(): void; + + } + + } + + } + + /** + * Phaser Release Version + */ + const VERSION: string; + + /** + * This setting will auto-detect if the browser is capable of suppporting WebGL. + * If it is, it will use the WebGL Renderer. If not, it will fall back to the Canvas Renderer. + */ + const AUTO: number; + + /** + * Forces Phaser to only use the Canvas Renderer, regardless if the browser supports + * WebGL or not. + */ + const CANVAS: number; + + /** + * Forces Phaser to use the WebGL Renderer. If the browser does not support it, there is + * no fallback to Canvas with this setting, so you should trap it and display a suitable + * message to the user. + */ + const WEBGL: number; + + /** + * A Headless Renderer doesn't create either a Canvas or WebGL Renderer. However, it still + * absolutely relies on the DOM being present and available. This mode is meant for unit testing, + * not for running Phaser on the server, which is something you really shouldn't do. + */ + const HEADLESS: number; + + /** + * In Phaser the value -1 means 'forever' in lots of cases, this const allows you to use it instead + * to help you remember what the value is doing in your code. + */ + const FOREVER: number; + + /** + * Direction constant. + */ + const NONE: number; + + /** + * Direction constant. + */ + const UP: number; + + /** + * Direction constant. + */ + const DOWN: number; + + /** + * Direction constant. + */ + const LEFT: number; + + /** + * Direction constant. + */ + const RIGHT: number; + + /** + * The Phaser.Game instance is the main controller for the entire Phaser game. It is responsible + * for handling the boot process, parsing the configuration values, creating the renderer, + * and setting-up all of the global Phaser systems, such as sound and input. + * Once that is complete it will start the Scene Manager and then begin the main game loop. + * + * You should generally avoid accessing any of the systems created by Game, and instead use those + * made available to you via the Phaser.Scene Systems class instead. + */ + class Game { + /** + * + * @param GameConfig The configuration object for your Phaser Game instance. + */ + constructor(GameConfig?: Phaser.Types.Core.GameConfig); + + /** + * The parsed Game Configuration object. + * + * The values stored within this object are read-only and should not be changed at run-time. + */ + readonly config: Phaser.Core.Config; + + /** + * A reference to either the Canvas or WebGL Renderer that this Game is using. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * A reference to an HTML Div Element used as the DOM Element Container. + * + * Only set if `createDOMContainer` is `true` in the game config (by default it is `false`) and + * if you provide a parent element to insert the Phaser Game inside. + * + * See the DOM Element Game Object for more details. + */ + domContainer: HTMLDivElement; + + /** + * A reference to the HTML Canvas Element that Phaser uses to render the game. + * This is created automatically by Phaser unless you provide a `canvas` property + * in your Game Config. + */ + canvas: HTMLCanvasElement; + + /** + * A reference to the Rendering Context belonging to the Canvas Element this game is rendering to. + * If the game is running under Canvas it will be a 2d Canvas Rendering Context. + * If the game is running under WebGL it will be a WebGL Rendering Context. + * This context is created automatically by Phaser unless you provide a `context` property + * in your Game Config. + */ + context: CanvasRenderingContext2D | WebGLRenderingContext; + + /** + * A flag indicating when this Game instance has finished its boot process. + */ + readonly isBooted: boolean; + + /** + * A flag indicating if this Game is currently running its game step or not. + */ + readonly isRunning: boolean; + + /** + * An Event Emitter which is used to broadcast game-level events from the global systems. + */ + events: Phaser.Events.EventEmitter; + + /** + * An instance of the Animation Manager. + * + * The Animation Manager is a global system responsible for managing all animations used within your game. + */ + anims: Phaser.Animations.AnimationManager; + + /** + * An instance of the Texture Manager. + * + * The Texture Manager is a global system responsible for managing all textures being used by your game. + */ + textures: Phaser.Textures.TextureManager; + + /** + * An instance of the Cache Manager. + * + * The Cache Manager is a global system responsible for caching, accessing and releasing external game assets. + */ + cache: Phaser.Cache.CacheManager; + + /** + * An instance of the Data Manager. This is a global manager, available from any Scene + * and allows you to share and exchange your own game-level data or events without having + * to use an internal event system. + */ + registry: Phaser.Data.DataManager; + + /** + * An instance of the Input Manager. + * + * The Input Manager is a global system responsible for the capture of browser-level input events. + */ + input: Phaser.Input.InputManager; + + /** + * An instance of the Scene Manager. + * + * The Scene Manager is a global system responsible for creating, modifying and updating the Scenes in your game. + */ + scene: Phaser.Scenes.SceneManager; + + /** + * A reference to the Device inspector. + * + * Contains information about the device running this game, such as OS, browser vendor and feature support. + * Used by various systems to determine capabilities and code paths. + */ + device: Phaser.DeviceConf; + + /** + * An instance of the Scale Manager. + * + * The Scale Manager is a global system responsible for handling scaling of the game canvas. + */ + scale: Phaser.Scale.ScaleManager; + + /** + * An instance of the base Sound Manager. + * + * The Sound Manager is a global system responsible for the playback and updating of all audio in your game. + * + * You can disable the inclusion of the Sound Manager in your build by toggling the webpack `FEATURE_SOUND` flag. + */ + sound: Phaser.Sound.NoAudioSoundManager | Phaser.Sound.HTML5AudioSoundManager | Phaser.Sound.WebAudioSoundManager; + + /** + * An instance of the Time Step. + * + * The Time Step is a global system responsible for setting-up and responding to the browser frame events, processing + * them and calculating delta values. It then automatically calls the game step. + */ + loop: Phaser.Core.TimeStep; + + /** + * An instance of the Plugin Manager. + * + * The Plugin Manager is a global system that allows plugins to register themselves with it, and can then install + * those plugins into Scenes as required. + */ + plugins: Phaser.Plugins.PluginManager; + + /** + * An instance of the Facebook Instant Games Plugin. + * + * This will only be available if the plugin has been built into Phaser, + * or you're using the special Facebook Instant Games custom build. + */ + facebook: Phaser.FacebookInstantGamesPlugin; + + /** + * Does the window the game is running in currently have focus or not? + * This is modified by the VisibilityHandler. + */ + readonly hasFocus: boolean; + + /** + * Is the Game currently paused? This will stop everything from updating, + * except the `TimeStep` and related RequestAnimationFrame or setTimeout. + * Those will continue stepping, but the core Game step will be skipped. + */ + isPaused: boolean; + + /** + * This method is called automatically when the DOM is ready. It is responsible for creating the renderer, + * displaying the Debug Header, adding the game canvas to the DOM and emitting the 'boot' event. + * It listens for a 'ready' event from the base systems and once received it will call `Game.start`. + */ + protected boot(): void; + + /** + * Called automatically by Game.boot once all of the global systems have finished setting themselves up. + * By this point the Game is now ready to start the main loop running. + * It will also enable the Visibility Handler. + */ + protected start(): void; + + /** + * The main Game Step. Called automatically by the Time Step, once per browser frame (typically as a result of + * Request Animation Frame, or Set Timeout on very old browsers.) + * + * The step will update the global managers first, then proceed to update each Scene in turn, via the Scene Manager. + * + * It will then render each Scene in turn, via the Renderer. This process emits `prerender` and `postrender` events. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + step(time: number, delta: number): void; + + /** + * A special version of the Game Step for the HEADLESS renderer only. + * + * The main Game Step. Called automatically by the Time Step, once per browser frame (typically as a result of + * Request Animation Frame, or Set Timeout on very old browsers.) + * + * The step will update the global managers first, then proceed to update each Scene in turn, via the Scene Manager. + * + * This process emits `prerender` and `postrender` events, even though nothing actually displays. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + headlessStep(time: number, delta: number): void; + + /** + * Called automatically by the Visibility Handler. + * This will pause the main loop and then emit a pause event. + */ + protected onHidden(): void; + + /** + * This will pause the entire game and emit a `PAUSE` event. + * + * All of Phaser's internal systems will be paused and the game will not re-render. + * + * Note that it does not pause any Loader requests that are currently in-flight. + */ + pause(): void; + + /** + * Called automatically by the Visibility Handler. + * This will resume the main loop and then emit a resume event. + */ + protected onVisible(): void; + + /** + * This will resume the entire game and emit a `RESUME` event. + * + * All of Phaser's internal systems will be resumed and the game will start rendering again. + */ + resume(): void; + + /** + * Called automatically by the Visibility Handler. + * This will set the main loop into a 'blurred' state, which pauses it. + */ + protected onBlur(): void; + + /** + * Called automatically by the Visibility Handler. + * This will set the main loop into a 'focused' state, which resumes it. + */ + protected onFocus(): void; + + /** + * Returns the current game frame. + * + * When the game starts running, the frame is incremented every time Request Animation Frame, or Set Timeout, fires. + */ + getFrame(): number; + + /** + * Returns the time that the current game step started at, as based on `performance.now`. + */ + getTime(): number; + + /** + * Flags this Game instance as needing to be destroyed on the _next frame_, making this an asynchronous operation. + * + * It will wait until the current frame has completed and then call `runDestroy` internally. + * + * If you need to react to the games eventual destruction, listen for the `DESTROY` event. + * + * If you **do not** need to run Phaser again on the same web page you can set the `noReturn` argument to `true` and it will free-up + * memory being held by the core Phaser plugins. If you do need to create another game instance on the same page, leave this as `false`. + * @param removeCanvas Set to `true` if you would like the parent canvas element removed from the DOM, or `false` to leave it in place. + * @param noReturn If `true` all the core Phaser plugins are destroyed. You cannot create another instance of Phaser on the same web page if you do this. Default false. + */ + destroy(removeCanvas: boolean, noReturn?: boolean): void; + + } + + namespace Core { + /** + * The active game configuration settings, parsed from a {@link Phaser.Types.Core.GameConfig} object. + */ + class Config { + /** + * + * @param GameConfig The configuration object for your Phaser Game instance. + */ + constructor(GameConfig?: Phaser.Types.Core.GameConfig); + + /** + * The width of the underlying canvas, in pixels. + */ + readonly width: number | string; + + /** + * The height of the underlying canvas, in pixels. + */ + readonly height: number | string; + + /** + * The zoom factor, as used by the Scale Manager. + */ + readonly zoom: Phaser.Scale.ZoomType | number; + + /** + * A parent DOM element into which the canvas created by the renderer will be injected. + */ + readonly parent: any | null; + + /** + * The scale mode as used by the Scale Manager. The default is zero, which is no scaling. + */ + readonly scaleMode: Phaser.Scale.ScaleModeType; + + /** + * Is the Scale Manager allowed to adjust the CSS height property of the parent to be 100%? + */ + readonly expandParent: boolean; + + /** + * Automatically round the display and style sizes of the canvas. This can help with performance in lower-powered devices. + */ + readonly autoRound: boolean; + + /** + * Automatically center the canvas within the parent? + */ + readonly autoCenter: Phaser.Scale.CenterType; + + /** + * How many ms should elapse before checking if the browser size has changed? + */ + readonly resizeInterval: number; + + /** + * The DOM element that will be sent into full screen mode, or its `id`. If undefined Phaser will create its own div and insert the canvas into it when entering fullscreen mode. + */ + readonly fullscreenTarget: HTMLElement | string | null; + + /** + * The minimum width, in pixels, the canvas will scale down to. A value of zero means no minimum. + */ + readonly minWidth: number; + + /** + * The maximum width, in pixels, the canvas will scale up to. A value of zero means no maximum. + */ + readonly maxWidth: number; + + /** + * The minimum height, in pixels, the canvas will scale down to. A value of zero means no minimum. + */ + readonly minHeight: number; + + /** + * The maximum height, in pixels, the canvas will scale up to. A value of zero means no maximum. + */ + readonly maxHeight: number; + + /** + * The horizontal amount to snap the canvas by when the Scale Manager is resizing. A value of zero means no snapping. + */ + readonly snapWidth: number; + + /** + * The vertical amount to snap the canvas by when the Scale Manager is resizing. A value of zero means no snapping. + */ + readonly snapHeight: number; + + /** + * Force Phaser to use a specific renderer. Can be `CONST.CANVAS`, `CONST.WEBGL`, `CONST.HEADLESS` or `CONST.AUTO` (default) + */ + readonly renderType: number; + + /** + * Force Phaser to use your own Canvas element instead of creating one. + */ + readonly canvas: HTMLCanvasElement | null; + + /** + * Force Phaser to use your own Canvas context instead of creating one. + */ + readonly context: CanvasRenderingContext2D | WebGLRenderingContext | null; + + /** + * Optional CSS attributes to be set on the canvas object created by the renderer. + */ + readonly canvasStyle: string | null; + + /** + * Is Phaser running under a custom (non-native web) environment? If so, set this to `true` to skip internal Feature detection. If `true` the `renderType` cannot be left as `AUTO`. + */ + readonly customEnvironment: boolean; + + /** + * The default Scene configuration object. + */ + readonly sceneConfig: object | null; + + /** + * A seed which the Random Data Generator will use. If not given, a dynamic seed based on the time is used. + */ + readonly seed: string[]; + + /** + * The title of the game. + */ + readonly gameTitle: string; + + /** + * The URL of the game. + */ + readonly gameURL: string; + + /** + * The version of the game. + */ + readonly gameVersion: string; + + /** + * If `true` the window will automatically be given focus immediately and on any future mousedown event. + */ + readonly autoFocus: boolean; + + /** + * `false` or `0` = Use the built-in StableSort (needed for older browsers), `true` or `1` = Rely on ES2019 Array.sort being stable (modern browsers only), or `-1` = Try and determine this automatically based on browser inspection (not guaranteed to work, errs on side of caution). + */ + readonly stableSort: number | boolean; + + /** + * Should the game create a div element to act as a DOM Container? Only enable if you're using DOM Element objects. You must provide a parent object if you use this feature. + */ + readonly domCreateContainer: boolean | null; + + /** + * The default `pointerEvents` attribute set on the DOM Container. + */ + readonly domPointerEvents: string | null; + + /** + * Enable the Keyboard Plugin. This can be disabled in games that don't need keyboard input. + */ + readonly inputKeyboard: boolean; + + /** + * The DOM Target to listen for keyboard events on. Defaults to `window` if not specified. + */ + readonly inputKeyboardEventTarget: any; + + /** + * `preventDefault` will be called on every non-modified key which has a key code in this array. By default, it is empty. + */ + readonly inputKeyboardCapture: number[] | null; + + /** + * Enable the Mouse Plugin. This can be disabled in games that don't need mouse input. + */ + readonly inputMouse: boolean | object; + + /** + * The DOM Target to listen for mouse events on. Defaults to the game canvas if not specified. + */ + readonly inputMouseEventTarget: any | null; + + /** + * Should `mousedown` DOM events have `preventDefault` called on them? + */ + readonly inputMousePreventDefaultDown: boolean; + + /** + * Should `mouseup` DOM events have `preventDefault` called on them? + */ + readonly inputMousePreventDefaultUp: boolean; + + /** + * Should `mousemove` DOM events have `preventDefault` called on them? + */ + readonly inputMousePreventDefaultMove: boolean; + + /** + * Should `wheel` DOM events have `preventDefault` called on them? + */ + readonly inputMousePreventDefaultWheel: boolean; + + /** + * Enable the Touch Plugin. This can be disabled in games that don't need touch input. + */ + readonly inputTouch: boolean; + + /** + * The DOM Target to listen for touch events on. Defaults to the game canvas if not specified. + */ + readonly inputTouchEventTarget: any | null; + + /** + * Should touch events be captured? I.e. have prevent default called on them. + */ + readonly inputTouchCapture: boolean; + + /** + * The number of Pointer objects created by default. In a mouse-only, or non-multi touch game, you can leave this as 1. + */ + readonly inputActivePointers: number; + + /** + * The smoothing factor to apply during Pointer movement. See {@link Phaser.Input.Pointer#smoothFactor}. + */ + readonly inputSmoothFactor: number; + + /** + * Should Phaser listen for input events on the Window? If you disable this, events like 'POINTER_UP_OUTSIDE' will no longer fire. + */ + readonly inputWindowEvents: boolean; + + /** + * Enable the Gamepad Plugin. This can be disabled in games that don't need gamepad input. + */ + readonly inputGamepad: boolean; + + /** + * The DOM Target to listen for gamepad events on. Defaults to `window` if not specified. + */ + readonly inputGamepadEventTarget: any; + + /** + * Set to `true` to disable the right-click context menu. + */ + readonly disableContextMenu: boolean; + + /** + * The Audio Configuration object. + */ + readonly audio: Phaser.Types.Core.AudioConfig; + + /** + * Don't write the banner line to the console.log. + */ + readonly hideBanner: boolean; + + /** + * Omit Phaser's name and version from the banner. + */ + readonly hidePhaser: boolean; + + /** + * The color of the banner text. + */ + readonly bannerTextColor: string; + + /** + * The background colors of the banner. + */ + readonly bannerBackgroundColor: string[]; + + /** + * The Frame Rate Configuration object, as parsed by the Timestep class. + */ + readonly fps: Phaser.Types.Core.FPSConfig; + + /** + * Disables the automatic creation of the Pre FX Pipelines. If disabled, you cannot use the built-in Pre FX on Game Objects. + */ + readonly disablePreFX: boolean; + + /** + * Disables the automatic creation of the Post FX Pipelines. If disabled, you cannot use the built-in Post FX on Game Objects. + */ + readonly disablePostFX: boolean; + + /** + * An object mapping WebGL names to WebGLPipeline classes. These should be class constructors, not instances. + */ + readonly pipeline: Phaser.Types.Core.PipelineConfig | Phaser.Renderer.WebGL.WebGLPipeline[]; + + /** + * Automatically enable the Mobile Pipeline if iOS or Android detected? + */ + readonly autoMobilePipeline: boolean; + + /** + * The WebGL Pipeline that Game Objects will use by default. Set to 'MultiPipeline' as standard. See also 'autoMobilePipeline'. + */ + readonly defaultPipeline: string; + + /** + * When set to `true`, WebGL uses linear interpolation to draw scaled or rotated textures, giving a smooth appearance. When set to `false`, WebGL uses nearest-neighbor interpolation, giving a crisper appearance. `false` also disables antialiasing of the game canvas itself, if the browser supports it, when the game canvas is scaled. + */ + readonly antialias: boolean; + + /** + * Sets the `antialias` property when the WebGL context is created. Setting this value does not impact any subsequent textures that are created, or the canvas style attributes. + */ + readonly antialiasGL: boolean; + + /** + * Sets the mipmap magFilter to be used when creating WebGL textures. Don't set unless you wish to create mipmaps. Set to one of the following: 'NEAREST', 'LINEAR', 'NEAREST_MIPMAP_NEAREST', 'LINEAR_MIPMAP_NEAREST', 'NEAREST_MIPMAP_LINEAR' or 'LINEAR_MIPMAP_LINEAR'. + */ + readonly mipmapFilter: string; + + /** + * When set to `true` it will create a desynchronized context for both 2D and WebGL. See https://developers.google.com/web/updates/2019/05/desynchronized for details. + */ + readonly desynchronized: boolean; + + /** + * Draw texture-based Game Objects at only whole-integer positions. Game Objects without textures, like Graphics, ignore this property. + */ + readonly roundPixels: boolean; + + /** + * Prevent pixel art from becoming blurred when scaled. It will remain crisp (tells the WebGL renderer to automatically create textures using a linear filter mode). + */ + readonly pixelArt: boolean; + + /** + * Whether the game canvas will have a transparent background. + */ + readonly transparent: boolean; + + /** + * Whether the game canvas will be cleared between each rendering frame. You can disable this if you have a full-screen background image or game object. + */ + readonly clearBeforeRender: boolean; + + /** + * If the value is true the WebGL buffers will not be cleared and will preserve their values until cleared or overwritten by the author. + */ + readonly preserveDrawingBuffer: boolean; + + /** + * In WebGL mode, sets the drawing buffer to contain colors with pre-multiplied alpha. + */ + readonly premultipliedAlpha: boolean; + + /** + * Let the browser abort creating a WebGL context if it judges performance would be unacceptable. + */ + readonly failIfMajorPerformanceCaveat: boolean; + + /** + * "high-performance", "low-power" or "default". A hint to the browser on how much device power the game might use. + */ + readonly powerPreference: string; + + /** + * The default WebGL Batch size. Represents the number of _quads_ that can be added to a single batch. + */ + readonly batchSize: number; + + /** + * When in WebGL mode, this sets the maximum number of GPU Textures to use. The default, -1, will use all available units. The WebGL1 spec says all browsers should provide a minimum of 8. + */ + readonly maxTextures: number; + + /** + * The maximum number of lights allowed to be visible within range of a single Camera in the LightManager. + */ + readonly maxLights: number; + + /** + * The background color of the game canvas. The default is black. This value is ignored if `transparent` is set to `true`. + */ + readonly backgroundColor: Phaser.Display.Color; + + /** + * Called before Phaser boots. Useful for initializing anything not related to Phaser that Phaser may require while booting. + */ + readonly preBoot: Phaser.Types.Core.BootCallback; + + /** + * A function to run at the end of the boot sequence. At this point, all the game systems have started and plugins have been loaded. + */ + readonly postBoot: Phaser.Types.Core.BootCallback; + + /** + * The Physics Configuration object. + */ + readonly physics: Phaser.Types.Core.PhysicsConfig; + + /** + * The default physics system. It will be started for each scene. Either 'arcade', 'impact' or 'matter'. + */ + readonly defaultPhysicsSystem: boolean | string; + + /** + * A URL used to resolve paths given to the loader. Example: 'http://labs.phaser.io/assets/'. + */ + readonly loaderBaseURL: string; + + /** + * A URL path used to resolve relative paths given to the loader. Example: 'images/sprites/'. + */ + readonly loaderPath: string; + + /** + * Maximum parallel downloads allowed for resources (Default to 32). + */ + readonly loaderMaxParallelDownloads: number; + + /** + * 'anonymous', 'use-credentials', or `undefined`. If you're not making cross-origin requests, leave this as `undefined`. See {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes}. + */ + readonly loaderCrossOrigin: string | undefined; + + /** + * The response type of the XHR request, e.g. `blob`, `text`, etc. + */ + readonly loaderResponseType: string; + + /** + * Should the XHR request use async or not? + */ + readonly loaderAsync: boolean; + + /** + * Optional username for all XHR requests. + */ + readonly loaderUser: string; + + /** + * Optional password for all XHR requests. + */ + readonly loaderPassword: string; + + /** + * Optional XHR timeout value, in ms. + */ + readonly loaderTimeout: number; + + /** + * Optional XHR withCredentials value. + */ + readonly loaderWithCredentials: boolean; + + /** + * Optional load type for image, `XHR` is default, or `HTMLImageElement` for a lightweight way. + */ + readonly loaderImageLoadType: string; + + /** + * An array of schemes that the Loader considers as being 'local' files. Defaults to: `[ 'file://', 'capacitor://' ]`. + */ + readonly loaderLocalScheme: string[]; + + /** + * The quality of the Glow FX (defaults to 0.1) + */ + readonly glowFXQuality: number; + + /** + * The distance of the Glow FX (defaults to 10) + */ + readonly glowFXDistance: number; + + /** + * An array of global plugins to be installed. + */ + readonly installGlobalPlugins: any; + + /** + * An array of Scene level plugins to be installed. + */ + readonly installScenePlugins: any; + + /** + * The plugins installed into every Scene (in addition to CoreScene and Global). + */ + readonly defaultPlugins: any; + + /** + * A base64 encoded PNG that will be used as the default blank texture. + */ + readonly defaultImage: string; + + /** + * A base64 encoded PNG that will be used as the default texture when a texture is assigned that is missing or not loaded. + */ + readonly missingImage: string; + + /** + * A base64 encoded PNG that will be used as the default texture when a texture is assigned that is white or not loaded. + */ + readonly whiteImage: string; + + } + + /** + * Called automatically by Phaser.Game and responsible for creating the renderer it will use. + * + * Relies upon two webpack global flags to be defined: `WEBGL_RENDERER` and `CANVAS_RENDERER` during build time, but not at run-time. + * @param game The Phaser.Game instance on which the renderer will be set. + */ + function CreateRenderer(game: Phaser.Game): void; + + /** + * Called automatically by Phaser.Game and responsible for creating the console.log debug header. + * + * You can customize or disable the header via the Game Config object. + * @param game The Phaser.Game instance which will output this debug header. + */ + function DebugHeader(game: Phaser.Game): void; + + namespace Events { + /** + * The Game Blur Event. + * + * This event is dispatched by the Game Visibility Handler when the window in which the Game instance is embedded + * enters a blurred state. The blur event is raised when the window loses focus. This can happen if a user swaps + * tab, or if they simply remove focus from the browser to another app. + */ + const BLUR: string; + + /** + * The Game Boot Event. + * + * This event is dispatched when the Phaser Game instance has finished booting, but before it is ready to start running. + * The global systems use this event to know when to set themselves up, dispatching their own `ready` events as required. + */ + const BOOT: string; + + /** + * The Game Context Lost Event. + * + * This event is dispatched by the Game if the WebGL Renderer it is using encounters a WebGL Context Lost event from the browser. + * + * The renderer halts all rendering and cannot resume after this happens. + */ + const CONTEXT_LOST: string; + + /** + * The Game Destroy Event. + * + * This event is dispatched when the game instance has been told to destroy itself. + * Lots of internal systems listen to this event in order to clear themselves out. + * Custom plugins and game code should also do the same. + */ + const DESTROY: string; + + /** + * The Game Focus Event. + * + * This event is dispatched by the Game Visibility Handler when the window in which the Game instance is embedded + * enters a focused state. The focus event is raised when the window re-gains focus, having previously lost it. + */ + const FOCUS: string; + + /** + * The Game Hidden Event. + * + * This event is dispatched by the Game Visibility Handler when the document in which the Game instance is embedded + * enters a hidden state. Only browsers that support the Visibility API will cause this event to be emitted. + * + * In most modern browsers, when the document enters a hidden state, the Request Animation Frame and setTimeout, which + * control the main game loop, will automatically pause. There is no way to stop this from happening. It is something + * your game should account for in its own code, should the pause be an issue (i.e. for multiplayer games) + */ + const HIDDEN: string; + + /** + * The Game Pause Event. + * + * This event is dispatched when the Game loop enters a paused state, usually as a result of the Visibility Handler. + */ + const PAUSE: string; + + /** + * The Game Post-Render Event. + * + * This event is dispatched right at the end of the render process. + * + * Every Scene will have rendered and been drawn to the canvas by the time this event is fired. + * Use it for any last minute post-processing before the next game step begins. + */ + const POST_RENDER: string; + + /** + * The Game Post-Step Event. + * + * This event is dispatched after the Scene Manager has updated. + * Hook into it from plugins or systems that need to do things before the render starts. + */ + const POST_STEP: string; + + /** + * The Game Pre-Render Event. + * + * This event is dispatched immediately before any of the Scenes have started to render. + * + * The renderer will already have been initialized this frame, clearing itself and preparing to receive the Scenes for rendering, but it won't have actually drawn anything yet. + */ + const PRE_RENDER: string; + + /** + * The Game Pre-Step Event. + * + * This event is dispatched before the main Game Step starts. By this point in the game cycle none of the Scene updates have yet happened. + * Hook into it from plugins or systems that need to update before the Scene Manager does. + */ + const PRE_STEP: string; + + /** + * The Game Ready Event. + * + * This event is dispatched when the Phaser Game instance has finished booting, the Texture Manager is fully ready, + * and all local systems are now able to start. + */ + const READY: string; + + /** + * The Game Resume Event. + * + * This event is dispatched when the game loop leaves a paused state and resumes running. + */ + const RESUME: string; + + /** + * The Game Step Event. + * + * This event is dispatched after the Game Pre-Step and before the Scene Manager steps. + * Hook into it from plugins or systems that need to update before the Scene Manager does, but after the core Systems have. + */ + const STEP: string; + + /** + * This event is dispatched when the Scene Manager has created the System Scene, + * which other plugins and systems may use to initialize themselves. + * + * This event is dispatched just once by the Game instance. + */ + const SYSTEM_READY: string; + + /** + * The Game Visible Event. + * + * This event is dispatched by the Game Visibility Handler when the document in which the Game instance is embedded + * enters a visible state, previously having been hidden. + * + * Only browsers that support the Visibility API will cause this event to be emitted. + */ + const VISIBLE: string; + + } + + /** + * The core runner class that Phaser uses to handle the game loop. It can use either Request Animation Frame, + * or SetTimeout, based on browser support and config settings, to create a continuous loop within the browser. + * + * Each time the loop fires, `TimeStep.step` is called and this is then passed onto the core Game update loop, + * it is the core heartbeat of your game. It will fire as often as Request Animation Frame is capable of handling + * on the target device. + * + * Note that there are lots of situations where a browser will stop updating your game. Such as if the player + * switches tabs, or covers up the browser window with another application. In these cases, the 'heartbeat' + * of your game will pause, and only resume when focus is returned to it by the player. There is no way to avoid + * this situation, all you can do is use the visibility events the browser, and Phaser, provide to detect when + * it has happened and then gracefully recover. + */ + class TimeStep { + /** + * + * @param game A reference to the Phaser.Game instance that owns this Time Step. + */ + constructor(game: Phaser.Game, config: Phaser.Types.Core.FPSConfig); + + /** + * A reference to the Phaser.Game instance. + */ + readonly game: Phaser.Game; + + /** + * The Request Animation Frame DOM Event handler. + */ + readonly raf: Phaser.DOM.RequestAnimationFrame; + + /** + * A flag that is set once the TimeStep has started running and toggled when it stops. + */ + readonly started: boolean; + + /** + * A flag that is set once the TimeStep has started running and toggled when it stops. + * The difference between this value and `started` is that `running` is toggled when + * the TimeStep is sent to sleep, where-as `started` remains `true`, only changing if + * the TimeStep is actually stopped, not just paused. + */ + readonly running: boolean; + + /** + * The minimum fps rate you want the Time Step to run at. + * + * Setting this cannot guarantee the browser runs at this rate, it merely influences + * the internal timing values to help the Timestep know when it has gone out of sync. + */ + minFps: number; + + /** + * The target fps rate for the Time Step to run at. + * + * Setting this value will not actually change the speed at which the browser runs, that is beyond + * the control of Phaser. Instead, it allows you to determine performance issues and if the Time Step + * is spiraling out of control. + */ + targetFps: number; + + /** + * Enforce a frame rate limit. This forces how often the Game step will run. By default it is zero, + * which means it will run at whatever limit the browser (via RequestAnimationFrame) can handle, which + * is the optimum rate for fast-action or responsive games. + * + * However, if you are building a non-game app, like a graphics generator, or low-intensity game that doesn't + * require 60fps, then you can lower the step rate via this Game Config value: + * + * ```js + * fps: { + * limit: 30 + * } + * ``` + * + * Setting this _beyond_ the rate of RequestAnimationFrame will make no difference at all. + * + * Use it purely to _restrict_ updates in low-intensity situations only. + */ + fpsLimit: number; + + /** + * Is the FPS rate limited? + * + * This is set by setting the Game Config `limit` value to a value above zero. + * + * Consider this property as read-only. + */ + hasFpsLimit: boolean; + + /** + * An exponential moving average of the frames per second. + */ + readonly actualFps: number; + + /** + * The time at which the next fps rate update will take place. + * + * When an fps update happens, the `framesThisSecond` value is reset. + */ + readonly nextFpsUpdate: number; + + /** + * The number of frames processed this second. + */ + readonly framesThisSecond: number; + + /** + * A callback to be invoked each time the TimeStep steps. + */ + callback: Phaser.Types.Core.TimeStepCallback; + + /** + * You can force the TimeStep to use SetTimeOut instead of Request Animation Frame by setting + * the `forceSetTimeOut` property to `true` in the Game Configuration object. It cannot be changed at run-time. + */ + readonly forceSetTimeOut: boolean; + + /** + * The time, updated each step by adding the elapsed delta time to the previous value. + * + * This differs from the `TimeStep.now` value, which is the high resolution time value + * as provided by Request Animation Frame. + */ + time: number; + + /** + * The time at which the game started running. + * + * This value is adjusted if the game is then paused and resumes. + */ + startTime: number; + + /** + * The time of the previous step. + * + * This is typically a high resolution timer value, as provided by Request Animation Frame. + */ + lastTime: number; + + /** + * The current frame the game is on. This counter is incremented once every game step, regardless of how much + * time has passed and is unaffected by delta smoothing. + */ + readonly frame: number; + + /** + * Is the browser currently considered in focus by the Page Visibility API? + * + * This value is set in the `blur` method, which is called automatically by the Game instance. + */ + readonly inFocus: boolean; + + /** + * The delta time, in ms, since the last game step. This is a clamped and smoothed average value. + */ + delta: number; + + /** + * Internal index of the delta history position. + */ + deltaIndex: number; + + /** + * Internal array holding the previous delta values, used for delta smoothing. + */ + deltaHistory: number[]; + + /** + * The maximum number of delta values that are retained in order to calculate a smoothed moving average. + * + * This can be changed in the Game Config via the `fps.deltaHistory` property. The default is 10. + */ + deltaSmoothingMax: number; + + /** + * The number of frames that the cooldown is set to after the browser panics over the FPS rate, usually + * as a result of switching tabs and regaining focus. + * + * This can be changed in the Game Config via the `fps.panicMax` property. The default is 120. + */ + panicMax: number; + + /** + * The actual elapsed time in ms between one update and the next. + * + * Unlike with `delta`, no smoothing, capping, or averaging is applied to this value. + * So please be careful when using this value in math calculations. + */ + rawDelta: number; + + /** + * The time, set at the start of the current step. + * + * This is typically a high resolution timer value, as provided by Request Animation Frame. + * + * This can differ from the `time` value in that it isn't calculated based on the delta value. + */ + now: number; + + /** + * Apply smoothing to the delta value used within Phasers internal calculations? + * + * This can be changed in the Game Config via the `fps.smoothStep` property. The default is `true`. + * + * Smoothing helps settle down the delta values after browser tab switches, or other situations + * which could cause significant delta spikes or dips. By default it has been enabled in Phaser 3 + * since the first version, but is now exposed under this property (and the corresponding game config + * `smoothStep` value), to allow you to easily disable it, should you require. + */ + smoothStep: boolean; + + /** + * Called by the Game instance when the DOM window.onBlur event triggers. + */ + blur(): void; + + /** + * Called by the Game instance when the DOM window.onFocus event triggers. + */ + focus(): void; + + /** + * Called when the visibility API says the game is 'hidden' (tab switch out of view, etc) + */ + pause(): void; + + /** + * Called when the visibility API says the game is 'visible' again (tab switch back into view, etc) + */ + resume(): void; + + /** + * Resets the time, lastTime, fps averages and delta history. + * Called automatically when a browser sleeps them resumes. + */ + resetDelta(): void; + + /** + * Starts the Time Step running, if it is not already doing so. + * Called automatically by the Game Boot process. + * @param callback The callback to be invoked each time the Time Step steps. + */ + start(callback: Phaser.Types.Core.TimeStepCallback): void; + + /** + * Takes the delta value and smooths it based on the previous frames. + * + * Called automatically as part of the step. + * @param delta The delta value for this step. + */ + smoothDelta(delta: number): number; + + /** + * Update the estimate of the frame rate, `fps`. Every second, the number + * of frames that occurred in that second are included in an exponential + * moving average of all frames per second, with an alpha of 0.25. This + * means that more recent seconds affect the estimated frame rate more than + * older seconds. + * + * When a browser window is NOT minimized, but is covered up (i.e. you're using + * another app which has spawned a window over the top of the browser), then it + * will start to throttle the raf callback time. It waits for a while, and then + * starts to drop the frame rate at 1 frame per second until it's down to just over 1fps. + * So if the game was running at 60fps, and the player opens a new window, then + * after 60 seconds (+ the 'buffer time') it'll be down to 1fps, so rafin'g at 1Hz. + * + * When they make the game visible again, the frame rate is increased at a rate of + * approx. 8fps, back up to 60fps (or the max it can obtain) + * + * There is no easy way to determine if this drop in frame rate is because the + * browser is throttling raf, or because the game is struggling with performance + * because you're asking it to do too much on the device. + * + * Compute the new exponential moving average with an alpha of 0.25. + * @param time The timestamp passed in from RequestAnimationFrame or setTimeout. + */ + updateFPS(time: number): void; + + /** + * The main step method with an fps limiter. This is called each time the browser updates, either by Request Animation Frame, + * or by Set Timeout. It is responsible for calculating the delta values, frame totals, cool down history and more. + * You generally should never call this method directly. + * @param time The timestamp passed in from RequestAnimationFrame or setTimeout. + */ + stepLimitFPS(time: number): void; + + /** + * The main step method. This is called each time the browser updates, either by Request Animation Frame, + * or by Set Timeout. It is responsible for calculating the delta values, frame totals, cool down history and more. + * You generally should never call this method directly. + * @param time The timestamp passed in from RequestAnimationFrame or setTimeout. + */ + step(time: number): void; + + /** + * Manually calls `TimeStep.step`. + */ + tick(): void; + + /** + * Sends the TimeStep to sleep, stopping Request Animation Frame (or SetTimeout) and toggling the `running` flag to false. + */ + sleep(): void; + + /** + * Wakes-up the TimeStep, restarting Request Animation Frame (or SetTimeout) and toggling the `running` flag to true. + * The `seamless` argument controls if the wake-up should adjust the start time or not. + * @param seamless Adjust the startTime based on the lastTime values. Default false. + */ + wake(seamless?: boolean): void; + + /** + * Gets the duration which the game has been running, in seconds. + */ + getDuration(): number; + + /** + * Gets the duration which the game has been running, in ms. + */ + getDurationMS(): number; + + /** + * Stops the TimeStep running. + */ + stop(): this; + + /** + * Destroys the TimeStep. This will stop Request Animation Frame, stop the step, clear the callbacks and null + * any objects. + */ + destroy(): void; + + } + + /** + * The Visibility Handler is responsible for listening out for document level visibility change events. + * This includes `visibilitychange` if the browser supports it, and blur and focus events. It then uses + * the provided Event Emitter and fires the related events. + * @param game The Game instance this Visibility Handler is working on. + */ + function VisibilityHandler(game: Phaser.Game): void; + + } + + namespace Create { + /** + * Generates a texture based on the given Create configuration object. + * + * The texture is drawn using a fixed-size indexed palette of 16 colors, where the hex value in the + * data cells map to a single color. For example, if the texture config looked like this: + * + * ```javascript + * var star = [ + * '.....828.....', + * '....72227....', + * '....82228....', + * '...7222227...', + * '2222222222222', + * '8222222222228', + * '.72222222227.', + * '..787777787..', + * '..877777778..', + * '.78778887787.', + * '.27887.78872.', + * '.787.....787.' + * ]; + * + * this.textures.generate('star', { data: star, pixelWidth: 4 }); + * ``` + * + * Then it would generate a texture that is 52 x 48 pixels in size, because each cell of the data array + * represents 1 pixel multiplied by the `pixelWidth` value. The cell values, such as `8`, maps to color + * number 8 in the palette. If a cell contains a period character `.` then it is transparent. + * + * The default palette is Arne16, but you can specify your own using the `palette` property. + * @param config The Generate Texture Configuration object. + */ + function GenerateTexture(config: Phaser.Types.Create.GenerateTextureConfig): HTMLCanvasElement; + + namespace Palettes { + /** + * A 16 color palette by [Arne](http://androidarts.com/palette/16pal.htm) + */ + var ARNE16: Phaser.Types.Create.Palette; + + /** + * A 16 color palette inspired by the Commodore 64. + */ + var C64: Phaser.Types.Create.Palette; + + /** + * A 16 color CGA inspired palette by [Arne](http://androidarts.com/palette/16pal.htm) + */ + var CGA: Phaser.Types.Create.Palette; + + /** + * A 16 color JMP palette by [Arne](http://androidarts.com/palette/16pal.htm) + */ + var JMP: Phaser.Types.Create.Palette; + + /** + * A 16 color palette inspired by Japanese computers like the MSX. + */ + var MSX: Phaser.Types.Create.Palette; + + } + + } + + namespace Curves { + /** + * A higher-order Bézier curve constructed of four points. + */ + class CubicBezier extends Phaser.Curves.Curve { + /** + * + * @param p0 Start point, or an array of point pairs. + * @param p1 Control Point 1. + * @param p2 Control Point 2. + * @param p3 End Point. + */ + constructor(p0: Phaser.Math.Vector2 | Phaser.Math.Vector2[], p1: Phaser.Math.Vector2, p2: Phaser.Math.Vector2, p3: Phaser.Math.Vector2); + + /** + * The start point of this curve. + */ + p0: Phaser.Math.Vector2; + + /** + * The first control point of this curve. + */ + p1: Phaser.Math.Vector2; + + /** + * The second control point of this curve. + */ + p2: Phaser.Math.Vector2; + + /** + * The end point of this curve. + */ + p3: Phaser.Math.Vector2; + + /** + * Gets the starting point on the curve. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getStartPoint(out?: O): O; + + /** + * Returns the resolution of this curve. + * @param divisions The amount of divisions used by this curve. + */ + getResolution(divisions: number): number; + + /** + * Get point at relative position in curve according to length. + * @param t The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPoint(t: number, out?: O): O; + + /** + * Draws this curve to the specified graphics object. + * @param graphics The graphics object this curve should be drawn to. + * @param pointsTotal The number of intermediary points that make up this curve. A higher number of points will result in a smoother curve. Default 32. + */ + draw(graphics: G, pointsTotal?: number): G; + + /** + * Returns a JSON object that describes this curve. + */ + toJSON(): Phaser.Types.Curves.JSONCurve; + + /** + * Generates a curve from a JSON object. + * @param data The JSON object containing this curve data. + */ + static fromJSON(data: Phaser.Types.Curves.JSONCurve): Phaser.Curves.CubicBezier; + + } + + /** + * A Base Curve class, which all other curve types extend. + * + * Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog) + */ + class Curve { + /** + * + * @param type The curve type. + */ + constructor(type: string); + + /** + * String based identifier for the type of curve. + */ + type: string; + + /** + * The default number of divisions within the curve. + */ + defaultDivisions: number; + + /** + * The quantity of arc length divisions within the curve. + */ + arcLengthDivisions: number; + + /** + * An array of cached arc length values. + */ + cacheArcLengths: number[]; + + /** + * Does the data of this curve need updating? + */ + needsUpdate: boolean; + + /** + * For a curve on a Path, `false` means the Path will ignore this curve. + */ + active: boolean; + + /** + * Draws this curve on the given Graphics object. + * + * The curve is drawn using `Graphics.strokePoints` so will be drawn at whatever the present Graphics stroke color is. + * The Graphics object is not cleared before the draw, so the curve will appear on-top of anything else already rendered to it. + * @param graphics The Graphics instance onto which this curve will be drawn. + * @param pointsTotal The resolution of the curve. The higher the value the smoother it will render, at the cost of rendering performance. Default 32. + */ + draw(graphics: G, pointsTotal?: number): G; + + /** + * Returns a Rectangle where the position and dimensions match the bounds of this Curve. + * + * You can control the accuracy of the bounds. The value given is used to work out how many points + * to plot across the curve. Higher values are more accurate at the cost of calculation speed. + * @param out The Rectangle to store the bounds in. If falsey a new object will be created. + * @param accuracy The accuracy of the bounds calculations. Default 16. + */ + getBounds(out?: Phaser.Geom.Rectangle, accuracy?: number): Phaser.Geom.Rectangle; + + /** + * Returns an array of points, spaced out X distance pixels apart. + * The smaller the distance, the larger the array will be. + * @param distance The distance, in pixels, between each point along the curve. + */ + getDistancePoints(distance: number): Phaser.Geom.Point[]; + + /** + * Get a point at the end of the curve. + * @param out Optional Vector object to store the result in. + */ + getEndPoint(out?: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Get total curve arc length + */ + getLength(): number; + + /** + * Get a list of cumulative segment lengths. + * + * These lengths are + * + * - [0] 0 + * - [1] The first segment + * - [2] The first and second segment + * - ... + * - [divisions] All segments + * @param divisions The number of divisions or segments. + */ + getLengths(divisions?: number): number[]; + + /** + * Get a point at a relative position on the curve, by arc length. + * @param u The relative position, [0..1]. + * @param out A point to store the result in. + */ + getPointAt(u: number, out?: O): O; + + /** + * Get a sequence of evenly spaced points from the curve. + * + * You can pass `divisions`, `stepRate`, or neither. + * + * The number of divisions will be + * + * 1. `divisions`, if `divisions` > 0; or + * 2. `this.getLength / stepRate`, if `stepRate` > 0; or + * 3. `this.defaultDivisions` + * + * `1 + divisions` points will be returned. + * @param divisions The number of divisions to make. + * @param stepRate The curve distance between points, implying `divisions`. + * @param out An optional array to store the points in. + */ + getPoints(divisions?: number, stepRate?: number, out?: O): O; + + /** + * Get a random point from the curve. + * @param out A point object to store the result in. + */ + getRandomPoint(out?: O): O; + + /** + * Get a sequence of equally spaced points (by arc distance) from the curve. + * + * `1 + divisions` points will be returned. + * @param divisions The number of divisions to make. Default this.defaultDivisions. + * @param stepRate Step between points. Used to calculate the number of points to return when divisions is falsy. Ignored if divisions is positive. + * @param out An optional array to store the points in. + */ + getSpacedPoints(divisions?: number, stepRate?: number, out?: any[] | Phaser.Math.Vector2[]): Phaser.Math.Vector2[]; + + /** + * Get a point at the start of the curve. + * @param out A point to store the result in. + */ + getStartPoint(out?: O): O; + + /** + * Get a unit vector tangent at a relative position on the curve. + * In case any sub curve does not implement its tangent derivation, + * 2 points a small delta apart will be used to find its gradient + * which seems to give a reasonable approximation + * @param t The relative position on the curve, [0..1]. + * @param out A vector to store the result in. + */ + getTangent(t: number, out?: O): O; + + /** + * Get a unit vector tangent at a relative position on the curve, by arc length. + * @param u The relative position on the curve, [0..1]. + * @param out A vector to store the result in. + */ + getTangentAt(u: number, out?: O): O; + + /** + * Given a distance in pixels, get a t to find p. + * @param distance The distance, in pixels. + * @param divisions Optional amount of divisions. + */ + getTFromDistance(distance: number, divisions?: number): number; + + /** + * Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant. + * @param u A float between 0 and 1. + * @param distance The distance, in pixels. + * @param divisions Optional amount of divisions. + */ + getUtoTmapping(u: number, distance: number, divisions?: number): number; + + /** + * Calculate and cache the arc lengths. + */ + updateArcLengths(): void; + + } + + /** + * An Elliptical Curve derived from the Base Curve class. + * + * See https://en.wikipedia.org/wiki/Elliptic_curve for more details. + */ + class Ellipse extends Phaser.Curves.Curve { + /** + * + * @param x The x coordinate of the ellipse, or an Ellipse Curve configuration object. Default 0. + * @param y The y coordinate of the ellipse. Default 0. + * @param xRadius The horizontal radius of ellipse. Default 0. + * @param yRadius The vertical radius of ellipse. Default 0. + * @param startAngle The start angle of the ellipse, in degrees. Default 0. + * @param endAngle The end angle of the ellipse, in degrees. Default 360. + * @param clockwise Whether the ellipse angles are given as clockwise (`true`) or counter-clockwise (`false`). Default false. + * @param rotation The rotation of the ellipse, in degrees. Default 0. + */ + constructor(x?: number | Phaser.Types.Curves.EllipseCurveConfig, y?: number, xRadius?: number, yRadius?: number, startAngle?: number, endAngle?: number, clockwise?: boolean, rotation?: number); + + /** + * The center point of the ellipse. Used for calculating rotation. + */ + p0: Phaser.Math.Vector2; + + /** + * Gets the starting point on the curve. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getStartPoint(out?: O): O; + + /** + * Get the resolution of the curve. + * @param divisions Optional divisions value. + */ + getResolution(divisions: number): number; + + /** + * Get point at relative position in curve according to length. + * @param t The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPoint(t: number, out?: O): O; + + /** + * Sets the horizontal radius of this curve. + * @param value The horizontal radius of this curve. + */ + setXRadius(value: number): this; + + /** + * Sets the vertical radius of this curve. + * @param value The vertical radius of this curve. + */ + setYRadius(value: number): this; + + /** + * Sets the width of this curve. + * @param value The width of this curve. + */ + setWidth(value: number): this; + + /** + * Sets the height of this curve. + * @param value The height of this curve. + */ + setHeight(value: number): this; + + /** + * Sets the start angle of this curve. + * @param value The start angle of this curve, in radians. + */ + setStartAngle(value: number): this; + + /** + * Sets the end angle of this curve. + * @param value The end angle of this curve, in radians. + */ + setEndAngle(value: number): this; + + /** + * Sets if this curve extends clockwise or anti-clockwise. + * @param value The clockwise state of this curve. + */ + setClockwise(value: boolean): this; + + /** + * Sets the rotation of this curve. + * @param value The rotation of this curve, in radians. + */ + setRotation(value: number): this; + + /** + * The x coordinate of the center of the ellipse. + */ + x: number; + + /** + * The y coordinate of the center of the ellipse. + */ + y: number; + + /** + * The horizontal radius of the ellipse. + */ + xRadius: number; + + /** + * The vertical radius of the ellipse. + */ + yRadius: number; + + /** + * The start angle of the ellipse in degrees. + */ + startAngle: number; + + /** + * The end angle of the ellipse in degrees. + */ + endAngle: number; + + /** + * `true` if the ellipse rotation is clockwise or `false` if anti-clockwise. + */ + clockwise: boolean; + + /** + * The rotation of the ellipse, relative to the center, in degrees. + */ + angle: number; + + /** + * The rotation of the ellipse, relative to the center, in radians. + */ + rotation: number; + + /** + * JSON serialization of the curve. + */ + toJSON(): Phaser.Types.Curves.JSONEllipseCurve; + + /** + * Creates a curve from the provided Ellipse Curve Configuration object. + * @param data The JSON object containing this curve data. + */ + static fromJSON(data: Phaser.Types.Curves.JSONEllipseCurve): Phaser.Curves.Ellipse; + + } + + /** + * A LineCurve is a "curve" comprising exactly two points (a line segment). + */ + class Line extends Phaser.Curves.Curve { + /** + * + * @param p0 The first endpoint. + * @param p1 The second endpoint. + */ + constructor(p0: Phaser.Math.Vector2 | number[], p1?: Phaser.Math.Vector2); + + /** + * The first endpoint. + */ + p0: Phaser.Math.Vector2; + + /** + * The second endpoint. + */ + p1: Phaser.Math.Vector2; + + /** + * The quantity of arc length divisions within the curve. + */ + arcLengthDivisions: number; + + /** + * Returns a Rectangle where the position and dimensions match the bounds of this Curve. + * @param out A Rectangle object to store the bounds in. If not given a new Rectangle will be created. + */ + getBounds(out?: O): O; + + /** + * Gets the starting point on the curve. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getStartPoint(out?: O): O; + + /** + * Gets the resolution of the line. + * @param divisions The number of divisions to consider. Default 1. + */ + getResolution(divisions?: number): number; + + /** + * Get point at relative position in curve according to length. + * @param t The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPoint(t: number, out?: O): O; + + /** + * Gets a point at a given position on the line. + * @param u The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPointAt(u: number, out?: O): O; + + /** + * Gets the slope of the line as a unit vector. + * @param t The relative position on the line, [0..1]. + * @param out A vector to store the result in. + */ + getTangent(t?: number, out?: O): O; + + /** + * Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant. + * @param u A float between 0 and 1. + * @param distance The distance, in pixels. + * @param divisions Optional amount of divisions. + */ + getUtoTmapping(u: number, distance: number, divisions?: number): number; + + /** + * Draws this curve on the given Graphics object. + * + * The curve is drawn using `Graphics.lineBetween` so will be drawn at whatever the present Graphics line color is. + * The Graphics object is not cleared before the draw, so the curve will appear on-top of anything else already rendered to it. + * @param graphics The Graphics instance onto which this curve will be drawn. + */ + draw(graphics: G): G; + + /** + * Gets a JSON representation of the line. + */ + toJSON(): Phaser.Types.Curves.JSONCurve; + + /** + * Configures this line from a JSON representation. + * @param data The JSON object containing this curve data. + */ + static fromJSON(data: Phaser.Types.Curves.JSONCurve): Phaser.Curves.Line; + + } + + /** + * A MoveTo Curve is a very simple curve consisting of only a single point. + * Its intended use is to move the ending point in a Path. + */ + class MoveTo { + /** + * + * @param x `x` pixel coordinate. Default 0. + * @param y `y` pixel coordinate. Default 0. + */ + constructor(x?: number, y?: number); + + /** + * Denotes that this Curve does not influence the bounds, points, and drawing of its parent Path. Must be `false` or some methods in the parent Path will throw errors. + */ + active: boolean; + + /** + * The lone point which this curve consists of. + */ + p0: Phaser.Math.Vector2; + + /** + * Get point at relative position in curve according to length. + * @param t The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPoint(t: number, out?: O): O; + + /** + * Retrieves the point at given position in the curve. This will always return this curve's only point. + * @param u The position in the path to retrieve, between 0 and 1. Not used. + * @param out An optional vector in which to store the point. + */ + getPointAt(u: number, out?: O): O; + + /** + * Gets the resolution of this curve. + */ + getResolution(): number; + + /** + * Gets the length of this curve. + */ + getLength(): number; + + /** + * Converts this curve into a JSON-serializable object. + */ + toJSON(): Phaser.Types.Curves.JSONCurve; + + } + + /** + * A Path combines multiple Curves into one continuous compound curve. + * It does not matter how many Curves are in the Path or what type they are. + * + * A Curve in a Path does not have to start where the previous Curve ends - that is to say, a Path does not + * have to be an uninterrupted curve. Only the order of the Curves influences the actual points on the Path. + */ + class Path { + /** + * + * @param x The X coordinate of the Path's starting point or a {@link Phaser.Types.Curves.JSONPath}. Default 0. + * @param y The Y coordinate of the Path's starting point. Default 0. + */ + constructor(x?: number, y?: number); + + /** + * The name of this Path. + * Empty by default and never populated by Phaser, this is left for developers to use. + */ + name: string; + + /** + * The default number of divisions within a curve. + */ + defaultDivisions: number; + + /** + * The list of Curves which make up this Path. + */ + curves: Phaser.Curves.Curve[]; + + /** + * The cached length of each Curve in the Path. + * + * Used internally by {@link #getCurveLengths}. + */ + cacheLengths: number[]; + + /** + * Automatically closes the path. + */ + autoClose: boolean; + + /** + * The starting point of the Path. + * + * This is not necessarily equivalent to the starting point of the first Curve in the Path. In an empty Path, it's also treated as the ending point. + */ + startPoint: Phaser.Math.Vector2; + + /** + * Appends a Curve to the end of the Path. + * + * The Curve does not have to start where the Path ends or, for an empty Path, at its defined starting point. + * @param curve The Curve to append. + */ + add(curve: Phaser.Curves.Curve): this; + + /** + * Creates a circular Ellipse Curve positioned at the end of the Path. + * @param radius The radius of the circle. + * @param clockwise `true` to create a clockwise circle as opposed to a counter-clockwise circle. Default false. + * @param rotation The rotation of the circle in degrees. Default 0. + */ + circleTo(radius: number, clockwise?: boolean, rotation?: number): this; + + /** + * Ensures that the Path is closed. + * + * A closed Path starts and ends at the same point. If the Path is not closed, a straight Line Curve will be created from the ending point directly to the starting point. During the check, the actual starting point of the Path, i.e. the starting point of the first Curve, will be used as opposed to the Path's defined {@link startPoint}, which could differ. + * + * Calling this method on an empty Path will result in an error. + */ + closePath(): this; + + /** + * Creates a cubic bezier curve starting at the previous end point and ending at p3, using p1 and p2 as control points. + * @param x The x coordinate of the end point. Or, if a Vector2, the p1 value. + * @param y The y coordinate of the end point. Or, if a Vector2, the p2 value. + * @param control1X The x coordinate of the first control point. Or, if a Vector2, the p3 value. + * @param control1Y The y coordinate of the first control point. Not used if Vector2s are provided as the first 3 arguments. + * @param control2X The x coordinate of the second control point. Not used if Vector2s are provided as the first 3 arguments. + * @param control2Y The y coordinate of the second control point. Not used if Vector2s are provided as the first 3 arguments. + */ + cubicBezierTo(x: number | Phaser.Math.Vector2, y: number | Phaser.Math.Vector2, control1X: number | Phaser.Math.Vector2, control1Y?: number, control2X?: number, control2Y?: number): this; + + /** + * Creates a Quadratic Bezier Curve starting at the ending point of the Path. + * @param x The X coordinate of the second control point or, if it's a `Vector2`, the first control point. + * @param y The Y coordinate of the second control point or, if `x` is a `Vector2`, the second control point. + * @param controlX If `x` is not a `Vector2`, the X coordinate of the first control point. + * @param controlY If `x` is not a `Vector2`, the Y coordinate of the first control point. + */ + quadraticBezierTo(x: number | Phaser.Math.Vector2[], y?: number, controlX?: number, controlY?: number): this; + + /** + * Draws all Curves in the Path to a Graphics Game Object. + * @param graphics The Graphics Game Object to draw to. + * @param pointsTotal The number of points to draw for each Curve. Higher numbers result in a smoother curve but require more processing. Default 32. + */ + draw(graphics: Phaser.GameObjects.Graphics, pointsTotal?: number): G; + + /** + * Creates an ellipse curve positioned at the previous end point, using the given parameters. + * @param xRadius The horizontal radius of ellipse. Default 0. + * @param yRadius The vertical radius of ellipse. Default 0. + * @param startAngle The start angle of the ellipse, in degrees. Default 0. + * @param endAngle The end angle of the ellipse, in degrees. Default 360. + * @param clockwise Whether the ellipse angles are given as clockwise (`true`) or counter-clockwise (`false`). Default false. + * @param rotation The rotation of the ellipse, in degrees. Default 0. + */ + ellipseTo(xRadius?: number, yRadius?: number, startAngle?: number, endAngle?: number, clockwise?: boolean, rotation?: number): this; + + /** + * Creates a Path from a Path Configuration object. + * + * The provided object should be a {@link Phaser.Types.Curves.JSONPath}, as returned by {@link #toJSON}. Providing a malformed object may cause errors. + * @param data The JSON object containing the Path data. + */ + fromJSON(data: Phaser.Types.Curves.JSONPath): this; + + /** + * Returns a Rectangle with a position and size matching the bounds of this Path. + * @param out The Rectangle to store the bounds in. + * @param accuracy The accuracy of the bounds calculations. Higher values are more accurate at the cost of calculation speed. Default 16. + */ + getBounds(out?: O, accuracy?: number): O; + + /** + * Returns an array containing the length of the Path at the end of each Curve. + * + * The result of this method will be cached to avoid recalculating it in subsequent calls. The cache is only invalidated when the {@link #curves} array changes in length, leading to potential inaccuracies if a Curve in the Path is changed, or if a Curve is removed and another is added in its place. + */ + getCurveLengths(): number[]; + + /** + * Returns the Curve that forms the Path at the given normalized location (between 0 and 1). + * @param t The normalized location on the Path, between 0 and 1. + */ + getCurveAt(t: number): Phaser.Curves.Curve | null; + + /** + * Returns the ending point of the Path. + * + * A Path's ending point is equivalent to the ending point of the last Curve in the Path. For an empty Path, the ending point is at the Path's defined {@link #startPoint}. + * @param out The object to store the point in. + */ + getEndPoint(out?: O): O; + + /** + * Returns the total length of the Path. + */ + getLength(): number; + + /** + * Calculates the coordinates of the point at the given normalized location (between 0 and 1) on the Path. + * + * The location is relative to the entire Path, not to an individual Curve. A location of 0.5 is always in the middle of the Path and is thus an equal distance away from both its starting and ending points. In a Path with one Curve, it would be in the middle of the Curve; in a Path with two Curves, it could be anywhere on either one of them depending on their lengths. + * @param t The location of the point to return, between 0 and 1. + * @param out The object in which to store the calculated point. + */ + getPoint(t: number, out?: O): O; + + /** + * Get a sequence of points on the path. + * @param divisions The number of divisions to make per resolution per curve. + * @param stepRate The curve distance between points per curve, implying `divisions`. + */ + getPoints(divisions?: number, stepRate?: number): Phaser.Math.Vector2[]; + + /** + * Returns a randomly chosen point anywhere on the path. This follows the same rules as `getPoint` in that it may return a point on any Curve inside this path. + * + * When calling this method multiple times, the points are not guaranteed to be equally spaced spatially. + * @param out `Vector2` instance that should be used for storing the result. If `undefined` a new `Vector2` will be created. + */ + getRandomPoint(out?: O): O; + + /** + * Divides this Path into a set of equally spaced points, + * + * The resulting points are equally spaced with respect to the points' position on the path, but not necessarily equally spaced spatially. + * @param divisions The amount of points to divide this Path into. Default 40. + */ + getSpacedPoints(divisions?: number): Phaser.Math.Vector2[]; + + /** + * Returns the starting point of the Path. + * @param out `Vector2` instance that should be used for storing the result. If `undefined` a new `Vector2` will be created. + */ + getStartPoint(out?: O): O; + + /** + * Gets a unit vector tangent at a relative position on the path. + * @param t The relative position on the path, [0..1]. + * @param out A vector to store the result in. + */ + getTangent(t: number, out?: O): O; + + /** + * Creates a line curve from the previous end point to x/y. + * @param x The X coordinate of the line's end point, or a `Vector2` / `Vector2Like` containing the entire end point. + * @param y The Y coordinate of the line's end point, if a number was passed as the X parameter. + */ + lineTo(x: number | Phaser.Math.Vector2 | Phaser.Types.Math.Vector2Like, y?: number): this; + + /** + * Creates a spline curve starting at the previous end point, using the given points on the curve. + * @param points The points the newly created spline curve should consist of. + */ + splineTo(points: Phaser.Math.Vector2[]): this; + + /** + * Creates a "gap" in this path from the path's current end point to the given coordinates. + * + * After calling this function, this Path's end point will be equal to the given coordinates + * @param x The X coordinate of the position to move the path's end point to, or a `Vector2` / `Vector2Like` containing the entire new end point. + * @param y The Y coordinate of the position to move the path's end point to, if a number was passed as the X coordinate. + */ + moveTo(x: number | Phaser.Math.Vector2 | Phaser.Types.Math.Vector2Like, y?: number): this; + + /** + * Converts this Path to a JSON object containing the path information and its constituent curves. + */ + toJSON(): Phaser.Types.Curves.JSONPath; + + /** + * cacheLengths must be recalculated. + */ + updateArcLengths(): void; + + /** + * Disposes of this Path, clearing its internal references to objects so they can be garbage-collected. + */ + destroy(): void; + + } + + /** + * A quadratic Bézier curve constructed from two control points. + */ + class QuadraticBezier extends Phaser.Curves.Curve { + /** + * + * @param p0 Start point, or an array of point pairs. + * @param p1 Control Point 1. + * @param p2 Control Point 2. + */ + constructor(p0: Phaser.Math.Vector2 | number[], p1: Phaser.Math.Vector2, p2: Phaser.Math.Vector2); + + /** + * The start point. + */ + p0: Phaser.Math.Vector2; + + /** + * The first control point. + */ + p1: Phaser.Math.Vector2; + + /** + * The second control point. + */ + p2: Phaser.Math.Vector2; + + /** + * Gets the starting point on the curve. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getStartPoint(out?: O): O; + + /** + * Get the resolution of the curve. + * @param divisions Optional divisions value. + */ + getResolution(divisions: number): number; + + /** + * Get point at relative position in curve according to length. + * @param t The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPoint(t: number, out?: O): O; + + /** + * Draws this curve on the given Graphics object. + * + * The curve is drawn using `Graphics.strokePoints` so will be drawn at whatever the present Graphics stroke color is. + * The Graphics object is not cleared before the draw, so the curve will appear on-top of anything else already rendered to it. + * @param graphics `Graphics` object to draw onto. + * @param pointsTotal Number of points to be used for drawing the curve. Higher numbers result in smoother curve but require more processing. Default 32. + */ + draw(graphics: G, pointsTotal?: number): G; + + /** + * Converts the curve into a JSON compatible object. + */ + toJSON(): Phaser.Types.Curves.JSONCurve; + + /** + * Creates a curve from a JSON object, e. g. created by `toJSON`. + * @param data The JSON object containing this curve data. + */ + static fromJSON(data: Phaser.Types.Curves.JSONCurve): Phaser.Curves.QuadraticBezier; + + } + + /** + * Create a smooth 2d spline curve from a series of points. + */ + class Spline extends Phaser.Curves.Curve { + /** + * + * @param points The points that configure the curve. + */ + constructor(points?: Phaser.Math.Vector2[] | number[] | number[][]); + + /** + * The Vector2 points that configure the curve. + */ + points: Phaser.Math.Vector2[]; + + /** + * Add a list of points to the current list of Vector2 points of the curve. + * @param points The points that configure the curve. + */ + addPoints(points: Phaser.Math.Vector2[] | number[] | number[][]): this; + + /** + * Add a point to the current list of Vector2 points of the curve. + * @param x The x coordinate of this curve + * @param y The y coordinate of this curve + */ + addPoint(x: number, y: number): Phaser.Math.Vector2; + + /** + * Gets the starting point on the curve. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getStartPoint(out?: O): O; + + /** + * Get the resolution of the curve. + * @param divisions Optional divisions value. + */ + getResolution(divisions: number): number; + + /** + * Get point at relative position in curve according to length. + * @param t The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPoint(t: number, out?: O): O; + + /** + * Exports a JSON object containing this curve data. + */ + toJSON(): Phaser.Types.Curves.JSONCurve; + + /** + * Imports a JSON object containing this curve data. + * @param data The JSON object containing this curve data. + */ + static fromJSON(data: Phaser.Types.Curves.JSONCurve): Phaser.Curves.Spline; + + } + + } + + namespace Data { + /** + * The Data Manager Component features a means to store pieces of data specific to a Game Object, System or Plugin. + * You can then search, query it, and retrieve the data. The parent must either extend EventEmitter, + * or have a property called `events` that is an instance of it. + */ + class DataManager { + /** + * + * @param parent The object that this DataManager belongs to. + * @param eventEmitter The DataManager's event emitter. + */ + constructor(parent: object, eventEmitter?: Phaser.Events.EventEmitter); + + /** + * The object that this DataManager belongs to. + */ + parent: any; + + /** + * The DataManager's event emitter. + */ + events: Phaser.Events.EventEmitter; + + /** + * The data list. + */ + list: {[key: string]: any}; + + /** + * The public values list. You can use this to access anything you have stored + * in this Data Manager. For example, if you set a value called `gold` you can + * access it via: + * + * ```javascript + * this.data.values.gold; + * ``` + * + * You can also modify it directly: + * + * ```javascript + * this.data.values.gold += 1000; + * ``` + * + * Doing so will emit a `setdata` event from the parent of this Data Manager. + * + * Do not modify this object directly. Adding properties directly to this object will not + * emit any events. Always use `DataManager.set` to create new items the first time around. + */ + values: {[key: string]: any}; + + /** + * Retrieves the value for the given key, or undefined if it doesn't exist. + * + * You can also access values via the `values` object. For example, if you had a key called `gold` you can do either: + * + * ```javascript + * this.data.get('gold'); + * ``` + * + * Or access the value directly: + * + * ```javascript + * this.data.values.gold; + * ``` + * + * You can also pass in an array of keys, in which case an array of values will be returned: + * + * ```javascript + * this.data.get([ 'gold', 'armor', 'health' ]); + * ``` + * + * This approach is useful for destructuring arrays in ES6. + * @param key The key of the value to retrieve, or an array of keys. + */ + get(key: string | string[]): any; + + /** + * Retrieves all data values in a new object. + */ + getAll(): {[key: string]: any}; + + /** + * Queries the DataManager for the values of keys matching the given regular expression. + * @param search A regular expression object. If a non-RegExp object obj is passed, it is implicitly converted to a RegExp by using new RegExp(obj). + */ + query(search: RegExp): {[key: string]: any}; + + /** + * Sets a value for the given key. If the key doesn't already exist in the Data Manager then it is created. + * + * ```javascript + * data.set('name', 'Red Gem Stone'); + * ``` + * + * You can also pass in an object of key value pairs as the first argument: + * + * ```javascript + * data.set({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 }); + * ``` + * + * To get a value back again you can call `get`: + * + * ```javascript + * data.get('gold'); + * ``` + * + * Or you can access the value directly via the `values` property, where it works like any other variable: + * + * ```javascript + * data.values.gold += 50; + * ``` + * + * When the value is first set, a `setdata` event is emitted. + * + * If the key already exists, a `changedata` event is emitted instead, along an event named after the key. + * For example, if you updated an existing key called `PlayerLives` then it would emit the event `changedata-PlayerLives`. + * These events will be emitted regardless if you use this method to set the value, or the direct `values` setter. + * + * Please note that the data keys are case-sensitive and must be valid JavaScript Object property strings. + * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager. + * @param key The key to set the value for. Or an object of key value pairs. If an object the `data` argument is ignored. + * @param data The value to set for the given key. If an object is provided as the key this argument is ignored. + */ + set(key: (string|T), data?: any): this; + + /** + * Increase a value for the given key. If the key doesn't already exist in the Data Manager then it is increased from 0. + * + * When the value is first set, a `setdata` event is emitted. + * @param key The key to change the value for. + * @param amount The amount to increase the given key by. Pass a negative value to decrease the key. Default 1. + */ + inc(key: string, amount?: number): this; + + /** + * Toggle a boolean value for the given key. If the key doesn't already exist in the Data Manager then it is toggled from false. + * + * When the value is first set, a `setdata` event is emitted. + * @param key The key to toggle the value for. + */ + toggle(key: string): this; + + /** + * Passes all data entries to the given callback. + * @param callback The function to call. + * @param context Value to use as `this` when executing callback. + * @param args Additional arguments that will be passed to the callback, after the game object, key, and data. + */ + each(callback: DataEachCallback, context?: any, ...args: any[]): this; + + /** + * Merge the given object of key value pairs into this DataManager. + * + * Any newly created values will emit a `setdata` event. Any updated values (see the `overwrite` argument) + * will emit a `changedata` event. + * @param data The data to merge. + * @param overwrite Whether to overwrite existing data. Defaults to true. Default true. + */ + merge(data: {[key: string]: any}, overwrite?: boolean): this; + + /** + * Remove the value for the given key. + * + * If the key is found in this Data Manager it is removed from the internal lists and a + * `removedata` event is emitted. + * + * You can also pass in an array of keys, in which case all keys in the array will be removed: + * + * ```javascript + * this.data.remove([ 'gold', 'armor', 'health' ]); + * ``` + * @param key The key to remove, or an array of keys to remove. + */ + remove(key: string | string[]): this; + + /** + * Retrieves the data associated with the given 'key', deletes it from this Data Manager, then returns it. + * @param key The key of the value to retrieve and delete. + */ + pop(key: string): any; + + /** + * Determines whether the given key is set in this Data Manager. + * + * Please note that the keys are case-sensitive and must be valid JavaScript Object property strings. + * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager. + * @param key The key to check. + */ + has(key: string): boolean; + + /** + * Freeze or unfreeze this Data Manager. A frozen Data Manager will block all attempts + * to create new values or update existing ones. + * @param value Whether to freeze or unfreeze the Data Manager. + */ + setFreeze(value: boolean): this; + + /** + * Delete all data in this Data Manager and unfreeze it. + */ + reset(): this; + + /** + * Destroy this data manager. + */ + destroy(): void; + + /** + * Gets or sets the frozen state of this Data Manager. + * A frozen Data Manager will block all attempts to create new values or update existing ones. + */ + freeze: boolean; + + /** + * Return the total number of entries in this Data Manager. + */ + count: number; + + } + + /** + * The Data Component features a means to store pieces of data specific to a Game Object, System or Plugin. + * You can then search, query it, and retrieve the data. The parent must either extend EventEmitter, + * or have a property called `events` that is an instance of it. + */ + class DataManagerPlugin extends Phaser.Data.DataManager { + /** + * + * @param scene A reference to the Scene that this DataManager belongs to. + */ + constructor(scene: Phaser.Scene); + + /** + * A reference to the Scene that this DataManager belongs to. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene's Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * The Scene that owns this plugin is being destroyed. + * We need to shutdown and then kill off all external references. + */ + destroy(): void; + + } + + namespace Events { + /** + * The Change Data Event. + * + * This event is dispatched by a Data Manager when an item in the data store is changed. + * + * Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for + * a change data event from a Game Object you would use: `sprite.on('changedata', listener)`. + * + * This event is dispatched for all items that change in the Data Manager. + * To listen for the change of a specific item, use the `CHANGE_DATA_KEY_EVENT` event. + */ + const CHANGE_DATA: string; + + /** + * The Change Data Key Event. + * + * This event is dispatched by a Data Manager when an item in the data store is changed. + * + * Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for + * the change of a specific data item from a Game Object you would use: `sprite.on('changedata-key', listener)`, + * where `key` is the unique string key of the data item. For example, if you have a data item stored called `gold` + * then you can listen for `sprite.on('changedata-gold')`. + */ + const CHANGE_DATA_KEY: string; + + /** + * The Data Manager Destroy Event. + * + * The Data Manager will listen for the destroy event from its parent, and then close itself down. + */ + const DESTROY: string; + + /** + * The Remove Data Event. + * + * This event is dispatched by a Data Manager when an item is removed from it. + * + * Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for + * the removal of a data item on a Game Object you would use: `sprite.on('removedata', listener)`. + */ + const REMOVE_DATA: string; + + /** + * The Set Data Event. + * + * This event is dispatched by a Data Manager when a new item is added to the data store. + * + * Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for + * the addition of a new data item on a Game Object you would use: `sprite.on('setdata', listener)`. + */ + const SET_DATA: string; + + } + + } + + namespace Device { + /** + * Determines the audio playback capabilities of the device running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.audio` from within any Scene. + */ + type Audio = { + /** + * Can this device play HTML Audio tags? + */ + audioData: boolean; + /** + * Can this device play EC-3 Dolby Digital Plus files? + */ + dolby: boolean; + /** + * Can this device can play m4a files. + */ + m4a: boolean; + /** + * Can this device can play aac files. + */ + aac: boolean; + /** + * Can this device can play flac files. + */ + flac: boolean; + /** + * Can this device play mp3 files? + */ + mp3: boolean; + /** + * Can this device play ogg files? + */ + ogg: boolean; + /** + * Can this device play opus files? + */ + opus: boolean; + /** + * Can this device play wav files? + */ + wav: boolean; + /** + * Does this device have the Web Audio API? + */ + webAudio: boolean; + /** + * Can this device play webm files? + */ + webm: boolean; + }; + + /** + * Determines the browser type and version running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.browser` from within any Scene. + */ + type Browser = { + /** + * Set to true if running in Chrome. + */ + chrome: boolean; + /** + * Set to true if running in Microsoft Edge browser. + */ + edge: boolean; + /** + * Set to true if running in Firefox. + */ + firefox: boolean; + /** + * Set to true if running in Internet Explorer 11 or less (not Edge). + */ + ie: boolean; + /** + * Set to true if running in Mobile Safari. + */ + mobileSafari: boolean; + /** + * Set to true if running in Opera. + */ + opera: boolean; + /** + * Set to true if running in Safari. + */ + safari: boolean; + /** + * Set to true if running in the Silk browser (as used on the Amazon Kindle) + */ + silk: boolean; + /** + * Set to true if running a Trident version of Internet Explorer (IE11+) + */ + trident: boolean; + /** + * If running in Chrome this will contain the major version number. + */ + chromeVersion: number; + /** + * If running in Firefox this will contain the major version number. + */ + firefoxVersion: number; + /** + * If running in Internet Explorer this will contain the major version number. Beyond IE10 you should use Browser.trident and Browser.tridentVersion. + */ + ieVersion: number; + /** + * If running in Safari this will contain the major version number. + */ + safariVersion: number; + /** + * If running in Internet Explorer 11 this will contain the major version number. See {@link http://msdn.microsoft.com/en-us/library/ie/ms537503(v=vs.85).aspx} + */ + tridentVersion: number; + }; + + /** + * Determines the canvas features of the browser running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.canvasFeatures` from within any Scene. + */ + type CanvasFeatures = { + /** + * Set to true if the browser supports inversed alpha. + */ + supportInverseAlpha: boolean; + /** + * Set to true if the browser supports new canvas blend modes. + */ + supportNewBlendModes: boolean; + }; + + /** + * Determines the features of the browser running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.features` from within any Scene. + */ + type Features = { + /** + * Is canvas available? + */ + canvas: boolean; + /** + * True if canvas supports a 'copy' bitblt onto itself when the source and destination regions overlap. + */ + canvasBitBltShift: boolean | null; + /** + * Is file available? + */ + file: boolean; + /** + * Is fileSystem available? + */ + fileSystem: boolean; + /** + * Does the device support the getUserMedia API? + */ + getUserMedia: boolean; + /** + * Is the device big or little endian? (only detected if the browser supports TypedArrays) + */ + littleEndian: boolean; + /** + * Is localStorage available? + */ + localStorage: boolean; + /** + * Is Pointer Lock available? + */ + pointerLock: boolean; + /** + * Is Array.sort stable? + */ + stableSort: boolean; + /** + * Does the device context support 32bit pixel manipulation using array buffer views? + */ + support32bit: boolean; + /** + * Does the device support the Vibration API? + */ + vibration: boolean; + /** + * Is webGL available? + */ + webGL: boolean; + /** + * Is worker available? + */ + worker: boolean; + }; + + /** + * Determines the full screen support of the browser running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.fullscreen` from within any Scene. + */ + type Fullscreen = { + /** + * Does the browser support the Full Screen API? + */ + available: boolean; + /** + * Does the browser support access to the Keyboard during Full Screen mode? + */ + keyboard: boolean; + /** + * If the browser supports the Full Screen API this holds the call you need to use to cancel it. + */ + cancel: string; + /** + * If the browser supports the Full Screen API this holds the call you need to use to activate it. + */ + request: string; + }; + + /** + * Determines the input support of the browser running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.input` from within any Scene. + */ + type Input = { + /** + * The newest type of Wheel/Scroll event supported: 'wheel', 'mousewheel', 'DOMMouseScroll' + */ + wheelType: string | null; + /** + * Is navigator.getGamepads available? + */ + gamepads: boolean; + /** + * Is mspointer available? + */ + mspointer: boolean; + /** + * Is touch available? + */ + touch: boolean; + }; + + /** + * Determines the operating system of the device running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.os` from within any Scene. + */ + type OS = { + /** + * Is running on android? + */ + android: boolean; + /** + * Is running on chromeOS? + */ + chromeOS: boolean; + /** + * Is the game running under Apache Cordova? + */ + cordova: boolean; + /** + * Is the game running under the Intel Crosswalk XDK? + */ + crosswalk: boolean; + /** + * Is running on a desktop? + */ + desktop: boolean; + /** + * Is the game running under Ejecta? + */ + ejecta: boolean; + /** + * Is the game running under GitHub Electron? + */ + electron: boolean; + /** + * Is running on iOS? + */ + iOS: boolean; + /** + * Is running on iPad? + */ + iPad: boolean; + /** + * Is running on iPhone? + */ + iPhone: boolean; + /** + * Is running on an Amazon Kindle? + */ + kindle: boolean; + /** + * Is running on linux? + */ + linux: boolean; + /** + * Is running on macOS? + */ + macOS: boolean; + /** + * Is the game running under Node.js? + */ + node: boolean; + /** + * Is the game running under Node-Webkit? + */ + nodeWebkit: boolean; + /** + * Set to true if running as a WebApp, i.e. within a WebView + */ + webApp: boolean; + /** + * Is running on windows? + */ + windows: boolean; + /** + * Is running on a Windows Phone? + */ + windowsPhone: boolean; + /** + * If running in iOS this will contain the major version number. + */ + iOSVersion: number; + /** + * PixelRatio of the host device? + */ + pixelRatio: number; + }; + + /** + * Determines the video support of the browser running this Phaser Game instance. + * + * These values are read-only and populated during the boot sequence of the game. + * + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.video` from within any Scene. + * + * In Phaser 3.20 the properties were renamed to drop the 'Video' suffix. + */ + type Video = { + /** + * Can this device play h264 mp4 video files? + */ + h264: boolean; + /** + * Can this device play hls video files? + */ + hls: boolean; + /** + * Can this device play h264 mp4 video files? + */ + mp4: boolean; + /** + * Can this device play m4v (typically mp4) video files? + */ + m4v: boolean; + /** + * Can this device play ogg video files? + */ + ogg: boolean; + /** + * Can this device play vp9 video files? + */ + vp9: boolean; + /** + * Can this device play webm video files? + */ + webm: boolean; + /** + * Returns the first video URL that can be played by this browser. + */ + getVideoURL: Function; + }; + + } + + type DeviceConf = { + /** + * The OS Device functions. + */ + os: Phaser.Device.OS; + /** + * The Browser Device functions. + */ + browser: Phaser.Device.Browser; + /** + * The Features Device functions. + */ + features: Phaser.Device.Features; + /** + * The Input Device functions. + */ + input: Phaser.Device.Input; + /** + * The Audio Device functions. + */ + audio: Phaser.Device.Audio; + /** + * The Video Device functions. + */ + video: Phaser.Device.Video; + /** + * The Fullscreen Device functions. + */ + fullscreen: Phaser.Device.Fullscreen; + /** + * The Canvas Device functions. + */ + canvasFeatures: Phaser.Device.CanvasFeatures; + }; + + namespace Display { + namespace Align { + /** + * A constant representing a top-left alignment or position. + */ + const TOP_LEFT: number; + + /** + * A constant representing a top-center alignment or position. + */ + const TOP_CENTER: number; + + /** + * A constant representing a top-right alignment or position. + */ + const TOP_RIGHT: number; + + /** + * A constant representing a left-top alignment or position. + */ + const LEFT_TOP: number; + + /** + * A constant representing a left-center alignment or position. + */ + const LEFT_CENTER: number; + + /** + * A constant representing a left-bottom alignment or position. + */ + const LEFT_BOTTOM: number; + + /** + * A constant representing a center alignment or position. + */ + const CENTER: number; + + /** + * A constant representing a right-top alignment or position. + */ + const RIGHT_TOP: number; + + /** + * A constant representing a right-center alignment or position. + */ + const RIGHT_CENTER: number; + + /** + * A constant representing a right-bottom alignment or position. + */ + const RIGHT_BOTTOM: number; + + /** + * A constant representing a bottom-left alignment or position. + */ + const BOTTOM_LEFT: number; + + /** + * A constant representing a bottom-center alignment or position. + */ + const BOTTOM_CENTER: number; + + /** + * A constant representing a bottom-right alignment or position. + */ + const BOTTOM_RIGHT: number; + + namespace In { + /** + * Takes given Game Object and aligns it so that it is positioned in the bottom center of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function BottomCenter(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the bottom left of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function BottomLeft(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the bottom right of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function BottomRight(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the center of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function Center(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the left center of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function LeftCenter(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned relative to the other. + * The alignment used is based on the `position` argument, which is an `ALIGN_CONST` value, such as `LEFT_CENTER` or `TOP_RIGHT`. + * @param child The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param position The position to align the Game Object with. This is an align constant, such as `ALIGN_CONST.LEFT_CENTER`. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function QuickSet(child: G, alignIn: Phaser.GameObjects.GameObject, position: number, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the right center of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function RightCenter(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the top center of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function TopCenter(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the top left of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function TopLeft(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the top right of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function TopRight(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + } + + namespace To { + /** + * Takes given Game Object and aligns it so that it is positioned next to the bottom center position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function BottomCenter(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the bottom left position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function BottomLeft(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the bottom right position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function BottomRight(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the left bottom position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function LeftBottom(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the left center position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function LeftCenter(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the left top position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function LeftTop(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes a Game Object and aligns it next to another, at the given position. + * The alignment used is based on the `position` argument, which is a `Phaser.Display.Align` property such as `LEFT_CENTER` or `TOP_RIGHT`. + * @param child The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param position The position to align the Game Object with. This is an align constant, such as `Phaser.Display.Align.LEFT_CENTER`. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function QuickSet(child: G, alignTo: Phaser.GameObjects.GameObject, position: number, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the right bottom position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function RightBottom(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the right center position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function RightCenter(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the right top position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function RightTop(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the top center position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function TopCenter(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the top left position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function TopLeft(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the top right position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function TopRight(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + } + + } + + namespace Bounds { + /** + * Positions the Game Object so that it is centered on the given coordinates. + * @param gameObject The Game Object that will be re-positioned. + * @param x The horizontal coordinate to position the Game Object on. + * @param y The vertical coordinate to position the Game Object on. + */ + function CenterOn(gameObject: G, x: number, y: number): G; + + /** + * Returns the bottom coordinate from the bounds of the Game Object. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetBottom(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the unrotated bounds of the Game Object as a rectangle. + * @param gameObject The Game Object to get the bounds value from. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + function GetBounds(gameObject: Phaser.GameObjects.GameObject, output?: Phaser.Geom.Rectangle | object): Phaser.Geom.Rectangle | object; + + /** + * Returns the center x coordinate from the bounds of the Game Object. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetCenterX(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the center y coordinate from the bounds of the Game Object. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetCenterY(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the left coordinate from the bounds of the Game Object. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetLeft(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the amount the Game Object is visually offset from its x coordinate. + * This is the same as `width * origin.x`. + * This value will only be > 0 if `origin.x` is not equal to zero. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetOffsetX(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the amount the Game Object is visually offset from its y coordinate. + * This is the same as `width * origin.y`. + * This value will only be > 0 if `origin.y` is not equal to zero. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetOffsetY(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the right coordinate from the bounds of the Game Object. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetRight(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the top coordinate from the bounds of the Game Object. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetTop(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Positions the Game Object so that the bottom of its bounds aligns with the given coordinate. + * @param gameObject The Game Object that will be re-positioned. + * @param value The coordinate to position the Game Object bounds on. + */ + function SetBottom(gameObject: G, value: number): G; + + /** + * Positions the Game Object so that the center top of its bounds aligns with the given coordinate. + * @param gameObject The Game Object that will be re-positioned. + * @param x The coordinate to position the Game Object bounds on. + */ + function SetCenterX(gameObject: G, x: number): G; + + /** + * Positions the Game Object so that the center top of its bounds aligns with the given coordinate. + * @param gameObject The Game Object that will be re-positioned. + * @param y The coordinate to position the Game Object bounds on. + */ + function SetCenterY(gameObject: G, y: number): G; + + /** + * Positions the Game Object so that the left of its bounds aligns with the given coordinate. + * @param gameObject The Game Object that will be re-positioned. + * @param value The coordinate to position the Game Object bounds on. + */ + function SetLeft(gameObject: G, value: number): G; + + /** + * Positions the Game Object so that the left of its bounds aligns with the given coordinate. + * @param gameObject The Game Object that will be re-positioned. + * @param value The coordinate to position the Game Object bounds on. + */ + function SetRight(gameObject: G, value: number): G; + + /** + * Positions the Game Object so that the top of its bounds aligns with the given coordinate. + * @param gameObject The Game Object that will be re-positioned. + * @param value The coordinate to position the Game Object bounds on. + */ + function SetTop(gameObject: G, value: number): G; + + } + + namespace Canvas { + namespace CanvasInterpolation { + /** + * Sets the CSS image-rendering property on the given canvas to be 'crisp' (aka 'optimize contrast' on webkit). + * @param canvas The canvas object to have the style set on. + */ + function setCrisp(canvas: HTMLCanvasElement): HTMLCanvasElement; + + /** + * Sets the CSS image-rendering property on the given canvas to be 'bicubic' (aka 'auto'). + * @param canvas The canvas object to have the style set on. + */ + function setBicubic(canvas: HTMLCanvasElement): HTMLCanvasElement; + + } + + /** + * The CanvasPool is a global static object, that allows Phaser to recycle and pool 2D Context Canvas DOM elements. + * It does not pool WebGL Contexts, because once the context options are set they cannot be modified again, + * which is useless for some of the Phaser pipelines / renderer. + * + * This singleton is instantiated as soon as Phaser loads, before a Phaser.Game instance has even been created. + * Which means all instances of Phaser Games on the same page can share the one single pool. + */ + namespace CanvasPool { + /** + * Creates a new Canvas DOM element, or pulls one from the pool if free. + * @param parent The parent of the Canvas object. + * @param width The width of the Canvas. Default 1. + * @param height The height of the Canvas. Default 1. + * @param canvasType The type of the Canvas. Either `Phaser.CANVAS` or `Phaser.WEBGL`. Default Phaser.CANVAS. + * @param selfParent Use the generated Canvas element as the parent? Default false. + */ + function create(parent: any, width?: number, height?: number, canvasType?: number, selfParent?: boolean): HTMLCanvasElement; + + /** + * Creates a new Canvas DOM element, or pulls one from the pool if free. + * @param parent The parent of the Canvas object. + * @param width The width of the Canvas. Default 1. + * @param height The height of the Canvas. Default 1. + */ + function create2D(parent: any, width?: number, height?: number): HTMLCanvasElement; + + /** + * Creates a new Canvas DOM element, or pulls one from the pool if free. + * @param parent The parent of the Canvas object. + * @param width The width of the Canvas. Default 1. + * @param height The height of the Canvas. Default 1. + */ + function createWebGL(parent: any, width?: number, height?: number): HTMLCanvasElement; + + /** + * Gets the first free canvas index from the pool. + * @param canvasType The type of the Canvas. Either `Phaser.CANVAS` or `Phaser.WEBGL`. Default Phaser.CANVAS. + */ + function first(canvasType?: number): HTMLCanvasElement; + + /** + * Looks up a canvas based on its parent, and if found puts it back in the pool, freeing it up for re-use. + * The canvas has its width and height set to 1, and its parent attribute nulled. + * @param parent The canvas or the parent of the canvas to free. + */ + function remove(parent: any): void; + + /** + * Gets the total number of used canvas elements in the pool. + */ + function total(): number; + + /** + * Gets the total number of free canvas elements in the pool. + */ + function free(): number; + + /** + * Disable context smoothing on any new Canvas element created. + */ + function disableSmoothing(): void; + + /** + * Enable context smoothing on any new Canvas element created. + */ + function enableSmoothing(): void; + + } + + namespace Smoothing { + /** + * Gets the Smoothing Enabled vendor prefix being used on the given context, or null if not set. + * @param context The canvas context to check. + */ + function getPrefix(context: CanvasRenderingContext2D | WebGLRenderingContext): string; + + /** + * Sets the Image Smoothing property on the given context. Set to false to disable image smoothing. + * By default browsers have image smoothing enabled, which isn't always what you visually want, especially + * when using pixel art in a game. Note that this sets the property on the context itself, so that any image + * drawn to the context will be affected. This sets the property across all current browsers but support is + * patchy on earlier browsers, especially on mobile. + * @param context The context on which to enable smoothing. + */ + function enable(context: CanvasRenderingContext2D | WebGLRenderingContext): CanvasRenderingContext2D | WebGLRenderingContext; + + /** + * Sets the Image Smoothing property on the given context. Set to false to disable image smoothing. + * By default browsers have image smoothing enabled, which isn't always what you visually want, especially + * when using pixel art in a game. Note that this sets the property on the context itself, so that any image + * drawn to the context will be affected. This sets the property across all current browsers but support is + * patchy on earlier browsers, especially on mobile. + * @param context The context on which to disable smoothing. + */ + function disable(context: CanvasRenderingContext2D | WebGLRenderingContext): CanvasRenderingContext2D | WebGLRenderingContext; + + /** + * Returns `true` if the given context has image smoothing enabled, otherwise returns `false`. + * Returns null if no smoothing prefix is available. + * @param context The context to check. + */ + function isEnabled(context: CanvasRenderingContext2D | WebGLRenderingContext): boolean | null; + + } + + /** + * Sets the touch-action property on the canvas style. Can be used to disable default browser touch actions. + * @param canvas The canvas element to have the style applied to. + * @param value The touch action value to set on the canvas. Set to `none` to disable touch actions. Default 'none'. + */ + function TouchAction(canvas: HTMLCanvasElement, value?: string): HTMLCanvasElement; + + /** + * Sets the user-select property on the canvas style. Can be used to disable default browser selection actions. + * @param canvas The canvas element to have the style applied to. + * @param value The touch callout value to set on the canvas. Set to `none` to disable touch callouts. Default 'none'. + */ + function UserSelect(canvas: HTMLCanvasElement, value?: string): HTMLCanvasElement; + + } + + namespace Color { + namespace Interpolate { + /** + * Interpolates between the two given color ranges over the length supplied. + * @param r1 Red value. + * @param g1 Blue value. + * @param b1 Green value. + * @param r2 Red value. + * @param g2 Blue value. + * @param b2 Green value. + * @param length Distance to interpolate over. Default 100. + * @param index Index to start from. Default 0. + */ + function RGBWithRGB(r1: number, g1: number, b1: number, r2: number, g2: number, b2: number, length?: number, index?: number): Phaser.Types.Display.ColorObject; + + /** + * Interpolates between the two given color objects over the length supplied. + * @param color1 The first Color object. + * @param color2 The second Color object. + * @param length Distance to interpolate over. Default 100. + * @param index Index to start from. Default 0. + */ + function ColorWithColor(color1: Phaser.Display.Color, color2: Phaser.Display.Color, length?: number, index?: number): Phaser.Types.Display.ColorObject; + + /** + * Interpolates between the Color object and color values over the length supplied. + * @param color1 The first Color object. + * @param r Red value. + * @param g Blue value. + * @param b Green value. + * @param length Distance to interpolate over. Default 100. + * @param index Index to start from. Default 0. + */ + function ColorWithRGB(color1: Phaser.Display.Color, r: number, g: number, b: number, length?: number, index?: number): Phaser.Types.Display.ColorObject; + + } + + } + + /** + * The Color class holds a single color value and allows for easy modification and reading of it. + */ + class Color { + /** + * + * @param red The red color value. A number between 0 and 255. Default 0. + * @param green The green color value. A number between 0 and 255. Default 0. + * @param blue The blue color value. A number between 0 and 255. Default 0. + * @param alpha The alpha value. A number between 0 and 255. Default 255. + */ + constructor(red?: number, green?: number, blue?: number, alpha?: number); + + /** + * An array containing the calculated color values for WebGL use. + */ + gl: number[]; + + /** + * Sets this color to be transparent. Sets all values to zero. + */ + transparent(): Phaser.Display.Color; + + /** + * Sets the color of this Color component. + * @param red The red color value. A number between 0 and 255. + * @param green The green color value. A number between 0 and 255. + * @param blue The blue color value. A number between 0 and 255. + * @param alpha The alpha value. A number between 0 and 255. Default 255. + * @param updateHSV Update the HSV values after setting the RGB values? Default true. + */ + setTo(red: number, green: number, blue: number, alpha?: number, updateHSV?: boolean): Phaser.Display.Color; + + /** + * Sets the red, green, blue and alpha GL values of this Color component. + * @param red The red color value. A number between 0 and 1. + * @param green The green color value. A number between 0 and 1. + * @param blue The blue color value. A number between 0 and 1. + * @param alpha The alpha value. A number between 0 and 1. Default 1. + */ + setGLTo(red: number, green: number, blue: number, alpha?: number): Phaser.Display.Color; + + /** + * Sets the color based on the color object given. + * @param color An object containing `r`, `g`, `b` and optionally `a` values in the range 0 to 255. + */ + setFromRGB(color: Phaser.Types.Display.InputColorObject): Phaser.Display.Color; + + /** + * Sets the color based on the hue, saturation and lightness values given. + * @param h The hue, in the range 0 - 1. This is the base color. + * @param s The saturation, in the range 0 - 1. This controls how much of the hue will be in the final color, where 1 is fully saturated and 0 will give you white. + * @param v The value, in the range 0 - 1. This controls how dark the color is. Where 1 is as bright as possible and 0 is black. + */ + setFromHSV(h: number, s: number, v: number): Phaser.Display.Color; + + /** + * Returns a new Color component using the values from this one. + */ + clone(): Phaser.Display.Color; + + /** + * Sets this Color object to be grayscaled based on the shade value given. + * @param shade A value between 0 and 255. + */ + gray(shade: number): Phaser.Display.Color; + + /** + * Sets this Color object to be a random color between the `min` and `max` values given. + * @param min The minimum random color value. Between 0 and 255. Default 0. + * @param max The maximum random color value. Between 0 and 255. Default 255. + */ + random(min?: number, max?: number): Phaser.Display.Color; + + /** + * Sets this Color object to be a random grayscale color between the `min` and `max` values given. + * @param min The minimum random color value. Between 0 and 255. Default 0. + * @param max The maximum random color value. Between 0 and 255. Default 255. + */ + randomGray(min?: number, max?: number): Phaser.Display.Color; + + /** + * Increase the saturation of this Color by the percentage amount given. + * The saturation is the amount of the base color in the hue. + * @param amount The percentage amount to change this color by. A value between 0 and 100. + */ + saturate(amount: number): Phaser.Display.Color; + + /** + * Decrease the saturation of this Color by the percentage amount given. + * The saturation is the amount of the base color in the hue. + * @param amount The percentage amount to change this color by. A value between 0 and 100. + */ + desaturate(amount: number): Phaser.Display.Color; + + /** + * Increase the lightness of this Color by the percentage amount given. + * @param amount The percentage amount to change this color by. A value between 0 and 100. + */ + lighten(amount: number): Phaser.Display.Color; + + /** + * Decrease the lightness of this Color by the percentage amount given. + * @param amount The percentage amount to change this color by. A value between 0 and 100. + */ + darken(amount: number): Phaser.Display.Color; + + /** + * Brighten this Color by the percentage amount given. + * @param amount The percentage amount to change this color by. A value between 0 and 100. + */ + brighten(amount: number): Phaser.Display.Color; + + /** + * The color of this Color component, not including the alpha channel. + */ + readonly color: number; + + /** + * The color of this Color component, including the alpha channel. + */ + readonly color32: number; + + /** + * The color of this Color component as a string which can be used in CSS color values. + */ + readonly rgba: string; + + /** + * The red color value, normalized to the range 0 to 1. + */ + redGL: number; + + /** + * The green color value, normalized to the range 0 to 1. + */ + greenGL: number; + + /** + * The blue color value, normalized to the range 0 to 1. + */ + blueGL: number; + + /** + * The alpha color value, normalized to the range 0 to 1. + */ + alphaGL: number; + + /** + * The red color value, normalized to the range 0 to 255. + */ + red: number; + + /** + * The green color value, normalized to the range 0 to 255. + */ + green: number; + + /** + * The blue color value, normalized to the range 0 to 255. + */ + blue: number; + + /** + * The alpha color value, normalized to the range 0 to 255. + */ + alpha: number; + + /** + * The hue color value. A number between 0 and 1. + * This is the base color. + */ + h: number; + + /** + * The saturation color value. A number between 0 and 1. + * This controls how much of the hue will be in the final color, where 1 is fully saturated and 0 will give you white. + */ + s: number; + + /** + * The lightness color value. A number between 0 and 1. + * This controls how dark the color is. Where 1 is as bright as possible and 0 is black. + */ + v: number; + + /** + * Return an array of Colors in a Color Spectrum. + * + * The spectrum colors flow in the order: red, yellow, green, blue. + * + * By default this function will return an array with 1024 elements in. + * + * However, you can reduce this to a smaller quantity if needed, by specitying the `limit` parameter. + * @param limit How many colors should be returned? The maximum is 1024 but you can set a smaller quantity if required. Default 1024. + */ + static ColorSpectrum(limit?: number): Phaser.Types.Display.ColorObject[]; + + /** + * Converts the given color value into an Object containing r,g,b and a properties. + * @param color A color value, optionally including the alpha value. + */ + static ColorToRGBA(color: number): Phaser.Types.Display.ColorObject; + + /** + * Returns a string containing a hex representation of the given color component. + * @param color The color channel to get the hex value for, must be a value between 0 and 255. + */ + static ComponentToHex(color: number): string; + + /** + * Given 3 separate color values this will return an integer representation of it. + * @param red The red color value. A number between 0 and 255. + * @param green The green color value. A number between 0 and 255. + * @param blue The blue color value. A number between 0 and 255. + */ + static GetColor(red: number, green: number, blue: number): number; + + /** + * Given an alpha and 3 color values this will return an integer representation of it. + * @param red The red color value. A number between 0 and 255. + * @param green The green color value. A number between 0 and 255. + * @param blue The blue color value. A number between 0 and 255. + * @param alpha The alpha color value. A number between 0 and 255. + */ + static GetColor32(red: number, green: number, blue: number, alpha: number): number; + + /** + * Converts a hex string into a Phaser Color object. + * + * The hex string can supplied as `'#0033ff'` or the short-hand format of `'#03f'`; it can begin with an optional "#" or "0x", or be unprefixed. + * + * An alpha channel is _not_ supported. + * @param hex The hex color value to convert, such as `#0033ff` or the short-hand format: `#03f`. + */ + static HexStringToColor(hex: string): Phaser.Display.Color; + + /** + * Converts HSL (hue, saturation and lightness) values to a Phaser Color object. + * @param h The hue value in the range 0 to 1. + * @param s The saturation value in the range 0 to 1. + * @param l The lightness value in the range 0 to 1. + */ + static HSLToColor(h: number, s: number, l: number): Phaser.Display.Color; + + /** + * Generates an HSV color wheel which is an array of 360 Color objects, for each step of the wheel. + * @param s The saturation, in the range 0 - 1. Default 1. + * @param v The value, in the range 0 - 1. Default 1. + */ + static HSVColorWheel(s?: number, v?: number): Phaser.Types.Display.ColorObject[]; + + /** + * Converts a HSV (hue, saturation and value) color set to RGB. + * + * Conversion formula from https://en.wikipedia.org/wiki/HSL_and_HSV + * + * Assumes HSV values are contained in the set [0, 1]. + * @param h The hue, in the range 0 - 1. This is the base color. + * @param s The saturation, in the range 0 - 1. This controls how much of the hue will be in the final color, where 1 is fully saturated and 0 will give you white. + * @param v The value, in the range 0 - 1. This controls how dark the color is. Where 1 is as bright as possible and 0 is black. + * @param out A Color object to store the results in. If not given a new ColorObject will be created. + */ + static HSVToRGB(h: number, s: number, v: number, out?: Phaser.Types.Display.ColorObject | Phaser.Display.Color): Phaser.Types.Display.ColorObject | Phaser.Display.Color; + + /** + * Converts a hue to an RGB color. + * Based on code by Michael Jackson (https://github.com/mjijackson) + */ + static HueToComponent(p: number, q: number, t: number): number; + + /** + * Converts the given color value into an instance of a Color object. + * @param input The color value to convert into a Color object. + */ + static IntegerToColor(input: number): Phaser.Display.Color; + + /** + * Return the component parts of a color as an Object with the properties alpha, red, green, blue. + * + * Alpha will only be set if it exists in the given color (0xAARRGGBB) + * @param input The color value to convert into a Color object. + */ + static IntegerToRGB(input: number): Phaser.Types.Display.ColorObject; + + /** + * Converts an object containing `r`, `g`, `b` and `a` properties into a Color class instance. + * @param input An object containing `r`, `g`, `b` and `a` properties in the range 0 to 255. + */ + static ObjectToColor(input: Phaser.Types.Display.InputColorObject): Phaser.Display.Color; + + /** + * Creates a new Color object where the r, g, and b values have been set to random values + * based on the given min max values. + * @param min The minimum value to set the random range from (between 0 and 255) Default 0. + * @param max The maximum value to set the random range from (between 0 and 255) Default 255. + */ + static RandomRGB(min?: number, max?: number): Phaser.Display.Color; + + /** + * Converts a CSS 'web' string into a Phaser Color object. + * + * The web string can be in the format `'rgb(r,g,b)'` or `'rgba(r,g,b,a)'` where r/g/b are in the range [0..255] and a is in the range [0..1]. + * @param rgb The CSS format color string, using the `rgb` or `rgba` format. + */ + static RGBStringToColor(rgb: string): Phaser.Display.Color; + + /** + * Converts an RGB color value to HSV (hue, saturation and value). + * Conversion formula from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes RGB values are contained in the set [0, 255] and returns h, s and v in the set [0, 1]. + * Based on code by Michael Jackson (https://github.com/mjijackson) + * @param r The red color value. A number between 0 and 255. + * @param g The green color value. A number between 0 and 255. + * @param b The blue color value. A number between 0 and 255. + * @param out An object to store the color values in. If not given an HSV Color Object will be created. + */ + static RGBToHSV(r: number, g: number, b: number, out?: Phaser.Types.Display.HSVColorObject | Phaser.Display.Color): Phaser.Types.Display.HSVColorObject | Phaser.Display.Color; + + /** + * Converts the color values into an HTML compatible color string, prefixed with either `#` or `0x`. + * @param r The red color value. A number between 0 and 255. + * @param g The green color value. A number between 0 and 255. + * @param b The blue color value. A number between 0 and 255. + * @param a The alpha value. A number between 0 and 255. Default 255. + * @param prefix The prefix of the string. Either `#` or `0x`. Default #. + */ + static RGBToString(r: number, g: number, b: number, a?: number, prefix?: string): string; + + /** + * Converts the given source color value into an instance of a Color class. + * The value can be either a string, prefixed with `rgb` or a hex string, a number or an Object. + * @param input The source color value to convert. + */ + static ValueToColor(input: string | number | Phaser.Types.Display.InputColorObject): Phaser.Display.Color; + + } + + /** + * The ColorMatrix class creates a 5x4 matrix that can be used in shaders and graphics + * operations. It provides methods required to modify the color values, such as adjusting + * the brightness, setting a sepia tone, hue rotation and more. + * + * Use the method `getData` to return a Float32Array containing the current color values. + */ + class ColorMatrix { + /** + * The value that determines how much of the original color is used + * when mixing the colors. A value between 0 (all original) and 1 (all final) + */ + alpha: number; + + /** + * Sets this ColorMatrix from the given array of color values. + * @param value The ColorMatrix values to set. Must have 20 elements. + */ + set(value: number[] | Float32Array): this; + + /** + * Resets the ColorMatrix to default values and also resets + * the `alpha` property back to 1. + */ + reset(): this; + + /** + * Gets the ColorMatrix as a Float32Array. + * + * Can be used directly as a 1fv shader uniform value. + */ + getData(): Float32Array; + + /** + * Changes the brightness of this ColorMatrix by the given amount. + * @param value The amount of brightness to apply to this ColorMatrix. Between 0 (black) and 1. Default 0. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + brightness(value?: number, multiply?: boolean): this; + + /** + * Changes the saturation of this ColorMatrix by the given amount. + * @param value The amount of saturation to apply to this ColorMatrix. Default 0. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + saturate(value?: number, multiply?: boolean): this; + + /** + * Desaturates this ColorMatrix (removes color from it). + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + saturation(multiply?: boolean): this; + + /** + * Rotates the hues of this ColorMatrix by the value given. + * @param rotation The amount of hue rotation to apply to this ColorMatrix, in degrees. Default 0. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + hue(rotation?: number, multiply?: boolean): this; + + /** + * Sets this ColorMatrix to be grayscale. + * @param value The grayscale scale (0 is black). Default 1. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + grayscale(value?: number, multiply?: boolean): this; + + /** + * Sets this ColorMatrix to be black and white. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + blackWhite(multiply?: boolean): this; + + /** + * Change the contrast of this ColorMatrix by the amount given. + * @param value The amount of contrast to apply to this ColorMatrix. Default 0. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + contrast(value?: number, multiply?: boolean): this; + + /** + * Converts this ColorMatrix to have negative values. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + negative(multiply?: boolean): this; + + /** + * Apply a desaturated luminance to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + desaturateLuminance(multiply?: boolean): this; + + /** + * Applies a sepia tone to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + sepia(multiply?: boolean): this; + + /** + * Applies a night vision tone to this ColorMatrix. + * @param intensity The intensity of this effect. Default 0.1. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + night(intensity?: number, multiply?: boolean): this; + + /** + * Applies a trippy color tone to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + lsd(multiply?: boolean): this; + + /** + * Applies a brown tone to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + brown(multiply?: boolean): this; + + /** + * Applies a vintage pinhole color effect to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + vintagePinhole(multiply?: boolean): this; + + /** + * Applies a kodachrome color effect to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + kodachrome(multiply?: boolean): this; + + /** + * Applies a technicolor color effect to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + technicolor(multiply?: boolean): this; + + /** + * Applies a polaroid color effect to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + polaroid(multiply?: boolean): this; + + /** + * Shifts the values of this ColorMatrix into BGR order. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + shiftToBGR(multiply?: boolean): this; + + /** + * Multiplies the two given matrices. + * @param a The 5x4 array to multiply with ColorMatrix._matrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + multiply(a: number[], multiply?: boolean): this; + + /** + * A constant array used by the ColorMatrix class for black_white operations. + */ + static readonly BLACK_WHITE: number[]; + + /** + * A constant array used by the ColorMatrix class for negative operations. + */ + static readonly NEGATIVE: number[]; + + /** + * A constant array used by the ColorMatrix class for desatured luminance operations. + */ + static readonly DESATURATE_LUMINANCE: number[]; + + /** + * A constant array used by the ColorMatrix class for sepia operations. + */ + static readonly SEPIA: number[]; + + /** + * A constant array used by the ColorMatrix class for lsd operations. + */ + static readonly LSD: number[]; + + /** + * A constant array used by the ColorMatrix class for brown operations. + */ + static readonly BROWN: number[]; + + /** + * A constant array used by the ColorMatrix class for vintage pinhole operations. + */ + static readonly VINTAGE: number[]; + + /** + * A constant array used by the ColorMatrix class for kodachrome operations. + */ + static readonly KODACHROME: number[]; + + /** + * A constant array used by the ColorMatrix class for technicolor operations. + */ + static readonly TECHNICOLOR: number[]; + + /** + * A constant array used by the ColorMatrix class for polaroid shift operations. + */ + static readonly POLAROID: number[]; + + /** + * A constant array used by the ColorMatrix class for shift BGR operations. + */ + static readonly SHIFT_BGR: number[]; + + } + + namespace Masks { + /** + * A Bitmap Mask combines the alpha (opacity) of a masked pixel with the alpha of another pixel. + * Unlike the Geometry Mask, which is a clipping path, a Bitmap Mask behaves like an alpha mask, + * not a clipping path. It is only available when using the WebGL Renderer. + * + * A Bitmap Mask can use any Game Object or Dynamic Texture to determine the alpha of each pixel of the masked Game Object(s). + * For any given point of a masked Game Object's texture, the pixel's alpha will be multiplied by the alpha + * of the pixel at the same position in the Bitmap Mask's Game Object. The color of the pixel from the + * Bitmap Mask doesn't matter. + * + * For example, if a pure blue pixel with an alpha of 0.95 is masked with a pure red pixel with an + * alpha of 0.5, the resulting pixel will be pure blue with an alpha of 0.475. Naturally, this means + * that a pixel in the mask with an alpha of 0 will hide the corresponding pixel in all masked Game Objects. + * A pixel with an alpha of 1 in the masked Game Object will receive the same alpha as the + * corresponding pixel in the mask. + * + * Note: You cannot combine Bitmap Masks and Blend Modes on the same Game Object. You can, however, + * combine Geometry Masks and Blend Modes together. + * + * The Bitmap Mask's location matches the location of its Game Object, not the location of the + * masked objects. Moving or transforming the underlying Game Object will change the mask + * (and affect the visibility of any masked objects), whereas moving or transforming a masked object + * will not affect the mask. + * + * The Bitmap Mask will not render its Game Object by itself. If the Game Object is not in a + * Scene's display list, it will only be used for the mask and its full texture will not be directly + * visible. Adding the underlying Game Object to a Scene will not cause any problems - it will + * render as a normal Game Object and will also serve as a mask. + */ + class BitmapMask { + /** + * + * @param scene The Scene to which this mask is being added. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame); + + /** + * The Game Object that is used as the mask. Must use a texture, such as a Sprite. + */ + bitmapMask: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture; + + /** + * Whether to invert the masks alpha. + * + * If `true`, the alpha of the masking pixel will be inverted before it's multiplied with the masked pixel. + * + * Essentially, this means that a masked area will be visible only if the corresponding area in the mask is invisible. + */ + invertAlpha: boolean; + + /** + * Is this mask a stencil mask? This is false by default and should not be changed. + */ + readonly isStencil: boolean; + + /** + * Sets a new Game Object or Dynamic Texture for this Bitmap Mask to use. + * + * If a Game Object it must have a texture, such as a Sprite. + * + * You can update the source of the mask as often as you like. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If a Game Object, it must have a texture, such as a Sprite. + */ + setBitmap(maskObject: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture): void; + + /** + * Prepares the WebGL Renderer to render a Game Object with this mask applied. + * + * This renders the masking Game Object to the mask framebuffer and switches to the main framebuffer so that the masked Game Object will be rendered to it instead of being rendered directly to the frame. + * @param renderer The WebGL Renderer to prepare. + * @param maskedObject The masked Game Object which will be drawn. + * @param camera The Camera to render to. + */ + preRenderWebGL(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer, maskedObject: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Finalizes rendering of a masked Game Object. + * + * This resets the previously bound framebuffer and switches the WebGL Renderer to the Bitmap Mask Pipeline, which uses a special fragment shader to apply the masking effect. + * @param renderer The WebGL Renderer to clean up. + * @param camera The Camera to render to. + * @param renderTarget Optional WebGL RenderTarget. + */ + postRenderWebGL(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer, camera: Phaser.Cameras.Scene2D.Camera, renderTarget?: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * This is a NOOP method. Bitmap Masks are not supported by the Canvas Renderer. + * @param renderer The Canvas Renderer which would be rendered to. + * @param mask The masked Game Object which would be rendered. + * @param camera The Camera to render to. + */ + preRenderCanvas(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer, mask: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * This is a NOOP method. Bitmap Masks are not supported by the Canvas Renderer. + * @param renderer The Canvas Renderer which would be rendered to. + */ + postRenderCanvas(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer): void; + + /** + * Destroys this BitmapMask and nulls any references it holds. + * + * Note that if a Game Object is currently using this mask it will _not_ automatically detect you have destroyed it, + * so be sure to call `clearMask` on any Game Object using it, before destroying it. + */ + destroy(): void; + + } + + /** + * A Geometry Mask can be applied to a Game Object to hide any pixels of it which don't intersect + * a visible pixel from the geometry mask. The mask is essentially a clipping path which can only + * make a masked pixel fully visible or fully invisible without changing its alpha (opacity). + * + * A Geometry Mask uses a Graphics Game Object to determine which pixels of the masked Game Object(s) + * should be clipped. For any given point of a masked Game Object's texture, the pixel will only be displayed + * if the Graphics Game Object of the Geometry Mask has a visible pixel at the same position. The color and + * alpha of the pixel from the Geometry Mask do not matter. + * + * The Geometry Mask's location matches the location of its Graphics object, not the location of the masked objects. + * Moving or transforming the underlying Graphics object will change the mask (and affect the visibility + * of any masked objects), whereas moving or transforming a masked object will not affect the mask. + * You can think of the Geometry Mask (or rather, of its Graphics object) as an invisible curtain placed + * in front of all masked objects which has its own visual properties and, naturally, respects the camera's + * visual properties, but isn't affected by and doesn't follow the masked objects by itself. + */ + class GeometryMask { + /** + * + * @param scene This parameter is not used. + * @param graphicsGeometry The Graphics Game Object to use for the Geometry Mask. Doesn't have to be in the Display List. + */ + constructor(scene: Phaser.Scene, graphicsGeometry: Phaser.GameObjects.Graphics); + + /** + * The Graphics object which describes the Geometry Mask. + */ + geometryMask: Phaser.GameObjects.Graphics; + + /** + * Similar to the BitmapMasks invertAlpha setting this to true will then hide all pixels + * drawn to the Geometry Mask. + * + * This is a WebGL only feature. + */ + invertAlpha: boolean; + + /** + * Is this mask a stencil mask? + */ + readonly isStencil: boolean; + + /** + * The current stencil level. This can change dynamically at runtime + * and is set in the applyStencil method. + */ + level: boolean; + + /** + * Sets a new Graphics object for the Geometry Mask. + * @param graphicsGeometry The Graphics object which will be used for the Geometry Mask. + */ + setShape(graphicsGeometry: Phaser.GameObjects.Graphics): this; + + /** + * Sets the `invertAlpha` property of this Geometry Mask. + * + * Inverting the alpha essentially flips the way the mask works. + * + * This is a WebGL only feature. + * @param value Invert the alpha of this mask? Default true. + */ + setInvertAlpha(value?: boolean): this; + + /** + * Renders the Geometry Mask's underlying Graphics object to the OpenGL stencil buffer and enables the stencil test, which clips rendered pixels according to the mask. + * @param renderer The WebGL Renderer instance to draw to. + * @param child The Game Object being rendered. + * @param camera The camera the Game Object is being rendered through. + */ + preRenderWebGL(renderer: Phaser.Renderer.WebGL.WebGLRenderer, child: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Applies the current stencil mask to the renderer. + * @param renderer The WebGL Renderer instance to draw to. + * @param camera The camera the Game Object is being rendered through. + * @param inc Is this an INCR stencil or a DECR stencil? + */ + applyStencil(renderer: Phaser.Renderer.WebGL.WebGLRenderer, camera: Phaser.Cameras.Scene2D.Camera, inc: boolean): void; + + /** + * Flushes all rendered pixels and disables the stencil test of a WebGL context, thus disabling the mask for it. + * @param renderer The WebGL Renderer instance to draw flush. + */ + postRenderWebGL(renderer: Phaser.Renderer.WebGL.WebGLRenderer): void; + + /** + * Sets the clipping path of a 2D canvas context to the Geometry Mask's underlying Graphics object. + * @param renderer The Canvas Renderer instance to set the clipping path on. + * @param mask The Game Object being rendered. + * @param camera The camera the Game Object is being rendered through. + */ + preRenderCanvas(renderer: Phaser.Renderer.Canvas.CanvasRenderer, mask: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Restore the canvas context's previous clipping path, thus turning off the mask for it. + * @param renderer The Canvas Renderer instance being restored. + */ + postRenderCanvas(renderer: Phaser.Renderer.Canvas.CanvasRenderer): void; + + /** + * Destroys this GeometryMask and nulls any references it holds. + * + * Note that if a Game Object is currently using this mask it will _not_ automatically detect you have destroyed it, + * so be sure to call `clearMask` on any Game Object using it, before destroying it. + */ + destroy(): void; + + } + + } + + /** + * The RGB class holds a single color value and allows for easy modification and reading of it, + * with optional on-change callback notification and a dirty flag. + */ + class RGB { + /** + * + * @param red The red color value. A number between 0 and 1. Default 0. + * @param green The green color value. A number between 0 and 1. Default 0. + * @param blue The blue color value. A number between 0 and 1. Default 0. + */ + constructor(red?: number, green?: number, blue?: number); + + /** + * This callback will be invoked each time one of the RGB color values change. + * + * The callback is sent the new color values as the parameters. + */ + onChangeCallback: Function; + + /** + * Is this color dirty? + */ + dirty: boolean; + + /** + * Sets the red, green and blue values of this RGB object, flags it as being + * dirty and then invokes the `onChangeCallback`, if set. + * @param red The red color value. A number between 0 and 1. Default 0. + * @param green The green color value. A number between 0 and 1. Default 0. + * @param blue The blue color value. A number between 0 and 1. Default 0. + */ + set(red?: number, green?: number, blue?: number): this; + + /** + * Compares the given rgb parameters with those in this object and returns + * a boolean `true` value if they are equal, otherwise it returns `false`. + * @param red The red value to compare with this object. + * @param green The green value to compare with this object. + * @param blue The blue value to compare with this object. + */ + equals(red: number, green: number, blue: number): boolean; + + /** + * Internal on change handler. Sets this object as being dirty and + * then invokes the `onChangeCallback`, if set, passing in the + * new RGB values. + */ + onChange(): void; + + /** + * The red color value. Between 0 and 1. + * + * Changing this property will flag this RGB object as being dirty + * and invoke the `onChangeCallback` , if set. + */ + r: number; + + /** + * The green color value. Between 0 and 1. + * + * Changing this property will flag this RGB object as being dirty + * and invoke the `onChangeCallback` , if set. + */ + g: number; + + /** + * The blue color value. Between 0 and 1. + * + * Changing this property will flag this RGB object as being dirty + * and invoke the `onChangeCallback` , if set. + */ + b: number; + + /** + * Nulls any external references this object contains. + */ + destroy(): void; + + } + + /** + * A BaseShader is a small resource class that contains the data required for a WebGL Shader to be created. + * + * It contains the raw source code to the fragment and vertex shader, as well as an object that defines + * the uniforms the shader requires, if any. + * + * BaseShaders are stored in the Shader Cache, available in a Scene via `this.cache.shaders` and are referenced + * by a unique key-based string. Retrieve them via `this.cache.shaders.get(key)`. + * + * BaseShaders are created automatically by the GLSL File Loader when loading an external shader resource. + * They can also be created at runtime, allowing you to use dynamically generated shader source code. + * + * Default fragment and vertex source is used if not provided in the constructor, setting-up a basic shader, + * suitable for debug rendering. + */ + class BaseShader { + /** + * + * @param key The key of this shader. Must be unique within the shader cache. + * @param fragmentSrc The fragment source for the shader. + * @param vertexSrc The vertex source for the shader. + * @param uniforms Optional object defining the uniforms the shader uses. + */ + constructor(key: string, fragmentSrc?: string, vertexSrc?: string, uniforms?: any); + + /** + * The key of this shader, unique within the shader cache of this Phaser game instance. + */ + key: string; + + /** + * The source code, as a string, of the fragment shader being used. + */ + fragmentSrc: string; + + /** + * The source code, as a string, of the vertex shader being used. + */ + vertexSrc: string; + + /** + * The default uniforms for this shader. + */ + uniforms: any | null; + + } + + } + + namespace DOM { + /** + * Adds the given element to the DOM. If a parent is provided the element is added as a child of the parent, providing it was able to access it. + * If no parent was given it falls back to using `document.body`. + * @param element The element to be added to the DOM. Usually a Canvas object. + * @param parent The parent in which to add the element. Can be a string which is passed to `getElementById` or an actual DOM object. + */ + function AddToDOM(element: HTMLElement, parent?: string | HTMLElement): HTMLElement; + + /** + * Inspects the readyState of the document. If the document is already complete then it invokes the given callback. + * If not complete it sets up several event listeners such as `deviceready`, and once those fire, it invokes the callback. + * Called automatically by the Phaser.Game instance. Should not usually be accessed directly. + * @param callback The callback to be invoked when the device is ready and the DOM content is loaded. + */ + function DOMContentLoaded(callback: ContentLoadedCallback): void; + + /** + * Attempts to determine the document inner height across iOS and standard devices. + * Based on code by @tylerjpeterson + * @param iOS Is this running on iOS? + */ + function GetInnerHeight(iOS: boolean): number; + + /** + * Attempts to determine the screen orientation using the Orientation API. + * @param width The width of the viewport. + * @param height The height of the viewport. + */ + function GetScreenOrientation(width: number, height: number): string; + + /** + * Attempts to get the target DOM element based on the given value, which can be either + * a string, in which case it will be looked-up by ID, or an element node. If nothing + * can be found it will return a reference to the document.body. + * @param element The DOM element to look-up. + */ + function GetTarget(element: HTMLElement): void; + + /** + * Takes the given data string and parses it as XML. + * First tries to use the window.DOMParser and reverts to the Microsoft.XMLDOM if that fails. + * The parsed XML object is returned, or `null` if there was an error while parsing the data. + * @param data The XML source stored in a string. + */ + function ParseXML(data: string): DOMParser | ActiveXObject | null; + + /** + * Attempts to remove the element from its parentNode in the DOM. + * @param element The DOM element to remove from its parent node. + */ + function RemoveFromDOM(element: HTMLElement): void; + + /** + * Abstracts away the use of RAF or setTimeOut for the core game update loop. + * + * This is invoked automatically by the Phaser.Game instance. + */ + class RequestAnimationFrame { + /** + * True if RequestAnimationFrame is running, otherwise false. + */ + isRunning: boolean; + + /** + * The callback to be invoked each step. + */ + callback: FrameRequestCallback; + + /** + * True if the step is using setTimeout instead of RAF. + */ + isSetTimeOut: boolean; + + /** + * The setTimeout or RAF callback ID used when canceling them. + */ + timeOutID: number | null; + + /** + * The delay rate in ms for setTimeOut. + */ + delay: number; + + /** + * The RAF step function. + * + * Invokes the callback and schedules another call to requestAnimationFrame. + */ + step: FrameRequestCallback; + + /** + * The SetTimeout step function. + * + * Invokes the callback and schedules another call to setTimeout. + */ + stepTimeout: Function; + + /** + * Starts the requestAnimationFrame or setTimeout process running. + * @param callback The callback to invoke each step. + * @param forceSetTimeOut Should it use SetTimeout, even if RAF is available? + * @param delay The setTimeout delay rate in ms. + */ + start(callback: FrameRequestCallback, forceSetTimeOut: boolean, delay: number): void; + + /** + * Stops the requestAnimationFrame or setTimeout from running. + */ + stop(): void; + + /** + * Stops the step from running and clears the callback reference. + */ + destroy(): void; + + } + + } + + namespace Events { + /** + * EventEmitter is a Scene Systems plugin compatible version of eventemitter3. + */ + class EventEmitter { + /** + * Removes all listeners. + */ + shutdown(): void; + + /** + * Removes all listeners. + */ + destroy(): void; + + /** + * Return an array listing the events for which the emitter has registered listeners. + */ + eventNames(): (string|symbol)[]; + + /** + * Return the listeners registered for a given event. + * @param event The event name. + */ + listeners(event: string | symbol): Function[]; + + /** + * Return the number of listeners listening to a given event. + * @param event The event name. + */ + listenerCount(event: string | symbol): number; + + /** + * Calls each of the listeners registered for a given event. + * @param event The event name. + * @param args Additional arguments that will be passed to the event handler. + */ + emit(event: string | symbol, ...args: any[]): boolean; + + /** + * Add a listener for a given event. + * @param event The event name. + * @param fn The listener function. + * @param context The context to invoke the listener with. Default this. + */ + on(event: string | symbol, fn: Function, context?: any): this; + + /** + * Add a listener for a given event. + * @param event The event name. + * @param fn The listener function. + * @param context The context to invoke the listener with. Default this. + */ + addListener(event: string | symbol, fn: Function, context?: any): this; + + /** + * Add a one-time listener for a given event. + * @param event The event name. + * @param fn The listener function. + * @param context The context to invoke the listener with. Default this. + */ + once(event: string | symbol, fn: Function, context?: any): this; + + /** + * Remove the listeners of a given event. + * @param event The event name. + * @param fn Only remove the listeners that match this function. + * @param context Only remove the listeners that have this context. + * @param once Only remove one-time listeners. + */ + removeListener(event: string | symbol, fn?: Function, context?: any, once?: boolean): this; + + /** + * Remove the listeners of a given event. + * @param event The event name. + * @param fn Only remove the listeners that match this function. + * @param context Only remove the listeners that have this context. + * @param once Only remove one-time listeners. + */ + off(event: string | symbol, fn?: Function, context?: any, once?: boolean): this; + + /** + * Remove all listeners, or those of the specified event. + * @param event The event name. + */ + removeAllListeners(event?: string | symbol): this; + + } + + } + + namespace FX { + /** + * The Barrel FX Controller. + * + * This FX controller manages the barrel distortion effect for a Game Object. + * + * A barrel effect allows you to apply either a 'pinch' or 'expand' distortion to + * a Game Object. The amount of the effect can be modified in real-time. + * + * A Barrel effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addBarrel(); + * sprite.postFX.addBarrel(); + * ``` + */ + class Barrel extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param amount The amount of distortion applied to the barrel effect. A value of 1 is no distortion. Typically keep this within +- 1. Default 1. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, amount?: number); + + /** + * The amount of distortion applied to the barrel effect. + * + * Typically keep this within the range 1 (no distortion) to +- 1. + */ + amount: number; + + } + + /** + * The Bloom FX Controller. + * + * This FX controller manages the bloom effect for a Game Object. + * + * Bloom is an effect used to reproduce an imaging artifact of real-world cameras. + * The effect produces fringes of light extending from the borders of bright areas in an image, + * contributing to the illusion of an extremely bright light overwhelming the + * camera or eye capturing the scene. + * + * A Bloom effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addBloom(); + * sprite.postFX.addBloom(); + * ``` + */ + class Bloom extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param color The color of the Bloom, as a hex value. Default 0xffffff. + * @param offsetX The horizontal offset of the bloom effect. Default 1. + * @param offsetY The vertical offset of the bloom effect. Default 1. + * @param blurStrength The strength of the blur process of the bloom effect. Default 1. + * @param strength The strength of the blend process of the bloom effect. Default 1. + * @param steps The number of steps to run the Bloom effect for. This value should always be an integer. Default 4. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, color?: number, offsetX?: number, offsetY?: number, blurStrength?: number, strength?: number, steps?: number); + + /** + * The number of steps to run the Bloom effect for. + * + * This value should always be an integer. + * + * It defaults to 4. The higher the value, the smoother the Bloom, + * but at the cost of exponentially more gl operations. + * + * Keep this to the lowest possible number you can have it, while + * still looking correct for your game. + */ + steps: number; + + /** + * The horizontal offset of the bloom effect. + */ + offsetX: number; + + /** + * The vertical offset of the bloom effect. + */ + offsetY: number; + + /** + * The strength of the blur process of the bloom effect. + */ + blurStrength: number; + + /** + * The strength of the blend process of the bloom effect. + */ + strength: number; + + /** + * The internal gl color array. + */ + glcolor: number[]; + + /** + * The color of the bloom as a number value. + */ + color: number; + + } + + /** + * The Blur FX Controller. + * + * This FX controller manages the blur effect for a Game Object. + * + * A Gaussian blur is the result of blurring an image by a Gaussian function. It is a widely used effect, + * typically to reduce image noise and reduce detail. The visual effect of this blurring technique is a + * smooth blur resembling that of viewing the image through a translucent screen, distinctly different + * from the bokeh effect produced by an out-of-focus lens or the shadow of an object under usual illumination. + * + * A Blur effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addBlur(); + * sprite.postFX.addBlur(); + * ``` + */ + class Blur extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param quality The quality of the blur effect. Can be either 0 for Low Quality, 1 for Medium Quality or 2 for High Quality. Default 0. + * @param x The horizontal offset of the blur effect. Default 2. + * @param y The vertical offset of the blur effect. Default 2. + * @param strength The strength of the blur effect. Default 1. + * @param color The color of the blur, as a hex value. Default 0xffffff. + * @param steps The number of steps to run the blur effect for. This value should always be an integer. Default 4. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, quality?: number, x?: number, y?: number, strength?: number, color?: number, steps?: number); + + /** + * The quality of the blur effect. + * + * This can be: + * + * 0 for Low Quality + * 1 for Medium Quality + * 2 for High Quality + * + * The higher the quality, the more complex shader is used + * and the more processing time is spent on the GPU calculating + * the final blur. This value is used in conjunction with the + * `steps` value, as one has a direct impact on the other. + * + * Keep this value as low as you can, while still achieving the + * desired effect you need for your game. + */ + quality: number; + + /** + * The horizontal offset of the blur effect. + */ + x: number; + + /** + * The vertical offset of the blur effect. + */ + y: number; + + /** + * The number of steps to run the Blur effect for. + * + * This value should always be an integer. + * + * It defaults to 4. The higher the value, the smoother the blur, + * but at the cost of exponentially more gl operations. + * + * Keep this to the lowest possible number you can have it, while + * still looking correct for your game. + */ + steps: number; + + /** + * The strength of the blur effect. + */ + strength: number; + + /** + * The internal gl color array. + */ + glcolor: number[]; + + /** + * The color of the blur as a number value. + */ + color: number; + + } + + /** + * The Bokeh FX Controller. + * + * This FX controller manages the bokeh effect for a Game Object. + * + * Bokeh refers to a visual effect that mimics the photographic technique of creating a shallow depth of field. + * This effect is used to emphasize the game's main subject or action, by blurring the background or foreground + * elements, resulting in a more immersive and visually appealing experience. It is achieved through rendering + * techniques that simulate the out-of-focus areas, giving a sense of depth and realism to the game's graphics. + * + * This effect can also be used to generate a Tilt Shift effect, which is a technique used to create a miniature + * effect by blurring everything except a small area of the image. This effect is achieved by blurring the + * top and bottom elements, while keeping the center area in focus. + * + * A Bokeh effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addBokeh(); + * sprite.postFX.addBokeh(); + * ``` + */ + class Bokeh extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param radius The radius of the bokeh effect. Default 0.5. + * @param amount The amount of the bokeh effect. Default 1. + * @param contrast The color contrast of the bokeh effect. Default 0.2. + * @param isTiltShift Is this a bokeh or Tile Shift effect? Default false. + * @param blurX If Tilt Shift, the amount of horizontal blur. Default 1. + * @param blurY If Tilt Shift, the amount of vertical blur. Default 1. + * @param strength If Tilt Shift, the strength of the blur. Default 1. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, radius?: number, amount?: number, contrast?: number, isTiltShift?: boolean, blurX?: number, blurY?: number, strength?: number); + + /** + * The radius of the bokeh effect. + * + * This is a float value, where a radius of 0 will result in no effect being applied, + * and a radius of 1 will result in a strong bokeh. However, you can exceed this value + * for even stronger effects. + */ + radius: number; + + /** + * The amount, or strength, of the bokeh effect. Defaults to 1. + */ + amount: number; + + /** + * The color contrast, or brightness, of the bokeh effect. Defaults to 0.2. + */ + contrast: number; + + /** + * Is this a Tilt Shift effect or a standard bokeh effect? + */ + isTiltShift: boolean; + + /** + * If a Tilt Shift effect this controls the strength of the blur. + * + * Setting this value on a non-Tilt Shift effect will have no effect. + */ + strength: number; + + /** + * If a Tilt Shift effect this controls the amount of horizontal blur. + * + * Setting this value on a non-Tilt Shift effect will have no effect. + */ + blurX: number; + + /** + * If a Tilt Shift effect this controls the amount of vertical blur. + * + * Setting this value on a non-Tilt Shift effect will have no effect. + */ + blurY: number; + + } + + /** + * The Circle FX Controller. + * + * This FX controller manages the circle effect for a Game Object. + * + * This effect will draw a circle around the texture of the Game Object, effectively masking off + * any area outside of the circle without the need for an actual mask. You can control the thickness + * of the circle, the color of the circle and the color of the background, should the texture be + * transparent. You can also control the feathering applied to the circle, allowing for a harsh or soft edge. + * + * Please note that adding this effect to a Game Object will not change the input area or physics body of + * the Game Object, should it have one. + * + * A Circle effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addCircle(); + * sprite.postFX.addCircle(); + * ``` + */ + class Circle extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param thickness The width of the circle around the texture, in pixels. Default 8. + * @param color The color of the circular ring, given as a number value. Default 0xfeedb6. + * @param backgroundColor The color of the background, behind the texture, given as a number value. Default 0xff0000. + * @param scale The scale of the circle. The default scale is 1, which is a circle the full size of the underlying texture. Default 1. + * @param feather The amount of feathering to apply to the circle from the ring. Default 0.005. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, thickness?: number, color?: number, backgroundColor?: number, scale?: number, feather?: number); + + /** + * The scale of the circle. The default scale is 1, which is a circle + * the full size of the underlying texture. Reduce this value to create + * a smaller circle, or increase it to create a circle that extends off + * the edges of the texture. + */ + scale: number; + + /** + * The amount of feathering to apply to the circle from the ring, + * extending into the middle of the circle. The default is 0.005, + * which is a very low amount of feathering just making sure the ring + * has a smooth edge. Increase this amount to a value such as 0.5 + * or 0.025 for larger amounts of feathering. + */ + feather: number; + + /** + * The width of the circle around the texture, in pixels. This value + * doesn't factor in the feather, which can extend the thickness + * internally depending on its value. + */ + thickness: number; + + /** + * The internal gl color array for the ring color. + */ + glcolor: number[]; + + /** + * The internal gl color array for the background color. + */ + glcolor2: number[]; + + /** + * The color of the circular ring, given as a number value. + */ + color: number; + + /** + * The color of the background, behind the texture, given as a number value. + */ + backgroundColor: number; + + /** + * The alpha of the background, behind the texture, given as a number value. + */ + backgroundAlpha: number; + + } + + /** + * The ColorMatrix FX Controller. + * + * This FX controller manages the color matrix effect for a Game Object. + * + * The color matrix effect is a visual technique that involves manipulating the colors of an image + * or scene using a mathematical matrix. This process can adjust hue, saturation, brightness, and contrast, + * allowing developers to create various stylistic appearances or mood settings within the game. + * Common applications include simulating different lighting conditions, applying color filters, + * or achieving a specific visual style. + * + * A ColorMatrix effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addColorMatrix(); + * sprite.postFX.addColorMatrix(); + * ``` + */ + class ColorMatrix extends Phaser.Display.ColorMatrix { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + */ + constructor(gameObject: Phaser.GameObjects.GameObject); + + /** + * The FX_CONST type of this effect. + */ + type: number; + + /** + * A reference to the Game Object that owns this effect. + */ + gameObject: Phaser.GameObjects.GameObject; + + /** + * Toggle this boolean to enable or disable this effect, + * without removing and adding it from the Game Object. + */ + active: boolean; + + } + + /** + * The Glow FX. + */ + const GLOW: number; + + /** + * The Shadow FX. + */ + const SHADOW: number; + + /** + * The Pixelate FX. + */ + const PIXELATE: number; + + /** + * The Vignette FX. + */ + const VIGNETTE: number; + + /** + * The Shine FX. + */ + const SHINE: number; + + /** + * The Blur FX. + */ + const BLUR: number; + + /** + * The Gradient FX. + */ + const GRADIENT: number; + + /** + * The Bloom FX. + */ + const BLOOM: number; + + /** + * The Color Matrix FX. + */ + const COLOR_MATRIX: number; + + /** + * The Circle FX. + */ + const CIRCLE: number; + + /** + * The Barrel FX. + */ + const BARREL: number; + + /** + * The Displacement FX. + */ + const DISPLACEMENT: number; + + /** + * The Wipe FX. + */ + const WIPE: number; + + /** + * The Bokeh and Tilt Shift FX. + */ + const BOKEH: number; + + /** + * FX Controller is the base class that all built-in FX use. + * + * You should not normally create an instance of this class directly, but instead use one of the built-in FX that extend it. + */ + class Controller { + /** + * + * @param type The FX Type constant. + * @param gameObject A reference to the Game Object that has this fx. + */ + constructor(type: number, gameObject: Phaser.GameObjects.GameObject); + + /** + * The FX_CONST type of this effect. + */ + type: number; + + /** + * A reference to the Game Object that owns this effect. + */ + gameObject: Phaser.GameObjects.GameObject; + + /** + * Toggle this boolean to enable or disable this effect, + * without removing and adding it from the Game Object. + * + * Only works for Pre FX. + * + * Post FX are always active. + */ + active: boolean; + + /** + * Sets the active state of this FX Controller. + * + * A disabled FX Controller will not be updated. + * @param value `true` to enable this FX Controller, or `false` to disable it. + */ + setActive(value: boolean): this; + + /** + * Destroys this FX Controller. + */ + destroy(): void; + + } + + /** + * The Displacement FX Controller. + * + * This FX controller manages the displacement effect for a Game Object. + * + * The displacement effect is a visual technique that alters the position of pixels in an image + * or texture based on the values of a displacement map. This effect is used to create the illusion + * of depth, surface irregularities, or distortion in otherwise flat elements. It can be applied to + * characters, objects, or backgrounds to enhance realism, convey movement, or achieve various + * stylistic appearances. + * + * A Displacement effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addDisplacement(); + * sprite.postFX.addDisplacement(); + * ``` + */ + class Displacement extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param texture The unique string-based key of the texture to use for displacement, which must exist in the Texture Manager. Default '__WHITE'. + * @param x The amount of horizontal displacement to apply. A very small float number, such as 0.005. Default 0.005. + * @param y The amount of vertical displacement to apply. A very small float number, such as 0.005. Default 0.005. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, texture?: string, x?: number, y?: number); + + /** + * The amount of horizontal displacement to apply. + */ + x: number; + + /** + * The amount of vertical displacement to apply. + */ + y: number; + + /** + * The underlying texture used for displacement. + */ + glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Sets the Texture to be used for the displacement effect. + * + * You can only use a whole texture, not a frame from a texture atlas or sprite sheet. + * @param texture The unique string-based key of the texture to use for displacement, which must exist in the Texture Manager. Default '__WHITE'. + */ + setTexture(texture?: string): this; + + } + + /** + * The Glow FX Controller. + * + * This FX controller manages the glow effect for a Game Object. + * + * The glow effect is a visual technique that creates a soft, luminous halo around game objects, + * characters, or UI elements. This effect is used to emphasize importance, enhance visual appeal, + * or convey a sense of energy, magic, or otherworldly presence. The effect can also be set on + * the inside of the Game Object. The color and strength of the glow can be modified. + * + * A Glow effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addGlow(); + * sprite.postFX.addGlow(); + * ``` + */ + class Glow extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param color The color of the glow effect as a number value. Default 0xffffff. + * @param outerStrength The strength of the glow outward from the edge of the Sprite. Default 4. + * @param innerStrength The strength of the glow inward from the edge of the Sprite. Default 0. + * @param knockout If `true` only the glow is drawn, not the texture itself. Default false. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, color?: number, outerStrength?: number, innerStrength?: number, knockout?: boolean); + + /** + * The strength of the glow outward from the edge of the Sprite. + */ + outerStrength: number; + + /** + * The strength of the glow inward from the edge of the Sprite. + */ + innerStrength: number; + + /** + * If `true` only the glow is drawn, not the texture itself. + */ + knockout: number; + + /** + * A 4 element array of gl color values. + */ + glcolor: number[]; + + /** + * The color of the glow as a number value. + */ + color: number; + + } + + /** + * The Gradient FX Controller. + * + * This FX controller manages the gradient effect for a Game Object. + * + * The gradient overlay effect is a visual technique where a smooth color transition is applied over Game Objects, + * such as sprites or UI components. This effect is used to enhance visual appeal, emphasize depth, or create + * stylistic and atmospheric variations. It can also be utilized to convey information, such as representing + * progress or health status through color changes. + * + * A Gradient effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addGradient(); + * sprite.postFX.addGradient(); + * ``` + */ + class Gradient extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param color1 The first gradient color, given as a number value. Default 0xff0000. + * @param color2 The second gradient color, given as a number value. Default 0x00ff00. + * @param alpha The alpha value of the gradient effect. Default 0.2. + * @param fromX The horizontal position the gradient will start from. This value is normalized, between 0 and 1, and is not in pixels. Default 0. + * @param fromY The vertical position the gradient will start from. This value is normalized, between 0 and 1, and is not in pixels. Default 0. + * @param toX The horizontal position the gradient will end at. This value is normalized, between 0 and 1, and is not in pixels. Default 0. + * @param toY The vertical position the gradient will end at. This value is normalized, between 0 and 1, and is not in pixels. Default 1. + * @param size How many 'chunks' the gradient is divided in to, as spread over the entire height of the texture. Leave this at zero for a smooth gradient, or set higher for a more retro chunky effect. Default 0. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, color1?: number, color2?: number, alpha?: number, fromX?: number, fromY?: number, toX?: number, toY?: number, size?: number); + + /** + * The alpha value of the gradient effect. + */ + alpha: number; + + /** + * Sets how many 'chunks' the gradient is divided in to, as spread over the + * entire height of the texture. Leave this at zero for a smooth gradient, + * or set to a higher number to split the gradient into that many sections, giving + * a more banded 'retro' effect. + */ + size: number; + + /** + * The horizontal position the gradient will start from. This value is normalized, between 0 and 1 and is not in pixels. + */ + fromX: number; + + /** + * The vertical position the gradient will start from. This value is normalized, between 0 and 1 and is not in pixels. + */ + fromY: number; + + /** + * The horizontal position the gradient will end. This value is normalized, between 0 and 1 and is not in pixels. + */ + toX: number; + + /** + * The vertical position the gradient will end. This value is normalized, between 0 and 1 and is not in pixels. + */ + toY: number; + + /** + * The internal gl color array for the starting color. + */ + glcolor1: number[]; + + /** + * The internal gl color array for the ending color. + */ + glcolor2: number[]; + + /** + * The first gradient color, given as a number value. + */ + color1: number; + + /** + * The second gradient color, given as a number value. + */ + color2: number; + + } + + /** + * The Pixelate FX Controller. + * + * This FX controller manages the pixelate effect for a Game Object. + * + * The pixelate effect is a visual technique that deliberately reduces the resolution or detail of an image, + * creating a blocky or mosaic appearance composed of large, visible pixels. This effect can be used for stylistic + * purposes, as a homage to retro gaming, or as a means to obscure certain elements within the game, such as + * during a transition or to censor specific content. + * + * A Pixelate effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addPixelate(); + * sprite.postFX.addPixelate(); + * ``` + */ + class Pixelate extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param amount The amount of pixelation to apply. Default 1. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, amount?: number); + + /** + * The amount of pixelation to apply. + */ + amount: number; + + } + + /** + * The Shadow FX Controller. + * + * This FX controller manages the shadow effect for a Game Object. + * + * The shadow effect is a visual technique used to create the illusion of depth and realism by adding darker, + * offset silhouettes or shapes beneath game objects, characters, or environments. These simulated shadows + * help to enhance the visual appeal and immersion, making the 2D game world appear more dynamic and three-dimensional. + * + * A Shadow effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addShadow(); + * sprite.postFX.addShadow(); + * ``` + */ + class Shadow extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param x The horizontal offset of the shadow effect. Default 0. + * @param y The vertical offset of the shadow effect. Default 0. + * @param decay The amount of decay for shadow effect. Default 0.1. + * @param power The power of the shadow effect. Default 1. + * @param color The color of the shadow. Default 0x000000. + * @param samples The number of samples that the shadow effect will run for. An integer between 1 and 12. Default 6. + * @param intensity The intensity of the shadow effect. Default 1. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, x?: number, y?: number, decay?: number, power?: number, color?: number, samples?: number, intensity?: number); + + /** + * The horizontal offset of the shadow effect. + */ + x: number; + + /** + * The vertical offset of the shadow effect. + */ + y: number; + + /** + * The amount of decay for the shadow effect. + */ + decay: number; + + /** + * The power of the shadow effect. + */ + power: number; + + /** + * The internal gl color array. + */ + glcolor: number[]; + + /** + * The number of samples that the shadow effect will run for. + * + * This should be an integer with a minimum value of 1 and a maximum of 12. + */ + samples: number; + + /** + * The intensity of the shadow effect. + */ + intensity: number; + + /** + * The color of the shadow. + */ + color: number; + + } + + /** + * The Shine FX Controller. + * + * This FX controller manages the shift effect for a Game Object. + * + * The shine effect is a visual technique that simulates the appearance of reflective + * or glossy surfaces by passing a light beam across a Game Object. This effect is used to + * enhance visual appeal, emphasize certain features, and create a sense of depth or + * material properties. + * + * A Shine effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addShine(); + * sprite.postFX.addShine(); + * ``` + */ + class Shine extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param speed The speed of the Shine effect. Default 0.5. + * @param lineWidth The line width of the Shine effect. Default 0.5. + * @param gradient The gradient of the Shine effect. Default 3. + * @param reveal Does this Shine effect reveal or get added to its target? Default false. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, speed?: number, lineWidth?: number, gradient?: number, reveal?: boolean); + + /** + * The speed of the Shine effect. + */ + speed: number; + + /** + * The line width of the Shine effect. + */ + lineWidth: number; + + /** + * The gradient of the Shine effect. + */ + gradient: number; + + /** + * Does this Shine effect reveal or get added to its target? + */ + reveal: boolean; + + } + + /** + * The Vignette FX Controller. + * + * This FX controller manages the vignette effect for a Game Object. + * + * The vignette effect is a visual technique where the edges of the screen, or a Game Object, gradually darken or blur, + * creating a frame-like appearance. This effect is used to draw the player's focus towards the central action or subject, + * enhance immersion, and provide a cinematic or artistic quality to the game's visuals. + * + * A Vignette effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addVignette(); + * sprite.postFX.addVignette(); + * ``` + */ + class Vignette extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param x The horizontal offset of the vignette effect. This value is normalized to the range 0 to 1. Default 0.5. + * @param y The vertical offset of the vignette effect. This value is normalized to the range 0 to 1. Default 0.5. + * @param radius The radius of the vignette effect. This value is normalized to the range 0 to 1. Default 0.5. + * @param strength The strength of the vignette effect. Default 0.5. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, x?: number, y?: number, radius?: number, strength?: number); + + /** + * The horizontal offset of the vignette effect. This value is normalized to the range 0 to 1. + */ + x: number; + + /** + * The vertical offset of the vignette effect. This value is normalized to the range 0 to 1. + */ + y: number; + + /** + * The radius of the vignette effect. This value is normalized to the range 0 to 1. + */ + radius: number; + + /** + * The strength of the vignette effect. + */ + strength: number; + + } + + /** + * The Wipe FX Controller. + * + * This FX controller manages the wipe effect for a Game Object. + * + * The wipe or reveal effect is a visual technique that gradually uncovers or conceals elements + * in the game, such as images, text, or scene transitions. This effect is often used to create + * a sense of progression, reveal hidden content, or provide a smooth and visually appealing transition + * between game states. + * + * You can set both the direction and the axis of the wipe effect. The following combinations are possible: + * + * * left to right: direction 0, axis 0 + * * right to left: direction 1, axis 0 + * * top to bottom: direction 1, axis 1 + * * bottom to top: direction 1, axis 0 + * + * It is up to you to set the `progress` value yourself, i.e. via a Tween, in order to transition the effect. + * + * A Wipe effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addWipe(); + * sprite.postFX.addWipe(); + * sprite.preFX.addReveal(); + * sprite.postFX.addReveal(); + * ``` + */ + class Wipe extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param wipeWidth The width of the wipe effect. This value is normalized in the range 0 to 1. Default 0.1. + * @param direction The direction of the wipe effect. Either 0 or 1. Set in conjunction with the axis property. Default 0. + * @param axis The axis of the wipe effect. Either 0 or 1. Set in conjunction with the direction property. Default 0. + * @param reveal Is this a reveal (true) or a fade (false) effect? Default false. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, wipeWidth?: number, direction?: number, axis?: number, reveal?: boolean); + + /** + * The progress of the Wipe effect. This value is normalized to the range 0 to 1. + * + * Adjust this value to make the wipe transition (i.e. via a Tween) + */ + progress: number; + + /** + * The width of the wipe effect. This value is normalized in the range 0 to 1. + */ + wipeWidth: number; + + /** + * The direction of the wipe effect. Either 0 or 1. Set in conjunction with the axis property. + */ + direction: number; + + /** + * The axis of the wipe effect. Either 0 or 1. Set in conjunction with the direction property. + */ + axis: number; + + /** + * Is this a reveal (true) or a fade (false) effect? + */ + reveal: boolean; + + } + + } + + namespace GameObjects { + /** + * BitmapText objects work by taking a texture file and an XML or JSON file that describes the font structure. + * + * During rendering for each letter of the text is rendered to the display, proportionally spaced out and aligned to + * match the font structure. + * + * Dynamic Bitmap Text objects are different from Static Bitmap Text in that they invoke a callback for each + * letter being rendered during the render pass. This callback allows you to manipulate the properties of + * each letter being rendered, such as its position, scale or tint, allowing you to create interesting effects + * like jiggling text, which can't be done with Static text. This means that Dynamic Text takes more processing + * time, so only use them if you require the callback ability they have. + * + * BitmapText objects are less flexible than Text objects, in that they have less features such as shadows, fills and the ability + * to use Web Fonts, however you trade this flexibility for rendering speed. You can also create visually compelling BitmapTexts by + * processing the font texture in an image editor, applying fills and any other effects required. + * + * To create multi-line text insert \r, \n or \r\n escape codes into the text string. + * + * To create a BitmapText data files you need a 3rd party app such as: + * + * BMFont (Windows, free): {@link http://www.angelcode.com/products/bmfont/|http://www.angelcode.com/products/bmfont/} + * Glyph Designer (OS X, commercial): {@link http://www.71squared.com/en/glyphdesigner|http://www.71squared.com/en/glyphdesigner} + * Snow BMF (Web-based, free): {@link https://snowb.org//|https://snowb.org/} + * Littera (Flash-based, free): {@link http://kvazars.com/littera/|http://kvazars.com/littera/} + * + * For most use cases it is recommended to use XML. If you wish to use JSON, the formatting should be equal to the result of + * converting a valid XML file through the popular X2JS library. An online tool for conversion can be found here: {@link http://codebeautify.org/xmltojson|http://codebeautify.org/xmltojson} + */ + class DynamicBitmapText extends Phaser.GameObjects.BitmapText { + /** + * + * @param scene The Scene to which this Game Object belongs. It can only belong to one Scene at any given time. + * @param x The x coordinate of this Game Object in world space. + * @param y The y coordinate of this Game Object in world space. + * @param font The key of the font to use from the Bitmap Font cache. + * @param text The string, or array of strings, to be set as the content of this Bitmap Text. + * @param size The font size of this Bitmap Text. + * @param align The alignment of the text in a multi-line BitmapText object. Default 0. + */ + constructor(scene: Phaser.Scene, x: number, y: number, font: string, text?: string | string[], size?: number, align?: number); + + /** + * The horizontal scroll position of the Bitmap Text. + */ + scrollX: number; + + /** + * The vertical scroll position of the Bitmap Text. + */ + scrollY: number; + + /** + * The crop width of the Bitmap Text. + */ + cropWidth: number; + + /** + * The crop height of the Bitmap Text. + */ + cropHeight: number; + + /** + * A callback that alters how each character of the Bitmap Text is rendered. + */ + displayCallback: Phaser.Types.GameObjects.BitmapText.DisplayCallback; + + /** + * The data object that is populated during rendering, then passed to the displayCallback. + * You should modify this object then return it back from the callback. It's updated values + * will be used to render the specific glyph. + * + * Please note that if you need a reference to this object locally in your game code then you + * should shallow copy it, as it's updated and re-used for every glyph in the text. + */ + callbackData: Phaser.Types.GameObjects.BitmapText.DisplayCallbackConfig; + + /** + * Set the crop size of this Bitmap Text. + * @param width The width of the crop. + * @param height The height of the crop. + */ + setSize(width: number, height: number): this; + + /** + * Set a callback that alters how each character of the Bitmap Text is rendered. + * + * The callback receives a {@link Phaser.Types.GameObjects.BitmapText.DisplayCallbackConfig} object that contains information about the character that's + * about to be rendered. + * + * It should return an object with `x`, `y`, `scale` and `rotation` properties that will be used instead of the + * usual values when rendering. + * @param callback The display callback to set. + */ + setDisplayCallback(callback: Phaser.Types.GameObjects.BitmapText.DisplayCallback): this; + + /** + * Set the horizontal scroll position of this Bitmap Text. + * @param value The horizontal scroll position to set. + */ + setScrollX(value: number): this; + + /** + * Set the vertical scroll position of this Bitmap Text. + * @param value The vertical scroll position to set. + */ + setScrollY(value: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + namespace RetroFont { + /** + * Text Set 1 = !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ + */ + var TEXT_SET1: string; + + /** + * Text Set 2 = !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ + */ + var TEXT_SET2: string; + + /** + * Text Set 3 = ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 + */ + var TEXT_SET3: string; + + /** + * Text Set 4 = ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 + */ + var TEXT_SET4: string; + + /** + * Text Set 5 = ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/() '!?-*:0123456789 + */ + var TEXT_SET5: string; + + /** + * Text Set 6 = ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;0123456789"(),-.' + */ + var TEXT_SET6: string; + + /** + * Text Set 7 = AGMSY+:4BHNTZ!;5CIOU.?06DJPV,(17EKQW")28FLRX-'39 + */ + var TEXT_SET7: string; + + /** + * Text Set 8 = 0123456789 .ABCDEFGHIJKLMNOPQRSTUVWXYZ + */ + var TEXT_SET8: string; + + /** + * Text Set 9 = ABCDEFGHIJKLMNOPQRSTUVWXYZ()-0123456789.:,'"?! + */ + var TEXT_SET9: string; + + /** + * Text Set 10 = ABCDEFGHIJKLMNOPQRSTUVWXYZ + */ + var TEXT_SET10: string; + + /** + * Text Set 11 = ABCDEFGHIJKLMNOPQRSTUVWXYZ.,"-+!?()':;0123456789 + */ + var TEXT_SET11: string; + + /** + * Parses a Retro Font configuration object so you can pass it to the BitmapText constructor + * and create a BitmapText object using a fixed-width retro font. + * @param scene A reference to the Phaser Scene. + * @param config The font configuration object. + */ + function Parse(scene: Phaser.Scene, config: Phaser.Types.GameObjects.BitmapText.RetroFontConfig): Phaser.Types.GameObjects.BitmapText.BitmapFontData; + + } + + /** + * BitmapText objects work by taking a texture file and an XML or JSON file that describes the font structure. + * + * During rendering for each letter of the text is rendered to the display, proportionally spaced out and aligned to + * match the font structure. + * + * BitmapText objects are less flexible than Text objects, in that they have less features such as shadows, fills and the ability + * to use Web Fonts, however you trade this flexibility for rendering speed. You can also create visually compelling BitmapTexts by + * processing the font texture in an image editor, applying fills and any other effects required. + * + * To create multi-line text insert \r, \n or \r\n escape codes into the text string. + * + * To create a BitmapText data files you need a 3rd party app such as: + * + * BMFont (Windows, free): {@link http://www.angelcode.com/products/bmfont/|http://www.angelcode.com/products/bmfont/} + * Glyph Designer (OS X, commercial): {@link http://www.71squared.com/en/glyphdesigner|http://www.71squared.com/en/glyphdesigner} + * Snow BMF (Web-based, free): {@link https://snowb.org//|https://snowb.org/} + * Littera (Flash-based, free): {@link http://kvazars.com/littera/|http://kvazars.com/littera/} + * + * For most use cases it is recommended to use XML. If you wish to use JSON, the formatting should be equal to the result of + * converting a valid XML file through the popular X2JS library. An online tool for conversion can be found here: {@link http://codebeautify.org/xmltojson|http://codebeautify.org/xmltojson} + */ + class BitmapText extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. It can only belong to one Scene at any given time. + * @param x The x coordinate of this Game Object in world space. + * @param y The y coordinate of this Game Object in world space. + * @param font The key of the font to use from the Bitmap Font cache. + * @param text The string, or array of strings, to be set as the content of this Bitmap Text. + * @param size The font size of this Bitmap Text. + * @param align The alignment of the text in a multi-line BitmapText object. Default 0. + */ + constructor(scene: Phaser.Scene, x: number, y: number, font: string, text?: string | string[], size?: number, align?: number); + + /** + * The key of the Bitmap Font used by this Bitmap Text. + * To change the font after creation please use `setFont`. + */ + readonly font: string; + + /** + * The data of the Bitmap Font used by this Bitmap Text. + */ + readonly fontData: Phaser.Types.GameObjects.BitmapText.BitmapFontData; + + /** + * The character code used to detect for word wrapping. + * Defaults to 32 (a space character). + */ + wordWrapCharCode: number; + + /** + * The horizontal offset of the drop shadow. + * + * You can set this directly, or use `Phaser.GameObjects.BitmapText#setDropShadow`. + */ + dropShadowX: number; + + /** + * The vertical offset of the drop shadow. + * + * You can set this directly, or use `Phaser.GameObjects.BitmapText#setDropShadow`. + */ + dropShadowY: number; + + /** + * The color of the drop shadow. + * + * You can set this directly, or use `Phaser.GameObjects.BitmapText#setDropShadow`. + */ + dropShadowColor: number; + + /** + * The alpha value of the drop shadow. + * + * You can set this directly, or use `Phaser.GameObjects.BitmapText#setDropShadow`. + */ + dropShadowAlpha: number; + + /** + * Indicates whether the font texture is from an atlas or not. + */ + readonly fromAtlas: boolean; + + /** + * Set the lines of text in this BitmapText to be left-aligned. + * This only has any effect if this BitmapText contains more than one line of text. + */ + setLeftAlign(): this; + + /** + * Set the lines of text in this BitmapText to be center-aligned. + * This only has any effect if this BitmapText contains more than one line of text. + */ + setCenterAlign(): this; + + /** + * Set the lines of text in this BitmapText to be right-aligned. + * This only has any effect if this BitmapText contains more than one line of text. + */ + setRightAlign(): this; + + /** + * Set the font size of this Bitmap Text. + * @param size The font size to set. + */ + setFontSize(size: number): this; + + /** + * Sets the letter spacing between each character of this Bitmap Text. + * Can be a positive value to increase the space, or negative to reduce it. + * Spacing is applied after the kerning values have been set. + * @param spacing The amount of horizontal space to add between each character. Default 0. + */ + setLetterSpacing(spacing?: number): this; + + /** + * Sets the line spacing value. This value is added to the font height to + * calculate the overall line height. + * + * Spacing can be a negative or positive number. + * + * Only has an effect if this BitmapText object contains multiple lines of text. + * @param spacing The amount of space to add between each line in multi-line text. Default 0. + */ + setLineSpacing(spacing?: number): this; + + /** + * Set the textual content of this BitmapText. + * + * An array of strings will be converted into multi-line text. Use the align methods to change multi-line alignment. + * @param value The string, or array of strings, to be set as the content of this BitmapText. + */ + setText(value: string | string[]): this; + + /** + * Sets a drop shadow effect on this Bitmap Text. + * + * This is a WebGL only feature and only works with Static Bitmap Text, not Dynamic. + * + * You can set the vertical and horizontal offset of the shadow, as well as the color and alpha. + * + * Once a shadow has been enabled you can modify the `dropShadowX` and `dropShadowY` properties of this + * Bitmap Text directly to adjust the position of the shadow in real-time. + * + * If you wish to clear the shadow, call this method with no parameters specified. + * @param x The horizontal offset of the drop shadow. Default 0. + * @param y The vertical offset of the drop shadow. Default 0. + * @param color The color of the drop shadow, given as a hex value, i.e. `0x000000` for black. Default 0x000000. + * @param alpha The alpha of the drop shadow, given as a float between 0 and 1. This is combined with the Bitmap Text alpha as well. Default 0.5. + */ + setDropShadow(x?: number, y?: number, color?: number, alpha?: number): this; + + /** + * Sets a tint on a range of characters in this Bitmap Text, starting from the `start` parameter index + * and running for `length` quantity of characters. + * + * The `start` parameter can be negative. In this case, it starts at the end of the text and counts + * backwards `start` places. + * + * You can also pass in -1 as the `length` and it will tint all characters from `start` + * up until the end of the string. + * Remember that spaces and punctuation count as characters. + * + * This is a WebGL only feature and only works with Static Bitmap Text, not Dynamic. + * + * The tint works by taking the pixel color values from the Bitmap Text texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole character will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the character range. + * + * To swap this from being an additive tint to a fill based tint, set the `tintFill` parameter to `true`. + * + * To modify the tint color once set, call this method again with new color values. + * + * Using `setWordTint` can override tints set by this function, and vice versa. + * + * To remove a tint call this method with just the `start`, and optionally, the `length` parameters defined. + * @param start The starting character to begin the tint at. If negative, it counts back from the end of the text. Default 0. + * @param length The number of characters to tint. Remember that spaces count as a character too. Pass -1 to tint all characters from `start` onwards. Default 1. + * @param tintFill Use a fill-based tint (true), or an additive tint (false) Default false. + * @param topLeft The tint being applied to the top-left of the character. If not other values are given this value is applied evenly, tinting the whole character. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the character. + * @param bottomLeft The tint being applied to the bottom-left of the character. + * @param bottomRight The tint being applied to the bottom-right of the character. + */ + setCharacterTint(start?: number, length?: number, tintFill?: boolean, topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a tint on a matching word within this Bitmap Text. + * + * The `word` parameter can be either a string or a number. + * + * If a string, it will run a string comparison against the text contents, and if matching, + * it will tint the whole word. + * + * If a number, if till that word, based on its offset within the text contents. + * + * The `count` parameter controls how many words are replaced. Pass in -1 to replace them all. + * + * This parameter is ignored if you pass a number as the `word` to be searched for. + * + * This is a WebGL only feature and only works with Static Bitmap Text, not Dynamic. + * + * The tint works by taking the pixel color values from the Bitmap Text texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole character will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the character range. + * + * To swap this from being an additive tint to a fill based tint, set the `tintFill` parameter to `true`. + * + * To modify the tint color once set, call this method again with new color values. + * + * Using `setCharacterTint` can override tints set by this function, and vice versa. + * @param word The word to search for. Either a string, or an index of the word in the words array. + * @param count The number of matching words to tint. Pass -1 to tint all matching words. Default 1. + * @param tintFill Use a fill-based tint (true), or an additive tint (false) Default false. + * @param topLeft The tint being applied to the top-left of the word. If not other values are given this value is applied evenly, tinting the whole word. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the word. + * @param bottomLeft The tint being applied to the bottom-left of the word. + * @param bottomRight The tint being applied to the bottom-right of the word. + */ + setWordTint(word: string | number, count?: number, tintFill?: boolean, topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Calculate the bounds of this Bitmap Text. + * + * An object is returned that contains the position, width and height of the Bitmap Text in local and global + * contexts. + * + * Local size is based on just the font size and a [0, 0] position. + * + * Global size takes into account the Game Object's scale, world position and display origin. + * + * Also in the object is data regarding the length of each line, should this be a multi-line BitmapText. + * @param round Whether to round the results up to the nearest integer. Default false. + */ + getTextBounds(round?: boolean): Phaser.Types.GameObjects.BitmapText.BitmapTextSize; + + /** + * Gets the character located at the given x/y coordinate within this Bitmap Text. + * + * The coordinates you pass in are translated into the local space of the + * Bitmap Text, however, it is up to you to first translate the input coordinates to world space. + * + * If you wish to use this in combination with an input event, be sure + * to pass in `Pointer.worldX` and `worldY` so they are in world space. + * + * In some cases, based on kerning, characters can overlap. When this happens, + * the first character in the word is returned. + * + * Note that this does not work for DynamicBitmapText if you have changed the + * character positions during render. It will only scan characters in their un-translated state. + * @param x The x position to check. + * @param y The y position to check. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getCharacterAt(x: number, y: number, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Types.GameObjects.BitmapText.BitmapTextCharacter; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * Changes the font this BitmapText is using to render. + * + * The new texture is loaded and applied to the BitmapText. The existing text, size and alignment are preserved, + * unless overridden via the arguments. + * @param font The key of the font to use from the Bitmap Font cache. + * @param size The font size of this Bitmap Text. If not specified the current size will be used. + * @param align The alignment of the text in a multi-line BitmapText object. If not specified the current alignment will be used. Default 0. + */ + setFont(font: string, size?: number, align?: number): this; + + /** + * Sets the maximum display width of this BitmapText in pixels. + * + * If `BitmapText.text` is longer than `maxWidth` then the lines will be automatically wrapped + * based on the previous whitespace character found in the line. + * + * If no whitespace was found then no wrapping will take place and consequently the `maxWidth` value will not be honored. + * + * Disable maxWidth by setting the value to 0. + * + * You can set the whitespace character to be searched for by setting the `wordWrapCharCode` parameter or property. + * @param value The maximum display width of this BitmapText in pixels. Set to zero to disable. + * @param wordWrapCharCode The character code to check for when word wrapping. Defaults to 32 (the space character). + */ + setMaxWidth(value: number, wordWrapCharCode?: number): this; + + /** + * Controls the alignment of each line of text in this BitmapText object. + * + * Only has any effect when this BitmapText contains multiple lines of text, split with carriage-returns. + * Has no effect with single-lines of text. + * + * See the methods `setLeftAlign`, `setCenterAlign` and `setRightAlign`. + * + * 0 = Left aligned (default) + * 1 = Middle aligned + * 2 = Right aligned + * + * The alignment position is based on the longest line of text. + */ + align: number; + + /** + * The text that this Bitmap Text object displays. + * + * You can also use the method `setText` if you want a chainable way to change the text content. + */ + text: string; + + /** + * The font size of this Bitmap Text. + * + * You can also use the method `setFontSize` if you want a chainable way to change the font size. + */ + fontSize: number; + + /** + * Adds / Removes spacing between characters. + * + * Can be a negative or positive number. + * + * You can also use the method `setLetterSpacing` if you want a chainable way to change the letter spacing. + */ + letterSpacing: number; + + /** + * Adds / Removes spacing between lines. + * + * Can be a negative or positive number. + * + * You can also use the method `setLineSpacing` if you want a chainable way to change the line spacing. + */ + lineSpacing: number; + + /** + * The maximum display width of this BitmapText in pixels. + * + * If BitmapText.text is longer than maxWidth then the lines will be automatically wrapped + * based on the last whitespace character found in the line. + * + * If no whitespace was found then no wrapping will take place and consequently the maxWidth value will not be honored. + * + * Disable maxWidth by setting the value to 0. + */ + maxWidth: number; + + /** + * The width of this Bitmap Text. + * + * This property is read-only. + */ + readonly width: number; + + /** + * The height of this Bitmap text. + * + * This property is read-only. + */ + readonly height: number; + + /** + * The displayed width of this Bitmap Text. + * + * This value takes into account the scale factor. + * + * This property is read-only. + */ + readonly displayWidth: number; + + /** + * The displayed height of this Bitmap Text. + * + * This value takes into account the scale factor. + * + * This property is read-only. + */ + readonly displayHeight: number; + + /** + * Build a JSON representation of this Bitmap Text. + */ + toJSON(): Phaser.Types.GameObjects.BitmapText.JSONBitmapText; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * Left align the text characters in a multi-line BitmapText object. + */ + static ALIGN_LEFT: number; + + /** + * Center align the text characters in a multi-line BitmapText object. + */ + static ALIGN_CENTER: number; + + /** + * Right align the text characters in a multi-line BitmapText object. + */ + static ALIGN_RIGHT: number; + + /** + * Parse an XML Bitmap Font from an Atlas. + * + * Adds the parsed Bitmap Font data to the cache with the `fontName` key. + * @param scene The Scene to parse the Bitmap Font for. + * @param fontName The key of the font to add to the Bitmap Font cache. + * @param textureKey The key of the BitmapFont's texture. + * @param frameKey The key of the BitmapFont texture's frame. + * @param xmlKey The key of the XML data of the font to parse. + * @param xSpacing The x-axis spacing to add between each letter. + * @param ySpacing The y-axis spacing to add to the line height. + */ + static ParseFromAtlas(scene: Phaser.Scene, fontName: string, textureKey: string, frameKey: string, xmlKey: string, xSpacing?: number, ySpacing?: number): boolean; + + /** + * Parse an XML font to Bitmap Font data for the Bitmap Font cache. + * @param xml The XML Document to parse the font from. + * @param frame The texture frame to take into account when creating the uv data. + * @param xSpacing The x-axis spacing to add between each letter. Default 0. + * @param ySpacing The y-axis spacing to add to the line height. Default 0. + */ + static ParseXMLBitmapFont(xml: XMLDocument, frame: Phaser.Textures.Frame, xSpacing?: number, ySpacing?: number): Phaser.Types.GameObjects.BitmapText.BitmapFontData; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Blitter Game Object. + * + * The Blitter Game Object is a special kind of container that creates, updates and manages Bob objects. + * Bobs are designed for rendering speed rather than flexibility. They consist of a texture, or frame from a texture, + * a position and an alpha value. You cannot scale or rotate them. They use a batched drawing method for speed + * during rendering. + * + * A Blitter Game Object has one texture bound to it. Bobs created by the Blitter can use any Frame from this + * Texture to render with, but they cannot use any other Texture. It is this single texture-bind that allows + * them their speed. + * + * If you have a need to blast a large volume of frames around the screen then Blitter objects are well worth + * investigating. They are especially useful for using as a base for your own special effects systems. + */ + class Blitter extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. It can only belong to one Scene at any given time. + * @param x The x coordinate of this Game Object in world space. Default 0. + * @param y The y coordinate of this Game Object in world space. Default 0. + * @param texture The key of the texture this Game Object will use for rendering. The Texture must already exist in the Texture Manager. Default '__DEFAULT'. + * @param frame The Frame of the Texture that this Game Object will use. Only set if the Texture has multiple frames, such as a Texture Atlas or Sprite Sheet. Default 0. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, texture?: string, frame?: string | number); + + /** + * The children of this Blitter. + * This List contains all of the Bob objects created by the Blitter. + */ + children: Phaser.Structs.List; + + /** + * Is the Blitter considered dirty? + * A 'dirty' Blitter has had its child count changed since the last frame. + */ + dirty: boolean; + + /** + * Creates a new Bob in this Blitter. + * + * The Bob is created at the given coordinates, relative to the Blitter and uses the given frame. + * A Bob can use any frame belonging to the texture bound to the Blitter. + * @param x The x position of the Bob. Bob coordinate are relative to the position of the Blitter object. + * @param y The y position of the Bob. Bob coordinate are relative to the position of the Blitter object. + * @param frame The Frame the Bob will use. It _must_ be part of the Texture the parent Blitter object is using. + * @param visible Should the created Bob render or not? Default true. + * @param index The position in the Blitters Display List to add the new Bob at. Defaults to the top of the list. + */ + create(x: number, y: number, frame?: string | number | Phaser.Textures.Frame, visible?: boolean, index?: number): Phaser.GameObjects.Bob; + + /** + * Creates multiple Bob objects within this Blitter and then passes each of them to the specified callback. + * @param callback The callback to invoke after creating a bob. It will be sent two arguments: The Bob and the index of the Bob. + * @param quantity The quantity of Bob objects to create. + * @param frame The Frame the Bobs will use. It must be part of the Blitter Texture. + * @param visible Should the created Bob render or not? Default true. + */ + createFromCallback(callback: CreateCallback, quantity: number, frame?: string | number | Phaser.Textures.Frame | string[] | number[] | Phaser.Textures.Frame[], visible?: boolean): Phaser.GameObjects.Bob[]; + + /** + * Creates multiple Bobs in one call. + * + * The amount created is controlled by a combination of the `quantity` argument and the number of frames provided. + * + * If the quantity is set to 10 and you provide 2 frames, then 20 Bobs will be created. 10 with the first + * frame and 10 with the second. + * @param quantity The quantity of Bob objects to create. + * @param frame The Frame the Bobs will use. It must be part of the Blitter Texture. + * @param visible Should the created Bob render or not? Default true. + */ + createMultiple(quantity: number, frame?: string | number | Phaser.Textures.Frame | string[] | number[] | Phaser.Textures.Frame[], visible?: boolean): Phaser.GameObjects.Bob[]; + + /** + * Checks if the given child can render or not, by checking its `visible` and `alpha` values. + * @param child The Bob to check for rendering. + */ + childCanRender(child: Phaser.GameObjects.Bob): boolean; + + /** + * Returns an array of Bobs to be rendered. + * If the Blitter is dirty then a new list is generated and stored in `renderList`. + */ + getRenderList(): Phaser.GameObjects.Bob[]; + + /** + * Removes all Bobs from the children List and clears the dirty flag. + */ + clear(): void; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Bob Game Object. + * + * A Bob belongs to a Blitter Game Object. The Blitter is responsible for managing and rendering this object. + * + * A Bob has a position, alpha value and a frame from a texture that it uses to render with. You can also toggle + * the flipped and visible state of the Bob. The Frame the Bob uses to render can be changed dynamically, but it + * must be a Frame within the Texture used by the parent Blitter. + * + * Bob positions are relative to the Blitter parent. So if you move the Blitter parent, all Bob children will + * have their positions impacted by this change as well. + * + * You can manipulate Bob objects directly from your game code, but the creation and destruction of them should be + * handled via the Blitter parent. + */ + class Bob { + /** + * + * @param blitter The parent Blitter object is responsible for updating this Bob. + * @param x The horizontal position of this Game Object in the world, relative to the parent Blitter position. + * @param y The vertical position of this Game Object in the world, relative to the parent Blitter position. + * @param frame The Frame this Bob will render with, as defined in the Texture the parent Blitter is using. + * @param visible Should the Bob render visible or not to start with? + */ + constructor(blitter: Phaser.GameObjects.Blitter, x: number, y: number, frame: string | number, visible: boolean); + + /** + * The Blitter object that this Bob belongs to. + */ + parent: Phaser.GameObjects.Blitter; + + /** + * The x position of this Bob, relative to the x position of the Blitter. + */ + x: number; + + /** + * The y position of this Bob, relative to the y position of the Blitter. + */ + y: number; + + /** + * The frame that the Bob uses to render with. + * To change the frame use the `Bob.setFrame` method. + */ + protected frame: Phaser.Textures.Frame; + + /** + * A blank object which can be used to store data related to this Bob in. + */ + data: object; + + /** + * The tint value of this Bob. + */ + tint: number; + + /** + * The horizontally flipped state of the Bob. + * A Bob that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Bob. + * A Bob that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture. + */ + flipY: boolean; + + /** + * Changes the Texture Frame being used by this Bob. + * The frame must be part of the Texture the parent Blitter is using. + * If no value is given it will use the default frame of the Blitter parent. + * @param frame The frame to be used during rendering. + */ + setFrame(frame?: string | number | Phaser.Textures.Frame): this; + + /** + * Resets the horizontal and vertical flipped state of this Bob back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Resets this Bob. + * + * Changes the position to the values given, and optionally changes the frame. + * + * Also resets the flipX and flipY values, sets alpha back to 1 and visible to true. + * @param x The x position of the Bob. Bob coordinate are relative to the position of the Blitter object. + * @param y The y position of the Bob. Bob coordinate are relative to the position of the Blitter object. + * @param frame The Frame the Bob will use. It _must_ be part of the Texture the parent Blitter object is using. + */ + reset(x: number, y: number, frame?: string | number | Phaser.Textures.Frame): this; + + /** + * Changes the position of this Bob to the values given. + * @param x The x position of the Bob. Bob coordinate are relative to the position of the Blitter object. + * @param y The y position of the Bob. Bob coordinate are relative to the position of the Blitter object. + */ + setPosition(x: number, y: number): this; + + /** + * Sets the horizontal flipped state of this Bob. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Bob. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Bob. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Sets the visibility of this Bob. + * + * An invisible Bob will skip rendering. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * Set the Alpha level of this Bob. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * A Bob with alpha 0 will skip rendering. + * @param value The alpha value used for this Bob. Between 0 and 1. + */ + setAlpha(value: number): this; + + /** + * Sets the tint of this Bob. + * @param value The tint value used for this Bob. Between 0 and 0xffffff. + */ + setTint(value: number): this; + + /** + * Destroys this Bob instance. + * Removes itself from the Blitter and clears the parent, frame and data properties. + */ + destroy(): void; + + /** + * The visible state of the Bob. + * + * An invisible Bob will skip rendering. + */ + visible: boolean; + + /** + * The alpha value of the Bob, between 0 and 1. + * + * A Bob with alpha 0 will skip rendering. + */ + alpha: number; + + } + + /** + * Builds a Game Object using the provided configuration object. + * @param scene A reference to the Scene. + * @param gameObject The initial GameObject. + * @param config The config to build the GameObject with. + */ + function BuildGameObject(scene: Phaser.Scene, gameObject: Phaser.GameObjects.GameObject, config: Phaser.Types.GameObjects.GameObjectConfig): Phaser.GameObjects.GameObject; + + /** + * Adds an Animation component to a Sprite and populates it based on the given config. + * @param sprite The sprite to add an Animation component to. + * @param config The animation config. + */ + function BuildGameObjectAnimation(sprite: Phaser.GameObjects.Sprite, config: object): Phaser.GameObjects.Sprite; + + namespace Components { + /** + * Provides methods used for setting the alpha properties of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Alpha { + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + } + + /** + * Provides methods used for setting the alpha property of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface AlphaSingle { + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + } + + /** + * Provides methods used for setting the blend mode of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface BlendMode { + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + } + + /** + * Provides methods used for calculating and setting the size of a non-Frame based Game Object. + * Should be applied as a mixin and not used directly. + */ + interface ComputedSize { + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + } + + /** + * Provides methods used for getting and setting the texture of a Game Object. + */ + interface Crop { + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + } + + /** + * Provides methods used for setting the depth of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Depth { + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + } + + /** + * Provides methods used for visually flipping a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Flip { + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + } + + interface FX { + /** + * A reference to the Game Object that owns this FX Component. + */ + readonly gameObject: Phaser.GameObjects.GameObject; + /** + * Is this a Post FX Controller? or a Pre FX Controller? + */ + readonly isPost: boolean; + /** + * Has this FX Component been enabled? + * + * You should treat this property as read-only, although it is toggled + * automaticaly during internal use. + */ + enabled: boolean; + /** + * An array containing all of the Pre FX Controllers that + * have been added to this FX Component. They are processed in + * the order they are added. + * + * This array is empty if this is a Post FX Component. + */ + list: Phaser.FX.Controller[]; + /** + * The amount of extra padding to be applied to this Game Object + * when it is being rendered by a PreFX Pipeline. + * + * Lots of FX require additional spacing added to the texture the + * Game Object uses, for example a glow or shadow effect, and this + * method allows you to control how much extra padding is included + * in addition to the texture size. + * + * You do not need to set this if you're only using Post FX. + */ + padding: number; + /** + * Sets the amount of extra padding to be applied to this Game Object + * when it is being rendered by a PreFX Pipeline. + * + * Lots of FX require additional spacing added to the texture the + * Game Object uses, for example a glow or shadow effect, and this + * method allows you to control how much extra padding is included + * in addition to the texture size. + * + * You do not need to set this if you're only using Post FX. + * @param padding The amount of padding to add to this Game Object. Default 0. + */ + setPadding(padding?: number): this; + /** + * This callback is invoked when this Game Object is copied by a PreFX Pipeline. + * + * This happens when the pipeline uses its `copySprite` method. + * + * It's invoked prior to the copy, allowing you to set shader uniforms, etc on the pipeline. + * @param pipeline The PreFX Pipeline that invoked this callback. + */ + onFXCopy(pipeline: Phaser.Renderer.WebGL.Pipelines.PreFXPipeline): void; + /** + * This callback is invoked when this Game Object is rendered by a PreFX Pipeline. + * + * This happens when the pipeline uses its `drawSprite` method. + * + * It's invoked prior to the draw, allowing you to set shader uniforms, etc on the pipeline. + * @param pipeline The PreFX Pipeline that invoked this callback. + */ + onFX(pipeline: Phaser.Renderer.WebGL.Pipelines.PreFXPipeline): void; + /** + * Enables this FX Component and applies the FXPipeline to the parent Game Object. + * + * This is called automatically whenever you call a method such as `addBloom`, etc. + * + * You can check the `enabled` property to see if the Game Object is already enabled, or not. + * + * This only applies to Pre FX. Post FX are always enabled. + * @param padding The amount of padding to add to this Game Object. Default 0. + */ + enable(padding?: number): void; + /** + * Destroys and removes all FX Controllers that are part of this FX Component, + * then disables it. + * + * If this is a Pre FX Component it will only remove Pre FX. + * If this is a Post FX Component it will only remove Post FX. + * + * To remove both at once use the `GameObject.clearFX` method instead. + */ + clear(): this; + /** + * Searches for the given FX Controller within this FX Component. + * + * If found, the controller is removed from this component and then destroyed. + * @param fx The FX Controller to remove from this FX Component. + */ + remove(fx: T): this; + /** + * Disables this FX Component. + * + * This will reset the pipeline on the Game Object that owns this component back to its + * default and flag this component as disabled. + * + * You can re-enable it again by calling `enable` for Pre FX or by adding an FX for Post FX. + * + * Optionally, set `clear` to destroy all current FX Controllers. + * @param clear Destroy and remove all FX Controllers that are part of this component. Default false. + */ + disable(clear?: boolean): this; + /** + * Adds the given FX Controler to this FX Component. + * + * Note that adding an FX Controller does not remove any existing FX. They all stack-up + * on-top of each other. If you don't want this, make sure to call either `remove` or + * `clear` first. + * @param fx The FX Controller to add to this FX Component. + * @param config Optional configuration object that is passed to the pipeline during instantiation. + */ + add(fx: T, config?: object): Phaser.FX.Controller; + /** + * Adds a Glow effect. + * + * The glow effect is a visual technique that creates a soft, luminous halo around game objects, + * characters, or UI elements. This effect is used to emphasize importance, enhance visual appeal, + * or convey a sense of energy, magic, or otherworldly presence. The effect can also be set on + * the inside of the Game Object. The color and strength of the glow can be modified. + * @param color The color of the glow effect as a number value. Default 0xffffff. + * @param outerStrength The strength of the glow outward from the edge of the Sprite. Default 4. + * @param innerStrength The strength of the glow inward from the edge of the Sprite. Default 0. + * @param knockout If `true` only the glow is drawn, not the texture itself. Default false. + * @param quality Only available for PostFX. Sets the quality of this Glow effect. Default is 0.1. Cannot be changed post-creation. Default 0.1. + * @param distance Only available for PostFX. Sets the distance of this Glow effect. Default is 10. Cannot be changed post-creation. Default 10. + */ + addGlow(color?: number, outerStrength?: number, innerStrength?: number, knockout?: boolean, quality?: number, distance?: number): Phaser.FX.Glow; + /** + * Adds a Shadow effect. + * + * The shadow effect is a visual technique used to create the illusion of depth and realism by adding darker, + * offset silhouettes or shapes beneath game objects, characters, or environments. These simulated shadows + * help to enhance the visual appeal and immersion, making the 2D game world appear more dynamic and three-dimensional. + * @param x The horizontal offset of the shadow effect. Default 0. + * @param y The vertical offset of the shadow effect. Default 0. + * @param decay The amount of decay for shadow effect. Default 0.1. + * @param power The power of the shadow effect. Default 1. + * @param color The color of the shadow. Default 0x000000. + * @param samples The number of samples that the shadow effect will run for. An integer between 1 and 12. Default 6. + * @param intensity The intensity of the shadow effect. Default 1. + */ + addShadow(x?: number, y?: number, decay?: number, power?: number, color?: number, samples?: number, intensity?: number): Phaser.FX.Shadow; + /** + * Adds a Pixelate effect. + * + * The pixelate effect is a visual technique that deliberately reduces the resolution or detail of an image, + * creating a blocky or mosaic appearance composed of large, visible pixels. This effect can be used for stylistic + * purposes, as a homage to retro gaming, or as a means to obscure certain elements within the game, such as + * during a transition or to censor specific content. + * @param amount The amount of pixelation to apply. Default 1. + */ + addPixelate(amount?: number): Phaser.FX.Pixelate; + /** + * Adds a Vignette effect. + * + * The vignette effect is a visual technique where the edges of the screen, or a Game Object, gradually darken or blur, + * creating a frame-like appearance. This effect is used to draw the player's focus towards the central action or subject, + * enhance immersion, and provide a cinematic or artistic quality to the game's visuals. + * @param x The horizontal offset of the vignette effect. This value is normalized to the range 0 to 1. Default 0.5. + * @param y The vertical offset of the vignette effect. This value is normalized to the range 0 to 1. Default 0.5. + * @param radius The radius of the vignette effect. This value is normalized to the range 0 to 1. Default 0.5. + * @param strength The strength of the vignette effect. Default 0.5. + */ + addVignette(x?: number, y?: number, radius?: number, strength?: number): Phaser.FX.Vignette; + /** + * Adds a Shine effect. + * + * The shine effect is a visual technique that simulates the appearance of reflective + * or glossy surfaces by passing a light beam across a Game Object. This effect is used to + * enhance visual appeal, emphasize certain features, and create a sense of depth or + * material properties. + * @param speed The speed of the Shine effect. Default 0.5. + * @param lineWidth The line width of the Shine effect. Default 0.5. + * @param gradient The gradient of the Shine effect. Default 3. + * @param reveal Does this Shine effect reveal or get added to its target? Default false. + */ + addShine(speed?: number, lineWidth?: number, gradient?: number, reveal?: boolean): Phaser.FX.Shine; + /** + * Adds a Blur effect. + * + * A Gaussian blur is the result of blurring an image by a Gaussian function. It is a widely used effect, + * typically to reduce image noise and reduce detail. The visual effect of this blurring technique is a + * smooth blur resembling that of viewing the image through a translucent screen, distinctly different + * from the bokeh effect produced by an out-of-focus lens or the shadow of an object under usual illumination. + * @param quality The quality of the blur effect. Can be either 0 for Low Quality, 1 for Medium Quality or 2 for High Quality. Default 0. + * @param x The horizontal offset of the blur effect. Default 2. + * @param y The vertical offset of the blur effect. Default 2. + * @param strength The strength of the blur effect. Default 1. + * @param color The color of the blur, as a hex value. Default 0xffffff. + * @param steps The number of steps to run the blur effect for. This value should always be an integer. Default 4. + */ + addBlur(quality?: number, x?: number, y?: number, strength?: number, color?: number, steps?: number): Phaser.FX.Blur; + /** + * Adds a Gradient effect. + * + * The gradient overlay effect is a visual technique where a smooth color transition is applied over Game Objects, + * such as sprites or UI components. This effect is used to enhance visual appeal, emphasize depth, or create + * stylistic and atmospheric variations. It can also be utilized to convey information, such as representing + * progress or health status through color changes. + * @param color1 The first gradient color, given as a number value. Default 0xff0000. + * @param color2 The second gradient color, given as a number value. Default 0x00ff00. + * @param alpha The alpha value of the gradient effect. Default 0.2. + * @param fromX The horizontal position the gradient will start from. This value is normalized, between 0 and 1, and is not in pixels. Default 0. + * @param fromY The vertical position the gradient will start from. This value is normalized, between 0 and 1, and is not in pixels. Default 0. + * @param toX The horizontal position the gradient will end at. This value is normalized, between 0 and 1, and is not in pixels. Default 0. + * @param toY The vertical position the gradient will end at. This value is normalized, between 0 and 1, and is not in pixels. Default 1. + * @param size How many 'chunks' the gradient is divided in to, as spread over the entire height of the texture. Leave this at zero for a smooth gradient, or set higher for a more retro chunky effect. Default 0. + */ + addGradient(color1?: number, color2?: number, alpha?: number, fromX?: number, fromY?: number, toX?: number, toY?: number, size?: number): Phaser.FX.Gradient; + /** + * Adds a Bloom effect. + * + * Bloom is an effect used to reproduce an imaging artifact of real-world cameras. + * The effect produces fringes of light extending from the borders of bright areas in an image, + * contributing to the illusion of an extremely bright light overwhelming the + * camera or eye capturing the scene. + * @param color The color of the Bloom, as a hex value. + * @param offsetX The horizontal offset of the bloom effect. Default 1. + * @param offsetY The vertical offset of the bloom effect. Default 1. + * @param blurStrength The strength of the blur process of the bloom effect. Default 1. + * @param strength The strength of the blend process of the bloom effect. Default 1. + * @param steps The number of steps to run the Bloom effect for. This value should always be an integer. Default 4. + */ + addBloom(color?: number, offsetX?: number, offsetY?: number, blurStrength?: number, strength?: number, steps?: number): Phaser.FX.Bloom; + /** + * Adds a ColorMatrix effect. + * + * The color matrix effect is a visual technique that involves manipulating the colors of an image + * or scene using a mathematical matrix. This process can adjust hue, saturation, brightness, and contrast, + * allowing developers to create various stylistic appearances or mood settings within the game. + * Common applications include simulating different lighting conditions, applying color filters, + * or achieving a specific visual style. + */ + addColorMatrix(): Phaser.FX.ColorMatrix; + /** + * Adds a Circle effect. + * + * This effect will draw a circle around the texture of the Game Object, effectively masking off + * any area outside of the circle without the need for an actual mask. You can control the thickness + * of the circle, the color of the circle and the color of the background, should the texture be + * transparent. You can also control the feathering applied to the circle, allowing for a harsh or soft edge. + * + * Please note that adding this effect to a Game Object will not change the input area or physics body of + * the Game Object, should it have one. + * @param thickness The width of the circle around the texture, in pixels. Default 8. + * @param color The color of the circular ring, given as a number value. Default 0xfeedb6. + * @param backgroundColor The color of the background, behind the texture, given as a number value. Default 0xff0000. + * @param scale The scale of the circle. The default scale is 1, which is a circle the full size of the underlying texture. Default 1. + * @param feather The amount of feathering to apply to the circle from the ring. Default 0.005. + */ + addCircle(thickness?: number, color?: number, backgroundColor?: number, scale?: number, feather?: number): Phaser.FX.Circle; + /** + * Adds a Barrel effect. + * + * A barrel effect allows you to apply either a 'pinch' or 'expand' distortion to + * a Game Object. The amount of the effect can be modified in real-time. + * @param amount The amount of distortion applied to the barrel effect. A value of 1 is no distortion. Typically keep this within +- 1. Default 1. + */ + addBarrel(amount?: number): Phaser.FX.Barrel; + /** + * Adds a Displacement effect. + * + * The displacement effect is a visual technique that alters the position of pixels in an image + * or texture based on the values of a displacement map. This effect is used to create the illusion + * of depth, surface irregularities, or distortion in otherwise flat elements. It can be applied to + * characters, objects, or backgrounds to enhance realism, convey movement, or achieve various + * stylistic appearances. + * @param texture The unique string-based key of the texture to use for displacement, which must exist in the Texture Manager. Default '__WHITE'. + * @param x The amount of horizontal displacement to apply. A very small float number, such as 0.005. Default 0.005. + * @param y The amount of vertical displacement to apply. A very small float number, such as 0.005. Default 0.005. + */ + addDisplacement(texture?: string, x?: number, y?: number): Phaser.FX.Displacement; + /** + * Adds a Wipe effect. + * + * The wipe or reveal effect is a visual technique that gradually uncovers or conceals elements + * in the game, such as images, text, or scene transitions. This effect is often used to create + * a sense of progression, reveal hidden content, or provide a smooth and visually appealing transition + * between game states. + * + * You can set both the direction and the axis of the wipe effect. The following combinations are possible: + * + * * left to right: direction 0, axis 0 + * * right to left: direction 1, axis 0 + * * top to bottom: direction 1, axis 1 + * * bottom to top: direction 1, axis 0 + * + * It is up to you to set the `progress` value yourself, i.e. via a Tween, in order to transition the effect. + * @param wipeWidth The width of the wipe effect. This value is normalized in the range 0 to 1. Default 0.1. + * @param direction The direction of the wipe effect. Either 0 or 1. Set in conjunction with the axis property. Default 0. + * @param axis The axis of the wipe effect. Either 0 or 1. Set in conjunction with the direction property. Default 0. + */ + addWipe(wipeWidth?: number, direction?: number, axis?: number): Phaser.FX.Wipe; + /** + * Adds a Reveal Wipe effect. + * + * The wipe or reveal effect is a visual technique that gradually uncovers or conceals elements + * in the game, such as images, text, or scene transitions. This effect is often used to create + * a sense of progression, reveal hidden content, or provide a smooth and visually appealing transition + * between game states. + * + * You can set both the direction and the axis of the wipe effect. The following combinations are possible: + * + * * left to right: direction 0, axis 0 + * * right to left: direction 1, axis 0 + * * top to bottom: direction 1, axis 1 + * * bottom to top: direction 1, axis 0 + * + * It is up to you to set the `progress` value yourself, i.e. via a Tween, in order to transition the effect. + * @param wipeWidth The width of the wipe effect. This value is normalized in the range 0 to 1. Default 0.1. + * @param direction The direction of the wipe effect. Either 0 or 1. Set in conjunction with the axis property. Default 0. + * @param axis The axis of the wipe effect. Either 0 or 1. Set in conjunction with the direction property. Default 0. + */ + addReveal(wipeWidth?: number, direction?: number, axis?: number): Phaser.FX.Wipe; + /** + * Adds a Bokeh effect. + * + * Bokeh refers to a visual effect that mimics the photographic technique of creating a shallow depth of field. + * This effect is used to emphasize the game's main subject or action, by blurring the background or foreground + * elements, resulting in a more immersive and visually appealing experience. It is achieved through rendering + * techniques that simulate the out-of-focus areas, giving a sense of depth and realism to the game's graphics. + * + * See also Tilt Shift. + * @param radius The radius of the bokeh effect. Default 0.5. + * @param amount The amount of the bokeh effect. Default 1. + * @param contrast The color contrast of the bokeh effect. Default 0.2. + */ + addBokeh(radius?: number, amount?: number, contrast?: number): Phaser.FX.Bokeh; + /** + * Adds a Tilt Shift effect. + * + * This Bokeh effect can also be used to generate a Tilt Shift effect, which is a technique used to create a miniature + * effect by blurring everything except a small area of the image. This effect is achieved by blurring the + * top and bottom elements, while keeping the center area in focus. + * + * See also Bokeh. + * @param radius The radius of the bokeh effect. Default 0.5. + * @param amount The amount of the bokeh effect. Default 1. + * @param contrast The color contrast of the bokeh effect. Default 0.2. + * @param blurX The amount of horizontal blur. Default 1. + * @param blurY The amount of vertical blur. Default 1. + * @param strength The strength of the blur. Default 1. + */ + addTiltShift(radius?: number, amount?: number, contrast?: number, blurX?: number, blurY?: number, strength?: number): Phaser.FX.Bokeh; + /** + * Destroys this FX Component. + * + * Called automatically when Game Objects are destroyed. + */ + destroy(): void; + } + + /** + * Provides methods used for obtaining the bounds of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface GetBounds { + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + } + + /** + * Provides methods used for getting and setting the mask of a Game Object. + */ + interface Mask { + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + } + + /** + * Provides methods used for getting and setting the origin of a Game Object. + * Values are normalized, given in the range 0 to 1. + * Display values contain the calculated pixel values. + * Should be applied as a mixin and not used directly. + */ + interface Origin { + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + } + + /** + * Provides methods used for managing a Game Object following a Path. + * Should be applied as a mixin and not used directly. + */ + interface PathFollower { + /** + * The Path this PathFollower is following. It can only follow one Path at a time. + */ + path: Phaser.Curves.Path; + /** + * Should the PathFollower automatically rotate to point in the direction of the Path? + */ + rotateToPath: boolean; + /** + * Set the Path that this PathFollower should follow. + * + * Optionally accepts {@link Phaser.Types.GameObjects.PathFollower.PathConfig} settings. + * @param path The Path this PathFollower is following. It can only follow one Path at a time. + * @param config Settings for the PathFollower. + */ + setPath(path: Phaser.Curves.Path, config?: number | Phaser.Types.GameObjects.PathFollower.PathConfig | Phaser.Types.Tweens.NumberTweenBuilderConfig): this; + /** + * Set whether the PathFollower should automatically rotate to point in the direction of the Path. + * @param value Whether the PathFollower should automatically rotate to point in the direction of the Path. + * @param offset Rotation offset in degrees. Default 0. + */ + setRotateToPath(value: boolean, offset?: number): this; + /** + * Is this PathFollower actively following a Path or not? + * + * To be considered as `isFollowing` it must be currently moving on a Path, and not paused. + */ + isFollowing(): boolean; + /** + * Starts this PathFollower following its given Path. + * @param config The duration of the follow, or a PathFollower config object. Default {}. + * @param startAt Optional start position of the follow, between 0 and 1. Default 0. + */ + startFollow(config?: number | Phaser.Types.GameObjects.PathFollower.PathConfig | Phaser.Types.Tweens.NumberTweenBuilderConfig, startAt?: number): this; + /** + * Pauses this PathFollower. It will still continue to render, but it will remain motionless at the + * point on the Path at which you paused it. + */ + pauseFollow(): this; + /** + * Resumes a previously paused PathFollower. + * + * If the PathFollower was not paused this has no effect. + */ + resumeFollow(): this; + /** + * Stops this PathFollower from following the path any longer. + * + * This will invoke any 'stop' conditions that may exist on the Path, or for the follower. + */ + stopFollow(): this; + /** + * Internal update handler that advances this PathFollower along the path. + * + * Called automatically by the Scene step, should not typically be called directly. + */ + pathUpdate(): void; + } + + /** + * Provides methods used for setting the WebGL rendering pipeline of a Game Object. + */ + interface Pipeline { + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + } + + /** + * Provides methods used for setting the WebGL rendering post pipeline of a Game Object. + */ + interface PostPipeline { + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + } + + /** + * Provides methods used for getting and setting the Scroll Factor of a Game Object. + */ + interface ScrollFactor { + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + } + + /** + * Provides methods used for getting and setting the size of a Game Object. + */ + interface Size { + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + } + + /** + * Provides methods used for getting and setting the texture of a Game Object. + */ + interface Texture { + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + } + + /** + * Provides methods used for getting and setting the texture of a Game Object. + */ + interface TextureCrop { + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + } + + /** + * Provides methods used for setting the tint of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Tint { + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + } + + /** + * Build a JSON representation of the given Game Object. + * + * This is typically extended further by Game Object specific implementations. + */ + interface ToJSON { + } + + /** + * Provides methods used for getting and setting the position, scale and rotation of a Game Object. + */ + interface Transform { + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + /** + * The x position of this Game Object. + */ + x: number; + /** + * The y position of this Game Object. + */ + y: number; + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + /** + * The w position of this Game Object. + */ + w: number; + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + } + + /** + * A Matrix used for display transformations for rendering. + * + * It is represented like so: + * + * ``` + * | a | c | tx | + * | b | d | ty | + * | 0 | 0 | 1 | + * ``` + */ + class TransformMatrix { + /** + * + * @param a The Scale X value. Default 1. + * @param b The Skew Y value. Default 0. + * @param c The Skew X value. Default 0. + * @param d The Scale Y value. Default 1. + * @param tx The Translate X value. Default 0. + * @param ty The Translate Y value. Default 0. + */ + constructor(a?: number, b?: number, c?: number, d?: number, tx?: number, ty?: number); + + /** + * The matrix values. + */ + matrix: Float32Array; + + /** + * The decomposed matrix. + */ + decomposedMatrix: object; + + /** + * The temporary quad value cache. + */ + quad: Float32Array; + + /** + * The Scale X value. + */ + a: number; + + /** + * The Skew Y value. + */ + b: number; + + /** + * The Skew X value. + */ + c: number; + + /** + * The Scale Y value. + */ + d: number; + + /** + * The Translate X value. + */ + e: number; + + /** + * The Translate Y value. + */ + f: number; + + /** + * The Translate X value. + */ + tx: number; + + /** + * The Translate Y value. + */ + ty: number; + + /** + * The rotation of the Matrix. Value is in radians. + */ + readonly rotation: number; + + /** + * The rotation of the Matrix, normalized to be within the Phaser right-handed + * clockwise rotation space. Value is in radians. + */ + readonly rotationNormalized: number; + + /** + * The decomposed horizontal scale of the Matrix. This value is always positive. + */ + readonly scaleX: number; + + /** + * The decomposed vertical scale of the Matrix. This value is always positive. + */ + readonly scaleY: number; + + /** + * Reset the Matrix to an identity matrix. + */ + loadIdentity(): this; + + /** + * Translate the Matrix. + * @param x The horizontal translation value. + * @param y The vertical translation value. + */ + translate(x: number, y: number): this; + + /** + * Scale the Matrix. + * @param x The horizontal scale value. + * @param y The vertical scale value. + */ + scale(x: number, y: number): this; + + /** + * Rotate the Matrix. + * @param angle The angle of rotation in radians. + */ + rotate(angle: number): this; + + /** + * Multiply this Matrix by the given Matrix. + * + * If an `out` Matrix is given then the results will be stored in it. + * If it is not given, this matrix will be updated in place instead. + * Use an `out` Matrix if you do not wish to mutate this matrix. + * @param rhs The Matrix to multiply by. + * @param out An optional Matrix to store the results in. + */ + multiply(rhs: Phaser.GameObjects.Components.TransformMatrix, out?: Phaser.GameObjects.Components.TransformMatrix): this | Phaser.GameObjects.Components.TransformMatrix; + + /** + * Multiply this Matrix by the matrix given, including the offset. + * + * The offsetX is added to the tx value: `offsetX * a + offsetY * c + tx`. + * The offsetY is added to the ty value: `offsetY * b + offsetY * d + ty`. + * @param src The source Matrix to copy from. + * @param offsetX Horizontal offset to factor in to the multiplication. + * @param offsetY Vertical offset to factor in to the multiplication. + */ + multiplyWithOffset(src: Phaser.GameObjects.Components.TransformMatrix, offsetX: number, offsetY: number): this; + + /** + * Transform the Matrix. + * @param a The Scale X value. + * @param b The Shear Y value. + * @param c The Shear X value. + * @param d The Scale Y value. + * @param tx The Translate X value. + * @param ty The Translate Y value. + */ + transform(a: number, b: number, c: number, d: number, tx: number, ty: number): this; + + /** + * Transform a point in to the local space of this Matrix. + * @param x The x coordinate of the point to transform. + * @param y The y coordinate of the point to transform. + * @param point Optional Point object to store the transformed coordinates in. + */ + transformPoint(x: number, y: number, point?: Phaser.Types.Math.Vector2Like): Phaser.Types.Math.Vector2Like; + + /** + * Invert the Matrix. + */ + invert(): this; + + /** + * Set the values of this Matrix to copy those of the matrix given. + * @param src The source Matrix to copy from. + */ + copyFrom(src: Phaser.GameObjects.Components.TransformMatrix): this; + + /** + * Set the values of this Matrix to copy those of the array given. + * Where array indexes 0, 1, 2, 3, 4 and 5 are mapped to a, b, c, d, e and f. + * @param src The array of values to set into this matrix. + */ + copyFromArray(src: any[]): this; + + /** + * Copy the values from this Matrix to the given Canvas Rendering Context. + * This will use the Context.transform method. + * @param ctx The Canvas Rendering Context to copy the matrix values to. + */ + copyToContext(ctx: CanvasRenderingContext2D): CanvasRenderingContext2D; + + /** + * Copy the values from this Matrix to the given Canvas Rendering Context. + * This will use the Context.setTransform method. + * @param ctx The Canvas Rendering Context to copy the matrix values to. + */ + setToContext(ctx: CanvasRenderingContext2D): CanvasRenderingContext2D; + + /** + * Copy the values in this Matrix to the array given. + * + * Where array indexes 0, 1, 2, 3, 4 and 5 are mapped to a, b, c, d, e and f. + * @param out The array to copy the matrix values in to. + */ + copyToArray(out?: any[]): any[]; + + /** + * Set the values of this Matrix. + * @param a The Scale X value. + * @param b The Shear Y value. + * @param c The Shear X value. + * @param d The Scale Y value. + * @param tx The Translate X value. + * @param ty The Translate Y value. + */ + setTransform(a: number, b: number, c: number, d: number, tx: number, ty: number): this; + + /** + * Decompose this Matrix into its translation, scale and rotation values using QR decomposition. + * + * The result must be applied in the following order to reproduce the current matrix: + * + * translate -> rotate -> scale + */ + decomposeMatrix(): Phaser.Types.GameObjects.DecomposeMatrixResults; + + /** + * Apply the identity, translate, rotate and scale operations on the Matrix. + * @param x The horizontal translation. + * @param y The vertical translation. + * @param rotation The angle of rotation in radians. + * @param scaleX The horizontal scale. + * @param scaleY The vertical scale. + */ + applyITRS(x: number, y: number, rotation: number, scaleX: number, scaleY: number): this; + + /** + * Takes the `x` and `y` values and returns a new position in the `output` vector that is the inverse of + * the current matrix with its transformation applied. + * + * Can be used to translate points from world to local space. + * @param x The x position to translate. + * @param y The y position to translate. + * @param output A Vector2, or point-like object, to store the results in. + */ + applyInverse(x: number, y: number, output?: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Performs the 8 calculations required to create the vertices of + * a quad based on this matrix and the given x/y/xw/yh values. + * + * The result is stored in `TransformMatrix.quad`, which is returned + * from this method. + * @param x The x value. + * @param y The y value. + * @param xw The xw value. + * @param yh The yh value. + * @param roundPixels Pass the results via Math.round? Default false. + * @param quad Optional Float32Array to store the results in. Otherwises uses the local quad array. + */ + setQuad(x: number, y: number, xw: number, yh: number, roundPixels?: boolean, quad?: Float32Array): Float32Array; + + /** + * Returns the X component of this matrix multiplied by the given values. + * This is the same as `x * a + y * c + e`. + * @param x The x value. + * @param y The y value. + */ + getX(x: number, y: number): number; + + /** + * Returns the Y component of this matrix multiplied by the given values. + * This is the same as `x * b + y * d + f`. + * @param x The x value. + * @param y The y value. + */ + getY(x: number, y: number): number; + + /** + * Returns the X component of this matrix multiplied by the given values. + * + * This is the same as `x * a + y * c + e`, optionally passing via `Math.round`. + * @param x The x value. + * @param y The y value. + * @param round Math.round the resulting value? Default false. + */ + getXRound(x: number, y: number, round?: boolean): number; + + /** + * Returns the Y component of this matrix multiplied by the given values. + * + * This is the same as `x * b + y * d + f`, optionally passing via `Math.round`. + * @param x The x value. + * @param y The y value. + * @param round Math.round the resulting value? Default false. + */ + getYRound(x: number, y: number, round?: boolean): number; + + /** + * Returns a string that can be used in a CSS Transform call as a `matrix` property. + */ + getCSSMatrix(): string; + + /** + * Destroys this Transform Matrix. + */ + destroy(): void; + + } + + /** + * Provides methods used for setting the visibility of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Visible { + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + } + + } + + /** + * A Container Game Object. + * + * A Container, as the name implies, can 'contain' other types of Game Object. + * When a Game Object is added to a Container, the Container becomes responsible for the rendering of it. + * By default it will be removed from the Display List and instead added to the Containers own internal list. + * + * The position of the Game Object automatically becomes relative to the position of the Container. + * + * The transform point of a Container is 0x0 (in local space) and that cannot be changed. The children you add to the + * Container should be positioned with this value in mind. I.e. you should treat 0x0 as being the center of + * the Container, and position children positively and negative around it as required. + * + * When the Container is rendered, all of its children are rendered as well, in the order in which they exist + * within the Container. Container children can be repositioned using methods such as `MoveUp`, `MoveDown` and `SendToBack`. + * + * If you modify a transform property of the Container, such as `Container.x` or `Container.rotation` then it will + * automatically influence all children as well. + * + * Containers can include other Containers for deeply nested transforms. + * + * Containers can have masks set on them and can be used as a mask too. However, Container children cannot be masked. + * The masks do not 'stack up'. Only a Container on the root of the display list will use its mask. + * + * Containers can be enabled for input. Because they do not have a texture you need to provide a shape for them + * to use as their hit area. Container children can also be enabled for input, independent of the Container. + * + * If input enabling a _child_ you should not set both the `origin` and a **negative** scale factor on the child, + * or the input area will become misaligned. + * + * Containers can be given a physics body for either Arcade Physics, Impact Physics or Matter Physics. However, + * if Container _children_ are enabled for physics you may get unexpected results, such as offset bodies, + * if the Container itself, or any of its ancestors, is positioned anywhere other than at 0 x 0. Container children + * with physics do not factor in the Container due to the excessive extra calculations needed. Please structure + * your game to work around this. + * + * It's important to understand the impact of using Containers. They add additional processing overhead into + * every one of their children. The deeper you nest them, the more the cost escalates. This is especially true + * for input events. You also loose the ability to set the display depth of Container children in the same + * flexible manner as those not within them. In short, don't use them for the sake of it. You pay a small cost + * every time you create one, try to structure your game around avoiding that where possible. + */ + class Container extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.ComputedSize, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param children An optional array of Game Objects to add to this Container. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, children?: Phaser.GameObjects.GameObject[]); + + /** + * An array holding the children of this Container. + */ + list: Phaser.GameObjects.GameObject[]; + + /** + * Does this Container exclusively manage its children? + * + * The default is `true` which means a child added to this Container cannot + * belong in another Container, which includes the Scene display list. + * + * If you disable this then this Container will no longer exclusively manage its children. + * This allows you to create all kinds of interesting graphical effects, such as replicating + * Game Objects without reparenting them all over the Scene. + * However, doing so will prevent children from receiving any kind of input event or have + * their physics bodies work by default, as they're no longer a single entity on the + * display list, but are being replicated where-ever this Container is. + */ + exclusive: boolean; + + /** + * Containers can have an optional maximum size. If set to anything above 0 it + * will constrict the addition of new Game Objects into the Container, capping off + * the maximum limit the Container can grow in size to. + */ + maxSize: number; + + /** + * The cursor position. + */ + position: number; + + /** + * Internal Transform Matrix used for local space conversion. + */ + localTransform: Phaser.GameObjects.Components.TransformMatrix; + + /** + * The horizontal scroll factor of this Container. + * + * The scroll factor controls the influence of the movement of a Camera upon this Container. + * + * When a camera scrolls it will change the location at which this Container is rendered on-screen. + * It does not change the Containers actual position values. + * + * For a Container, setting this value will only update the Container itself, not its children. + * If you wish to change the scrollFactor of the children as well, use the `setScrollFactor` method. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Container. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Container. + * + * The scroll factor controls the influence of the movement of a Camera upon this Container. + * + * When a camera scrolls it will change the location at which this Container is rendered on-screen. + * It does not change the Containers actual position values. + * + * For a Container, setting this value will only update the Container itself, not its children. + * If you wish to change the scrollFactor of the children as well, use the `setScrollFactor` method. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Container. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Internal value to allow Containers to be used for input and physics. + * Do not change this value. It has no effect other than to break things. + */ + readonly originX: number; + + /** + * Internal value to allow Containers to be used for input and physics. + * Do not change this value. It has no effect other than to break things. + */ + readonly originY: number; + + /** + * Internal value to allow Containers to be used for input and physics. + * Do not change this value. It has no effect other than to break things. + */ + readonly displayOriginX: number; + + /** + * Internal value to allow Containers to be used for input and physics. + * Do not change this value. It has no effect other than to break things. + */ + readonly displayOriginY: number; + + /** + * Does this Container exclusively manage its children? + * + * The default is `true` which means a child added to this Container cannot + * belong in another Container, which includes the Scene display list. + * + * If you disable this then this Container will no longer exclusively manage its children. + * This allows you to create all kinds of interesting graphical effects, such as replicating + * Game Objects without reparenting them all over the Scene. + * However, doing so will prevent children from receiving any kind of input event or have + * their physics bodies work by default, as they're no longer a single entity on the + * display list, but are being replicated where-ever this Container is. + * @param value The exclusive state of this Container. Default true. + */ + setExclusive(value?: boolean): this; + + /** + * Gets the bounds of this Container. It works by iterating all children of the Container, + * getting their respective bounds, and then working out a min-max rectangle from that. + * It does not factor in if the children render or not, all are included. + * + * Some children are unable to return their bounds, such as Graphics objects, in which case + * they are skipped. + * + * Depending on the quantity of children in this Container it could be a really expensive call, + * so cache it and only poll it as needed. + * + * The values are stored and returned in a Rectangle object. + * @param output A Geom.Rectangle object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: Phaser.Geom.Rectangle): Phaser.Geom.Rectangle; + + /** + * Takes a Point-like object, such as a Vector2, Geom.Point or object with public x and y properties, + * and transforms it into the space of this Container, then returns it in the output object. + * @param source The Source Point to be transformed. + * @param output A destination object to store the transformed point in. If none given a Vector2 will be created and returned. + */ + pointToContainer(source: Phaser.Types.Math.Vector2Like, output?: Phaser.Types.Math.Vector2Like): Phaser.Types.Math.Vector2Like; + + /** + * Returns the world transform matrix as used for Bounds checks. + * + * The returned matrix is temporal and shouldn't be stored. + */ + getBoundsTransformMatrix(): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Adds the given Game Object, or array of Game Objects, to this Container. + * + * Each Game Object must be unique within the Container. + * @param child The Game Object, or array of Game Objects, to add to the Container. + */ + add(child: (T|T[])): this; + + /** + * Adds the given Game Object, or array of Game Objects, to this Container at the specified position. + * + * Existing Game Objects in the Container are shifted up. + * + * Each Game Object must be unique within the Container. + * @param child The Game Object, or array of Game Objects, to add to the Container. + * @param index The position to insert the Game Object/s at. Default 0. + */ + addAt(child: (T|T[]), index?: number): this; + + /** + * Returns the Game Object at the given position in this Container. + * @param index The position to get the Game Object from. + */ + getAt(index: number): T; + + /** + * Returns the index of the given Game Object in this Container. + * @param child The Game Object to search for in this Container. + */ + getIndex(child: T): number; + + /** + * Sort the contents of this Container so the items are in order based on the given property. + * For example: `sort('alpha')` would sort the elements based on the value of their `alpha` property. + * @param property The property to lexically sort by. + * @param handler Provide your own custom handler function. Will receive 2 children which it should compare and return a boolean. + */ + sort(property: string, handler?: Function): this; + + /** + * Searches for the first instance of a child with its `name` property matching the given argument. + * Should more than one child have the same name only the first is returned. + * @param name The name to search for. + */ + getByName(name: string): T; + + /** + * Returns a random Game Object from this Container. + * @param startIndex An optional start index. Default 0. + * @param length An optional length, the total number of elements (from the startIndex) to choose from. + */ + getRandom(startIndex?: number, length?: number): T; + + /** + * Gets the first Game Object in this Container. + * + * You can also specify a property and value to search for, in which case it will return the first + * Game Object in this Container with a matching property and / or value. + * + * For example: `getFirst('visible', true)` would return the first Game Object that had its `visible` property set. + * + * You can limit the search to the `startIndex` - `endIndex` range. + * @param property The property to test on each Game Object in the Container. + * @param value The value to test the property against. Must pass a strict (`===`) comparison check. + * @param startIndex An optional start index to search from. Default 0. + * @param endIndex An optional end index to search up to (but not included) Default Container.length. + */ + getFirst(property: string, value: any, startIndex?: number, endIndex?: number): T; + + /** + * Returns all Game Objects in this Container. + * + * You can optionally specify a matching criteria using the `property` and `value` arguments. + * + * For example: `getAll('body')` would return only Game Objects that have a body property. + * + * You can also specify a value to compare the property to: + * + * `getAll('visible', true)` would return only Game Objects that have their visible property set to `true`. + * + * Optionally you can specify a start and end index. For example if this Container had 100 Game Objects, + * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only + * the first 50 Game Objects. + * @param property The property to test on each Game Object in the Container. + * @param value If property is set then the `property` must strictly equal this value to be included in the results. + * @param startIndex An optional start index to search from. Default 0. + * @param endIndex An optional end index to search up to (but not included) Default Container.length. + */ + getAll(property?: string, value?: any, startIndex?: number, endIndex?: number): T[]; + + /** + * Returns the total number of Game Objects in this Container that have a property + * matching the given value. + * + * For example: `count('visible', true)` would count all the elements that have their visible property set. + * + * You can optionally limit the operation to the `startIndex` - `endIndex` range. + * @param property The property to check. + * @param value The value to check. + * @param startIndex An optional start index to search from. Default 0. + * @param endIndex An optional end index to search up to (but not included) Default Container.length. + */ + count(property: string, value: any, startIndex?: number, endIndex?: number): number; + + /** + * Swaps the position of two Game Objects in this Container. + * Both Game Objects must belong to this Container. + * @param child1 The first Game Object to swap. + * @param child2 The second Game Object to swap. + */ + swap(child1: T, child2: T): this; + + /** + * Moves a Game Object to a new position within this Container. + * + * The Game Object must already be a child of this Container. + * + * The Game Object is removed from its old position and inserted into the new one. + * Therefore the Container size does not change. Other children will change position accordingly. + * @param child The Game Object to move. + * @param index The new position of the Game Object in this Container. + */ + moveTo(child: T, index: number): this; + + /** + * Moves a Game Object above another one within this Container. + * + * These 2 Game Objects must already be children of this Container. + * @param child1 The Game Object to move above base Game Object. + * @param child2 The base Game Object. + */ + moveAbove(child1: T, child2: T): this; + + /** + * Moves a Game Object below another one within this Container. + * + * These 2 Game Objects must already be children of this Container. + * @param child1 The Game Object to move below base Game Object. + * @param child2 The base Game Object. + */ + moveBelow(child1: T, child2: T): this; + + /** + * Removes the given Game Object, or array of Game Objects, from this Container. + * + * The Game Objects must already be children of this Container. + * + * You can also optionally call `destroy` on each Game Object that is removed from the Container. + * @param child The Game Object, or array of Game Objects, to be removed from the Container. + * @param destroyChild Optionally call `destroy` on each child successfully removed from this Container. Default false. + */ + remove(child: (T|T[]), destroyChild?: boolean): this; + + /** + * Removes the Game Object at the given position in this Container. + * + * You can also optionally call `destroy` on the Game Object, if one is found. + * @param index The index of the Game Object to be removed. + * @param destroyChild Optionally call `destroy` on the Game Object if successfully removed from this Container. Default false. + */ + removeAt(index: number, destroyChild?: boolean): this; + + /** + * Removes the Game Objects between the given positions in this Container. + * + * You can also optionally call `destroy` on each Game Object that is removed from the Container. + * @param startIndex An optional start index to search from. Default 0. + * @param endIndex An optional end index to search up to (but not included) Default Container.length. + * @param destroyChild Optionally call `destroy` on each Game Object successfully removed from this Container. Default false. + */ + removeBetween(startIndex?: number, endIndex?: number, destroyChild?: boolean): this; + + /** + * Removes all Game Objects from this Container. + * + * You can also optionally call `destroy` on each Game Object that is removed from the Container. + * @param destroyChild Optionally call `destroy` on each Game Object successfully removed from this Container. Default false. + */ + removeAll(destroyChild?: boolean): this; + + /** + * Brings the given Game Object to the top of this Container. + * This will cause it to render on-top of any other objects in the Container. + * @param child The Game Object to bring to the top of the Container. + */ + bringToTop(child: T): this; + + /** + * Sends the given Game Object to the bottom of this Container. + * This will cause it to render below any other objects in the Container. + * @param child The Game Object to send to the bottom of the Container. + */ + sendToBack(child: T): this; + + /** + * Moves the given Game Object up one place in this Container, unless it's already at the top. + * @param child The Game Object to be moved in the Container. + */ + moveUp(child: T): this; + + /** + * Moves the given Game Object down one place in this Container, unless it's already at the bottom. + * @param child The Game Object to be moved in the Container. + */ + moveDown(child: T): this; + + /** + * Reverses the order of all Game Objects in this Container. + */ + reverse(): this; + + /** + * Shuffles the all Game Objects in this Container using the Fisher-Yates implementation. + */ + shuffle(): this; + + /** + * Replaces a Game Object in this Container with the new Game Object. + * The new Game Object cannot already be a child of this Container. + * @param oldChild The Game Object in this Container that will be replaced. + * @param newChild The Game Object to be added to this Container. + * @param destroyChild Optionally call `destroy` on the Game Object if successfully removed from this Container. Default false. + */ + replace(oldChild: T, newChild: T, destroyChild?: boolean): this; + + /** + * Returns `true` if the given Game Object is a direct child of this Container. + * + * This check does not scan nested Containers. + * @param child The Game Object to check for within this Container. + */ + exists(child: T): boolean; + + /** + * Sets the property to the given value on all Game Objects in this Container. + * + * Optionally you can specify a start and end index. For example if this Container had 100 Game Objects, + * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only + * the first 50 Game Objects. + * @param property The property that must exist on the Game Object. + * @param value The value to get the property to. + * @param startIndex An optional start index to search from. Default 0. + * @param endIndex An optional end index to search up to (but not included) Default Container.length. + */ + setAll(property: string, value: any, startIndex?: number, endIndex?: number): this; + + /** + * Passes all Game Objects in this Container to the given callback. + * + * A copy of the Container is made before passing each entry to your callback. + * This protects against the callback itself modifying the Container. + * + * If you know for sure that the callback will not change the size of this Container + * then you can use the more performant `Container.iterate` method instead. + * @param callback The function to call. + * @param context Value to use as `this` when executing callback. + * @param args Additional arguments that will be passed to the callback, after the child. + */ + each(callback: Function, context?: object, ...args: any[]): this; + + /** + * Passes all Game Objects in this Container to the given callback. + * + * Only use this method when you absolutely know that the Container will not be modified during + * the iteration, i.e. by removing or adding to its contents. + * @param callback The function to call. + * @param context Value to use as `this` when executing callback. + * @param args Additional arguments that will be passed to the callback, after the child. + */ + iterate(callback: Function, context?: object, ...args: any[]): this; + + /** + * Sets the scroll factor of this Container and optionally all of its children. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + * @param updateChildren Apply this scrollFactor to all Container children as well? Default false. + */ + setScrollFactor(x: number, y?: number, updateChildren?: boolean): this; + + /** + * The number of Game Objects inside this Container. + */ + readonly length: number; + + /** + * Returns the first Game Object within the Container, or `null` if it is empty. + * + * You can move the cursor by calling `Container.next` and `Container.previous`. + */ + readonly first: Phaser.GameObjects.GameObject | null; + + /** + * Returns the last Game Object within the Container, or `null` if it is empty. + * + * You can move the cursor by calling `Container.next` and `Container.previous`. + */ + readonly last: Phaser.GameObjects.GameObject | null; + + /** + * Returns the next Game Object within the Container, or `null` if it is empty. + * + * You can move the cursor by calling `Container.next` and `Container.previous`. + */ + readonly next: Phaser.GameObjects.GameObject | null; + + /** + * Returns the previous Game Object within the Container, or `null` if it is empty. + * + * You can move the cursor by calling `Container.next` and `Container.previous`. + */ + readonly previous: Phaser.GameObjects.GameObject | null; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * Internal handler, called when a child is destroyed. + */ + protected onChildDestroyed(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Display List plugin. + * + * Display Lists belong to a Scene and maintain the list of Game Objects to render every frame. + * + * Some of these Game Objects may also be part of the Scene's [Update List]{@link Phaser.GameObjects.UpdateList}, for updating. + */ + class DisplayList extends Phaser.Structs.List { + /** + * + * @param scene The Scene that this Display List belongs to. + */ + constructor(scene: Phaser.Scene); + + /** + * The flag the determines whether Game Objects should be sorted when `depthSort()` is called. + */ + sortChildrenFlag: boolean; + + /** + * The Scene that this Display List belongs to. + */ + scene: Phaser.Scene; + + /** + * The Scene's Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * The Scene's Event Emitter. + */ + events: Phaser.Events.EventEmitter; + + /** + * Force a sort of the display list on the next call to depthSort. + */ + queueDepthSort(): void; + + /** + * Immediately sorts the display list if the flag is set. + */ + depthSort(): void; + + /** + * Compare the depth of two Game Objects. + * @param childA The first Game Object. + * @param childB The second Game Object. + */ + sortByDepth(childA: Phaser.GameObjects.GameObject, childB: Phaser.GameObjects.GameObject): number; + + /** + * Returns an array which contains all objects currently on the Display List. + * This is a reference to the main list array, not a copy of it, so be careful not to modify it. + */ + getChildren(): Phaser.GameObjects.GameObject[]; + + } + + /** + * DOM Element Game Objects are a way to control and manipulate HTML Elements over the top of your game. + * + * In order for DOM Elements to display you have to enable them by adding the following to your game + * configuration object: + * + * ```javascript + * dom { + * createContainer: true + * } + * ``` + * + * You must also have a parent container for Phaser. This is specified by the `parent` property in the + * game config. + * + * When these two things are added, Phaser will automatically create a DOM Container div that is positioned + * over the top of the game canvas. This div is sized to match the canvas, and if the canvas size changes, + * as a result of settings within the Scale Manager, the dom container is resized accordingly. + * + * If you have not already done so, you have to provide a `parent` in the Game Configuration, or the DOM + * Container will fail to be created. + * + * You can create a DOM Element by either passing in DOMStrings, or by passing in a reference to an existing + * Element that you wish to be placed under the control of Phaser. For example: + * + * ```javascript + * this.add.dom(x, y, 'div', 'background-color: lime; width: 220px; height: 100px; font: 48px Arial', 'Phaser'); + * ``` + * + * The above code will insert a div element into the DOM Container at the given x/y coordinate. The DOMString in + * the 4th argument sets the initial CSS style of the div and the final argument is the inner text. In this case, + * it will create a lime colored div that is 220px by 100px in size with the text Phaser in it, in an Arial font. + * + * You should nearly always, without exception, use explicitly sized HTML Elements, in order to fully control + * alignment and positioning of the elements next to regular game content. + * + * Rather than specify the CSS and HTML directly you can use the `load.html` File Loader to load it into the + * cache and then use the `createFromCache` method instead. You can also use `createFromHTML` and various other + * methods available in this class to help construct your elements. + * + * Once the element has been created you can then control it like you would any other Game Object. You can set its + * position, scale, rotation, alpha and other properties. It will move as the main Scene Camera moves and be clipped + * at the edge of the canvas. It's important to remember some limitations of DOM Elements: The obvious one is that + * they appear above or below your game canvas. You cannot blend them into the display list, meaning you cannot have + * a DOM Element, then a Sprite, then another DOM Element behind it. + * + * They also cannot be enabled for input. To do that, you have to use the `addListener` method to add native event + * listeners directly. The final limitation is to do with cameras. The DOM Container is sized to match the game canvas + * entirely and clipped accordingly. DOM Elements respect camera scrolling and scrollFactor settings, but if you + * change the size of the camera so it no longer matches the size of the canvas, they won't be clipped accordingly. + * + * DOM Game Objects can be added to a Phaser Container, however you should only nest them **one level deep**. + * Any further down the chain and they will ignore all root container properties. + * + * Also, all DOM Elements are inserted into the same DOM Container, regardless of which Scene they are created in. + * + * Note that you should only have DOM Elements in a Scene with a _single_ Camera. If you require multiple cameras, + * use parallel scenes to achieve this. + * + * DOM Elements are a powerful way to align native HTML with your Phaser Game Objects. For example, you can insert + * a login form for a multiplayer game directly into your title screen. Or a text input box for a highscore table. + * Or a banner ad from a 3rd party service. Or perhaps you'd like to use them for high resolution text display and + * UI. The choice is up to you, just remember that you're dealing with standard HTML and CSS floating over the top + * of your game, and should treat it accordingly. + */ + class DOMElement extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this DOM Element in the world. Default 0. + * @param y The vertical position of this DOM Element in the world. Default 0. + * @param element An existing DOM element, or a string. If a string starting with a # it will do a `getElementById` look-up on the string (minus the hash). Without a hash, it represents the type of element to create, i.e. 'div'. + * @param style If a string, will be set directly as the elements `style` property value. If a plain object, will be iterated and the values transferred. In both cases the values replacing whatever CSS styles may have been previously set. + * @param innerText If given, will be set directly as the elements `innerText` property value, replacing whatever was there before. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, element?: Element | string, style?: string | any, innerText?: string); + + /** + * A reference to the parent DOM Container that the Game instance created when it started. + */ + parent: Element; + + /** + * A reference to the HTML Cache. + */ + cache: Phaser.Cache.BaseCache; + + /** + * The actual DOM Element that this Game Object is bound to. For example, if you've created a `
    ` + * then this property is a direct reference to that element within the dom. + */ + node: Element; + + /** + * By default a DOM Element will have its transform, display, opacity, zIndex and blend mode properties + * updated when its rendered. If, for some reason, you don't want any of these changed other than the + * CSS transform, then set this flag to `true`. When `true` only the CSS Transform is applied and it's + * up to you to keep track of and set the other properties as required. + * + * This can be handy if, for example, you've a nested DOM Element and you don't want the opacity to be + * picked-up by any of its children. + */ + transformOnly: boolean; + + /** + * The angle, in radians, by which to skew the DOM Element on the horizontal axis. + * + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform + */ + skewX: number; + + /** + * The angle, in radians, by which to skew the DOM Element on the vertical axis. + * + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform + */ + skewY: number; + + /** + * A Vector4 that contains the 3D rotation of this DOM Element around a fixed axis in 3D space. + * + * All values in the Vector4 are treated as degrees, unless the `rotate3dAngle` property is changed. + * + * For more details see the following MDN page: + * + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/rotate3d + */ + rotate3d: Phaser.Math.Vector4; + + /** + * The unit that represents the 3D rotation values. By default this is `deg` for degrees, but can + * be changed to any supported unit. See this page for further details: + * + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/rotate3d + */ + rotate3dAngle: string; + + /** + * Sets the CSS `pointerEvents` attribute on the DOM Element during rendering. + * + * This is 'auto' by default. Changing it may have unintended side-effects with + * internal Phaser input handling, such as dragging, so only change this if you + * understand the implications. + */ + pointerEvents: string; + + /** + * The native (un-scaled) width of this Game Object. + * + * For a DOM Element this property is read-only. + * + * The property `displayWidth` holds the computed bounds of this DOM Element, factoring in scaling. + */ + readonly width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * For a DOM Element this property is read-only. + * + * The property `displayHeight` holds the computed bounds of this DOM Element, factoring in scaling. + */ + readonly height: number; + + /** + * The computed display width of this Game Object, based on the `getBoundingClientRect` DOM call. + * + * The property `width` holds the un-scaled width of this DOM Element. + */ + readonly displayWidth: number; + + /** + * The computed display height of this Game Object, based on the `getBoundingClientRect` DOM call. + * + * The property `height` holds the un-scaled height of this DOM Element. + */ + readonly displayHeight: number; + + /** + * Sets the horizontal and vertical skew values of this DOM Element. + * + * For more information see: https://developer.mozilla.org/en-US/docs/Web/CSS/transform + * @param x The angle, in radians, by which to skew the DOM Element on the horizontal axis. Default 0. + * @param y The angle, in radians, by which to skew the DOM Element on the vertical axis. Default x. + */ + setSkew(x?: number, y?: number): this; + + /** + * Sets the perspective CSS property of the _parent DOM Container_. This determines the distance between the z=0 + * plane and the user in order to give a 3D-positioned element some perspective. Each 3D element with + * z > 0 becomes larger; each 3D-element with z < 0 becomes smaller. The strength of the effect is determined + * by the value of this property. + * + * For more information see: https://developer.mozilla.org/en-US/docs/Web/CSS/perspective + * + * **Changing this value changes it globally for all DOM Elements, as they all share the same parent container.** + * @param value The perspective value, in pixels, that determines the distance between the z plane and the user. + */ + setPerspective(value: number): this; + + /** + * The perspective CSS property value of the _parent DOM Container_. This determines the distance between the z=0 + * plane and the user in order to give a 3D-positioned element some perspective. Each 3D element with + * z > 0 becomes larger; each 3D-element with z < 0 becomes smaller. The strength of the effect is determined + * by the value of this property. + * + * For more information see: https://developer.mozilla.org/en-US/docs/Web/CSS/perspective + * + * **Changing this value changes it globally for all DOM Elements, as they all share the same parent container.** + */ + perspective: number; + + /** + * Adds one or more native DOM event listeners onto the underlying Element of this Game Object. + * The event is then dispatched via this Game Objects standard event emitter. + * + * For example: + * + * ```javascript + * var div = this.add.dom(x, y, element); + * + * div.addListener('click'); + * + * div.on('click', handler); + * ``` + * @param events The DOM event/s to listen for. You can specify multiple events by separating them with spaces. + */ + addListener(events: string): this; + + /** + * Removes one or more native DOM event listeners from the underlying Element of this Game Object. + * @param events The DOM event/s to stop listening for. You can specify multiple events by separating them with spaces. + */ + removeListener(events: string): this; + + /** + * Creates a native DOM Element, adds it to the parent DOM Container and then binds it to this Game Object, + * so you can control it. The `tagName` should be a string and is passed to `document.createElement`: + * + * ```javascript + * this.add.dom().createElement('div'); + * ``` + * + * For more details on acceptable tag names see: https://developer.mozilla.org/en-US/docs/Web/API/Document/createElement + * + * You can also pass in a DOMString or style object to set the CSS on the created element, and an optional `innerText` + * value as well. Here is an example of a DOMString: + * + * ```javascript + * this.add.dom().createElement('div', 'background-color: lime; width: 220px; height: 100px; font: 48px Arial', 'Phaser'); + * ``` + * + * And using a style object: + * + * ```javascript + * var style = { + * 'background-color': 'lime'; + * 'width': '200px'; + * 'height': '100px'; + * 'font': '48px Arial'; + * }; + * + * this.add.dom().createElement('div', style, 'Phaser'); + * ``` + * + * If this Game Object already has an Element, it is removed from the DOM entirely first. + * Any event listeners you may have previously created will need to be re-created after this call. + * @param tagName A string that specifies the type of element to be created. The nodeName of the created element is initialized with the value of tagName. Don't use qualified names (like "html:a") with this method. + * @param style Either a DOMString that holds the CSS styles to be applied to the created element, or an object the styles will be ready from. + * @param innerText A DOMString that holds the text that will be set as the innerText of the created element. + */ + createElement(tagName: string, style?: string | any, innerText?: string): this; + + /** + * Binds a new DOM Element to this Game Object. If this Game Object already has an Element it is removed from the DOM + * entirely first. Any event listeners you may have previously created will need to be re-created on the new element. + * + * The `element` argument you pass to this method can be either a string tagName: + * + * ```javascript + *

    Phaser

    + * + * this.add.dom().setElement('heading'); + * ``` + * + * Or a reference to an Element instance: + * + * ```javascript + *

    Phaser

    + * + * var h1 = document.getElementById('heading'); + * + * this.add.dom().setElement(h1); + * ``` + * + * You can also pass in a DOMString or style object to set the CSS on the created element, and an optional `innerText` + * value as well. Here is an example of a DOMString: + * + * ```javascript + * this.add.dom().setElement(h1, 'background-color: lime; width: 220px; height: 100px; font: 48px Arial', 'Phaser'); + * ``` + * + * And using a style object: + * + * ```javascript + * var style = { + * 'background-color': 'lime'; + * 'width': '200px'; + * 'height': '100px'; + * 'font': '48px Arial'; + * }; + * + * this.add.dom().setElement(h1, style, 'Phaser'); + * ``` + * @param element If a string it is passed to `getElementById()`, or it should be a reference to an existing Element. + * @param style Either a DOMString that holds the CSS styles to be applied to the created element, or an object the styles will be ready from. + * @param innerText A DOMString that holds the text that will be set as the innerText of the created element. + */ + setElement(element: string | Element, style?: string | any, innerText?: string): this; + + /** + * Takes a block of html from the HTML Cache, that has previously been preloaded into the game, and then + * creates a DOM Element from it. The loaded HTML is set as the `innerHTML` property of the created + * element. + * + * Assume the following html is stored in a file called `loginform.html`: + * + * ```html + * + * + * ``` + * + * Which is loaded into your game using the cache key 'login': + * + * ```javascript + * this.load.html('login', 'assets/loginform.html'); + * ``` + * + * You can create a DOM Element from it using the cache key: + * + * ```javascript + * this.add.dom().createFromCache('login'); + * ``` + * + * The optional `elementType` argument controls the container that is created, into which the loaded html is inserted. + * The default is a plain `div` object, but any valid tagName can be given. + * + * If this Game Object already has an Element, it is removed from the DOM entirely first. + * Any event listeners you may have previously created will need to be re-created after this call. + * @param The key of the html cache entry to use for this DOM Element. + * @param tagName The tag name of the element into which all of the loaded html will be inserted. Defaults to a plain div tag. Default 'div'. + */ + createFromCache(The: string, tagName?: string): this; + + /** + * Takes a string of html and then creates a DOM Element from it. The HTML is set as the `innerHTML` + * property of the created element. + * + * ```javascript + * let form = ` + * + * + * `; + * ``` + * + * You can create a DOM Element from it using the string: + * + * ```javascript + * this.add.dom().createFromHTML(form); + * ``` + * + * The optional `elementType` argument controls the type of container that is created, into which the html is inserted. + * The default is a plain `div` object, but any valid tagName can be given. + * + * If this Game Object already has an Element, it is removed from the DOM entirely first. + * Any event listeners you may have previously created will need to be re-created after this call. + * @param html A string of html to be set as the `innerHTML` property of the created element. + * @param tagName The tag name of the element into which all of the html will be inserted. Defaults to a plain div tag. Default 'div'. + */ + createFromHTML(html: string, tagName?: string): this; + + /** + * Removes the current DOM Element bound to this Game Object from the DOM entirely and resets the + * `node` property of this Game Object to be `null`. + */ + removeElement(): this; + + /** + * Internal method that calls `getBoundingClientRect` on the `node` and then sets the bounds width + * and height into the `displayWidth` and `displayHeight` properties, and the `clientWidth` and `clientHeight` + * values into the `width` and `height` properties respectively. + * + * This is called automatically whenever a new element is created or set. + */ + updateSize(): this; + + /** + * Gets all children from this DOM Elements node, using `querySelectorAll('*')` and then iterates through + * them, looking for the first one that has a property matching the given key and value. It then returns this child + * if found, or `null` if not. + * @param property The property to search the children for. + * @param value The value the property must strictly equal. + */ + getChildByProperty(property: string, value: string): Element | null; + + /** + * Gets all children from this DOM Elements node, using `querySelectorAll('*')` and then iterates through + * them, looking for the first one that has a matching id. It then returns this child if found, or `null` if not. + * + * Be aware that class and id names are case-sensitive. + * @param id The id to search the children for. + */ + getChildByID(id: string): Element | null; + + /** + * Gets all children from this DOM Elements node, using `querySelectorAll('*')` and then iterates through + * them, looking for the first one that has a matching name. It then returns this child if found, or `null` if not. + * + * Be aware that class and id names are case-sensitive. + * @param name The name to search the children for. + */ + getChildByName(name: string): Element | null; + + /** + * Sets the `className` property of the DOM Element node and updates the internal sizes. + * @param className A string representing the class or space-separated classes of the element. + */ + setClassName(className: string): this; + + /** + * Sets the `innerText` property of the DOM Element node and updates the internal sizes. + * + * Note that only certain types of Elements can have `innerText` set on them. + * @param text A DOMString representing the rendered text content of the element. + */ + setText(text: string): this; + + /** + * Sets the `innerHTML` property of the DOM Element node and updates the internal sizes. + * @param html A DOMString of html to be set as the `innerHTML` property of the element. + */ + setHTML(html: string): this; + + /** + * Compares the renderMask with the renderFlags to see if this Game Object will render or not. + * + * DOMElements always return `true` as they need to still set values during the render pass, even if not visible. + */ + willRender(): boolean; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + namespace Events { + /** + * The Game Object Added to Scene Event. + * + * This event is dispatched when a Game Object is added to a Scene. + * + * Listen for it on a Game Object instance using `GameObject.on('addedtoscene', listener)`. + */ + const ADDED_TO_SCENE: string; + + /** + * The Game Object Destroy Event. + * + * This event is dispatched when a Game Object instance is being destroyed. + * + * Listen for it on a Game Object instance using `GameObject.on('destroy', listener)`. + */ + const DESTROY: string; + + /** + * The Game Object Removed from Scene Event. + * + * This event is dispatched when a Game Object is removed from a Scene. + * + * Listen for it on a Game Object instance using `GameObject.on('removedfromscene', listener)`. + */ + const REMOVED_FROM_SCENE: string; + + /** + * The Video Game Object Complete Event. + * + * This event is dispatched when a Video finishes playback by reaching the end of its duration. It + * is also dispatched if a video marker sequence is being played and reaches the end. + * + * Note that not all videos can fire this event. Live streams, for example, have no fixed duration, + * so never technically 'complete'. + * + * If a video is stopped from playback, via the `Video.stop` method, it will emit the + * `VIDEO_STOP` event instead of this one. + * + * Listen for it from a Video Game Object instance using `Video.on('complete', listener)`. + */ + const VIDEO_COMPLETE: string; + + /** + * The Video Game Object Created Event. + * + * This event is dispatched when the texture for a Video has been created. This happens + * when enough of the video source has been loaded that the browser is able to render a + * frame from it. + * + * Listen for it from a Video Game Object instance using `Video.on('created', listener)`. + */ + const VIDEO_CREATED: string; + + /** + * The Video Game Object Error Event. + * + * This event is dispatched when a Video tries to play a source that does not exist, or is the wrong file type. + * + * Listen for it from a Video Game Object instance using `Video.on('error', listener)`. + */ + const VIDEO_ERROR: string; + + /** + * The Video Game Object Locked Event. + * + * This event is dispatched when a Video was attempted to be played, but the browser prevented it + * from doing so due to the Media Engagement Interaction policy. + * + * If you get this event you will need to wait for the user to interact with the browser before + * the video will play. This is a browser security measure to prevent autoplaying videos with + * audio. An interaction includes a mouse click, a touch, or a key press. + * + * Listen for it from a Video Game Object instance using `Video.on('locked', listener)`. + */ + const VIDEO_LOCKED: string; + + /** + * The Video Game Object Loop Event. + * + * This event is dispatched when a Video that is currently playing has looped. This only + * happens if the `loop` parameter was specified, or the `setLoop` method was called, + * and if the video has a fixed duration. Video streams, for example, cannot loop, as + * they have no duration. + * + * Looping is based on the result of the Video `timeupdate` event. This event is not + * frame-accurate, due to the way browsers work, so please do not rely on this loop + * event to be time or frame precise. + * + * Listen for it from a Video Game Object instance using `Video.on('loop', listener)`. + */ + const VIDEO_LOOP: string; + + /** + * The Video Game Object Metadata Event. + * + * This event is dispatched when a Video has access to the metadata. + * + * Listen for it from a Video Game Object instance using `Video.on('metadata', listener)`. + */ + const VIDEO_METADATA: string; + + /** + * The Video Game Object Playing Event. + * + * The playing event is fired after playback is first started, + * and whenever it is restarted. For example it is fired when playback + * resumes after having been paused or delayed due to lack of data. + * + * Listen for it from a Video Game Object instance using `Video.on('playing', listener)`. + */ + const VIDEO_PLAYING: string; + + /** + * The Video Game Object Play Event. + * + * This event is dispatched when a Video begins playback. For videos that do not require + * interaction unlocking, this is usually as soon as the `Video.play` method is called. + * However, for videos that require unlocking, it is fired once playback begins after + * they've been unlocked. + * + * Listen for it from a Video Game Object instance using `Video.on('play', listener)`. + */ + const VIDEO_PLAY: string; + + /** + * The Video Game Object Seeked Event. + * + * This event is dispatched when a Video completes seeking to a new point in its timeline. + * + * Listen for it from a Video Game Object instance using `Video.on('seeked', listener)`. + */ + const VIDEO_SEEKED: string; + + /** + * The Video Game Object Seeking Event. + * + * This event is dispatched when a Video _begins_ seeking to a new point in its timeline. + * When the seek is complete, it will dispatch the `VIDEO_SEEKED` event to conclude. + * + * Listen for it from a Video Game Object instance using `Video.on('seeking', listener)`. + */ + const VIDEO_SEEKING: string; + + /** + * The Video Game Object Stalled Event. + * + * This event is dispatched by a Video Game Object when the video playback stalls. + * + * This can happen if the video is buffering. + * + * If will fire for any of the following native DOM events: + * + * `stalled` + * `suspend` + * `waiting` + * + * Listen for it from a Video Game Object instance using `Video.on('stalled', listener)`. + * + * Note that being stalled isn't always a negative thing. A video can be stalled if it + * has downloaded enough data in to its buffer to not need to download any more until + * the current batch of frames have rendered. + */ + const VIDEO_STALLED: string; + + /** + * The Video Game Object Stopped Event. + * + * This event is dispatched when a Video is stopped from playback via a call to the `Video.stop` method, + * either directly via game code, or indirectly as the result of changing a video source or destroying it. + * + * Listen for it from a Video Game Object instance using `Video.on('stop', listener)`. + */ + const VIDEO_STOP: string; + + /** + * The Video Game Object Texture Ready Event. + * + * This event is dispatched by a Video Game Object when it has finished creating its texture. + * + * This happens when the video has finished loading enough data for its first frame. + * + * If you wish to use the Video texture elsewhere in your game, such as as a Sprite texture, + * then you should listen for this event first, before creating the Sprites that use it. + * + * Listen for it from a Video Game Object instance using `Video.on('textureready', listener)`. + */ + const VIDEO_TEXTURE: string; + + /** + * The Video Game Object Unlocked Event. + * + * This event is dispatched when a Video that was prevented from playback due to the browsers + * Media Engagement Interaction policy, is unlocked by a user gesture. + * + * Listen for it from a Video Game Object instance using `Video.on('unlocked', listener)`. + */ + const VIDEO_UNLOCKED: string; + + /** + * The Video Game Object Unsupported Event. + * + * This event is dispatched by a Video Game Object if the media source + * (which may be specified as a MediaStream, MediaSource, Blob, or File, + * for example) doesn't represent a supported media format. + * + * Listen for it from a Video Game Object instance using `Video.on('unsupported', listener)`. + */ + const VIDEO_UNSUPPORTED: string; + + } + + /** + * An Extern Game Object is a special type of Game Object that allows you to pass + * rendering off to a 3rd party. + * + * When you create an Extern and place it in the display list of a Scene, the renderer will + * process the list as usual. When it finds an Extern it will flush the current batch, + * clear down the pipeline and prepare a transform matrix which your render function can + * take advantage of, if required. + * + * The WebGL context is then left in a 'clean' state, ready for you to bind your own shaders, + * or draw to it, whatever you wish to do. This should all take place in the `render` method. + * The correct way to deploy an Extern object is to create a class that extends it, then + * override the `render` (and optionally `preUpdate`) methods and pass off control to your + * 3rd party libraries or custom WebGL code there. + * + * Once you've finished, you should free-up any of your resources. + * The Extern will then rebind the Phaser pipeline and carry on rendering the display list. + * + * Although this object has lots of properties such as Alpha, Blend Mode and Tint, none of + * them are used during rendering unless you take advantage of them in your own render code. + */ + class Extern extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + */ + constructor(scene: Phaser.Scene); + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The base class that all Game Objects extend. + * You don't create GameObjects directly and they cannot be added to the display list. + * Instead, use them as the base for your own custom classes. + */ + class GameObject extends Phaser.Events.EventEmitter { + /** + * + * @param scene The Scene to which this Game Object belongs. + * @param type A textual representation of the type of Game Object, i.e. `sprite`. + */ + constructor(scene: Phaser.Scene, type: string); + + /** + * A reference to the Scene to which this Game Object belongs. + * + * Game Objects can only belong to one Scene. + * + * You should consider this property as being read-only. You cannot move a + * Game Object to another Scene by simply changing it. + */ + scene: Phaser.Scene; + + /** + * Holds a reference to the Display List that contains this Game Object. + * + * This is set automatically when this Game Object is added to a Scene or Layer. + * + * You should treat this property as being read-only. + */ + displayList: Phaser.GameObjects.DisplayList | Phaser.GameObjects.Layer; + + /** + * A textual representation of this Game Object, i.e. `sprite`. + * Used internally by Phaser but is available for your own custom classes to populate. + */ + type: string; + + /** + * The current state of this Game Object. + * + * Phaser itself will never modify this value, although plugins may do so. + * + * Use this property to track the state of a Game Object during its lifetime. For example, it could change from + * a state of 'moving', to 'attacking', to 'dead'. The state value should be an integer (ideally mapped to a constant + * in your game code), or a string. These are recommended to keep it light and simple, with fast comparisons. + * If you need to store complex data about your Game Object, look at using the Data Component instead. + */ + state: number | string; + + /** + * The parent Container of this Game Object, if it has one. + */ + parentContainer: Phaser.GameObjects.Container; + + /** + * The name of this Game Object. + * Empty by default and never populated by Phaser, this is left for developers to use. + */ + name: string; + + /** + * The active state of this Game Object. + * A Game Object with an active state of `true` is processed by the Scenes UpdateList, if added to it. + * An active object is one which is having its logic and internal systems updated. + */ + active: boolean; + + /** + * The Tab Index of the Game Object. + * Reserved for future use by plugins and the Input Manager. + */ + tabIndex: number; + + /** + * A Data Manager. + * It allows you to store, query and get key/value paired information specific to this Game Object. + * `null` by default. Automatically created if you use `getData` or `setData` or `setDataEnabled`. + */ + data: Phaser.Data.DataManager; + + /** + * The flags that are compared against `RENDER_MASK` to determine if this Game Object will render or not. + * The bits are 0001 | 0010 | 0100 | 1000 set by the components Visible, Alpha, Transform and Texture respectively. + * If those components are not used by your custom class then you can use this bitmask as you wish. + */ + renderFlags: number; + + /** + * A bitmask that controls if this Game Object is drawn by a Camera or not. + * Not usually set directly, instead call `Camera.ignore`, however you can + * set this property directly using the Camera.id property: + */ + cameraFilter: number; + + /** + * If this Game Object is enabled for input then this property will contain an InteractiveObject instance. + * Not usually set directly. Instead call `GameObject.setInteractive()`. + */ + input: Phaser.Types.Input.InteractiveObject | null; + + /** + * If this Game Object is enabled for Arcade or Matter Physics then this property will contain a reference to a Physics Body. + */ + body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody | MatterJS.BodyType | null; + + /** + * This Game Object will ignore all calls made to its destroy method if this flag is set to `true`. + * This includes calls that may come from a Group, Container or the Scene itself. + * While it allows you to persist a Game Object across Scenes, please understand you are entirely + * responsible for managing references to and from this Game Object. + */ + ignoreDestroy: boolean; + + /** + * Sets the `active` property of this Game Object and returns this Game Object for further chaining. + * A Game Object with its `active` property set to `true` will be updated by the Scenes UpdateList. + * @param value True if this Game Object should be set as active, false if not. + */ + setActive(value: boolean): this; + + /** + * Sets the `name` property of this Game Object and returns this Game Object for further chaining. + * The `name` property is not populated by Phaser and is presented for your own use. + * @param value The name to be given to this Game Object. + */ + setName(value: string): this; + + /** + * Sets the current state of this Game Object. + * + * Phaser itself will never modify the State of a Game Object, although plugins may do so. + * + * For example, a Game Object could change from a state of 'moving', to 'attacking', to 'dead'. + * The state value should typically be an integer (ideally mapped to a constant + * in your game code), but could also be a string. It is recommended to keep it light and simple. + * If you need to store complex data about your Game Object, look at using the Data Component instead. + * @param value The state of the Game Object. + */ + setState(value: number | string): this; + + /** + * Adds a Data Manager component to this Game Object. + */ + setDataEnabled(): this; + + /** + * Allows you to store a key value pair within this Game Objects Data Manager. + * + * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled + * before setting the value. + * + * If the key doesn't already exist in the Data Manager then it is created. + * + * ```javascript + * sprite.setData('name', 'Red Gem Stone'); + * ``` + * + * You can also pass in an object of key value pairs as the first argument: + * + * ```javascript + * sprite.setData({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 }); + * ``` + * + * To get a value back again you can call `getData`: + * + * ```javascript + * sprite.getData('gold'); + * ``` + * + * Or you can access the value directly via the `values` property, where it works like any other variable: + * + * ```javascript + * sprite.data.values.gold += 50; + * ``` + * + * When the value is first set, a `setdata` event is emitted from this Game Object. + * + * If the key already exists, a `changedata` event is emitted instead, along an event named after the key. + * For example, if you updated an existing key called `PlayerLives` then it would emit the event `changedata-PlayerLives`. + * These events will be emitted regardless if you use this method to set the value, or the direct `values` setter. + * + * Please note that the data keys are case-sensitive and must be valid JavaScript Object property strings. + * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager. + * @param key The key to set the value for. Or an object of key value pairs. If an object the `data` argument is ignored. + * @param data The value to set for the given key. If an object is provided as the key this argument is ignored. + */ + setData(key: (string|T), data?: any): this; + + /** + * Increase a value for the given key within this Game Objects Data Manager. If the key doesn't already exist in the Data Manager then it is increased from 0. + * + * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled + * before setting the value. + * + * If the key doesn't already exist in the Data Manager then it is created. + * + * When the value is first set, a `setdata` event is emitted from this Game Object. + * @param key The key to change the value for. + * @param amount The amount to increase the given key by. Pass a negative value to decrease the key. Default 1. + */ + incData(key: string, amount?: number): this; + + /** + * Toggle a boolean value for the given key within this Game Objects Data Manager. If the key doesn't already exist in the Data Manager then it is toggled from false. + * + * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled + * before setting the value. + * + * If the key doesn't already exist in the Data Manager then it is created. + * + * When the value is first set, a `setdata` event is emitted from this Game Object. + * @param key The key to toggle the value for. + */ + toggleData(key: string): this; + + /** + * Retrieves the value for the given key in this Game Objects Data Manager, or undefined if it doesn't exist. + * + * You can also access values via the `values` object. For example, if you had a key called `gold` you can do either: + * + * ```javascript + * sprite.getData('gold'); + * ``` + * + * Or access the value directly: + * + * ```javascript + * sprite.data.values.gold; + * ``` + * + * You can also pass in an array of keys, in which case an array of values will be returned: + * + * ```javascript + * sprite.getData([ 'gold', 'armor', 'health' ]); + * ``` + * + * This approach is useful for destructuring arrays in ES6. + * @param key The key of the value to retrieve, or an array of keys. + */ + getData(key: string | string[]): any; + + /** + * Pass this Game Object to the Input Manager to enable it for Input. + * + * Input works by using hit areas, these are nearly always geometric shapes, such as rectangles or circles, that act as the hit area + * for the Game Object. However, you can provide your own hit area shape and callback, should you wish to handle some more advanced + * input detection. + * + * If no arguments are provided it will try and create a rectangle hit area based on the texture frame the Game Object is using. If + * this isn't a texture-bound object, such as a Graphics or BitmapText object, this will fail, and you'll need to provide a specific + * shape for it to use. + * + * You can also provide an Input Configuration Object as the only argument to this method. + * @param hitArea Either an input configuration object, or a geometric shape that defines the hit area for the Game Object. If not given it will try to create a Rectangle based on the texture frame. + * @param callback The callback that determines if the pointer is within the Hit Area shape or not. If you provide a shape you must also provide a callback. + * @param dropZone Should this Game Object be treated as a drop zone target? Default false. + */ + setInteractive(hitArea?: Phaser.Types.Input.InputConfiguration | any, callback?: Phaser.Types.Input.HitAreaCallback, dropZone?: boolean): this; + + /** + * If this Game Object has previously been enabled for input, this will disable it. + * + * An object that is disabled for input stops processing or being considered for + * input events, but can be turned back on again at any time by simply calling + * `setInteractive()` with no arguments provided. + * + * If want to completely remove interaction from this Game Object then use `removeInteractive` instead. + */ + disableInteractive(): this; + + /** + * If this Game Object has previously been enabled for input, this will queue it + * for removal, causing it to no longer be interactive. The removal happens on + * the next game step, it is not immediate. + * + * The Interactive Object that was assigned to this Game Object will be destroyed, + * removed from the Input Manager and cleared from this Game Object. + * + * If you wish to re-enable this Game Object at a later date you will need to + * re-create its InteractiveObject by calling `setInteractive` again. + * + * If you wish to only temporarily stop an object from receiving input then use + * `disableInteractive` instead, as that toggles the interactive state, where-as + * this erases it completely. + * + * If you wish to resize a hit area, don't remove and then set it as being + * interactive. Instead, access the hitarea object directly and resize the shape + * being used. I.e.: `sprite.input.hitArea.setSize(width, height)` (assuming the + * shape is a Rectangle, which it is by default.) + */ + removeInteractive(): this; + + /** + * This callback is invoked when this Game Object is added to a Scene. + * + * Can be overriden by custom Game Objects, but be aware of some Game Objects that + * will use this, such as Sprites, to add themselves into the Update List. + * + * You can also listen for the `ADDED_TO_SCENE` event from this Game Object. + */ + addedToScene(): void; + + /** + * This callback is invoked when this Game Object is removed from a Scene. + * + * Can be overriden by custom Game Objects, but be aware of some Game Objects that + * will use this, such as Sprites, to removed themselves from the Update List. + * + * You can also listen for the `REMOVED_FROM_SCENE` event from this Game Object. + */ + removedFromScene(): void; + + /** + * To be overridden by custom GameObjects. Allows base objects to be used in a Pool. + * @param args args + */ + update(...args: any[]): void; + + /** + * Returns a JSON representation of the Game Object. + */ + toJSON(): Phaser.Types.GameObjects.JSONGameObject; + + /** + * Compares the renderMask with the renderFlags to see if this Game Object will render or not. + * Also checks the Game Object against the given Cameras exclusion list. + * @param camera The Camera to check against this Game Object. + */ + willRender(camera: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Returns an array containing the display list index of either this Game Object, or if it has one, + * its parent Container. It then iterates up through all of the parent containers until it hits the + * root of the display list (which is index 0 in the returned array). + * + * Used internally by the InputPlugin but also useful if you wish to find out the display depth of + * this Game Object and all of its ancestors. + */ + getIndexList(): number[]; + + /** + * Adds this Game Object to the given Display List. + * + * If no Display List is specified, it will default to the Display List owned by the Scene to which + * this Game Object belongs. + * + * A Game Object can only exist on one Display List at any given time, but may move freely between them. + * + * If this Game Object is already on another Display List when this method is called, it will first + * be removed from it, before being added to the new list. + * + * You can query which list it is on by looking at the `Phaser.GameObjects.GameObject#displayList` property. + * + * If a Game Object isn't on any display list, it will not be rendered. If you just wish to temporarly + * disable it from rendering, consider using the `setVisible` method, instead. + * @param displayList The Display List to add to. Defaults to the Scene Display List. + */ + addToDisplayList(displayList?: Phaser.GameObjects.DisplayList | Phaser.GameObjects.Layer): this; + + /** + * Adds this Game Object to the Update List belonging to the Scene. + * + * When a Game Object is added to the Update List it will have its `preUpdate` method called + * every game frame. This method is passed two parameters: `delta` and `time`. + * + * If you wish to run your own logic within `preUpdate` then you should always call + * `super.preUpdate(delta, time)` within it, or it may fail to process required operations, + * such as Sprite animations. + */ + addToUpdateList(): this; + + /** + * Removes this Game Object from the Display List it is currently on. + * + * A Game Object can only exist on one Display List at any given time, but may move freely removed + * and added back at a later stage. + * + * You can query which list it is on by looking at the `Phaser.GameObjects.GameObject#displayList` property. + * + * If a Game Object isn't on any Display List, it will not be rendered. If you just wish to temporarly + * disable it from rendering, consider using the `setVisible` method, instead. + */ + removeFromDisplayList(): this; + + /** + * Removes this Game Object from the Scene's Update List. + * + * When a Game Object is on the Update List, it will have its `preUpdate` method called + * every game frame. Calling this method will remove it from the list, preventing this. + * + * Removing a Game Object from the Update List will stop most internal functions working. + * For example, removing a Sprite from the Update List will prevent it from being able to + * run animations. + */ + removeFromUpdateList(): this; + + /** + * Destroys this Game Object removing it from the Display List and Update List and + * severing all ties to parent resources. + * + * Also removes itself from the Input Manager and Physics Manager if previously enabled. + * + * Use this to remove a Game Object from your game if you don't ever plan to use it again. + * As long as no reference to it exists within your own code it should become free for + * garbage collection by the browser. + * + * If you just want to temporarily disable an object then look at using the + * Game Object Pool instead of destroying it, as destroyed objects cannot be resurrected. + * @param fromScene `True` if this Game Object is being destroyed by the Scene, `false` if not. Default false. + */ + destroy(fromScene?: boolean): void; + + /** + * The bitmask that `GameObject.renderFlags` is compared against to determine if the Game Object will render or not. + */ + static readonly RENDER_MASK: number; + + } + + /** + * The Game Object Creator is a Scene plugin that allows you to quickly create many common + * types of Game Objects and return them using a configuration object, rather than + * having to specify a limited set of parameters such as with the GameObjectFactory. + * + * Game Objects made via this class are automatically added to the Scene and Update List + * unless you explicitly set the `add` property in the configuration object to `false`. + */ + class GameObjectCreator { + /** + * + * @param scene The Scene to which this Game Object Factory belongs. + */ + constructor(scene: Phaser.Scene); + + /** + * Creates a new Dynamic Bitmap Text Game Object and returns it. + * + * Note: This method will only be available if the Dynamic Bitmap Text Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + dynamicBitmapText(config: Phaser.Types.GameObjects.BitmapText.BitmapTextConfig, addToScene?: boolean): Phaser.GameObjects.DynamicBitmapText; + + /** + * Creates a new Bitmap Text Game Object and returns it. + * + * Note: This method will only be available if the Bitmap Text Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + bitmapText(config: Phaser.Types.GameObjects.BitmapText.BitmapTextConfig, addToScene?: boolean): Phaser.GameObjects.BitmapText; + + /** + * Creates a new Blitter Game Object and returns it. + * + * Note: This method will only be available if the Blitter Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + blitter(config: Phaser.Types.GameObjects.Sprite.SpriteConfig, addToScene?: boolean): Phaser.GameObjects.Blitter; + + /** + * Creates a new Container Game Object and returns it. + * + * Note: This method will only be available if the Container Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + container(config: Phaser.Types.GameObjects.Container.ContainerConfig, addToScene?: boolean): Phaser.GameObjects.Container; + + /** + * The Scene to which this Game Object Creator belongs. + */ + protected scene: Phaser.Scene; + + /** + * A reference to the Scene.Systems. + */ + protected systems: Phaser.Scenes.Systems; + + /** + * A reference to the Scene Event Emitter. + */ + protected events: Phaser.Events.EventEmitter; + + /** + * A reference to the Scene Display List. + */ + protected displayList: Phaser.GameObjects.DisplayList; + + /** + * A reference to the Scene Update List. + */ + protected updateList: Phaser.GameObjects.UpdateList; + + /** + * Static method called directly by the Game Object creator functions. + * With this method you can register a custom GameObject factory in the GameObjectCreator, + * providing a name (`factoryType`) and the constructor (`factoryFunction`) in order + * to be called when you invoke Phaser.Scene.make[ factoryType ] method. + * @param factoryType The key of the factory that you will use to call to Phaser.Scene.make[ factoryType ] method. + * @param factoryFunction The constructor function to be called when you invoke to the Phaser.Scene.make method. + */ + static register(factoryType: string, factoryFunction: Function): void; + + /** + * Static method called directly by the Game Object Creator functions. + * + * With this method you can remove a custom Game Object Creator that has been previously + * registered in the Game Object Creator. Pass in its `factoryType` in order to remove it. + * @param factoryType The key of the factory that you want to remove from the GameObjectCreator. + */ + static remove(factoryType: string): void; + + /** + * Creates a new Graphics Game Object and returns it. + * + * Note: This method will only be available if the Graphics Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + graphics(config?: Phaser.Types.GameObjects.Graphics.Options, addToScene?: boolean): Phaser.GameObjects.Graphics; + + /** + * Creates a new Group Game Object and returns it. + * + * Note: This method will only be available if the Group Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + */ + group(config: Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig): Phaser.GameObjects.Group; + + /** + * Creates a new Image Game Object and returns it. + * + * Note: This method will only be available if the Image Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + image(config: Phaser.Types.GameObjects.Sprite.SpriteConfig, addToScene?: boolean): Phaser.GameObjects.Image; + + /** + * Creates a new Layer Game Object and returns it. + * + * Note: This method will only be available if the Layer Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + layer(config: Phaser.Types.GameObjects.Sprite.SpriteConfig, addToScene?: boolean): Phaser.GameObjects.Layer; + + /** + * Creates a new Mesh Game Object and returns it. + * + * Note: This method will only be available if the Mesh Game Object and WebGL support have been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + mesh(config: Phaser.Types.GameObjects.Mesh.MeshConfig, addToScene?: boolean): Phaser.GameObjects.Mesh; + + /** + * Creates a new Nine Slice Game Object and returns it. + * + * Note: This method will only be available if the Nine Slice Game Object and WebGL support have been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + nineslice(config: Phaser.Types.GameObjects.NineSlice.NineSliceConfig, addToScene?: boolean): Phaser.GameObjects.NineSlice; + + /** + * Creates a new Particle Emitter Game Object and returns it. + * + * Prior to Phaser v3.60 this function would create a `ParticleEmitterManager`. These were removed + * in v3.60 and replaced with creating a `ParticleEmitter` instance directly. Please see the + * updated function parameters and class documentation for more details. + * + * Note: This method will only be available if the Particles Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + particles(config: Phaser.Types.GameObjects.Particles.ParticleEmitterCreatorConfig, addToScene?: boolean): Phaser.GameObjects.Particles.ParticleEmitter; + + /** + * Creates a new Plane Game Object and returns it. + * + * Note: This method will only be available if the Plane Game Object and WebGL support have been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + plane(config: Phaser.Types.GameObjects.Plane.PlaneConfig, addToScene?: boolean): Phaser.GameObjects.Plane; + + /** + * Creates a new Point Light Game Object and returns it. + * + * Note: This method will only be available if the Point Light Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + pointlight(config: object, addToScene?: boolean): Phaser.GameObjects.PointLight; + + /** + * Creates a new Render Texture Game Object and returns it. + * + * Note: This method will only be available if the Render Texture Game Object has been built into Phaser. + * + * A Render Texture is a combination of Dynamic Texture and an Image Game Object, that uses the + * Dynamic Texture to display itself with. + * + * A Dynamic Texture is a special texture that allows you to draw textures, frames and most kind of + * Game Objects directly to it. + * + * You can take many complex objects and draw them to this one texture, which can then be used as the + * base texture for other Game Objects, such as Sprites. Should you then update this texture, all + * Game Objects using it will instantly be updated as well, reflecting the changes immediately. + * + * It's a powerful way to generate dynamic textures at run-time that are WebGL friendly and don't invoke + * expensive GPU uploads on each change. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + renderTexture(config: Phaser.Types.GameObjects.RenderTexture.RenderTextureConfig, addToScene?: boolean): Phaser.GameObjects.RenderTexture; + + /** + * Creates a new Rope Game Object and returns it. + * + * Note: This method will only be available if the Rope Game Object and WebGL support have been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + rope(config: Phaser.Types.GameObjects.Rope.RopeConfig, addToScene?: boolean): Phaser.GameObjects.Rope; + + /** + * Creates a new Shader Game Object and returns it. + * + * Note: This method will only be available if the Shader Game Object and WebGL support have been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + shader(config: Phaser.Types.GameObjects.Shader.ShaderConfig, addToScene?: boolean): Phaser.GameObjects.Shader; + + /** + * Creates a new Sprite Game Object and returns it. + * + * Note: This method will only be available if the Sprite Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. Default true. + */ + sprite(config: Phaser.Types.GameObjects.Sprite.SpriteConfig, addToScene?: boolean): Phaser.GameObjects.Sprite; + + /** + * Creates a new Text Game Object and returns it. + * + * Note: This method will only be available if the Text Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + text(config: Phaser.Types.GameObjects.Text.TextConfig, addToScene?: boolean): Phaser.GameObjects.Text; + + /** + * Creates a new TileSprite Game Object and returns it. + * + * Note: This method will only be available if the TileSprite Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + tileSprite(config: Phaser.Types.GameObjects.TileSprite.TileSpriteConfig, addToScene?: boolean): Phaser.GameObjects.TileSprite; + + /** + * Creates a new Video Game Object and returns it. + * + * Note: This method will only be available if the Video Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + video(config: Phaser.Types.GameObjects.Video.VideoConfig, addToScene?: boolean): Phaser.GameObjects.Video; + + /** + * Creates a new Zone Game Object and returns it. + * + * Note: This method will only be available if the Zone Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + */ + zone(config: Phaser.Types.GameObjects.Zone.ZoneConfig): Phaser.GameObjects.Zone; + + /** + * Creates a Tilemap from the given key or data, or creates a blank Tilemap if no key/data provided. + * When loading from CSV or a 2D array, you should specify the tileWidth & tileHeight. When parsing + * from a map from Tiled, the tileWidth, tileHeight, width & height will be pulled from the map + * data. For an empty map, you should specify tileWidth, tileHeight, width & height. + * @param config The config options for the Tilemap. + */ + tilemap(config?: Phaser.Types.Tilemaps.TilemapConfig): Phaser.Tilemaps.Tilemap; + + /** + * Creates a new Tween object and returns it. + * + * Note: This method will only be available if Tweens have been built into Phaser. + * @param config A Tween Configuration object, or a Tween or TweenChain instance. + */ + tween(config: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenChainBuilderConfig | Phaser.Tweens.Tween | Phaser.Tweens.TweenChain): Phaser.Tweens.Tween; + + /** + * Creates a new TweenChain object and returns it, without adding it to the Tween Manager. + * + * Note: This method will only be available if Tweens have been built into Phaser. + * @param config The TweenChain configuration. + */ + tweenchain(config: Phaser.Types.Tweens.TweenBuilderConfig | object): Phaser.Tweens.TweenChain; + + } + + /** + * The Game Object Factory is a Scene plugin that allows you to quickly create many common + * types of Game Objects and have them automatically registered with the Scene. + * + * Game Objects directly register themselves with the Factory and inject their own creation + * methods into the class. + */ + class GameObjectFactory { + /** + * + * @param scene The Scene to which this Game Object Factory belongs. + */ + constructor(scene: Phaser.Scene); + + /** + * Creates a new Path Object. + * @param x The horizontal position of this Path. + * @param y The vertical position of this Path. + */ + path(x: number, y: number): Phaser.Curves.Path; + + /** + * A Bitmap Mask combines the alpha (opacity) of a masked pixel with the alpha of another pixel. + * Unlike the Geometry Mask, which is a clipping path, a Bitmap Mask behaves like an alpha mask, + * not a clipping path. It is only available when using the WebGL Renderer. + * + * A Bitmap Mask can use any Game Object, or Dynamic Texture, to determine the alpha of each pixel of the masked Game Object(s). + * For any given point of a masked Game Object's texture, the pixel's alpha will be multiplied by the alpha + * of the pixel at the same position in the Bitmap Mask's Game Object. The color of the pixel from the + * Bitmap Mask doesn't matter. + * + * For example, if a pure blue pixel with an alpha of 0.95 is masked with a pure red pixel with an + * alpha of 0.5, the resulting pixel will be pure blue with an alpha of 0.475. Naturally, this means + * that a pixel in the mask with an alpha of 0 will hide the corresponding pixel in all masked Game Objects + * A pixel with an alpha of 1 in the masked Game Object will receive the same alpha as the + * corresponding pixel in the mask. + * + * Note: You cannot combine Bitmap Masks and Blend Modes on the same Game Object. You can, however, + * combine Geometry Masks and Blend Modes together. + * + * The Bitmap Mask's location matches the location of its Game Object, not the location of the + * masked objects. Moving or transforming the underlying Game Object will change the mask + * (and affect the visibility of any masked objects), whereas moving or transforming a masked object + * will not affect the mask. + * + * The Bitmap Mask will not render its Game Object by itself. If the Game Object is not in a + * Scene's display list, it will only be used for the mask and its full texture will not be directly + * visible. Adding the underlying Game Object to a Scene will not cause any problems - it will + * render as a normal Game Object and will also serve as a mask. + * @param maskObject The Game Object or Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + bitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates a new Dynamic Bitmap Text Game Object and adds it to the Scene. + * + * BitmapText objects work by taking a texture file and an XML or JSON file that describes the font structure. + * + * During rendering for each letter of the text is rendered to the display, proportionally spaced out and aligned to + * match the font structure. + * + * Dynamic Bitmap Text objects are different from Static Bitmap Text in that they invoke a callback for each + * letter being rendered during the render pass. This callback allows you to manipulate the properties of + * each letter being rendered, such as its position, scale or tint, allowing you to create interesting effects + * like jiggling text, which can't be done with Static text. This means that Dynamic Text takes more processing + * time, so only use them if you require the callback ability they have. + * + * BitmapText objects are less flexible than Text objects, in that they have less features such as shadows, fills and the ability + * to use Web Fonts, however you trade this flexibility for rendering speed. You can also create visually compelling BitmapTexts by + * processing the font texture in an image editor, applying fills and any other effects required. + * + * To create multi-line text insert \r, \n or \r\n escape codes into the text string. + * + * To create a BitmapText data files you need a 3rd party app such as: + * + * BMFont (Windows, free): http://www.angelcode.com/products/bmfont/ + * Glyph Designer (OS X, commercial): http://www.71squared.com/en/glyphdesigner + * Littera (Web-based, free): http://kvazars.com/littera/ + * + * For most use cases it is recommended to use XML. If you wish to use JSON, the formatting should be equal to the result of + * converting a valid XML file through the popular X2JS library. An online tool for conversion can be found here: http://codebeautify.org/xmltojson + * + * Note: This method will only be available if the Dynamic Bitmap Text Game Object has been built into Phaser. + * @param x The x position of the Game Object. + * @param y The y position of the Game Object. + * @param font The key of the font to use from the BitmapFont cache. + * @param text The string, or array of strings, to be set as the content of this Bitmap Text. + * @param size The font size to set. + */ + dynamicBitmapText(x: number, y: number, font: string, text?: string | string[], size?: number): Phaser.GameObjects.DynamicBitmapText; + + /** + * Creates a new Bitmap Text Game Object and adds it to the Scene. + * + * BitmapText objects work by taking a texture file and an XML or JSON file that describes the font structure. + * + * During rendering for each letter of the text is rendered to the display, proportionally spaced out and aligned to + * match the font structure. + * + * BitmapText objects are less flexible than Text objects, in that they have less features such as shadows, fills and the ability + * to use Web Fonts, however you trade this flexibility for rendering speed. You can also create visually compelling BitmapTexts by + * processing the font texture in an image editor, applying fills and any other effects required. + * + * To create multi-line text insert \r, \n or \r\n escape codes into the text string. + * + * To create a BitmapText data files you need a 3rd party app such as: + * + * BMFont (Windows, free): http://www.angelcode.com/products/bmfont/ + * Glyph Designer (OS X, commercial): http://www.71squared.com/en/glyphdesigner + * Littera (Web-based, free): http://kvazars.com/littera/ + * + * For most use cases it is recommended to use XML. If you wish to use JSON, the formatting should be equal to the result of + * converting a valid XML file through the popular X2JS library. An online tool for conversion can be found here: http://codebeautify.org/xmltojson + * + * Note: This method will only be available if the Bitmap Text Game Object has been built into Phaser. + * @param x The x position of the Game Object. + * @param y The y position of the Game Object. + * @param font The key of the font to use from the BitmapFont cache. + * @param text The string, or array of strings, to be set as the content of this Bitmap Text. + * @param size The font size to set. + * @param align The alignment of the text in a multi-line BitmapText object. Default 0. + */ + bitmapText(x: number, y: number, font: string, text?: string | string[], size?: number, align?: number): Phaser.GameObjects.BitmapText; + + /** + * Creates a new Blitter Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Blitter Game Object has been built into Phaser. + * @param x The x position of the Game Object. + * @param y The y position of the Game Object. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame The default Frame children of the Blitter will use. + */ + blitter(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.Blitter; + + /** + * Creates a new Container Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Container Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param children An optional array of Game Objects to add to this Container. + */ + container(x?: number, y?: number, children?: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[]): Phaser.GameObjects.Container; + + /** + * DOM Element Game Objects are a way to control and manipulate HTML Elements over the top of your game. + * + * In order for DOM Elements to display you have to enable them by adding the following to your game + * configuration object: + * + * ```javascript + * dom { + * createContainer: true + * } + * ``` + * + * When this is added, Phaser will automatically create a DOM Container div that is positioned over the top + * of the game canvas. This div is sized to match the canvas, and if the canvas size changes, as a result of + * settings within the Scale Manager, the dom container is resized accordingly. + * + * You can create a DOM Element by either passing in DOMStrings, or by passing in a reference to an existing + * Element that you wish to be placed under the control of Phaser. For example: + * + * ```javascript + * this.add.dom(x, y, 'div', 'background-color: lime; width: 220px; height: 100px; font: 48px Arial', 'Phaser'); + * ``` + * + * The above code will insert a div element into the DOM Container at the given x/y coordinate. The DOMString in + * the 4th argument sets the initial CSS style of the div and the final argument is the inner text. In this case, + * it will create a lime colored div that is 220px by 100px in size with the text Phaser in it, in an Arial font. + * + * You should nearly always, without exception, use explicitly sized HTML Elements, in order to fully control + * alignment and positioning of the elements next to regular game content. + * + * Rather than specify the CSS and HTML directly you can use the `load.html` File Loader to load it into the + * cache and then use the `createFromCache` method instead. You can also use `createFromHTML` and various other + * methods available in this class to help construct your elements. + * + * Once the element has been created you can then control it like you would any other Game Object. You can set its + * position, scale, rotation, alpha and other properties. It will move as the main Scene Camera moves and be clipped + * at the edge of the canvas. It's important to remember some limitations of DOM Elements: The obvious one is that + * they appear above or below your game canvas. You cannot blend them into the display list, meaning you cannot have + * a DOM Element, then a Sprite, then another DOM Element behind it. + * + * They also cannot be enabled for input. To do that, you have to use the `addListener` method to add native event + * listeners directly. The final limitation is to do with cameras. The DOM Container is sized to match the game canvas + * entirely and clipped accordingly. DOM Elements respect camera scrolling and scrollFactor settings, but if you + * change the size of the camera so it no longer matches the size of the canvas, they won't be clipped accordingly. + * + * Also, all DOM Elements are inserted into the same DOM Container, regardless of which Scene they are created in. + * + * DOM Elements are a powerful way to align native HTML with your Phaser Game Objects. For example, you can insert + * a login form for a multiplayer game directly into your title screen. Or a text input box for a highscore table. + * Or a banner ad from a 3rd party service. Or perhaps you'd like to use them for high resolution text display and + * UI. The choice is up to you, just remember that you're dealing with standard HTML and CSS floating over the top + * of your game, and should treat it accordingly. + * + * Note: This method will only be available if the DOM Element Game Object has been built into Phaser. + * @param x The horizontal position of this DOM Element in the world. + * @param y The vertical position of this DOM Element in the world. + * @param element An existing DOM element, or a string. If a string starting with a # it will do a `getElementById` look-up on the string (minus the hash). Without a hash, it represents the type of element to create, i.e. 'div'. + * @param style If a string, will be set directly as the elements `style` property value. If a plain object, will be iterated and the values transferred. In both cases the values replacing whatever CSS styles may have been previously set. + * @param innerText If given, will be set directly as the elements `innerText` property value, replacing whatever was there before. + */ + dom(x: number, y: number, element?: HTMLElement | string, style?: string | any, innerText?: string): Phaser.GameObjects.DOMElement; + + /** + * Creates a new Extern Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Extern Game Object has been built into Phaser. + */ + extern(): Phaser.GameObjects.Extern; + + /** + * The Scene to which this Game Object Factory belongs. + */ + protected scene: Phaser.Scene; + + /** + * A reference to the Scene.Systems. + */ + protected systems: Phaser.Scenes.Systems; + + /** + * A reference to the Scene Event Emitter. + */ + protected events: Phaser.Events.EventEmitter; + + /** + * A reference to the Scene Display List. + */ + protected displayList: Phaser.GameObjects.DisplayList; + + /** + * A reference to the Scene Update List. + */ + protected updateList: Phaser.GameObjects.UpdateList; + + /** + * Adds an existing Game Object to this Scene. + * + * If the Game Object renders, it will be added to the Display List. + * If it has a `preUpdate` method, it will be added to the Update List. + * @param child The child to be added to this Scene. + */ + existing(child: G): G; + + /** + * Static method called directly by the Game Object factory functions. + * With this method you can register a custom GameObject factory in the GameObjectFactory, + * providing a name (`factoryType`) and the constructor (`factoryFunction`) in order + * to be called when you call to Phaser.Scene.add[ factoryType ] method. + * @param factoryType The key of the factory that you will use to call to Phaser.Scene.add[ factoryType ] method. + * @param factoryFunction The constructor function to be called when you invoke to the Phaser.Scene.add method. + */ + static register(factoryType: string, factoryFunction: Function): void; + + /** + * Static method called directly by the Game Object factory functions. + * With this method you can remove a custom GameObject factory registered in the GameObjectFactory, + * providing a its `factoryType`. + * @param factoryType The key of the factory that you want to remove from the GameObjectFactory. + */ + static remove(factoryType: string): void; + + /** + * Creates a new Graphics Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Graphics Game Object has been built into Phaser. + * @param config The Graphics configuration. + */ + graphics(config?: Phaser.Types.GameObjects.Graphics.Options): Phaser.GameObjects.Graphics; + + /** + * Creates a new Group Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Group Game Object has been built into Phaser. + * @param children Game Objects to add to this Group; or the `config` argument. + * @param config A Group Configuration object. + */ + group(children?: Phaser.GameObjects.GameObject[] | Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupConfig[] | Phaser.Types.GameObjects.Group.GroupCreateConfig, config?: Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig): Phaser.GameObjects.Group; + + /** + * Creates a new Image Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Image Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + image(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.Image; + + /** + * Creates a new Layer Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Layer Game Object has been built into Phaser. + * @param children An optional array of Game Objects to add to this Layer. + */ + layer(children?: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[]): Phaser.GameObjects.Layer; + + /** + * Creates a new Mesh Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Mesh Game Object and WebGL support have been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param vertices The vertices array. Either `xy` pairs, or `xyz` if the `containsZ` parameter is `true`. + * @param uvs The UVs pairs array. + * @param indicies Optional vertex indicies array. If you don't have one, pass `null` or an empty array. + * @param containsZ Does the vertices data include a `z` component? Default false. + * @param normals Optional vertex normals array. If you don't have one, pass `null` or an empty array. + * @param colors An array of colors, one per vertex, or a single color value applied to all vertices. Default 0xffffff. + * @param alphas An array of alpha values, one per vertex, or a single alpha value applied to all vertices. Default 1. + */ + mesh(x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number, vertices?: number[], uvs?: number[], indicies?: number[], containsZ?: boolean, normals?: number[], colors?: number | number[], alphas?: number | number[]): Phaser.GameObjects.Mesh; + + /** + * A Nine Slice Game Object allows you to display a texture-based object that + * can be stretched both horizontally and vertically, but that retains + * fixed-sized corners. The dimensions of the corners are set via the + * parameters to this class. + * + * This is extremely useful for UI and button like elements, where you need + * them to expand to accommodate the content without distorting the texture. + * + * The texture you provide for this Game Object should be based on the + * following layout structure: + * + * ``` + * A B + * +---+----------------------+---+ + * C | 1 | 2 | 3 | + * +---+----------------------+---+ + * | | | | + * | 4 | 5 | 6 | + * | | | | + * +---+----------------------+---+ + * D | 7 | 8 | 9 | + * +---+----------------------+---+ + * ``` + * + * When changing this objects width and / or height: + * + * areas 1, 3, 7 and 9 (the corners) will remain unscaled + * areas 2 and 8 will be stretched horizontally only + * areas 4 and 6 will be stretched vertically only + * area 5 will be stretched both horizontally and vertically + * + * You can also create a 3 slice Game Object: + * + * This works in a similar way, except you can only stretch it horizontally. + * Therefore, it requires less configuration: + * + * ``` + * A B + * +---+----------------------+---+ + * | | | | + * C | 1 | 2 | 3 | + * | | | | + * +---+----------------------+---+ + * ``` + * + * When changing this objects width (you cannot change its height) + * + * areas 1 and 3 will remain unscaled + * area 2 will be stretched horizontally + * + * The above configuration concept is adapted from the Pixi NineSlicePlane. + * + * To specify a 3 slice object instead of a 9 slice you should only + * provide the `leftWidth` and `rightWidth` parameters. To create a 9 slice + * you must supply all parameters. + * + * The _minimum_ width this Game Object can be is the total of + * `leftWidth` + `rightWidth`. The _minimum_ height this Game Object + * can be is the total of `topHeight` + `bottomHeight`. + * If you need to display this object at a smaller size, you can scale it. + * + * In terms of performance, using a 3 slice Game Object is the equivalent of + * having 3 Sprites in a row. Using a 9 slice Game Object is the equivalent + * of having 9 Sprites in a row. The vertices of this object are all batched + * together and can co-exist with other Sprites and graphics on the display + * list, without incurring any additional overhead. + * + * As of Phaser 3.60 this Game Object is WebGL only. + * @param x The horizontal position of the center of this Game Object in the world. + * @param y The vertical position of the center of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param width The width of the Nine Slice Game Object. You can adjust the width post-creation. Default 256. + * @param height The height of the Nine Slice Game Object. If this is a 3 slice object the height will be fixed to the height of the texture and cannot be changed. Default 256. + * @param leftWidth The size of the left vertical column (A). Default 10. + * @param rightWidth The size of the right vertical column (B). Default 10. + * @param topHeight The size of the top horiztonal row (C). Set to zero or undefined to create a 3 slice object. Default 0. + * @param bottomHeight The size of the bottom horiztonal row (D). Set to zero or undefined to create a 3 slice object. Default 0. + */ + nineslice(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, width?: number, height?: number, leftWidth?: number, rightWidth?: number, topHeight?: number, bottomHeight?: number): Phaser.GameObjects.NineSlice; + + /** + * Creates a new Particle Emitter Game Object and adds it to the Scene. + * + * If you wish to configure the Emitter after creating it, use the `ParticleEmitter.setConfig` method. + * + * Prior to Phaser v3.60 this function would create a `ParticleEmitterManager`. These were removed + * in v3.60 and replaced with creating a `ParticleEmitter` instance directly. Please see the + * updated function parameters and class documentation for more details. + * + * Note: This method will only be available if the Particles Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param config Configuration settings for the Particle Emitter. + */ + particles(x?: number, y?: number, texture?: string | Phaser.Textures.Texture, config?: Phaser.Types.GameObjects.Particles.ParticleEmitterConfig): Phaser.GameObjects.Particles.ParticleEmitter; + + /** + * Creates a new PathFollower Game Object and adds it to the Scene. + * + * Note: This method will only be available if the PathFollower Game Object has been built into Phaser. + * @param path The Path this PathFollower is connected to. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + follower(path: Phaser.Curves.Path, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.PathFollower; + + /** + * Creates a new Plane Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Plane Game Object has been built into Phaser. + * @param x The horizontal position of this Plane in the world. + * @param y The vertical position of this Plane in the world. + * @param texture The key, or instance of the Texture this Plane will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Plane is rendering with. + * @param width The width of this Plane, in cells, not pixels. Default 8. + * @param height The height of this Plane, in cells, not pixels. Default 8. + * @param tile Is the texture tiled? I.e. repeated across each cell. Default false. + */ + plane(x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number, width?: number, height?: number, tile?: boolean): Phaser.GameObjects.Plane; + + /** + * Creates a new Point Light Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Point Light Game Object has been built into Phaser. + * + * The Point Light Game Object provides a way to add a point light effect into your game, + * without the expensive shader processing requirements of the traditional Light Game Object. + * + * The difference is that the Point Light renders using a custom shader, designed to give the + * impression of a point light source, of variable radius, intensity and color, in your game. + * However, unlike the Light Game Object, it does not impact any other Game Objects, or use their + * normal maps for calcuations. This makes them extremely fast to render compared to Lights + * and perfect for special effects, such as flickering torches or muzzle flashes. + * + * For maximum performance you should batch Point Light Game Objects together. This means + * ensuring they follow each other consecutively on the display list. Ideally, use a Layer + * Game Object and then add just Point Lights to it, so that it can batch together the rendering + * of the lights. You don't _have_ to do this, and if you've only a handful of Point Lights in + * your game then it's perfectly safe to mix them into the dislay list as normal. However, if + * you're using a large number of them, please consider how they are mixed into the display list. + * + * The renderer will automatically cull Point Lights. Those with a radius that does not intersect + * with the Camera will be skipped in the rendering list. This happens automatically and the + * culled state is refreshed every frame, for every camera. + * + * The origin of a Point Light is always 0.5 and it cannot be changed. + * + * Point Lights are a WebGL only feature and do not have a Canvas counterpart. + * @param x The horizontal position of this Point Light in the world. + * @param y The vertical position of this Point Light in the world. + * @param color The color of the Point Light, given as a hex value. Default 0xffffff. + * @param radius The radius of the Point Light. Default 128. + * @param intensity The intensity, or color blend, of the Point Light. Default 1. + * @param attenuation The attenuation of the Point Light. This is the reduction of light from the center point. Default 0.1. + */ + pointlight(x: number, y: number, color?: number, radius?: number, intensity?: number, attenuation?: number): Phaser.GameObjects.PointLight; + + /** + * Creates a new Render Texture Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Render Texture Game Object has been built into Phaser. + * + * A Render Texture is a combination of Dynamic Texture and an Image Game Object, that uses the + * Dynamic Texture to display itself with. + * + * A Dynamic Texture is a special texture that allows you to draw textures, frames and most kind of + * Game Objects directly to it. + * + * You can take many complex objects and draw them to this one texture, which can then be used as the + * base texture for other Game Objects, such as Sprites. Should you then update this texture, all + * Game Objects using it will instantly be updated as well, reflecting the changes immediately. + * + * It's a powerful way to generate dynamic textures at run-time that are WebGL friendly and don't invoke + * expensive GPU uploads on each change. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param width The width of the Render Texture. Default 32. + * @param height The height of the Render Texture. Default 32. + */ + renderTexture(x: number, y: number, width?: number, height?: number): Phaser.GameObjects.RenderTexture; + + /** + * Creates a new Rope Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Rope Game Object and WebGL support have been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param points An array containing the vertices data for this Rope. If none is provided a simple quad is created. See `setPoints` to set this post-creation. + * @param horizontal Should the vertices of this Rope be aligned horizontally (`true`), or vertically (`false`)? Default true. + * @param colors An optional array containing the color data for this Rope. You should provide one color value per pair of vertices. + * @param alphas An optional array containing the alpha data for this Rope. You should provide one alpha value per pair of vertices. + */ + rope(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, points?: Phaser.Types.Math.Vector2Like[], horizontal?: boolean, colors?: number[], alphas?: number[]): Phaser.GameObjects.Rope; + + /** + * Creates a new Shader Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Shader Game Object and WebGL support have been built into Phaser. + * @param key The key of the shader to use from the shader cache, or a BaseShader instance. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the Game Object. Default 128. + * @param height The height of the Game Object. Default 128. + * @param textures Optional array of texture keys to bind to the iChannel0...3 uniforms. The textures must already exist in the Texture Manager. + * @param textureData Optional additional texture data. + */ + shader(key: string | Phaser.Display.BaseShader, x?: number, y?: number, width?: number, height?: number, textures?: string[], textureData?: object): Phaser.GameObjects.Shader; + + /** + * Creates a new Arc Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Arc Game Object has been built into Phaser. + * + * The Arc Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * When it renders it displays an arc shape. You can control the start and end angles of the arc, + * as well as if the angles are winding clockwise or anti-clockwise. With the default settings + * it renders as a complete circle. By changing the angles you can create other arc shapes, + * such as half-circles. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param radius The radius of the arc. Default 128. + * @param startAngle The start angle of the arc, in degrees. Default 0. + * @param endAngle The end angle of the arc, in degrees. Default 360. + * @param anticlockwise The winding order of the start and end angles. Default false. + * @param fillColor The color the arc will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the arc will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + arc(x?: number, y?: number, radius?: number, startAngle?: number, endAngle?: number, anticlockwise?: boolean, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Arc; + + /** + * Creates a new Circle Shape Game Object and adds it to the Scene. + * + * A Circle is an Arc with no defined start and end angle, making it render as a complete circle. + * + * Note: This method will only be available if the Arc Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param radius The radius of the circle. Default 128. + * @param fillColor The color the circle will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the circle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + circle(x?: number, y?: number, radius?: number, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Arc; + + /** + * Creates a new Curve Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Curve Game Object has been built into Phaser. + * + * The Curve Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * To render a Curve Shape you must first create a `Phaser.Curves.Curve` object, then pass it to + * the Curve Shape in the constructor. + * + * The Curve shape also has a `smoothness` property and corresponding `setSmoothness` method. + * This allows you to control how smooth the shape renders in WebGL, by controlling the number of iterations + * that take place during construction. Increase and decrease the default value for smoother, or more + * jagged, shapes. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param curve The Curve object to use to create the Shape. + * @param fillColor The color the curve will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the curve will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + curve(x?: number, y?: number, curve?: Phaser.Curves.Curve, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Curve; + + /** + * Creates a new Ellipse Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Ellipse Game Object has been built into Phaser. + * + * The Ellipse Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * When it renders it displays an ellipse shape. You can control the width and height of the ellipse. + * If the width and height match it will render as a circle. If the width is less than the height, + * it will look more like an egg shape. + * + * The Ellipse shape also has a `smoothness` property and corresponding `setSmoothness` method. + * This allows you to control how smooth the shape renders in WebGL, by controlling the number of iterations + * that take place during construction. Increase and decrease the default value for smoother, or more + * jagged, shapes. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the ellipse. An ellipse with equal width and height renders as a circle. Default 128. + * @param height The height of the ellipse. An ellipse with equal width and height renders as a circle. Default 128. + * @param fillColor The color the ellipse will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the ellipse will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + ellipse(x?: number, y?: number, width?: number, height?: number, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Ellipse; + + /** + * Creates a new Grid Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Grid Game Object has been built into Phaser. + * + * The Grid Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only fill colors and cannot be stroked. + * + * A Grid Shape allows you to display a grid in your game, where you can control the size of the + * grid as well as the width and height of the grid cells. You can set a fill color for each grid + * cell as well as an alternate fill color. When the alternate fill color is set then the grid + * cells will alternate the fill colors as they render, creating a chess-board effect. You can + * also optionally have an outline fill color. If set, this draws lines between the grid cells + * in the given color. If you specify an outline color with an alpha of zero, then it will draw + * the cells spaced out, but without the lines between them. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the grid. Default 128. + * @param height The height of the grid. Default 128. + * @param cellWidth The width of one cell in the grid. Default 32. + * @param cellHeight The height of one cell in the grid. Default 32. + * @param fillColor The color the grid cells will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + * @param outlineFillColor The color of the lines between the grid cells. + * @param outlineFillAlpha The alpha of the lines between the grid cells. + */ + grid(x?: number, y?: number, width?: number, height?: number, cellWidth?: number, cellHeight?: number, fillColor?: number, fillAlpha?: number, outlineFillColor?: number, outlineFillAlpha?: number): Phaser.GameObjects.Grid; + + /** + * Creates a new IsoBox Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the IsoBox Game Object has been built into Phaser. + * + * The IsoBox Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only fill colors and cannot be stroked. + * + * An IsoBox is an 'isometric' rectangle. Each face of it has a different fill color. You can set + * the color of the top, left and right faces of the rectangle respectively. You can also choose + * which of the faces are rendered via the `showTop`, `showLeft` and `showRight` properties. + * + * You cannot view an IsoBox from under-neath, however you can change the 'angle' by setting + * the `projection` property. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param size The width of the iso box in pixels. The left and right faces will be exactly half this value. Default 48. + * @param height The height of the iso box. The left and right faces will be this tall. The overall height of the isobox will be this value plus half the `size` value. Default 32. + * @param fillTop The fill color of the top face of the iso box. Default 0xeeeeee. + * @param fillLeft The fill color of the left face of the iso box. Default 0x999999. + * @param fillRight The fill color of the right face of the iso box. Default 0xcccccc. + */ + isobox(x?: number, y?: number, size?: number, height?: number, fillTop?: number, fillLeft?: number, fillRight?: number): Phaser.GameObjects.IsoBox; + + /** + * Creates a new IsoTriangle Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the IsoTriangle Game Object has been built into Phaser. + * + * The IsoTriangle Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only fill colors and cannot be stroked. + * + * An IsoTriangle is an 'isometric' triangle. Think of it like a pyramid. Each face has a different + * fill color. You can set the color of the top, left and right faces of the triangle respectively + * You can also choose which of the faces are rendered via the `showTop`, `showLeft` and `showRight` properties. + * + * You cannot view an IsoTriangle from under-neath, however you can change the 'angle' by setting + * the `projection` property. The `reversed` property controls if the IsoTriangle is rendered upside + * down or not. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param size The width of the iso triangle in pixels. The left and right faces will be exactly half this value. Default 48. + * @param height The height of the iso triangle. The left and right faces will be this tall. The overall height of the iso triangle will be this value plus half the `size` value. Default 32. + * @param reversed Is the iso triangle upside down? Default false. + * @param fillTop The fill color of the top face of the iso triangle. Default 0xeeeeee. + * @param fillLeft The fill color of the left face of the iso triangle. Default 0x999999. + * @param fillRight The fill color of the right face of the iso triangle. Default 0xcccccc. + */ + isotriangle(x?: number, y?: number, size?: number, height?: number, reversed?: boolean, fillTop?: number, fillLeft?: number, fillRight?: number): Phaser.GameObjects.IsoTriangle; + + /** + * Creates a new Line Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Line Game Object has been built into Phaser. + * + * The Line Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only stroke colors and cannot be filled. + * + * A Line Shape allows you to draw a line between two points in your game. You can control the + * stroke color and thickness of the line. In WebGL only you can also specify a different + * thickness for the start and end of the line, allowing you to render lines that taper-off. + * + * If you need to draw multiple lines in a sequence you may wish to use the Polygon Shape instead. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param x1 The horizontal position of the start of the line. Default 0. + * @param y1 The vertical position of the start of the line. Default 0. + * @param x2 The horizontal position of the end of the line. Default 128. + * @param y2 The vertical position of the end of the line. Default 0. + * @param strokeColor The color the line will be drawn in, i.e. 0xff0000 for red. + * @param strokeAlpha The alpha the line will be drawn in. You can also set the alpha of the overall Shape using its `alpha` property. + */ + line(x?: number, y?: number, x1?: number, y1?: number, x2?: number, y2?: number, strokeColor?: number, strokeAlpha?: number): Phaser.GameObjects.Line; + + /** + * Creates a new Polygon Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Polygon Game Object has been built into Phaser. + * + * The Polygon Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * The Polygon Shape is created by providing a list of points, which are then used to create an + * internal Polygon geometry object. The points can be set from a variety of formats: + * + * - An array of Point or Vector2 objects: `[new Phaser.Math.Vector2(x1, y1), ...]` + * - An array of objects with public x/y properties: `[obj1, obj2, ...]` + * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]` + * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]` + * + * By default the `x` and `y` coordinates of this Shape refer to the center of it. However, depending + * on the coordinates of the points provided, the final shape may be rendered offset from its origin. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param points The points that make up the polygon. + * @param fillColor The color the polygon will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the polygon will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + polygon(x?: number, y?: number, points?: any, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Polygon; + + /** + * Creates a new Rectangle Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Rectangle Game Object has been built into Phaser. + * + * The Rectangle Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * You can change the size of the rectangle by changing the `width` and `height` properties. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the rectangle. Default 128. + * @param height The height of the rectangle. Default 128. + * @param fillColor The color the rectangle will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the rectangle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + rectangle(x?: number, y?: number, width?: number, height?: number, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Rectangle; + + /** + * Creates a new Star Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Star Game Object has been built into Phaser. + * + * The Star Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * As the name implies, the Star shape will display a star in your game. You can control several + * aspects of it including the number of points that constitute the star. The default is 5. If + * you change it to 4 it will render as a diamond. If you increase them, you'll get a more spiky + * star shape. + * + * You can also control the inner and outer radius, which is how 'long' each point of the star is. + * Modify these values to create more interesting shapes. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param points The number of points on the star. Default 5. + * @param innerRadius The inner radius of the star. Default 32. + * @param outerRadius The outer radius of the star. Default 64. + * @param fillColor The color the star will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the star will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + star(x?: number, y?: number, points?: number, innerRadius?: number, outerRadius?: number, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Star; + + /** + * Creates a new Triangle Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Triangle Game Object has been built into Phaser. + * + * The Triangle Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * The Triangle consists of 3 lines, joining up to form a triangular shape. You can control the + * position of each point of these lines. The triangle is always closed and cannot have an open + * face. If you require that, consider using a Polygon instead. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param x1 The horizontal position of the first point in the triangle. Default 0. + * @param y1 The vertical position of the first point in the triangle. Default 128. + * @param x2 The horizontal position of the second point in the triangle. Default 64. + * @param y2 The vertical position of the second point in the triangle. Default 0. + * @param x3 The horizontal position of the third point in the triangle. Default 128. + * @param y3 The vertical position of the third point in the triangle. Default 128. + * @param fillColor The color the triangle will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the triangle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + triangle(x?: number, y?: number, x1?: number, y1?: number, x2?: number, y2?: number, x3?: number, y3?: number, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Triangle; + + /** + * Creates a new Sprite Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Sprite Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + sprite(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.Sprite; + + /** + * Creates a new Text Game Object and adds it to the Scene. + * + * A Text Game Object. + * + * Text objects work by creating their own internal hidden Canvas and then renders text to it using + * the standard Canvas `fillText` API. It then creates a texture from this canvas which is rendered + * to your game during the render pass. + * + * Because it uses the Canvas API you can take advantage of all the features this offers, such as + * applying gradient fills to the text, or strokes, shadows and more. You can also use custom fonts + * loaded externally, such as Google or TypeKit Web fonts. + * + * You can only display fonts that are currently loaded and available to the browser: therefore fonts must + * be pre-loaded. Phaser does not do this for you, so you will require the use of a 3rd party font loader, + * or have the fonts ready available in the CSS on the page in which your Phaser game resides. + * + * See {@link http://www.jordanm.co.uk/tinytype this compatibility table} for the available default fonts + * across mobile browsers. + * + * A note on performance: Every time the contents of a Text object changes, i.e. changing the text being + * displayed, or the style of the text, it needs to remake the Text canvas, and if on WebGL, re-upload the + * new texture to the GPU. This can be an expensive operation if used often, or with large quantities of + * Text objects in your game. If you run into performance issues you would be better off using Bitmap Text + * instead, as it benefits from batching and avoids expensive Canvas API calls. + * + * Note: This method will only be available if the Text Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param text The text this Text object will display. + * @param style The Text style configuration object. + */ + text(x: number, y: number, text: string | string[], style?: Phaser.Types.GameObjects.Text.TextStyle): Phaser.GameObjects.Text; + + /** + * Creates a new TileSprite Game Object and adds it to the Scene. + * + * Note: This method will only be available if the TileSprite Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param width The width of the Game Object. If zero it will use the size of the texture frame. + * @param height The height of the Game Object. If zero it will use the size of the texture frame. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. Cannot be a DynamicTexture. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + tileSprite(x: number, y: number, width: number, height: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.TileSprite; + + /** + * Creates a new Video Game Object and adds it to the Scene. + * + * This Game Object is capable of handling playback of a video file, video stream or media stream. + * + * You can optionally 'preload' the video into the Phaser Video Cache: + * + * ```javascript + * preload () { + * this.load.video('ripley', 'assets/aliens.mp4'); + * } + * + * create () { + * this.add.video(400, 300, 'ripley'); + * } + * ``` + * + * You don't have to 'preload' the video. You can also play it directly from a URL: + * + * ```javascript + * create () { + * this.add.video(400, 300).loadURL('assets/aliens.mp4'); + * } + * ``` + * + * To all intents and purposes, a video is a standard Game Object, just like a Sprite. And as such, you can do + * all the usual things to it, such as scaling, rotating, cropping, tinting, making interactive, giving a + * physics body, etc. + * + * Transparent videos are also possible via the WebM file format. Providing the video file has was encoded with + * an alpha channel, and providing the browser supports WebM playback (not all of them do), then it will render + * in-game with full transparency. + * + * ### Autoplaying Videos + * + * Videos can only autoplay if the browser has been unlocked with an interaction, or satisfies the MEI settings. + * The policies that control autoplaying are vast and vary between browser. You can, and should, read more about + * it here: https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide + * + * If your video doesn't contain any audio, then set the `noAudio` parameter to `true` when the video is _loaded_, + * and it will often allow the video to play immediately: + * + * ```javascript + * preload () { + * this.load.video('pixar', 'nemo.mp4', true); + * } + * ``` + * + * The 3rd parameter in the load call tells Phaser that the video doesn't contain any audio tracks. Video without + * audio can autoplay without requiring a user interaction. Video with audio cannot do this unless it satisfies + * the browsers MEI settings. See the MDN Autoplay Guide for further details. + * + * Or: + * + * ```javascript + * create () { + * this.add.video(400, 300).loadURL('assets/aliens.mp4', true); + * } + * ``` + * + * You can set the `noAudio` parameter to `true` even if the video does contain audio. It will still allow the video + * to play immediately, but the audio will not start. + * + * Note that due to a bug in IE11 you cannot play a video texture to a Sprite in WebGL. For IE11 force Canvas mode. + * + * More details about video playback and the supported media formats can be found on MDN: + * + * https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement + * https://developer.mozilla.org/en-US/docs/Web/Media/Formats + * + * Note: This method will only be available if the Video Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param key Optional key of the Video this Game Object will play, as stored in the Video Cache. + */ + video(x: number, y: number, key?: string): Phaser.GameObjects.Video; + + /** + * Creates a new Zone Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Zone Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param width The width of the Game Object. + * @param height The height of the Game Object. + */ + zone(x: number, y: number, width: number, height: number): Phaser.GameObjects.Zone; + + /** + * Creates a Tilemap from the given key or data, or creates a blank Tilemap if no key/data provided. + * When loading from CSV or a 2D array, you should specify the tileWidth & tileHeight. When parsing + * from a map from Tiled, the tileWidth, tileHeight, width & height will be pulled from the map + * data. For an empty map, you should specify tileWidth, tileHeight, width & height. + * @param key The key in the Phaser cache that corresponds to the loaded tilemap data. + * @param tileWidth The width of a tile in pixels. Pass in `null` to leave as the + * default. Default 32. + * @param tileHeight The height of a tile in pixels. Pass in `null` to leave as the + * default. Default 32. + * @param width The width of the map in tiles. Pass in `null` to leave as the + * default. Default 10. + * @param height The height of the map in tiles. Pass in `null` to leave as the + * default. Default 10. + * @param data Instead of loading from the cache, you can also load directly from + * a 2D array of tile indexes. Pass in `null` for no data. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the + * map data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. Default false. + */ + tilemap(key?: string, tileWidth?: number, tileHeight?: number, width?: number, height?: number, data?: number[][], insertNull?: boolean): Phaser.Tilemaps.Tilemap; + + /** + * A Timeline is a way to schedule events to happen at specific times in the future. + * + * You can think of it as an event sequencer for your game, allowing you to schedule the + * running of callbacks, events and other actions at specific times in the future. + * + * A Timeline is a Scene level system, meaning you can have as many Timelines as you like, each + * belonging to a different Scene. You can also have multiple Timelines running at the same time. + * + * If the Scene is paused, the Timeline will also pause. If the Scene is destroyed, the Timeline + * will be automatically destroyed. However, you can control the Timeline directly, pausing, + * resuming and stopping it at any time. + * + * Create an instance of a Timeline via the Game Object Factory: + * + * ```js + * const timeline = this.add.timeline(); + * ``` + * + * The Timeline always starts paused. You must call `play` on it to start it running. + * + * You can also pass in a configuration object on creation, or an array of them: + * + * ```js + * const timeline = this.add.timeline({ + * at: 1000, + * run: () => { + * this.add.sprite(400, 300, 'logo'); + * } + * }); + * + * timeline.play(); + * ``` + * + * In this example we sequence a few different events: + * + * ```js + * const timeline = this.add.timeline([ + * { + * at: 1000, + * run: () => { this.logo = this.add.sprite(400, 300, 'logo'); }, + * sound: 'TitleMusic' + * }, + * { + * at: 2500, + * tween: { + * targets: this.logo, + * y: 600, + * yoyo: true + * }, + * sound: 'Explode' + * }, + * { + * at: 8000, + * event: 'HURRY_PLAYER', + * target: this.background, + * set: { + * tint: 0xff0000 + * } + * } + * ]); + * + * timeline.play(); + * ``` + * + * The Timeline can also be looped with the repeat method: + * ```js + * timeline.repeat().play(); + * ``` + * + * There are lots of options available to you via the configuration object. See the + * {@link Phaser.Types.Time.TimelineEventConfig} typedef for more details. + * @param config The configuration object for this Timeline Event, or an array of them. + */ + timeline(config: Phaser.Types.Time.TimelineEventConfig | Phaser.Types.Time.TimelineEventConfig[]): Phaser.Time.Timeline; + + /** + * Creates a new Tween object. + * + * Note: This method will only be available if Tweens have been built into Phaser. + * @param config A Tween Configuration object, or a Tween or TweenChain instance. + */ + tween(config: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenChainBuilderConfig | Phaser.Tweens.Tween | Phaser.Tweens.TweenChain): Phaser.Tweens.Tween; + + /** + * Creates a new TweenChain object and adds it to the Tween Manager. + * + * Note: This method will only be available if Tweens have been built into Phaser. + * @param config The TweenChain configuration. + */ + tweenchain(config: Phaser.Types.Tweens.TweenBuilderConfig | object): Phaser.Tweens.TweenChain; + + } + + /** + * Calculates the Transform Matrix of the given Game Object and Camera, factoring in + * the parent matrix if provided. + * + * Note that the object this results contains _references_ to the Transform Matrices, + * not new instances of them. Therefore, you should use their values immediately, or + * copy them to your own matrix, as they will be replaced as soon as another Game + * Object is rendered. + * @param src The Game Object to calculate the transform matrix for. + * @param camera The camera being used to render the Game Object. + * @param parentMatrix The transform matrix of the parent container, if any. + */ + function GetCalcMatrix(src: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.Types.GameObjects.GetCalcMatrixResults; + + /** + * A Graphics object is a way to draw primitive shapes to your game. Primitives include forms of geometry, such as + * Rectangles, Circles, and Polygons. They also include lines, arcs and curves. When you initially create a Graphics + * object it will be empty. + * + * To draw to it you must first specify a line style or fill style (or both), draw shapes using paths, and finally + * fill or stroke them. For example: + * + * ```javascript + * graphics.lineStyle(5, 0xFF00FF, 1.0); + * graphics.beginPath(); + * graphics.moveTo(100, 100); + * graphics.lineTo(200, 200); + * graphics.closePath(); + * graphics.strokePath(); + * ``` + * + * There are also many helpful methods that draw and fill/stroke common shapes for you. + * + * ```javascript + * graphics.lineStyle(5, 0xFF00FF, 1.0); + * graphics.fillStyle(0xFFFFFF, 1.0); + * graphics.fillRect(50, 50, 400, 200); + * graphics.strokeRect(50, 50, 400, 200); + * ``` + * + * When a Graphics object is rendered it will render differently based on if the game is running under Canvas or WebGL. + * Under Canvas it will use the HTML Canvas context drawing operations to draw the path. + * Under WebGL the graphics data is decomposed into polygons. Both of these are expensive processes, especially with + * complex shapes. + * + * If your Graphics object doesn't change much (or at all) once you've drawn your shape to it, then you will help + * performance by calling {@link Phaser.GameObjects.Graphics#generateTexture}. This will 'bake' the Graphics object into + * a Texture, and return it. You can then use this Texture for Sprites or other display objects. If your Graphics object + * updates frequently then you should avoid doing this, as it will constantly generate new textures, which will consume + * memory. + * + * As you can tell, Graphics objects are a bit of a trade-off. While they are extremely useful, you need to be careful + * in their complexity and quantity of them in your game. + */ + class Graphics extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible, Phaser.GameObjects.Components.ScrollFactor { + /** + * + * @param scene The Scene to which this Graphics object belongs. + * @param options Options that set the position and default style of this Graphics object. + */ + constructor(scene: Phaser.Scene, options?: Phaser.Types.GameObjects.Graphics.Options); + + /** + * The horizontal display origin of the Graphics. + */ + displayOriginX: number; + + /** + * The vertical display origin of the Graphics. + */ + displayOriginY: number; + + /** + * The array of commands used to render the Graphics. + */ + commandBuffer: any[]; + + /** + * The default fill color for shapes rendered by this Graphics object. + * Set this value with `setDefaultStyles()`. + */ + readonly defaultFillColor: number; + + /** + * The default fill alpha for shapes rendered by this Graphics object. + * Set this value with `setDefaultStyles()`. + */ + readonly defaultFillAlpha: number; + + /** + * The default stroke width for shapes rendered by this Graphics object. + * Set this value with `setDefaultStyles()`. + */ + readonly defaultStrokeWidth: number; + + /** + * The default stroke color for shapes rendered by this Graphics object. + * Set this value with `setDefaultStyles()`. + */ + readonly defaultStrokeColor: number; + + /** + * The default stroke alpha for shapes rendered by this Graphics object. + * Set this value with `setDefaultStyles()`. + */ + readonly defaultStrokeAlpha: number; + + /** + * Set the default style settings for this Graphics object. + * @param options The styles to set as defaults. + */ + setDefaultStyles(options: Phaser.Types.GameObjects.Graphics.Styles): this; + + /** + * Set the current line style. Used for all 'stroke' related functions. + * @param lineWidth The stroke width. + * @param color The stroke color. + * @param alpha The stroke alpha. Default 1. + */ + lineStyle(lineWidth: number, color: number, alpha?: number): this; + + /** + * Set the current fill style. Used for all 'fill' related functions. + * @param color The fill color. + * @param alpha The fill alpha. Default 1. + */ + fillStyle(color: number, alpha?: number): this; + + /** + * Sets a gradient fill style. This is a WebGL only feature. + * + * The gradient color values represent the 4 corners of an untransformed rectangle. + * The gradient is used to color all filled shapes and paths drawn after calling this method. + * If you wish to turn a gradient off, call `fillStyle` and provide a new single fill color. + * + * When filling a triangle only the first 3 color values provided are used for the 3 points of a triangle. + * + * This feature is best used only on rectangles and triangles. All other shapes will give strange results. + * + * Note that for objects such as arcs or ellipses, or anything which is made out of triangles, each triangle used + * will be filled with a gradient on its own. There is no ability to gradient fill a shape or path as a single + * entity at this time. + * @param topLeft The top left fill color. + * @param topRight The top right fill color. + * @param bottomLeft The bottom left fill color. + * @param bottomRight The bottom right fill color. Not used when filling triangles. + * @param alphaTopLeft The top left alpha value. If you give only this value, it's used for all corners. Default 1. + * @param alphaTopRight The top right alpha value. Default 1. + * @param alphaBottomLeft The bottom left alpha value. Default 1. + * @param alphaBottomRight The bottom right alpha value. Default 1. + */ + fillGradientStyle(topLeft: number, topRight: number, bottomLeft: number, bottomRight: number, alphaTopLeft?: number, alphaTopRight?: number, alphaBottomLeft?: number, alphaBottomRight?: number): this; + + /** + * Sets a gradient line style. This is a WebGL only feature. + * + * The gradient color values represent the 4 corners of an untransformed rectangle. + * The gradient is used to color all stroked shapes and paths drawn after calling this method. + * If you wish to turn a gradient off, call `lineStyle` and provide a new single line color. + * + * This feature is best used only on single lines. All other shapes will give strange results. + * + * Note that for objects such as arcs or ellipses, or anything which is made out of triangles, each triangle used + * will be filled with a gradient on its own. There is no ability to gradient stroke a shape or path as a single + * entity at this time. + * @param lineWidth The stroke width. + * @param topLeft The tint being applied to the top-left of the Game Object. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + * @param alpha The fill alpha. Default 1. + */ + lineGradientStyle(lineWidth: number, topLeft: number, topRight: number, bottomLeft: number, bottomRight: number, alpha?: number): this; + + /** + * Start a new shape path. + */ + beginPath(): this; + + /** + * Close the current path. + */ + closePath(): this; + + /** + * Fill the current path. + */ + fillPath(): this; + + /** + * Fill the current path. + * + * This is an alias for `Graphics.fillPath` and does the same thing. + * It was added to match the CanvasRenderingContext 2D API. + */ + fill(): this; + + /** + * Stroke the current path. + */ + strokePath(): this; + + /** + * Stroke the current path. + * + * This is an alias for `Graphics.strokePath` and does the same thing. + * It was added to match the CanvasRenderingContext 2D API. + */ + stroke(): this; + + /** + * Fill the given circle. + * @param circle The circle to fill. + */ + fillCircleShape(circle: Phaser.Geom.Circle): this; + + /** + * Stroke the given circle. + * @param circle The circle to stroke. + */ + strokeCircleShape(circle: Phaser.Geom.Circle): this; + + /** + * Fill a circle with the given position and radius. + * @param x The x coordinate of the center of the circle. + * @param y The y coordinate of the center of the circle. + * @param radius The radius of the circle. + */ + fillCircle(x: number, y: number, radius: number): this; + + /** + * Stroke a circle with the given position and radius. + * @param x The x coordinate of the center of the circle. + * @param y The y coordinate of the center of the circle. + * @param radius The radius of the circle. + */ + strokeCircle(x: number, y: number, radius: number): this; + + /** + * Fill the given rectangle. + * @param rect The rectangle to fill. + */ + fillRectShape(rect: Phaser.Geom.Rectangle): this; + + /** + * Stroke the given rectangle. + * @param rect The rectangle to stroke. + */ + strokeRectShape(rect: Phaser.Geom.Rectangle): this; + + /** + * Fill a rectangle with the given position and size. + * @param x The x coordinate of the top-left of the rectangle. + * @param y The y coordinate of the top-left of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + */ + fillRect(x: number, y: number, width: number, height: number): this; + + /** + * Stroke a rectangle with the given position and size. + * @param x The x coordinate of the top-left of the rectangle. + * @param y The y coordinate of the top-left of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + */ + strokeRect(x: number, y: number, width: number, height: number): this; + + /** + * Fill a rounded rectangle with the given position, size and radius. + * @param x The x coordinate of the top-left of the rectangle. + * @param y The y coordinate of the top-left of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + * @param radius The corner radius; It can also be an object to specify different radius for corners. Default 20. + */ + fillRoundedRect(x: number, y: number, width: number, height: number, radius?: Phaser.Types.GameObjects.Graphics.RoundedRectRadius | number): this; + + /** + * Stroke a rounded rectangle with the given position, size and radius. + * @param x The x coordinate of the top-left of the rectangle. + * @param y The y coordinate of the top-left of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + * @param radius The corner radius; It can also be an object to specify different radii for corners. Default 20. + */ + strokeRoundedRect(x: number, y: number, width: number, height: number, radius?: Phaser.Types.GameObjects.Graphics.RoundedRectRadius | number): this; + + /** + * Fill the given point. + * + * Draws a square at the given position, 1 pixel in size by default. + * @param point The point to fill. + * @param size The size of the square to draw. Default 1. + */ + fillPointShape(point: Phaser.Geom.Point | Phaser.Math.Vector2 | object, size?: number): this; + + /** + * Fill a point at the given position. + * + * Draws a square at the given position, 1 pixel in size by default. + * @param x The x coordinate of the point. + * @param y The y coordinate of the point. + * @param size The size of the square to draw. Default 1. + */ + fillPoint(x: number, y: number, size?: number): this; + + /** + * Fill the given triangle. + * @param triangle The triangle to fill. + */ + fillTriangleShape(triangle: Phaser.Geom.Triangle): this; + + /** + * Stroke the given triangle. + * @param triangle The triangle to stroke. + */ + strokeTriangleShape(triangle: Phaser.Geom.Triangle): this; + + /** + * Fill a triangle with the given points. + * @param x0 The x coordinate of the first point. + * @param y0 The y coordinate of the first point. + * @param x1 The x coordinate of the second point. + * @param y1 The y coordinate of the second point. + * @param x2 The x coordinate of the third point. + * @param y2 The y coordinate of the third point. + */ + fillTriangle(x0: number, y0: number, x1: number, y1: number, x2: number, y2: number): this; + + /** + * Stroke a triangle with the given points. + * @param x0 The x coordinate of the first point. + * @param y0 The y coordinate of the first point. + * @param x1 The x coordinate of the second point. + * @param y1 The y coordinate of the second point. + * @param x2 The x coordinate of the third point. + * @param y2 The y coordinate of the third point. + */ + strokeTriangle(x0: number, y0: number, x1: number, y1: number, x2: number, y2: number): this; + + /** + * Draw the given line. + * @param line The line to stroke. + */ + strokeLineShape(line: Phaser.Geom.Line): this; + + /** + * Draw a line between the given points. + * @param x1 The x coordinate of the start point of the line. + * @param y1 The y coordinate of the start point of the line. + * @param x2 The x coordinate of the end point of the line. + * @param y2 The y coordinate of the end point of the line. + */ + lineBetween(x1: number, y1: number, x2: number, y2: number): this; + + /** + * Draw a line from the current drawing position to the given position. + * + * Moves the current drawing position to the given position. + * @param x The x coordinate to draw the line to. + * @param y The y coordinate to draw the line to. + */ + lineTo(x: number, y: number): this; + + /** + * Move the current drawing position to the given position. + * @param x The x coordinate to move to. + * @param y The y coordinate to move to. + */ + moveTo(x: number, y: number): this; + + /** + * Stroke the shape represented by the given array of points. + * + * Pass `closeShape` to automatically close the shape by joining the last to the first point. + * + * Pass `closePath` to automatically close the path before it is stroked. + * @param points The points to stroke. + * @param closeShape When `true`, the shape is closed by joining the last point to the first point. Default false. + * @param closePath When `true`, the path is closed before being stroked. Default false. + * @param endIndex The index of `points` to stop drawing at. Defaults to `points.length`. + */ + strokePoints(points: any[] | Phaser.Geom.Point[], closeShape?: boolean, closePath?: boolean, endIndex?: number): this; + + /** + * Fill the shape represented by the given array of points. + * + * Pass `closeShape` to automatically close the shape by joining the last to the first point. + * + * Pass `closePath` to automatically close the path before it is filled. + * @param points The points to fill. + * @param closeShape When `true`, the shape is closed by joining the last point to the first point. Default false. + * @param closePath When `true`, the path is closed before being stroked. Default false. + * @param endIndex The index of `points` to stop at. Defaults to `points.length`. + */ + fillPoints(points: any[] | Phaser.Geom.Point[], closeShape?: boolean, closePath?: boolean, endIndex?: number): this; + + /** + * Stroke the given ellipse. + * @param ellipse The ellipse to stroke. + * @param smoothness The number of points to draw the ellipse with. Default 32. + */ + strokeEllipseShape(ellipse: Phaser.Geom.Ellipse, smoothness?: number): this; + + /** + * Stroke an ellipse with the given position and size. + * @param x The x coordinate of the center of the ellipse. + * @param y The y coordinate of the center of the ellipse. + * @param width The width of the ellipse. + * @param height The height of the ellipse. + * @param smoothness The number of points to draw the ellipse with. Default 32. + */ + strokeEllipse(x: number, y: number, width: number, height: number, smoothness?: number): this; + + /** + * Fill the given ellipse. + * @param ellipse The ellipse to fill. + * @param smoothness The number of points to draw the ellipse with. Default 32. + */ + fillEllipseShape(ellipse: Phaser.Geom.Ellipse, smoothness?: number): this; + + /** + * Fill an ellipse with the given position and size. + * @param x The x coordinate of the center of the ellipse. + * @param y The y coordinate of the center of the ellipse. + * @param width The width of the ellipse. + * @param height The height of the ellipse. + * @param smoothness The number of points to draw the ellipse with. Default 32. + */ + fillEllipse(x: number, y: number, width: number, height: number, smoothness?: number): this; + + /** + * Draw an arc. + * + * This method can be used to create circles, or parts of circles. + * + * Make sure you call `beginPath` before starting the arc unless you wish for the arc to automatically + * close when filled or stroked. + * + * Use the optional `overshoot` argument increase the number of iterations that take place when + * the arc is rendered in WebGL. This is useful if you're drawing an arc with an especially thick line, + * as it will allow the arc to fully join-up. Try small values at first, i.e. 0.01. + * + * Call {@link Phaser.GameObjects.Graphics#fillPath} or {@link Phaser.GameObjects.Graphics#strokePath} after calling + * this method to draw the arc. + * @param x The x coordinate of the center of the circle. + * @param y The y coordinate of the center of the circle. + * @param radius The radius of the circle. + * @param startAngle The starting angle, in radians. + * @param endAngle The ending angle, in radians. + * @param anticlockwise Whether the drawing should be anticlockwise or clockwise. Default false. + * @param overshoot This value allows you to increase the segment iterations in WebGL rendering. Useful if the arc has a thick stroke and needs to overshoot to join-up cleanly. Use small numbers such as 0.01 to start with and increase as needed. Default 0. + */ + arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean, overshoot?: number): this; + + /** + * Creates a pie-chart slice shape centered at `x`, `y` with the given radius. + * You must define the start and end angle of the slice. + * + * Setting the `anticlockwise` argument to `true` creates a shape similar to Pacman. + * Setting it to `false` creates a shape like a slice of pie. + * + * This method will begin a new path and close the path at the end of it. + * To display the actual slice you need to call either `strokePath` or `fillPath` after it. + * @param x The horizontal center of the slice. + * @param y The vertical center of the slice. + * @param radius The radius of the slice. + * @param startAngle The start angle of the slice, given in radians. + * @param endAngle The end angle of the slice, given in radians. + * @param anticlockwise Whether the drawing should be anticlockwise or clockwise. Default false. + * @param overshoot This value allows you to overshoot the endAngle by this amount. Useful if the arc has a thick stroke and needs to overshoot to join-up cleanly. Default 0. + */ + slice(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean, overshoot?: number): this; + + /** + * Saves the state of the Graphics by pushing the current state onto a stack. + * + * The most recently saved state can then be restored with {@link Phaser.GameObjects.Graphics#restore}. + */ + save(): this; + + /** + * Restores the most recently saved state of the Graphics by popping from the state stack. + * + * Use {@link Phaser.GameObjects.Graphics#save} to save the current state, and call this afterwards to restore that state. + * + * If there is no saved state, this command does nothing. + */ + restore(): this; + + /** + * Inserts a translation command into this Graphics objects command buffer. + * + * All objects drawn _after_ calling this method will be translated + * by the given amount. + * + * This does not change the position of the Graphics object itself, + * only of the objects drawn by it after calling this method. + * @param x The horizontal translation to apply. + * @param y The vertical translation to apply. + */ + translateCanvas(x: number, y: number): this; + + /** + * Inserts a scale command into this Graphics objects command buffer. + * + * All objects drawn _after_ calling this method will be scaled + * by the given amount. + * + * This does not change the scale of the Graphics object itself, + * only of the objects drawn by it after calling this method. + * @param x The horizontal scale to apply. + * @param y The vertical scale to apply. + */ + scaleCanvas(x: number, y: number): this; + + /** + * Inserts a rotation command into this Graphics objects command buffer. + * + * All objects drawn _after_ calling this method will be rotated + * by the given amount. + * + * This does not change the rotation of the Graphics object itself, + * only of the objects drawn by it after calling this method. + * @param radians The rotation angle, in radians. + */ + rotateCanvas(radians: number): this; + + /** + * Clear the command buffer and reset the fill style and line style to their defaults. + */ + clear(): this; + + /** + * Generate a texture from this Graphics object. + * + * If `key` is a string it'll generate a new texture using it and add it into the + * Texture Manager (assuming no key conflict happens). + * + * If `key` is a Canvas it will draw the texture to that canvas context. Note that it will NOT + * automatically upload it to the GPU in WebGL mode. + * + * Please understand that the texture is created via the Canvas API of the browser, therefore some + * Graphics features, such as `fillGradientStyle`, will not appear on the resulting texture, + * as they're unsupported by the Canvas API. + * @param key The key to store the texture with in the Texture Manager, or a Canvas to draw to. + * @param width The width of the graphics to generate. + * @param height The height of the graphics to generate. + */ + generateTexture(key: string | HTMLCanvasElement, width?: number, height?: number): this; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * A Camera used specifically by the Graphics system for rendering to textures. + */ + static TargetCamera: Phaser.Cameras.Scene2D.Camera; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + } + + /** + * A Group is a way for you to create, manipulate, or recycle similar Game Objects. + * + * Group membership is non-exclusive. A Game Object can belong to several groups, one group, or none. + * + * Groups themselves aren't displayable, and can't be positioned, rotated, scaled, or hidden. + */ + class Group extends Phaser.Events.EventEmitter { + /** + * + * @param scene The scene this group belongs to. + * @param children Game Objects to add to this group; or the `config` argument. + * @param config Settings for this group. If `key` is set, Phaser.GameObjects.Group#createMultiple is also called with these settings. + */ + constructor(scene: Phaser.Scene, children?: Phaser.GameObjects.GameObject[] | Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig, config?: Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig); + + /** + * This scene this group belongs to. + */ + scene: Phaser.Scene; + + /** + * Members of this group. + */ + children: Phaser.Structs.Set; + + /** + * A flag identifying this object as a group. + */ + isParent: boolean; + + /** + * A textual representation of this Game Object. + * Used internally by Phaser but is available for your own custom classes to populate. + */ + type: string; + + /** + * The class to create new group members from. + */ + classType: Function; + + /** + * The name of this group. + * Empty by default and never populated by Phaser, this is left for developers to use. + */ + name: string; + + /** + * Whether this group runs its {@link Phaser.GameObjects.Group#preUpdate} method (which may update any members). + */ + active: boolean; + + /** + * The maximum size of this group, if used as a pool. -1 is no limit. + */ + maxSize: number; + + /** + * A default texture key to use when creating new group members. + * + * This is used in {@link Phaser.GameObjects.Group#create} + * but not in {@link Phaser.GameObjects.Group#createMultiple}. + */ + defaultKey: string; + + /** + * A default texture frame to use when creating new group members. + */ + defaultFrame: string | number; + + /** + * Whether to call the update method of any members. + */ + runChildUpdate: boolean; + + /** + * A function to be called when adding or creating group members. + */ + createCallback: Phaser.Types.GameObjects.Group.GroupCallback | null; + + /** + * A function to be called when removing group members. + */ + removeCallback: Phaser.Types.GameObjects.Group.GroupCallback | null; + + /** + * A function to be called when creating several group members at once. + */ + createMultipleCallback: Phaser.Types.GameObjects.Group.GroupMultipleCreateCallback | null; + + /** + * Creates a new Game Object and adds it to this group, unless the group {@link Phaser.GameObjects.Group#isFull is full}. + * + * Calls {@link Phaser.GameObjects.Group#createCallback}. + * @param x The horizontal position of the new Game Object in the world. Default 0. + * @param y The vertical position of the new Game Object in the world. Default 0. + * @param key The texture key of the new Game Object. Default defaultKey. + * @param frame The texture frame of the new Game Object. Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of the new Game Object. Default true. + * @param active The {@link Phaser.GameObjects.GameObject#active} state of the new Game Object. Default true. + */ + create(x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean, active?: boolean): any; + + /** + * Creates several Game Objects and adds them to this group. + * + * If the group becomes {@link Phaser.GameObjects.Group#isFull}, no further Game Objects are created. + * + * Calls {@link Phaser.GameObjects.Group#createMultipleCallback} and {@link Phaser.GameObjects.Group#createCallback}. + * @param config Creation settings. This can be a single configuration object or an array of such objects, which will be applied in turn. + */ + createMultiple(config: Phaser.Types.GameObjects.Group.GroupCreateConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig[]): any[]; + + /** + * A helper for {@link Phaser.GameObjects.Group#createMultiple}. + * @param options Creation settings. + */ + createFromConfig(options: Phaser.Types.GameObjects.Group.GroupCreateConfig): any[]; + + /** + * Updates any group members, if {@link Phaser.GameObjects.Group#runChildUpdate} is enabled. + * @param time The current timestamp. + * @param delta The delta time elapsed since the last frame. + */ + preUpdate(time: number, delta: number): void; + + /** + * Adds a Game Object to this group. + * + * Calls {@link Phaser.GameObjects.Group#createCallback}. + * @param child The Game Object to add. + * @param addToScene Also add the Game Object to the scene. Default false. + */ + add(child: Phaser.GameObjects.GameObject, addToScene?: boolean): this; + + /** + * Adds several Game Objects to this group. + * + * Calls {@link Phaser.GameObjects.Group#createCallback}. + * @param children The Game Objects to add. + * @param addToScene Also add the Game Objects to the scene. Default false. + */ + addMultiple(children: Phaser.GameObjects.GameObject[], addToScene?: boolean): this; + + /** + * Removes a member of this Group and optionally removes it from the Scene and / or destroys it. + * + * Calls {@link Phaser.GameObjects.Group#removeCallback}. + * @param child The Game Object to remove. + * @param removeFromScene Optionally remove the Group member from the Scene it belongs to. Default false. + * @param destroyChild Optionally call destroy on the removed Group member. Default false. + */ + remove(child: Phaser.GameObjects.GameObject, removeFromScene?: boolean, destroyChild?: boolean): this; + + /** + * Removes all members of this Group and optionally removes them from the Scene and / or destroys them. + * + * Does not call {@link Phaser.GameObjects.Group#removeCallback}. + * @param removeFromScene Optionally remove each Group member from the Scene. Default false. + * @param destroyChild Optionally call destroy on the removed Group members. Default false. + */ + clear(removeFromScene?: boolean, destroyChild?: boolean): this; + + /** + * Tests if a Game Object is a member of this group. + * @param child A Game Object. + */ + contains(child: Phaser.GameObjects.GameObject): boolean; + + /** + * All members of the group. + */ + getChildren(): Phaser.GameObjects.GameObject[]; + + /** + * The number of members of the group. + */ + getLength(): number; + + /** + * Returns all children in this Group that match the given criteria based on the `property` and `value` arguments. + * + * For example: `getMatching('visible', true)` would return only children that have their `visible` property set. + * + * Optionally, you can specify a start and end index. For example if the Group has 100 elements, + * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only + * the first 50. + * @param property The property to test on each array element. + * @param value The value to test the property against. Must pass a strict (`===`) comparison check. + * @param startIndex An optional start index to search from. + * @param endIndex An optional end index to search to. + */ + getMatching(property?: string, value?: any, startIndex?: number, endIndex?: number): any[]; + + /** + * Scans the Group, from top to bottom, for the first member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument, + * assigns `x` and `y`, and returns the member. + * + * If no matching member is found and `createIfNull` is true and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param state The {@link Phaser.GameObjects.GameObject#active} value to match. Default false. + * @param createIfNull Create a new Game Object if no matching members are found, using the following arguments. Default false. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + getFirst(state?: boolean, createIfNull?: boolean, x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any | null; + + /** + * Scans the Group, from top to bottom, for the nth member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument, + * assigns `x` and `y`, and returns the member. + * + * If no matching member is found and `createIfNull` is true and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param nth The nth matching Group member to search for. + * @param state The {@link Phaser.GameObjects.GameObject#active} value to match. Default false. + * @param createIfNull Create a new Game Object if no matching members are found, using the following arguments. Default false. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + getFirstNth(nth: number, state?: boolean, createIfNull?: boolean, x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any | null; + + /** + * Scans the Group for the last member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument, + * assigns `x` and `y`, and returns the member. + * + * If no matching member is found and `createIfNull` is true and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param state The {@link Phaser.GameObjects.GameObject#active} value to match. Default false. + * @param createIfNull Create a new Game Object if no matching members are found, using the following arguments. Default false. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + getLast(state?: boolean, createIfNull?: boolean, x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any | null; + + /** + * Scans the Group for the last nth member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument, + * assigns `x` and `y`, and returns the member. + * + * If no matching member is found and `createIfNull` is true and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param nth The nth matching Group member to search for. + * @param state The {@link Phaser.GameObjects.GameObject#active} value to match. Default false. + * @param createIfNull Create a new Game Object if no matching members are found, using the following arguments. Default false. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + getLastNth(nth: number, state?: boolean, createIfNull?: boolean, x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any | null; + + /** + * Scans the group for the first member that has an {@link Phaser.GameObjects.GameObject#active} state set to `false`, + * assigns `x` and `y`, and returns the member. + * + * If no inactive member is found and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`. + * The new Game Object will have its active state set to `true`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + get(x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any | null; + + /** + * Scans the group for the first member that has an {@link Phaser.GameObjects.GameObject#active} state set to `true`, + * assigns `x` and `y`, and returns the member. + * + * If no active member is found and `createIfNull` is `true` and the group isn't full then it will create a new one using `x`, `y`, `key`, `frame`, and `visible`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param createIfNull Create a new Game Object if no matching members are found, using the following arguments. Default false. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + getFirstAlive(createIfNull?: boolean, x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any; + + /** + * Scans the group for the first member that has an {@link Phaser.GameObjects.GameObject#active} state set to `false`, + * assigns `x` and `y`, and returns the member. + * + * If no inactive member is found and `createIfNull` is `true` and the group isn't full then it will create a new one using `x`, `y`, `key`, `frame`, and `visible`. + * The new Game Object will have an active state set to `true`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param createIfNull Create a new Game Object if no matching members are found, using the following arguments. Default false. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + getFirstDead(createIfNull?: boolean, x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any; + + /** + * {@link Phaser.GameObjects.Components.Animation#play Plays} an animation for all members of this group. + * @param key The string-based key of the animation to play. + * @param startFrame Optionally start the animation playing from this frame index. Default 0. + */ + playAnimation(key: string, startFrame?: string): this; + + /** + * Whether this group's size at its {@link Phaser.GameObjects.Group#maxSize maximum}. + */ + isFull(): boolean; + + /** + * Counts the number of active (or inactive) group members. + * @param value Count active (true) or inactive (false) group members. Default true. + */ + countActive(value?: boolean): number; + + /** + * Counts the number of in-use (active) group members. + */ + getTotalUsed(): number; + + /** + * The difference of {@link Phaser.GameObjects.Group#maxSize} and the number of active group members. + * + * This represents the number of group members that could be created or reactivated before reaching the size limit. + */ + getTotalFree(): number; + + /** + * Sets the `active` property of this Group. + * When active, this Group runs its `preUpdate` method. + * @param value True if this Group should be set as active, false if not. + */ + setActive(value: boolean): this; + + /** + * Sets the `name` property of this Group. + * The `name` property is not populated by Phaser and is presented for your own use. + * @param value The name to be given to this Group. + */ + setName(value: string): this; + + /** + * Sets the property as defined in `key` of each group member to the given value. + * @param key The property to be updated. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + propertyValueSet(key: string, value: number, step?: number, index?: number, direction?: number): this; + + /** + * Adds the given value to the property as defined in `key` of each group member. + * @param key The property to be updated. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + propertyValueInc(key: string, value: number, step?: number, index?: number, direction?: number): this; + + /** + * Sets the x of each group member. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + setX(value: number, step?: number): this; + + /** + * Sets the y of each group member. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + setY(value: number, step?: number): this; + + /** + * Sets the x, y of each group member. + * @param x The amount to set the `x` property to. + * @param y The amount to set the `y` property to. If `undefined` or `null` it uses the `x` value. Default x. + * @param stepX This is added to the `x` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `y` amount, multiplied by the iteration counter. Default 0. + */ + setXY(x: number, y?: number, stepX?: number, stepY?: number): this; + + /** + * Adds the given value to the x of each group member. + * @param value The amount to be added to the `x` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + incX(value: number, step?: number): this; + + /** + * Adds the given value to the y of each group member. + * @param value The amount to be added to the `y` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + incY(value: number, step?: number): this; + + /** + * Adds the given value to the x, y of each group member. + * @param x The amount to be added to the `x` property. + * @param y The amount to be added to the `y` property. If `undefined` or `null` it uses the `x` value. Default x. + * @param stepX This is added to the `x` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `y` amount, multiplied by the iteration counter. Default 0. + */ + incXY(x: number, y?: number, stepX?: number, stepY?: number): this; + + /** + * Iterate through the group members changing the position of each element to be that of the element that came before + * it in the array (or after it if direction = 1) + * + * The first group member position is set to x/y. + * @param x The x coordinate to place the first item in the array at. + * @param y The y coordinate to place the first item in the array at. + * @param direction The iteration direction. 0 = first to last and 1 = last to first. Default 0. + */ + shiftPosition(x: number, y: number, direction?: number): this; + + /** + * Sets the angle of each group member. + * @param value The amount to set the angle to, in degrees. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + angle(value: number, step?: number): this; + + /** + * Sets the rotation of each group member. + * @param value The amount to set the rotation to, in radians. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + rotate(value: number, step?: number): this; + + /** + * Rotates each group member around the given point by the given angle. + * @param point Any object with public `x` and `y` properties. + * @param angle The angle to rotate by, in radians. + */ + rotateAround(point: Phaser.Types.Math.Vector2Like, angle: number): this; + + /** + * Rotates each group member around the given point by the given angle and distance. + * @param point Any object with public `x` and `y` properties. + * @param angle The angle to rotate by, in radians. + * @param distance The distance from the point of rotation in pixels. + */ + rotateAroundDistance(point: Phaser.Types.Math.Vector2Like, angle: number, distance: number): this; + + /** + * Sets the alpha of each group member. + * @param value The amount to set the alpha to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + setAlpha(value: number, step?: number): this; + + /** + * Sets the tint of each group member. + * @param topLeft The tint being applied to top-left corner of item. If other parameters are given no value, this tint will be applied to whole item. + * @param topRight The tint to be applied to top-right corner of item. + * @param bottomLeft The tint to be applied to the bottom-left corner of item. + * @param bottomRight The tint to be applied to the bottom-right corner of item. + */ + setTint(topLeft: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets the originX, originY of each group member. + * @param originX The amount to set the `originX` property to. + * @param originY The amount to set the `originY` property to. If `undefined` or `null` it uses the `originX` value. + * @param stepX This is added to the `originX` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `originY` amount, multiplied by the iteration counter. Default 0. + */ + setOrigin(originX: number, originY?: number, stepX?: number, stepY?: number): this; + + /** + * Sets the scaleX of each group member. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + scaleX(value: number, step?: number): this; + + /** + * Sets the scaleY of each group member. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + scaleY(value: number, step?: number): this; + + /** + * Sets the scaleX, scaleY of each group member. + * @param scaleX The amount to be added to the `scaleX` property. + * @param scaleY The amount to be added to the `scaleY` property. If `undefined` or `null` it uses the `scaleX` value. + * @param stepX This is added to the `scaleX` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `scaleY` amount, multiplied by the iteration counter. Default 0. + */ + scaleXY(scaleX: number, scaleY?: number, stepX?: number, stepY?: number): this; + + /** + * Sets the depth of each group member. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + setDepth(value: number, step?: number): this; + + /** + * Sets the blendMode of each group member. + * @param value The amount to set the property to. + */ + setBlendMode(value: number): this; + + /** + * Passes all group members to the Input Manager to enable them for input with identical areas and callbacks. + * @param hitArea Either an input configuration object, or a geometric shape that defines the hit area for the Game Object. If not specified a Rectangle will be used. + * @param hitAreaCallback A callback to be invoked when the Game Object is interacted with. If you provide a shape you must also provide a callback. + */ + setHitArea(hitArea: any, hitAreaCallback: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Shuffles the group members in place. + */ + shuffle(): this; + + /** + * Deactivates a member of this group. + * @param gameObject A member of this group. + */ + kill(gameObject: Phaser.GameObjects.GameObject): void; + + /** + * Deactivates and hides a member of this group. + * @param gameObject A member of this group. + */ + killAndHide(gameObject: Phaser.GameObjects.GameObject): void; + + /** + * Sets the visible of each group member. + * @param value The value to set the property to. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + setVisible(value: boolean, index?: number, direction?: number): this; + + /** + * Toggles (flips) the visible state of each member of this group. + */ + toggleVisible(): this; + + /** + * Empties this Group of all children and removes it from the Scene. + * + * Does not call {@link Phaser.GameObjects.Group#removeCallback}. + * + * Children of this Group will _not_ be removed from the Scene by calling this method + * unless you specify the `removeFromScene` parameter. + * + * Children of this Group will also _not_ be destroyed by calling this method + * unless you specify the `destroyChildren` parameter. + * @param destroyChildren Also {@link Phaser.GameObjects.GameObject#destroy} each Group member. Default false. + * @param removeFromScene Optionally remove each Group member from the Scene. Default false. + */ + destroy(destroyChildren?: boolean, removeFromScene?: boolean): void; + + } + + /** + * An Image Game Object. + * + * An Image is a light-weight Game Object useful for the display of static images in your game, + * such as logos, backgrounds, scenery or other non-animated elements. Images can have input + * events and physics bodies, or be tweened, tinted or scrolled. The main difference between an + * Image and a Sprite is that you cannot animate an Image as they do not have the Animation component. + */ + class Image extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.TextureCrop, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number); + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Layer Game Object. + * + * A Layer is a special type of Game Object that acts as a Display List. You can add any type of Game Object + * to a Layer, just as you would to a Scene. Layers can be used to visually group together 'layers' of Game + * Objects: + * + * ```javascript + * const spaceman = this.add.sprite(150, 300, 'spaceman'); + * const bunny = this.add.sprite(400, 300, 'bunny'); + * const elephant = this.add.sprite(650, 300, 'elephant'); + * + * const layer = this.add.layer(); + * + * layer.add([ spaceman, bunny, elephant ]); + * ``` + * + * The 3 sprites in the example above will now be managed by the Layer they were added to. Therefore, + * if you then set `layer.setVisible(false)` they would all vanish from the display. + * + * You can also control the depth of the Game Objects within the Layer. For example, calling the + * `setDepth` method of a child of a Layer will allow you to adjust the depth of that child _within the + * Layer itself_, rather than the whole Scene. The Layer, too, can have its depth set as well. + * + * The Layer class also offers many different methods for manipulating the list, such as the + * methods `moveUp`, `moveDown`, `sendToBack`, `bringToTop` and so on. These allow you to change the + * display list position of the Layers children, causing it to adjust the order in which they are + * rendered. Using `setDepth` on a child allows you to override this. + * + * Layers can have Post FX Pipelines set, which allows you to easily enable a post pipeline across + * a whole range of children, which, depending on the effect, can often be far more efficient that doing so + * on a per-child basis. + * + * Layers have no position or size within the Scene. This means you cannot enable a Layer for + * physics or input, or change the position, rotation or scale of a Layer. They also have no scroll + * factor, texture, tint, origin, crop or bounds. + * + * If you need those kind of features then you should use a Container instead. Containers can be added + * to Layers, but Layers cannot be added to Containers. + * + * However, you can set the Alpha, Blend Mode, Depth, Mask and Visible state of a Layer. These settings + * will impact all children being rendered by the Layer. + */ + class Layer extends Phaser.Structs.List implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param children An optional array of Game Objects to add to this Layer. + */ + constructor(scene: Phaser.Scene, children?: Phaser.GameObjects.GameObject[]); + + /** + * A reference to the Scene to which this Game Object belongs. + * + * Game Objects can only belong to one Scene. + * + * You should consider this property as being read-only. You cannot move a + * Game Object to another Scene by simply changing it. + */ + scene: Phaser.Scene; + + /** + * Holds a reference to the Display List that contains this Game Object. + * + * This is set automatically when this Game Object is added to a Scene or Layer. + * + * You should treat this property as being read-only. + */ + displayList: Phaser.GameObjects.DisplayList | Phaser.GameObjects.Layer; + + /** + * A textual representation of this Game Object, i.e. `sprite`. + * Used internally by Phaser but is available for your own custom classes to populate. + */ + type: string; + + /** + * The current state of this Game Object. + * + * Phaser itself will never modify this value, although plugins may do so. + * + * Use this property to track the state of a Game Object during its lifetime. For example, it could change from + * a state of 'moving', to 'attacking', to 'dead'. The state value should be an integer (ideally mapped to a constant + * in your game code), or a string. These are recommended to keep it light and simple, with fast comparisons. + * If you need to store complex data about your Game Object, look at using the Data Component instead. + */ + state: number | string; + + /** + * A Layer cannot be placed inside a Container. + * + * This property is kept purely so a Layer has the same + * shape as a Game Object. + */ + parentContainer: Phaser.GameObjects.Container; + + /** + * The name of this Game Object. + * Empty by default and never populated by Phaser, this is left for developers to use. + */ + name: string; + + /** + * The active state of this Game Object. + * A Game Object with an active state of `true` is processed by the Scenes UpdateList, if added to it. + * An active object is one which is having its logic and internal systems updated. + */ + active: boolean; + + /** + * The Tab Index of the Game Object. + * Reserved for future use by plugins and the Input Manager. + */ + tabIndex: number; + + /** + * A Data Manager. + * It allows you to store, query and get key/value paired information specific to this Game Object. + * `null` by default. Automatically created if you use `getData` or `setData` or `setDataEnabled`. + */ + data: Phaser.Data.DataManager; + + /** + * The flags that are compared against `RENDER_MASK` to determine if this Game Object will render or not. + * The bits are 0001 | 0010 | 0100 | 1000 set by the components Visible, Alpha, Transform and Texture respectively. + * If those components are not used by your custom class then you can use this bitmask as you wish. + */ + renderFlags: number; + + /** + * A bitmask that controls if this Game Object is drawn by a Camera or not. + * Not usually set directly, instead call `Camera.ignore`, however you can + * set this property directly using the Camera.id property: + */ + cameraFilter: number; + + /** + * This property is kept purely so a Layer has the same + * shape as a Game Object. You cannot input enable a Layer. + */ + input: Phaser.Types.Input.InteractiveObject | null; + + /** + * This property is kept purely so a Layer has the same + * shape as a Game Object. You cannot give a Layer a physics body. + */ + body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody | MatterJS.BodyType | null; + + /** + * This Game Object will ignore all calls made to its destroy method if this flag is set to `true`. + * This includes calls that may come from a Group, Container or the Scene itself. + * While it allows you to persist a Game Object across Scenes, please understand you are entirely + * responsible for managing references to and from this Game Object. + */ + ignoreDestroy: boolean; + + /** + * A reference to the Scene Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * A reference to the Scene Event Emitter. + */ + events: Phaser.Events.EventEmitter; + + /** + * The flag the determines whether Game Objects should be sorted when `depthSort()` is called. + */ + sortChildrenFlag: boolean; + + /** + * Sets the `active` property of this Game Object and returns this Game Object for further chaining. + * A Game Object with its `active` property set to `true` will be updated by the Scenes UpdateList. + * @param value True if this Game Object should be set as active, false if not. + */ + setActive(value: boolean): this; + + /** + * Sets the `name` property of this Game Object and returns this Game Object for further chaining. + * The `name` property is not populated by Phaser and is presented for your own use. + * @param value The name to be given to this Game Object. + */ + setName(value: string): this; + + /** + * Sets the current state of this Game Object. + * + * Phaser itself will never modify the State of a Game Object, although plugins may do so. + * + * For example, a Game Object could change from a state of 'moving', to 'attacking', to 'dead'. + * The state value should typically be an integer (ideally mapped to a constant + * in your game code), but could also be a string. It is recommended to keep it light and simple. + * If you need to store complex data about your Game Object, look at using the Data Component instead. + * @param value The state of the Game Object. + */ + setState(value: number | string): this; + + /** + * Adds a Data Manager component to this Game Object. + */ + setDataEnabled(): this; + + /** + * Allows you to store a key value pair within this Game Objects Data Manager. + * + * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled + * before setting the value. + * + * If the key doesn't already exist in the Data Manager then it is created. + * + * ```javascript + * sprite.setData('name', 'Red Gem Stone'); + * ``` + * + * You can also pass in an object of key value pairs as the first argument: + * + * ```javascript + * sprite.setData({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 }); + * ``` + * + * To get a value back again you can call `getData`: + * + * ```javascript + * sprite.getData('gold'); + * ``` + * + * Or you can access the value directly via the `values` property, where it works like any other variable: + * + * ```javascript + * sprite.data.values.gold += 50; + * ``` + * + * When the value is first set, a `setdata` event is emitted from this Game Object. + * + * If the key already exists, a `changedata` event is emitted instead, along an event named after the key. + * For example, if you updated an existing key called `PlayerLives` then it would emit the event `changedata-PlayerLives`. + * These events will be emitted regardless if you use this method to set the value, or the direct `values` setter. + * + * Please note that the data keys are case-sensitive and must be valid JavaScript Object property strings. + * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager. + * @param key The key to set the value for. Or an object of key value pairs. If an object the `data` argument is ignored. + * @param data The value to set for the given key. If an object is provided as the key this argument is ignored. + */ + setData(key: string | object, data?: any): this; + + /** + * Increase a value for the given key within this Game Objects Data Manager. If the key doesn't already exist in the Data Manager then it is increased from 0. + * + * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled + * before setting the value. + * + * If the key doesn't already exist in the Data Manager then it is created. + * + * When the value is first set, a `setdata` event is emitted from this Game Object. + * @param key The key to increase the value for. + * @param data The value to increase for the given key. + */ + incData(key: string | object, data?: any): this; + + /** + * Toggle a boolean value for the given key within this Game Objects Data Manager. If the key doesn't already exist in the Data Manager then it is toggled from false. + * + * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled + * before setting the value. + * + * If the key doesn't already exist in the Data Manager then it is created. + * + * When the value is first set, a `setdata` event is emitted from this Game Object. + * @param key The key to toggle the value for. + */ + toggleData(key: string | object): this; + + /** + * Retrieves the value for the given key in this Game Objects Data Manager, or undefined if it doesn't exist. + * + * You can also access values via the `values` object. For example, if you had a key called `gold` you can do either: + * + * ```javascript + * sprite.getData('gold'); + * ``` + * + * Or access the value directly: + * + * ```javascript + * sprite.data.values.gold; + * ``` + * + * You can also pass in an array of keys, in which case an array of values will be returned: + * + * ```javascript + * sprite.getData([ 'gold', 'armor', 'health' ]); + * ``` + * + * This approach is useful for destructuring arrays in ES6. + * @param key The key of the value to retrieve, or an array of keys. + */ + getData(key: string | string[]): any; + + /** + * A Layer cannot be enabled for input. + * + * This method does nothing and is kept to ensure + * the Layer has the same shape as a Game Object. + */ + setInteractive(): this; + + /** + * A Layer cannot be enabled for input. + * + * This method does nothing and is kept to ensure + * the Layer has the same shape as a Game Object. + */ + disableInteractive(): this; + + /** + * A Layer cannot be enabled for input. + * + * This method does nothing and is kept to ensure + * the Layer has the same shape as a Game Object. + */ + removeInteractive(): this; + + /** + * This callback is invoked when this Game Object is added to a Scene. + * + * Can be overriden by custom Game Objects, but be aware of some Game Objects that + * will use this, such as Sprites, to add themselves into the Update List. + * + * You can also listen for the `ADDED_TO_SCENE` event from this Game Object. + */ + addedToScene(): void; + + /** + * This callback is invoked when this Game Object is removed from a Scene. + * + * Can be overriden by custom Game Objects, but be aware of some Game Objects that + * will use this, such as Sprites, to removed themselves from the Update List. + * + * You can also listen for the `REMOVED_FROM_SCENE` event from this Game Object. + */ + removedFromScene(): void; + + /** + * To be overridden by custom GameObjects. Allows base objects to be used in a Pool. + * @param args args + */ + update(...args: any[]): void; + + /** + * Returns a JSON representation of the Game Object. + */ + toJSON(): Phaser.Types.GameObjects.JSONGameObject; + + /** + * Compares the renderMask with the renderFlags to see if this Game Object will render or not. + * Also checks the Game Object against the given Cameras exclusion list. + * @param camera The Camera to check against this Game Object. + */ + willRender(camera: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Returns an array containing the display list index of either this Game Object, or if it has one, + * its parent Container. It then iterates up through all of the parent containers until it hits the + * root of the display list (which is index 0 in the returned array). + * + * Used internally by the InputPlugin but also useful if you wish to find out the display depth of + * this Game Object and all of its ancestors. + */ + getIndexList(): number[]; + + /** + * Force a sort of the display list on the next call to depthSort. + */ + queueDepthSort(): void; + + /** + * Immediately sorts the display list if the flag is set. + */ + depthSort(): void; + + /** + * Compare the depth of two Game Objects. + * @param childA The first Game Object. + * @param childB The second Game Object. + */ + sortByDepth(childA: Phaser.GameObjects.GameObject, childB: Phaser.GameObjects.GameObject): number; + + /** + * Returns an array which contains all Game Objects within this Layer. + * + * This is a reference to the main list array, not a copy of it, so be careful not to modify it. + */ + getChildren(): Phaser.GameObjects.GameObject[]; + + /** + * Adds this Layer to the given Display List. + * + * If no Display List is specified, it will default to the Display List owned by the Scene to which + * this Layer belongs. + * + * A Layer can only exist on one Display List at any given time, but may move freely between them. + * + * If this Layer is already on another Display List when this method is called, it will first + * be removed from it, before being added to the new list. + * + * You can query which list it is on by looking at the `Phaser.GameObjects.Layer#displayList` property. + * + * If a Layer isn't on any display list, it will not be rendered. If you just wish to temporarily + * disable it from rendering, consider using the `setVisible` method, instead. + * @param displayList The Display List to add to. Defaults to the Scene Display List. + */ + addToDisplayList(displayList?: Phaser.GameObjects.DisplayList | Phaser.GameObjects.Layer): this; + + /** + * Removes this Layer from the Display List it is currently on. + * + * A Layer can only exist on one Display List at any given time, but may move freely removed + * and added back at a later stage. + * + * You can query which list it is on by looking at the `Phaser.GameObjects.GameObject#displayList` property. + * + * If a Layer isn't on any Display List, it will not be rendered. If you just wish to temporarily + * disable it from rendering, consider using the `setVisible` method, instead. + */ + removeFromDisplayList(): this; + + /** + * Destroys this Layer removing it from the Display List and Update List and + * severing all ties to parent resources. + * + * Also destroys all children of this Layer. If you do not wish for the + * children to be destroyed, you should move them from this Layer first. + * + * Use this to remove this Layer from your game if you don't ever plan to use it again. + * As long as no reference to it exists within your own code it should become free for + * garbage collection by the browser. + * + * If you just want to temporarily disable an object then look at using the + * Game Object Pool instead of destroying it, as destroyed objects cannot be resurrected. + * @param fromScene `True` if this Game Object is being destroyed by the Scene, `false` if not. Default false. + */ + destroy(fromScene?: boolean): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A 2D Light. + * + * These are created by the {@link Phaser.GameObjects.LightsManager}, available from within a scene via `this.lights`. + * + * Any Game Objects using the Light2D pipeline will then be affected by these Lights as long as they have a normal map. + * + * They can also simply be used to represent a point light for your own purposes. + * + * Lights cannot be added to Containers. They are designed to exist in the root of a Scene. + */ + class Light extends Phaser.Geom.Circle implements Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Visible { + /** + * + * @param x The horizontal position of the light. + * @param y The vertical position of the light. + * @param radius The radius of the light. + * @param r The red color of the light. A value between 0 and 1. + * @param g The green color of the light. A value between 0 and 1. + * @param b The blue color of the light. A value between 0 and 1. + * @param intensity The intensity of the light. + */ + constructor(x: number, y: number, radius: number, r: number, g: number, b: number, intensity: number); + + /** + * The color of the light. + */ + color: Phaser.Display.RGB; + + /** + * The intensity of the light. + */ + intensity: number; + + /** + * The flags that are compared against `RENDER_MASK` to determine if this Game Object will render or not. + * The bits are 0001 | 0010 | 0100 | 1000 set by the components Visible, Alpha, Transform and Texture respectively. + * If those components are not used by your custom class then you can use this bitmask as you wish. + */ + renderFlags: number; + + /** + * A bitmask that controls if this Game Object is drawn by a Camera or not. + * Not usually set directly, instead call `Camera.ignore`, however you can + * set this property directly using the Camera.id property: + */ + cameraFilter: number; + + /** + * The width of this Light Game Object. This is the same as `Light.diameter`. + */ + displayWidth: number; + + /** + * The height of this Light Game Object. This is the same as `Light.diameter`. + */ + displayHeight: number; + + /** + * The width of this Light Game Object. This is the same as `Light.diameter`. + */ + width: number; + + /** + * The height of this Light Game Object. This is the same as `Light.diameter`. + */ + height: number; + + /** + * Compares the renderMask with the renderFlags to see if this Game Object will render or not. + * Also checks the Game Object against the given Cameras exclusion list. + * @param camera The Camera to check against this Game Object. + */ + willRender(camera: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Set the color of the light from a single integer RGB value. + * @param rgb The integer RGB color of the light. + */ + setColor(rgb: number): this; + + /** + * Set the intensity of the light. + * @param intensity The intensity of the light. + */ + setIntensity(intensity: number): this; + + /** + * Set the radius of the light. + * @param radius The radius of the light. + */ + setRadius(radius: number): this; + + /** + * The bitmask that `GameObject.renderFlags` is compared against to determine if the Game Object will render or not. + */ + static readonly RENDER_MASK: number; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * Manages Lights for a Scene. + * + * Affects the rendering of Game Objects using the `Light2D` pipeline. + */ + class LightsManager { + /** + * The Lights in the Scene. + */ + lights: Phaser.GameObjects.Light[]; + + /** + * The ambient color. + */ + ambientColor: Phaser.Display.RGB; + + /** + * Whether the Lights Manager is enabled. + */ + active: boolean; + + /** + * The maximum number of lights that a single Camera and the lights shader can process. + * Change this via the `maxLights` property in your game config, as it cannot be changed at runtime. + */ + readonly maxLights: number; + + /** + * The number of lights that the LightPipeline processed in the _previous_ frame. + */ + readonly visibleLights: number; + + /** + * Creates a new Point Light Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Point Light Game Object has been built into Phaser. + * + * The Point Light Game Object provides a way to add a point light effect into your game, + * without the expensive shader processing requirements of the traditional Light Game Object. + * + * The difference is that the Point Light renders using a custom shader, designed to give the + * impression of a point light source, of variable radius, intensity and color, in your game. + * However, unlike the Light Game Object, it does not impact any other Game Objects, or use their + * normal maps for calcuations. This makes them extremely fast to render compared to Lights + * and perfect for special effects, such as flickering torches or muzzle flashes. + * + * For maximum performance you should batch Point Light Game Objects together. This means + * ensuring they follow each other consecutively on the display list. Ideally, use a Layer + * Game Object and then add just Point Lights to it, so that it can batch together the rendering + * of the lights. You don't _have_ to do this, and if you've only a handful of Point Lights in + * your game then it's perfectly safe to mix them into the dislay list as normal. However, if + * you're using a large number of them, please consider how they are mixed into the display list. + * + * The renderer will automatically cull Point Lights. Those with a radius that does not intersect + * with the Camera will be skipped in the rendering list. This happens automatically and the + * culled state is refreshed every frame, for every camera. + * + * The origin of a Point Light is always 0.5 and it cannot be changed. + * + * Point Lights are a WebGL only feature and do not have a Canvas counterpart. + * @param x The horizontal position of this Point Light in the world. + * @param y The vertical position of this Point Light in the world. + * @param color The color of the Point Light, given as a hex value. Default 0xffffff. + * @param radius The radius of the Point Light. Default 128. + * @param intensity The intensity, or color blend, of the Point Light. Default 1. + * @param attenuation The attenuation of the Point Light. This is the reduction of light from the center point. Default 0.1. + */ + addPointLight(x: number, y: number, color?: number, radius?: number, intensity?: number, attenuation?: number): Phaser.GameObjects.PointLight; + + /** + * Enable the Lights Manager. + */ + enable(): this; + + /** + * Disable the Lights Manager. + */ + disable(): this; + + /** + * Get all lights that can be seen by the given Camera. + * + * It will automatically cull lights that are outside the world view of the Camera. + * + * If more lights are returned than supported by the pipeline, the lights are then culled + * based on the distance from the center of the camera. Only those closest are rendered. + * @param camera The Camera to cull Lights for. + */ + getLights(camera: Phaser.Cameras.Scene2D.Camera): Phaser.GameObjects.Light[]; + + /** + * Set the ambient light color. + * @param rgb The integer RGB color of the ambient light. + */ + setAmbientColor(rgb: number): this; + + /** + * Returns the maximum number of Lights allowed to appear at once. + */ + getMaxVisibleLights(): number; + + /** + * Get the number of Lights managed by this Lights Manager. + */ + getLightCount(): number; + + /** + * Add a Light. + * @param x The horizontal position of the Light. Default 0. + * @param y The vertical position of the Light. Default 0. + * @param radius The radius of the Light. Default 128. + * @param rgb The integer RGB color of the light. Default 0xffffff. + * @param intensity The intensity of the Light. Default 1. + */ + addLight(x?: number, y?: number, radius?: number, rgb?: number, intensity?: number): Phaser.GameObjects.Light; + + /** + * Remove a Light. + * @param light The Light to remove. + */ + removeLight(light: Phaser.GameObjects.Light): this; + + /** + * Shut down the Lights Manager. + * + * Recycles all active Lights into the Light pool, resets ambient light color and clears the lists of Lights and + * culled Lights. + */ + shutdown(): void; + + /** + * Destroy the Lights Manager. + * + * Cleans up all references by calling {@link Phaser.GameObjects.LightsManager#shutdown}. + */ + destroy(): void; + + } + + /** + * A Scene plugin that provides a {@link Phaser.GameObjects.LightsManager} for the Light2D pipeline. + * + * Available from within a Scene via `this.lights`. + * + * Add Lights using the {@link Phaser.GameObjects.LightsManager#addLight} method: + * + * ```javascript + * // Enable the Lights Manager because it is disabled by default + * this.lights.enable(); + * + * // Create a Light at [400, 300] with a radius of 200 + * this.lights.addLight(400, 300, 200); + * ``` + * + * For Game Objects to be affected by the Lights when rendered, you will need to set them to use the `Light2D` pipeline like so: + * + * ```javascript + * sprite.setPipeline('Light2D'); + * ``` + * + * Note that you cannot use this pipeline on Graphics Game Objects or Shape Game Objects. + */ + class LightsPlugin extends Phaser.GameObjects.LightsManager { + /** + * + * @param scene The Scene that this Lights Plugin belongs to. + */ + constructor(scene: Phaser.Scene); + + /** + * A reference to the Scene that this Lights Plugin belongs to. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene's systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * Boot the Lights Plugin. + */ + boot(): void; + + /** + * Destroy the Lights Plugin. + * + * Cleans up all references. + */ + destroy(): void; + + } + + /** + * A Mesh Game Object. + * + * The Mesh Game Object allows you to render a group of textured vertices and manipulate + * the view of those vertices, such as rotation, translation or scaling. + * + * Support for generating mesh data from grids, model data or Wavefront OBJ Files is included. + * + * Although you can use this to render 3D objects, its primary use is for displaying more complex + * Sprites, or Sprites where you need fine-grained control over the vertex positions in order to + * achieve special effects in your games. Note that rendering still takes place using Phaser's + * orthographic camera (after being transformed via `projectionMesh`, see `setPerspective`, + * `setOrtho`, and `panZ` methods). As a result, all depth and face tests are done in an eventually + * orthographic space. + * + * The rendering process will iterate through the faces of this Mesh and render out each face + * that is considered as being in view of the camera. No depth buffer is used, and because of this, + * you should be careful not to use model data with too many vertices, or overlapping geometry, + * or you'll probably encounter z-depth fighting. The Mesh was designed to allow for more advanced + * 2D layouts, rather than displaying 3D objects, even though it can do this to a degree. + * + * In short, if you want to remake Crysis, use a 3D engine, not a Mesh. However, if you want + * to easily add some small fun 3D elements into your game, or create some special effects involving + * vertex warping, this is the right object for you. Mesh data becomes part of the WebGL batch, + * just like standard Sprites, so doesn't introduce any additional shader overhead. Because + * the Mesh just generates vertices into the WebGL batch, like any other Sprite, you can use all of + * the common Game Object components on a Mesh too, such as a custom pipeline, mask, blend mode + * or texture. + * + * Note that the Mesh object is WebGL only and does not have a Canvas counterpart. + * + * The Mesh origin is always 0.5 x 0.5 and cannot be changed. + */ + class Mesh extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param vertices The vertices array. Either `xy` pairs, or `xyz` if the `containsZ` parameter is `true` (but see note). + * @param uvs The UVs pairs array. + * @param indicies Optional vertex indicies array. If you don't have one, pass `null` or an empty array. + * @param containsZ Does the vertices data include a `z` component? Note: If not, it will be assumed `z=0`, see method `panZ` or `setOrtho`. Default false. + * @param normals Optional vertex normals array. If you don't have one, pass `null` or an empty array. + * @param colors An array of colors, one per vertex, or a single color value applied to all vertices. Default 0xffffff. + * @param alphas An array of alpha values, one per vertex, or a single alpha value applied to all vertices. Default 1. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number, vertices?: number[], uvs?: number[], indicies?: number[], containsZ?: boolean, normals?: number[], colors?: number | number[], alphas?: number | number[]); + + /** + * An array containing the Face instances belonging to this Mesh. + * + * A Face consists of 3 Vertex objects. + * + * This array is populated during calls such as `addVertices` or `addOBJ`. + */ + faces: Phaser.Geom.Mesh.Face[]; + + /** + * An array containing Vertex instances. One instance per vertex in this Mesh. + * + * This array is populated during calls such as `addVertex` or `addOBJ`. + */ + vertices: Phaser.Geom.Mesh.Vertex[]; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertex colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * You can optionally choose to render the vertices of this Mesh to a Graphics instance. + * + * Achieve this by setting the `debugCallback` and the `debugGraphic` properties. + * + * You can do this in a single call via the `Mesh.setDebug` method, which will use the + * built-in debug function. You can also set it to your own callback. The callback + * will be invoked _once per render_ and sent the following parameters: + * + * `debugCallback(src, meshLength, verts)` + * + * `src` is the Mesh instance being debugged. + * `meshLength` is the number of mesh vertices in total. + * `verts` is an array of the translated vertex coordinates. + * + * To disable rendering, set this property back to `null`. + * + * Please note that high vertex count Meshes will struggle to debug properly. + */ + debugCallback: Function; + + /** + * The Graphics instance that the debug vertices will be drawn to, if `setDebug` has + * been called. + */ + debugGraphic: Phaser.GameObjects.Graphics; + + /** + * When rendering, skip any Face that isn't counter clockwise? + * + * Enable this to hide backward-facing Faces during rendering. + * + * Disable it to render all Faces. + */ + hideCCW: boolean; + + /** + * A Vector3 containing the 3D position of the vertices in this Mesh. + * + * Modifying the components of this property will allow you to reposition where + * the vertices are rendered within the Mesh. This happens in the `preUpdate` phase, + * where each vertex is transformed using the view and projection matrices. + * + * Changing this property will impact all vertices being rendered by this Mesh. + * + * You can also adjust the 'view' by using the `pan` methods. + */ + modelPosition: Phaser.Math.Vector3; + + /** + * A Vector3 containing the 3D scale of the vertices in this Mesh. + * + * Modifying the components of this property will allow you to scale + * the vertices within the Mesh. This happens in the `preUpdate` phase, + * where each vertex is transformed using the view and projection matrices. + * + * Changing this property will impact all vertices being rendered by this Mesh. + */ + modelScale: Phaser.Math.Vector3; + + /** + * A Vector3 containing the 3D rotation of the vertices in this Mesh. + * + * The values should be given in radians, i.e. to rotate the vertices by 90 + * degrees you can use `modelRotation.x = Phaser.Math.DegToRad(90)`. + * + * Modifying the components of this property will allow you to rotate + * the vertices within the Mesh. This happens in the `preUpdate` phase, + * where each vertex is transformed using the view and projection matrices. + * + * Changing this property will impact all vertices being rendered by this Mesh. + */ + modelRotation: Phaser.Math.Vector3; + + /** + * The transformation matrix for this Mesh. + */ + transformMatrix: Phaser.Math.Matrix4; + + /** + * The view position for this Mesh. + * + * Use the methods`panX`, `panY` and `panZ` to adjust the view. + */ + viewPosition: Phaser.Math.Vector3; + + /** + * The view matrix for this Mesh. + */ + viewMatrix: Phaser.Math.Matrix4; + + /** + * The projection matrix for this Mesh. + * + * Update it with the `setPerspective` or `setOrtho` methods. + */ + projectionMatrix: Phaser.Math.Matrix4; + + /** + * How many faces were rendered by this Mesh Game Object in the last + * draw? This is reset in the `preUpdate` method and then incremented + * each time a face is drawn. Note that in multi-camera Scenes this + * value may exceed that found in `Mesh.getFaceCount` due to + * cameras drawing the same faces more than once. + */ + readonly totalRendered: number; + + /** + * By default, the Mesh will check to see if its model or view transform has + * changed each frame and only recalculate the vertex positions if they have. + * + * This avoids lots of additional math in the `preUpdate` step when not required. + * + * However, if you are performing per-Face or per-Vertex manipulation on this Mesh, + * such as tweening a Face, or moving it without moving the rest of the Mesh, + * then you may need to disable the dirty cache in order for the Mesh to re-render + * correctly. You can toggle this property to do that. Please note that leaving + * this set to `true` will cause the Mesh to recalculate the position of every single + * vertex in it, every single frame. So only really do this if you know you + * need it. + */ + ignoreDirtyCache: boolean; + + /** + * The Camera fov (field of view) in degrees. + * + * This is set automatically as part of the `Mesh.setPerspective` call, but exposed + * here for additional math. + * + * Do not modify this property directly, doing so will not change the fov. For that, + * call the respective Mesh methods. + */ + readonly fov: number; + + /** + * Translates the view position of this Mesh on the x axis by the given amount. + * @param v The amount to pan by. + */ + panX(v: number): void; + + /** + * Translates the view position of this Mesh on the y axis by the given amount. + * @param v The amount to pan by. + */ + panY(v: number): void; + + /** + * Translates the view position of this Mesh on the z axis by the given amount. + * + * As the default `panZ` value is 0, vertices with `z=0` (the default) need special + * care or else they will not display as they are "behind" the camera. + * + * Consider using `mesh.panZ(mesh.height / (2 * Math.tan(Math.PI / 16)))`, + * which will interpret vertex geometry 1:1 with pixel geometry (or see `setOrtho`). + * @param v The amount to pan by. + */ + panZ(v: number): void; + + /** + * Builds a new perspective projection matrix from the given values. + * + * These are also the initial projection matrix and parameters for `Mesh` (see `Mesh.panZ` for more discussion). + * + * See also `setOrtho`. + * @param width The width of the projection matrix. Typically the same as the Mesh and/or Renderer. + * @param height The height of the projection matrix. Typically the same as the Mesh and/or Renderer. + * @param fov The field of view, in degrees. Default 45. + * @param near The near value of the view. Default 0.01. + * @param far The far value of the view. Default 1000. + */ + setPerspective(width: number, height: number, fov?: number, near?: number, far?: number): void; + + /** + * Builds a new orthographic projection matrix from the given values. + * + * If using this mode you will often need to set `Mesh.hideCCW` to `false` as well. + * + * By default, calling this method with no parameters will set the scaleX value to + * match the renderer's aspect ratio. If you would like to render vertex positions 1:1 + * to pixel positions, consider calling as `mesh.setOrtho(mesh.width, mesh.height)`. + * + * See also `setPerspective`. + * @param scaleX The default horizontal scale in relation to the Mesh / Renderer dimensions. Default 1. + * @param scaleY The default vertical scale in relation to the Mesh / Renderer dimensions. Default 1. + * @param near The near value of the view. Default -1000. + * @param far The far value of the view. Default 1000. + */ + setOrtho(scaleX?: number, scaleY?: number, near?: number, far?: number): void; + + /** + * Iterates and destroys all current Faces in this Mesh, then resets the + * `faces` and `vertices` arrays. + */ + clear(): this; + + /** + * This method will add the data from a triangulated Wavefront OBJ model file to this Mesh. + * + * The data should have been loaded via the OBJFile: + * + * ```javascript + * this.load.obj(key, url); + * ``` + * + * Then use the same `key` as the first parameter to this method. + * + * Multiple Mesh Game Objects can use the same model data without impacting on each other. + * + * Make sure your 3D package has triangulated the model data prior to exporting it. + * + * You can add multiple models to a single Mesh, although they will act as one when + * moved or rotated. You can scale the model data, should it be too small, or too large, to see. + * You can also offset the vertices of the model via the `x`, `y` and `z` parameters. + * @param key The key of the model data in the OBJ Cache to add to this Mesh. + * @param scale An amount to scale the model data by. Use this if the model has exported too small, or large, to see. Default 1. + * @param x Translate the model x position by this amount. Default 0. + * @param y Translate the model y position by this amount. Default 0. + * @param z Translate the model z position by this amount. Default 0. + * @param rotateX Rotate the model on the x axis by this amount, in radians. Default 0. + * @param rotateY Rotate the model on the y axis by this amount, in radians. Default 0. + * @param rotateZ Rotate the model on the z axis by this amount, in radians. Default 0. + * @param zIsUp Is the z axis up (true), or is y axis up (false)? Default true. + */ + addVerticesFromObj(key: string, scale?: number, x?: number, y?: number, z?: number, rotateX?: number, rotateY?: number, rotateZ?: number, zIsUp?: boolean): this; + + /** + * Compare the depth of two Faces. + * @param faceA The first Face. + * @param faceB The second Face. + */ + sortByDepth(faceA: Phaser.Geom.Mesh.Face, faceB: Phaser.Geom.Mesh.Face): number; + + /** + * Runs a depth sort across all Faces in this Mesh, comparing their averaged depth. + * + * This is called automatically if you use any of the `rotate` methods, but you can + * also invoke it to sort the Faces should you manually position them. + */ + depthSort(): this; + + /** + * Adds a new Vertex into the vertices array of this Mesh. + * + * Just adding a vertex isn't enough to render it. You need to also + * make it part of a Face, with 3 Vertex instances per Face. + * @param x The x position of the vertex. + * @param y The y position of the vertex. + * @param z The z position of the vertex. + * @param u The UV u coordinate of the vertex. + * @param v The UV v coordinate of the vertex. + * @param color The color value of the vertex. Default 0xffffff. + * @param alpha The alpha value of the vertex. Default 1. + */ + addVertex(x: number, y: number, z: number, u: number, v: number, color?: number, alpha?: number): this; + + /** + * Adds a new Face into the faces array of this Mesh. + * + * A Face consists of references to 3 Vertex instances, which must be provided. + * @param vertex1 The first vertex of the Face. + * @param vertex2 The second vertex of the Face. + * @param vertex3 The third vertex of the Face. + */ + addFace(vertex1: Phaser.Geom.Mesh.Vertex, vertex2: Phaser.Geom.Mesh.Vertex, vertex3: Phaser.Geom.Mesh.Vertex): this; + + /** + * Adds new vertices to this Mesh by parsing the given data. + * + * This method will take vertex data in one of two formats, based on the `containsZ` parameter. + * + * If your vertex data are `x`, `y` pairs, then `containsZ` should be `false` (this is the default, and will result in `z=0` for each vertex). + * + * If your vertex data is groups of `x`, `y` and `z` values, then the `containsZ` parameter must be true. + * + * The `uvs` parameter is a numeric array consisting of `u` and `v` pairs. + * + * The `normals` parameter is a numeric array consisting of `x`, `y` vertex normal values and, if `containsZ` is true, `z` values as well. + * + * The `indicies` parameter is an optional array that, if given, is an indexed list of vertices to be added. + * + * The `colors` parameter is an optional array, or single value, that if given sets the color of each vertex created. + * + * The `alphas` parameter is an optional array, or single value, that if given sets the alpha of each vertex created. + * + * When providing indexed data it is assumed that _all_ of the arrays are indexed, not just the vertices. + * + * The following example will create a 256 x 256 sized quad using an index array: + * + * ```javascript + * let mesh = new Mesh(this); // Assuming `this` is a scene! + * const vertices = [ + * -128, 128, + * 128, 128, + * -128, -128, + * 128, -128 + * ]; + * + * const uvs = [ + * 0, 1, + * 1, 1, + * 0, 0, + * 1, 0 + * ]; + * + * const indices = [ 0, 2, 1, 2, 3, 1 ]; + * + * mesh.addVertices(vertices, uvs, indicies); + * // Note: Otherwise the added points will be "behind" the camera! This value will project vertex `x` & `y` values 1:1 to pixel values. + * mesh.hideCCW = false; + * mesh.setOrtho(mesh.width, mesh.height); + * ``` + * + * If the data is not indexed, it's assumed that the arrays all contain sequential data. + * @param vertices The vertices array. Either `xy` pairs, or `xyz` if the `containsZ` parameter is `true`. + * @param uvs The UVs pairs array. + * @param indicies Optional vertex indicies array. If you don't have one, pass `null` or an empty array. + * @param containsZ Does the vertices data include a `z` component? If not, it will be assumed `z=0`, see methods `panZ` or `setOrtho`. Default false. + * @param normals Optional vertex normals array. If you don't have one, pass `null` or an empty array. + * @param colors An array of colors, one per vertex, or a single color value applied to all vertices. Default 0xffffff. + * @param alphas An array of alpha values, one per vertex, or a single alpha value applied to all vertices. Default 1. + */ + addVertices(vertices: number[], uvs: number[], indicies?: number[], containsZ?: boolean, normals?: number[], colors?: number | number[], alphas?: number | number[]): this; + + /** + * Returns the total number of Faces in this Mesh Game Object. + */ + getFaceCount(): number; + + /** + * Returns the total number of Vertices in this Mesh Game Object. + */ + getVertexCount(): number; + + /** + * Returns the Face at the given index in this Mesh Game Object. + * @param index The index of the Face to get. + */ + getFace(index: number): Phaser.Geom.Mesh.Face; + + /** + * Tests to see if _any_ face in this Mesh intersects with the given coordinates. + * + * The given position is translated through the matrix of this Mesh and the given Camera, + * before being compared against the vertices. + * @param x The x position to check against. + * @param y The y position to check against. + * @param camera The camera to pass the coordinates through. If not give, the default Scene Camera is used. + */ + hasFaceAt(x: number, y: number, camera?: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Return an array of Face objects from this Mesh that intersect with the given coordinates. + * + * The given position is translated through the matrix of this Mesh and the given Camera, + * before being compared against the vertices. + * + * If more than one Face intersects, they will all be returned in the array, but the array will + * be depth sorted first, so the first element will always be that closest to the camera. + * @param x The x position to check against. + * @param y The y position to check against. + * @param camera The camera to pass the coordinates through. If not give, the default Scene Camera is used. + */ + getFaceAt(x: number, y: number, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Geom.Mesh.Face[]; + + /** + * This method enables rendering of the Mesh vertices to the given Graphics instance. + * + * If you enable this feature, you **must** call `Graphics.clear()` in your Scene `update`, + * otherwise the Graphics instance you provide to debug will fill-up with draw calls, + * eventually crashing the browser. This is not done automatically to allow you to debug + * draw multiple Mesh objects to a single Graphics instance. + * + * The Mesh class has a built-in debug rendering callback `Mesh.renderDebug`, however + * you can also provide your own callback to be used instead. Do this by setting the `callback` parameter. + * + * The callback is invoked _once per render_ and sent the following parameters: + * + * `callback(src, faces)` + * + * `src` is the Mesh instance being debugged. + * `faces` is an array of the Faces that were rendered. + * + * You can get the final drawn vertex position from a Face object like this: + * + * ```javascript + * let face = faces[i]; + * + * let x0 = face.vertex1.tx; + * let y0 = face.vertex1.ty; + * let x1 = face.vertex2.tx; + * let y1 = face.vertex2.ty; + * let x2 = face.vertex3.tx; + * let y2 = face.vertex3.ty; + * + * graphic.strokeTriangle(x0, y0, x1, y1, x2, y2); + * ``` + * + * If using your own callback you do not have to provide a Graphics instance to this method. + * + * To disable debug rendering, to either your own callback or the built-in one, call this method + * with no arguments. + * @param graphic The Graphic instance to render to if using the built-in callback. + * @param callback The callback to invoke during debug render. Leave as undefined to use the built-in callback. + */ + setDebug(graphic?: Phaser.GameObjects.Graphics, callback?: Function): this; + + /** + * Checks if the transformation data in this mesh is dirty. + * + * This is used internally by the `preUpdate` step to determine if the vertices should + * be recalculated or not. + */ + isDirty(): boolean; + + /** + * The Mesh update loop. The following takes place in this method: + * + * First, the `totalRendered` and `totalFrame` properties are set. + * + * If the view matrix of this Mesh isn't dirty, and the model position, rotate or scale properties are + * all clean, then the method returns at this point. + * + * Otherwise, if the viewPosition is dirty (i.e. from calling a method like `panZ`), then it will + * refresh the viewMatrix. + * + * After this, a new transformMatrix is built and it then iterates through all Faces in this + * Mesh, calling `transformCoordinatesLocal` on all of them. Internally, this updates every + * vertex, calculating its new transformed position, based on the new transform matrix. + * + * Finally, the faces are depth sorted. + * @param time The current timestamp. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected preUpdate(time: number, delta: number): void; + + /** + * The built-in Mesh debug rendering method. + * + * See `Mesh.setDebug` for more details. + * @param src The Mesh object being rendered. + * @param faces An array of Faces. + */ + renderDebug(src: Phaser.GameObjects.Mesh, faces: Phaser.Geom.Mesh.Face[]): void; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff on all vertices, + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Pass this Mesh Game Object to the Input Manager to enable it for Input. + * + * Unlike other Game Objects, the Mesh Game Object uses its own special hit area callback, which you cannot override. + * @param config An input configuration object but it will ignore hitArea, hitAreaCallback and pixelPerfect with associated alphaTolerance properties. + */ + setInteractive(config?: Phaser.Types.Input.InputConfiguration): this; + + /** + * Sets an additive tint on all vertices of this Mesh Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. + * + * To remove a tint call `clearTint`. + * @param tint The tint being applied to all vertices of this Mesh Game Object. Default 0xffffff. + */ + setTint(tint?: number): this; + + /** + * Scrolls the UV texture coordinates of all faces in this Mesh by + * adding the given x/y amounts to them. + * + * If you only wish to scroll one coordinate, pass a value of zero + * to the other. + * + * Use small values for scrolling. UVs are set from the range 0 + * to 1, so you should increment (or decrement) them by suitably + * small values, such as 0.01. + * + * Due to a limitation in WebGL1 you can only UV scroll textures + * that are a power-of-two in size. Scrolling NPOT textures will + * work but will result in clamping the pixels to the edges. + * + * Note that if this Mesh is using a _frame_ from a texture atlas + * then you will be unable to UV scroll its texture. + * @param x The amount to horizontally shift the UV coordinates by. + * @param y The amount to vertically shift the UV coordinates by. + */ + uvScroll(x: number, y: number): this; + + /** + * Scales the UV texture coordinates of all faces in this Mesh by + * the exact given amounts. + * + * If you only wish to scale one coordinate, pass a value of one + * to the other. + * + * Due to a limitation in WebGL1 you can only UV scale textures + * that are a power-of-two in size. Scaling NPOT textures will + * work but will result in clamping the pixels to the edges if + * you scale beyond a value of 1. Scaling below 1 will work + * regardless of texture size. + * + * Note that if this Mesh is using a _frame_ from a texture atlas + * then you will be unable to UV scale its texture. + * @param x The amount to horizontally scale the UV coordinates by. + * @param y The amount to vertically scale the UV coordinates by. + */ + uvScale(x: number, y: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * This property is a setter-only. + */ + tint(): number; + + /** + * The x rotation of the Model in 3D space, as specified in degrees. + * + * If you need the value in radians use the `modelRotation.x` property directly. + */ + rotateX(): number; + + /** + * The y rotation of the Model in 3D space, as specified in degrees. + * + * If you need the value in radians use the `modelRotation.y` property directly. + */ + rotateY(): number; + + /** + * The z rotation of the Model in 3D space, as specified in degrees. + * + * If you need the value in radians use the `modelRotation.z` property directly. + */ + rotateZ(): number; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Nine Slice Game Object allows you to display a texture-based object that + * can be stretched both horizontally and vertically, but that retains + * fixed-sized corners. The dimensions of the corners are set via the + * parameters to this class. + * + * This is extremely useful for UI and button like elements, where you need + * them to expand to accommodate the content without distorting the texture. + * + * The texture you provide for this Game Object should be based on the + * following layout structure: + * + * ``` + * A B + * +---+----------------------+---+ + * C | 1 | 2 | 3 | + * +---+----------------------+---+ + * | | | | + * | 4 | 5 | 6 | + * | | | | + * +---+----------------------+---+ + * D | 7 | 8 | 9 | + * +---+----------------------+---+ + * ``` + * + * When changing this objects width and / or height: + * + * areas 1, 3, 7 and 9 (the corners) will remain unscaled + * areas 2 and 8 will be stretched horizontally only + * areas 4 and 6 will be stretched vertically only + * area 5 will be stretched both horizontally and vertically + * + * You can also create a 3 slice Game Object: + * + * This works in a similar way, except you can only stretch it horizontally. + * Therefore, it requires less configuration: + * + * ``` + * A B + * +---+----------------------+---+ + * | | | | + * C | 1 | 2 | 3 | + * | | | | + * +---+----------------------+---+ + * ``` + * + * When changing this objects width (you cannot change its height) + * + * areas 1 and 3 will remain unscaled + * area 2 will be stretched horizontally + * + * The above configuration concept is adapted from the Pixi NineSlicePlane. + * + * To specify a 3 slice object instead of a 9 slice you should only + * provide the `leftWidth` and `rightWidth` parameters. To create a 9 slice + * you must supply all parameters. + * + * The _minimum_ width this Game Object can be is the total of + * `leftWidth` + `rightWidth`. The _minimum_ height this Game Object + * can be is the total of `topHeight` + `bottomHeight`. + * If you need to display this object at a smaller size, you can scale it. + * + * In terms of performance, using a 3 slice Game Object is the equivalent of + * having 3 Sprites in a row. Using a 9 slice Game Object is the equivalent + * of having 9 Sprites in a row. The vertices of this object are all batched + * together and can co-exist with other Sprites and graphics on the display + * list, without incurring any additional overhead. + * + * As of Phaser 3.60 this Game Object is WebGL only. + * + * As of Phaser 3.70 this Game Object can now populate its values automatically + * if they have been set within Texture Packer 7.1.0 or above and exported with + * the atlas json. If this is the case, you can just call this method without + * specifying anything more than the texture key and frame and it will pull the + * area data from the atlas. + */ + class NineSlice extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of the center of this Game Object in the world. + * @param y The vertical position of the center of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param width The width of the Nine Slice Game Object. You can adjust the width post-creation. Default 256. + * @param height The height of the Nine Slice Game Object. If this is a 3 slice object the height will be fixed to the height of the texture and cannot be changed. Default 256. + * @param leftWidth The size of the left vertical column (A). Default 10. + * @param rightWidth The size of the right vertical column (B). Default 10. + * @param topHeight The size of the top horizontal row (C). Set to zero or undefined to create a 3 slice object. Default 0. + * @param bottomHeight The size of the bottom horizontal row (D). Set to zero or undefined to create a 3 slice object. Default 0. + */ + constructor(scene: Phaser.Scene, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, width?: number, height?: number, leftWidth?: number, rightWidth?: number, topHeight?: number, bottomHeight?: number); + + /** + * An array of Vertex objects that correspond to the quads that make-up + * this Nine Slice Game Object. They are stored in the following order: + * + * Top Left - Indexes 0 - 5 + * Top Center - Indexes 6 - 11 + * Top Right - Indexes 12 - 17 + * Center Left - Indexes 18 - 23 + * Center - Indexes 24 - 29 + * Center Right - Indexes 30 - 35 + * Bottom Left - Indexes 36 - 41 + * Bottom Center - Indexes 42 - 47 + * Bottom Right - Indexes 48 - 53 + * + * Each quad is represented by 6 Vertex instances. + * + * This array will contain 18 elements for a 3 slice object + * and 54 for a nine slice object. + * + * You should never modify this array once it has been populated. + */ + vertices: Phaser.Geom.Mesh.Vertex[]; + + /** + * The size of the left vertical bar (A). + */ + readonly leftWidth: number; + + /** + * The size of the right vertical bar (B). + */ + readonly rightWidth: number; + + /** + * The size of the top horizontal bar (C). + * + * If this is a 3 slice object this property will be set to the + * height of the texture being used. + */ + readonly topHeight: number; + + /** + * The size of the bottom horizontal bar (D). + * + * If this is a 3 slice object this property will be set to zero. + */ + readonly bottomHeight: number; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tint: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * This property is `true` if this Nine Slice Game Object was configured + * with just `leftWidth` and `rightWidth` values, making it a 3-slice + * instead of a 9-slice object. + */ + is3Slice: boolean; + + /** + * Resets the width, height and slices for this NineSlice Game Object. + * + * This allows you to modify the texture being used by this object and then reset the slice configuration, + * to avoid having to destroy this Game Object in order to use it for a different game element. + * + * Please note that you cannot change a 9-slice to a 3-slice or vice versa. + * @param width The width of the Nine Slice Game Object. You can adjust the width post-creation. Default 256. + * @param height The height of the Nine Slice Game Object. If this is a 3 slice object the height will be fixed to the height of the texture and cannot be changed. Default 256. + * @param leftWidth The size of the left vertical column (A). Default 10. + * @param rightWidth The size of the right vertical column (B). Default 10. + * @param topHeight The size of the top horizontal row (C). Set to zero or undefined to create a 3 slice object. Default 0. + * @param bottomHeight The size of the bottom horizontal row (D). Set to zero or undefined to create a 3 slice object. Default 0. + * @param skipScale9 If this Nine Slice was created from Texture Packer scale9 atlas data, set this property to use the given column sizes instead of those specified in the JSON. Default false. + */ + setSlices(width?: number, height?: number, leftWidth?: number, rightWidth?: number, topHeight?: number, bottomHeight?: number, skipScale9?: boolean): this; + + /** + * Updates all of the vertice UV coordinates. This is called automatically + * when the NineSlice Game Object is created, or if the texture frame changes. + * + * Unlike with the `updateVertice` method, you do not need to call this + * method if the Nine Slice changes size. Only if it changes texture frame. + */ + updateUVs(): void; + + /** + * Recalculates all of the vertices in this Nine Slice Game Object + * based on the `leftWidth`, `rightWidth`, `topHeight` and `bottomHeight` + * properties, combined with the Game Object size. + * + * This method is called automatically when this object is created + * or if it's origin is changed. + * + * You should not typically need to call this method directly, but it + * is left public should you find a need to modify one of those properties + * after creation. + */ + updateVertices(): void; + + /** + * Internally updates the position coordinates across all vertices of the + * given quad offset. + * + * You should not typically need to call this method directly, but it + * is left public should an extended class require it. + * @param offset The offset in the vertices array of the quad to update. + * @param x1 The top-left quad coordinate. + * @param y1 The top-left quad coordinate. + * @param x2 The bottom-right quad coordinate. + * @param y2 The bottom-right quad coordinate. + */ + updateQuad(offset: number, x1: number, y1: number, x2: number, y2: number): void; + + /** + * Internally updates the UV coordinates across all vertices of the + * given quad offset, based on the frame size. + * + * You should not typically need to call this method directly, but it + * is left public should an extended class require it. + * @param offset The offset in the vertices array of the quad to update. + * @param u1 The top-left UV coordinate. + * @param v1 The top-left UV coordinate. + * @param u2 The bottom-right UV coordinate. + * @param v2 The bottom-right UV coordinate. + */ + updateQuadUVs(offset: number, u1: number, v1: number, u2: number, v2: number): void; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property. + * + * To remove a tint call `clearTint`, or call this method with no parameters. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param color The tint being applied to the entire Game Object. Default 0xffffff. + */ + setTint(color?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. The whole Game Object will be rendered in the given color. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property. + * + * To remove a tint call `clearTint`, or call this method with no parameters. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param color The tint being applied to the entire Game Object. Default 0xffffff. + */ + setTintFill(color?: number): this; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the tint property is set to a value other than 0xffffff. + * This indicates that a Game Object is tinted. + */ + readonly isTinted: boolean; + + /** + * The displayed width of this Game Object. + * + * Setting this value will adjust the way in which this Nine Slice + * object scales horizontally, if configured to do so. + * + * The _minimum_ width this Game Object can be is the total of + * `leftWidth` + `rightWidth`. If you need to display this object + * at a smaller size, you can also scale it. + */ + width: number; + + /** + * The displayed height of this Game Object. + * + * Setting this value will adjust the way in which this Nine Slice + * object scales vertically, if configured to do so. + * + * The _minimum_ height this Game Object can be is the total of + * `topHeight` + `bottomHeight`. If you need to display this object + * at a smaller size, you can also scale it. + * + * If this is a 3-slice object, you can only stretch it horizontally + * and changing the height will be ignored. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object. + * + * For a Nine Slice Game Object this means it will be stretched (or shrunk) horizontally + * and vertically depending on the dimensions given to this method, in accordance with + * how it has been configured for the various corner sizes. + * + * If this is a 3-slice object, you can only stretch it horizontally + * and changing the height will be ignored. + * + * If you have enabled this Game Object for input, changing the size will also change the + * size of the hit area. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + */ + originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + */ + originY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * This method is included but does nothing for the Nine Slice Game Object, + * because the size of the object isn't based on the texture frame. + * + * You should not call this method. + */ + setSizeToFrame(): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + namespace Particles { + /** + * This class is responsible for taking control over the color property + * in the Particle class and managing its emission and updating functions. + * + * See the `ParticleEmitter` class for more details on emitter op configuration. + */ + class EmitterColorOp extends Phaser.GameObjects.Particles.EmitterOp { + /** + * + * @param key The name of the property. + */ + constructor(key: string); + + /** + * An array containing the red color values. + * + * Populated during the `setMethods` method. + */ + r: number[]; + + /** + * An array containing the green color values. + * + * Populated during the `setMethods` method. + */ + g: number[]; + + /** + * An array containing the blue color values. + * + * Populated during the `setMethods` method. + */ + b: number[]; + + /** + * Checks the type of `EmitterOp.propertyValue` to determine which + * method is required in order to return values from this op function. + */ + getMethod(): number; + + /** + * Sets the EmitterColorOp method values, if in use. + */ + setMethods(): this; + + /** + * Sets the Ease function to use for Color interpolation. + * @param ease The string-based name of the Ease function to use. + */ + setEase(ease: string): void; + + /** + * An `onEmit` callback for an eased property. + * + * It prepares the particle for easing by {@link Phaser.GameObjects.Particles.EmitterColorOp#easeValueUpdate}. + * @param particle The particle. + * @param key The name of the property. + */ + easedValueEmit(particle: Phaser.GameObjects.Particles.Particle, key: string): number; + + /** + * An `onUpdate` callback that returns an eased value between the + * {@link Phaser.GameObjects.Particles.EmitterColorOp#start} and {@link Phaser.GameObjects.Particles.EmitterColorOp#end} + * range. + * @param particle The particle. + * @param key The name of the property. + * @param t The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + */ + easeValueUpdate(particle: Phaser.GameObjects.Particles.Particle, key: string, t: number): number; + + } + + /** + * This class is responsible for taking control over a single property + * in the Particle class and managing its emission and updating functions. + * + * Particles properties such as `x`, `y`, `scaleX`, `lifespan` and others all use + * EmitterOp instances to manage them, as they can be given in a variety of + * formats: from simple values, to functions, to dynamic callbacks. + * + * See the `ParticleEmitter` class for more details on emitter op configuration. + */ + class EmitterOp { + /** + * + * @param key The name of the property. + * @param defaultValue The default value of the property. + * @param emitOnly Whether the property can only be modified when a Particle is emitted. Default false. + */ + constructor(key: string, defaultValue: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType, emitOnly?: boolean); + + /** + * The name of this property. + */ + propertyKey: string; + + /** + * The current value of this property. + * + * This can be a simple value, an array, a function or an onEmit + * configuration object. + */ + propertyValue: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + + /** + * The default value of this property. + * + * This can be a simple value, an array, a function or an onEmit + * configuration object. + */ + defaultValue: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + + /** + * The number of steps for stepped easing between {@link Phaser.GameObjects.Particles.EmitterOp#start} and + * {@link Phaser.GameObjects.Particles.EmitterOp#end} values, per emit. + */ + steps: number; + + /** + * The step counter for stepped easing, per emit. + */ + counter: number; + + /** + * When the step counter reaches it's maximum, should it then + * yoyo back to the start again, or flip over to it? + */ + yoyo: boolean; + + /** + * The counter direction. 0 for up and 1 for down. + */ + direction: number; + + /** + * The start value for this property to ease between. + * + * If an interpolation this holds a reference to the number data array. + */ + start: number | number[]; + + /** + * The most recently calculated value. Updated every time an + * emission or update method is called. Treat as read-only. + */ + current: number; + + /** + * The end value for this property to ease between. + */ + end: number; + + /** + * The easing function to use for updating this property, if any. + */ + ease: Function | null; + + /** + * The interpolation function to use for updating this property, if any. + */ + interpolation: Function | null; + + /** + * Whether this property can only be modified when a Particle is emitted. + * + * Set to `true` to allow only {@link Phaser.GameObjects.Particles.EmitterOp#onEmit} callbacks to be set and + * affect this property. + * + * Set to `false` to allow both {@link Phaser.GameObjects.Particles.EmitterOp#onEmit} and + * {@link Phaser.GameObjects.Particles.EmitterOp#onUpdate} callbacks to be set and affect this property. + */ + emitOnly: boolean; + + /** + * The callback to run for Particles when they are emitted from the Particle Emitter. + */ + onEmit: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitCallback; + + /** + * The callback to run for Particles when they are updated. + */ + onUpdate: Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateCallback; + + /** + * Set to `false` to disable this EmitterOp. + */ + active: boolean; + + /** + * The onEmit method type of this EmitterOp. + * + * Set as part of `setMethod` and cached here to avoid + * re-setting when only the value changes. + */ + method: number; + + /** + * Load the property from a Particle Emitter configuration object. + * + * Optionally accepts a new property key to use, replacing the current one. + * @param config Settings for the Particle Emitter that owns this property. + * @param newKey The new key to use for this property, if any. + */ + loadConfig(config?: Phaser.Types.GameObjects.Particles.ParticleEmitterConfig, newKey?: string): void; + + /** + * Build a JSON representation of this Particle Emitter property. + */ + toJSON(): object; + + /** + * Change the current value of the property and update its callback methods. + * @param value The new numeric value of this property. + */ + onChange(value: number): this; + + /** + * Checks the type of `EmitterOp.propertyValue` to determine which + * method is required in order to return values from this op function. + */ + getMethod(): number; + + /** + * Update the {@link Phaser.GameObjects.Particles.EmitterOp#onEmit} and + * {@link Phaser.GameObjects.Particles.EmitterOp#onUpdate} callbacks based on the method returned + * from `getMethod`. The method is stored in the `EmitterOp.method` property + * and is a number between 0 and 9 inclusively. + */ + setMethods(): this; + + /** + * Check whether an object has the given property. + * @param object The object to check. + * @param key The key of the property to look for in the object. + */ + has(object: object, key: string): boolean; + + /** + * Check whether an object has both of the given properties. + * @param object The object to check. + * @param key1 The key of the first property to check the object for. + * @param key2 The key of the second property to check the object for. + */ + hasBoth(object: object, key1: string, key2: string): boolean; + + /** + * Check whether an object has at least one of the given properties. + * @param object The object to check. + * @param key1 The key of the first property to check the object for. + * @param key2 The key of the second property to check the object for. + */ + hasEither(object: object, key1: string, key2: string): boolean; + + /** + * The returned value sets what the property will be at the START of the particles life, on emit. + * @param particle The particle. + * @param key The name of the property. + * @param value The current value of the property. + */ + defaultEmit(particle: Phaser.GameObjects.Particles.Particle, key: string, value?: number): number; + + /** + * The returned value updates the property for the duration of the particles life. + * @param particle The particle. + * @param key The name of the property. + * @param t The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + * @param value The current value of the property. + */ + defaultUpdate(particle: Phaser.GameObjects.Particles.Particle, key: string, t: number, value: number): number; + + /** + * The returned value sets what the property will be at the START of the particles life, on emit. + * + * This method is only used when you have provided a custom emit callback. + * @param particle The particle. + * @param key The name of the property. + * @param value The current value of the property. + */ + proxyEmit(particle: Phaser.GameObjects.Particles.Particle, key: string, value?: number): number; + + /** + * The returned value updates the property for the duration of the particles life. + * + * This method is only used when you have provided a custom update callback. + * @param particle The particle. + * @param key The name of the property. + * @param t The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + * @param value The current value of the property. + */ + proxyUpdate(particle: Phaser.GameObjects.Particles.Particle, key: string, t: number, value: number): number; + + /** + * An `onEmit` callback that returns the current value of the property. + */ + staticValueEmit(): number; + + /** + * An `onUpdate` callback that returns the current value of the property. + */ + staticValueUpdate(): number; + + /** + * An `onEmit` callback that returns a random value from the current value array. + */ + randomStaticValueEmit(): number; + + /** + * An `onEmit` callback that returns a value between the {@link Phaser.GameObjects.Particles.EmitterOp#start} and + * {@link Phaser.GameObjects.Particles.EmitterOp#end} range. + * @param particle The particle. + * @param key The key of the property. + */ + randomRangedValueEmit(particle: Phaser.GameObjects.Particles.Particle, key: string): number; + + /** + * An `onEmit` callback that returns a value between the {@link Phaser.GameObjects.Particles.EmitterOp#start} and + * {@link Phaser.GameObjects.Particles.EmitterOp#end} range. + * @param particle The particle. + * @param key The key of the property. + */ + randomRangedIntEmit(particle: Phaser.GameObjects.Particles.Particle, key: string): number; + + /** + * An `onEmit` callback that returns a stepped value between the + * {@link Phaser.GameObjects.Particles.EmitterOp#start} and {@link Phaser.GameObjects.Particles.EmitterOp#end} + * range. + */ + steppedEmit(): number; + + /** + * An `onEmit` callback for an eased property. + * + * It prepares the particle for easing by {@link Phaser.GameObjects.Particles.EmitterOp#easeValueUpdate}. + * @param particle The particle. + * @param key The name of the property. + */ + easedValueEmit(particle: Phaser.GameObjects.Particles.Particle, key: string): number; + + /** + * An `onUpdate` callback that returns an eased value between the + * {@link Phaser.GameObjects.Particles.EmitterOp#start} and {@link Phaser.GameObjects.Particles.EmitterOp#end} + * range. + * @param particle The particle. + * @param key The name of the property. + * @param t The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + */ + easeValueUpdate(particle: Phaser.GameObjects.Particles.Particle, key: string, t: number): number; + + /** + * Destroys this EmitterOp instance and all of its references. + * + * Called automatically when the ParticleEmitter that owns this + * EmitterOp is destroyed. + */ + destroy(): void; + + } + + namespace Events { + /** + * The Particle Emitter Complete Event. + * + * This event is dispatched when the final particle, emitted from a Particle Emitter that + * has been stopped, dies. Upon receipt of this event you know that no particles are + * still rendering at this point in time. + * + * Listen for it on a Particle Emitter instance using `ParticleEmitter.on('complete', listener)`. + */ + const COMPLETE: string; + + /** + * The Particle Emitter Death Zone Event. + * + * This event is dispatched when a Death Zone kills a Particle instance. + * + * Listen for it on a Particle Emitter instance using `ParticleEmitter.on('deathzone', listener)`. + * + * If you wish to know when the final particle is killed, see the `COMPLETE` event. + */ + const DEATH_ZONE: string; + + /** + * The Particle Emitter Explode Event. + * + * This event is dispatched when a Particle Emitter explodes a set of particles. + * + * Listen for it on a Particle Emitter instance using `ParticleEmitter.on('explode', listener)`. + */ + const EXPLODE: string; + + /** + * The Particle Emitter Start Event. + * + * This event is dispatched when a Particle Emitter starts emission of particles. + * + * Listen for it on a Particle Emitter instance using `ParticleEmitter.on('start', listener)`. + */ + const START: string; + + /** + * The Particle Emitter Stop Event. + * + * This event is dispatched when a Particle Emitter is stopped. This can happen either + * when you directly call the `ParticleEmitter.stop` method, or if the emitter has + * been configured to stop after a set time via the `duration` property, or after a + * set number of particles via the `stopAfter` property. + * + * Listen for it on a Particle Emitter instance using `ParticleEmitter.on('stop', listener)`. + * + * Note that just because the emitter has stopped, that doesn't mean there aren't still + * particles alive and rendering. It just means the emitter has stopped emitting particles. + * + * If you wish to know when the final particle is killed, see the `COMPLETE` event. + */ + const STOP: string; + + } + + /** + * The Gravity Well Particle Processor applies a force on the particles to draw + * them towards, or repel them from, a single point. + * + * The force applied is inversely proportional to the square of the distance + * from the particle to the point, in accordance with Newton's law of gravity. + * + * This simulates the effect of gravity over large distances (as between planets, for example). + */ + class GravityWell extends Phaser.GameObjects.Particles.ParticleProcessor { + /** + * + * @param x The x coordinate of the Gravity Well, in world space. Default 0. + * @param y The y coordinate of the Gravity Well, in world space. Default 0. + * @param power The strength of the gravity force - larger numbers produce a stronger force. Default 0. + * @param epsilon The minimum distance for which the gravity force is calculated. Default 100. + * @param gravity The gravitational force of this Gravity Well. Default 50. + */ + constructor(x?: number | Phaser.Types.GameObjects.Particles.GravityWellConfig, y?: number, power?: number, epsilon?: number, gravity?: number); + + /** + * Takes a Particle and updates it based on the properties of this Gravity Well. + * @param particle The Particle to update. + * @param delta The delta time in ms. + * @param step The delta value divided by 1000. + */ + update(particle: Phaser.GameObjects.Particles.Particle, delta: number, step: number): void; + + /** + * The minimum distance for which the gravity force is calculated. + * + * Defaults to 100. + */ + epsilon: number; + + /** + * The strength of the gravity force - larger numbers produce a stronger force. + * + * Defaults to 0. + */ + power: number; + + /** + * The gravitational force of this Gravity Well. + * + * Defaults to 50. + */ + gravity: number; + + } + + /** + * A Particle is a simple object owned and controlled by a Particle Emitter. + * + * It encapsulates all of the properties required to move and update according + * to the Emitters operations. + */ + class Particle { + /** + * + * @param emitter The Emitter to which this Particle belongs. + */ + constructor(emitter: Phaser.GameObjects.Particles.ParticleEmitter); + + /** + * The Emitter to which this Particle belongs. + * + * A Particle can only belong to a single Emitter and is created, updated and destroyed by it. + */ + emitter: Phaser.GameObjects.Particles.ParticleEmitter; + + /** + * The texture used by this Particle when it renders. + */ + texture: Phaser.Textures.Texture; + + /** + * The texture frame used by this Particle when it renders. + */ + frame: Phaser.Textures.Frame; + + /** + * The x coordinate of this Particle. + */ + x: number; + + /** + * The y coordinate of this Particle. + */ + y: number; + + /** + * The coordinates of this Particle in world space. + * + * Updated as part of `computeVelocity`. + */ + worldPosition: Phaser.Math.Vector2; + + /** + * The x velocity of this Particle. + */ + velocityX: number; + + /** + * The y velocity of this Particle. + */ + velocityY: number; + + /** + * The x acceleration of this Particle. + */ + accelerationX: number; + + /** + * The y acceleration of this Particle. + */ + accelerationY: number; + + /** + * The maximum horizontal velocity this Particle can travel at. + */ + maxVelocityX: number; + + /** + * The maximum vertical velocity this Particle can travel at. + */ + maxVelocityY: number; + + /** + * The bounciness, or restitution, of this Particle. + */ + bounce: number; + + /** + * The horizontal scale of this Particle. + */ + scaleX: number; + + /** + * The vertical scale of this Particle. + */ + scaleY: number; + + /** + * The alpha value of this Particle. + */ + alpha: number; + + /** + * The angle of this Particle in degrees. + */ + angle: number; + + /** + * The angle of this Particle in radians. + */ + rotation: number; + + /** + * The tint applied to this Particle. + */ + tint: number; + + /** + * The lifespan of this Particle in ms. + */ + life: number; + + /** + * The current life of this Particle in ms. + */ + lifeCurrent: number; + + /** + * The delay applied to this Particle upon emission, in ms. + */ + delayCurrent: number; + + /** + * The hold applied to this Particle before it expires, in ms. + */ + holdCurrent: number; + + /** + * The normalized lifespan T value, where 0 is the start and 1 is the end. + */ + lifeT: number; + + /** + * The data used by the ease equation. + */ + data: Phaser.Types.GameObjects.Particles.ParticleData; + + /** + * A reference to the Scene to which this Game Object belongs. + * + * Game Objects can only belong to one Scene. + * + * You should consider this property as being read-only. You cannot move a + * Game Object to another Scene by simply changing it. + */ + scene: Phaser.Scene; + + /** + * The Animation State component of this Particle. + * + * This component provides features to apply animations to this Particle. + * It is responsible for playing, loading, queuing animations for later playback, + * mixing between animations and setting the current animation frame to this Particle. + */ + anims: Phaser.Animations.AnimationState; + + /** + * A rectangle that holds the bounds of this Particle after a call to + * the `Particle.getBounds` method has been made. + */ + bounds: Phaser.Geom.Rectangle; + + /** + * The Event Emitter proxy. + * + * Passes on all parameters to the `ParticleEmitter` to emit directly. + * @param event The event name. + * @param a1 Optional argument 1. + * @param a2 Optional argument 2. + * @param a3 Optional argument 3. + * @param a4 Optional argument 4. + * @param a5 Optional argument 5. + */ + emit(event: string | Symbol, a1?: any, a2?: any, a3?: any, a4?: any, a5?: any): boolean; + + /** + * Checks to see if this Particle is alive and updating. + */ + isAlive(): boolean; + + /** + * Kills this particle. This sets the `lifeCurrent` value to 0, which forces + * the Particle to be removed the next time its parent Emitter runs an update. + */ + kill(): void; + + /** + * Sets the position of this particle to the given x/y coordinates. + * + * If the parameters are left undefined, it resets the particle back to 0x0. + * @param x The x coordinate to set this Particle to. Default 0. + * @param y The y coordinate to set this Particle to. Default 0. + */ + setPosition(x?: number, y?: number): void; + + /** + * Starts this Particle from the given coordinates. + * @param x The x coordinate to launch this Particle from. + * @param y The y coordinate to launch this Particle from. + */ + fire(x?: number, y?: number): boolean; + + /** + * The main update method for this Particle. + * + * Updates its life values, computes the velocity and repositions the Particle. + * @param delta The delta time in ms. + * @param step The delta value divided by 1000. + * @param processors An array of all active Particle Processors. + */ + update(delta: number, step: number, processors: Phaser.GameObjects.Particles.ParticleProcessor[]): boolean; + + /** + * An internal method that calculates the velocity of the Particle and + * its world position. It also runs it against any active Processors + * that are set on the Emitter. + * @param emitter The Emitter that is updating this Particle. + * @param delta The delta time in ms. + * @param step The delta value divided by 1000. + * @param processors An array of all active Particle Processors. + * @param t The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + */ + computeVelocity(emitter: Phaser.GameObjects.Particles.ParticleEmitter, delta: number, step: number, processors: Phaser.GameObjects.Particles.ParticleProcessor[], t: number): void; + + /** + * This is a NOOP method and does nothing when called. + */ + setSizeToFrame(): void; + + /** + * Gets the bounds of this particle as a Geometry Rectangle, factoring in any + * transforms of the parent emitter and anything else above it in the display list. + * + * Once calculated the bounds can be accessed via the `Particle.bounds` property. + * @param matrix Optional transform matrix to apply to this particle. + */ + getBounds(matrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.Geom.Rectangle; + + /** + * Destroys this Particle. + */ + destroy(): void; + + } + + /** + * The Particle Bounds Processor. + * + * Defines a rectangular region, in world space, within which particle movement + * is restrained. + * + * Use the properties `collideLeft`, `collideRight`, `collideTop` and + * `collideBottom` to control if a particle will rebound off the sides + * of this boundary, or not. + * + * This happens when the particles worldPosition x/y coordinate hits the boundary. + * + * The strength of the rebound is determined by the `Particle.bounce` property. + */ + class ParticleBounds extends Phaser.GameObjects.Particles.ParticleProcessor { + /** + * + * @param x The x position (top-left) of the bounds, in world space. + * @param y The y position (top-left) of the bounds, in world space. + * @param width The width of the bounds. + * @param height The height of the bounds. + * @param collideLeft Whether particles interact with the left edge of the bounds. Default true. + * @param collideRight Whether particles interact with the right edge of the bounds. Default true. + * @param collideTop Whether particles interact with the top edge of the bounds. Default true. + * @param collideBottom Whether particles interact with the bottom edge of the bounds. Default true. + */ + constructor(x: number, y: number, width: number, height: number, collideLeft?: boolean, collideRight?: boolean, collideTop?: boolean, collideBottom?: boolean); + + /** + * A rectangular boundary constraining particle movement. Use the Emitter properties `collideLeft`, + * `collideRight`, `collideTop` and `collideBottom` to control if a particle will rebound off + * the sides of this boundary, or not. This happens when the particles x/y coordinate hits + * the boundary. + */ + bounds: Phaser.Geom.Rectangle; + + /** + * Whether particles interact with the left edge of the emitter {@link Phaser.GameObjects.Particles.ParticleEmitter#bounds}. + */ + collideLeft: boolean; + + /** + * Whether particles interact with the right edge of the emitter {@link Phaser.GameObjects.Particles.ParticleBounds#bounds}. + */ + collideRight: boolean; + + /** + * Whether particles interact with the top edge of the emitter {@link Phaser.GameObjects.Particles.ParticleBounds#bounds}. + */ + collideTop: boolean; + + /** + * Whether particles interact with the bottom edge of the emitter {@link Phaser.GameObjects.Particles.ParticleBounds#bounds}. + */ + collideBottom: boolean; + + /** + * Takes a Particle and updates it against the bounds. + * @param particle The Particle to update. + */ + update(particle: Phaser.GameObjects.Particles.Particle): void; + + } + + /** + * A Particle Emitter is a special kind of Game Object that controls a pool of {@link Phaser.GameObjects.Particles.Particle Particles}. + * + * Particle Emitters are created via a configuration object. The properties of this object + * can be specified in a variety of formats, given you plenty of scope over the values they + * return, leading to complex visual effects. Here are the different forms of configuration + * value you can give: + * + * ## An explicit static value: + * + * ```js + * x: 400 + * ``` + * + * The x value will always be 400 when the particle is spawned. + * + * ## A random value: + * + * ```js + * x: [ 100, 200, 300, 400 ] + * ``` + * + * The x value will be one of the 4 elements in the given array, picked at random on emission. + * + * ## A custom callback: + * + * ```js + * x: (particle, key, t, value) => { + * return value + 50; + * } + * ``` + * + * The x value is the result of calling this function. This is only used when the + * particle is emitted, so it provides it's initial starting value. It is not used + * when the particle is updated (see the onUpdate callback for that) + * + * ## A start / end object: + * + * This allows you to control the change in value between the given start and + * end parameters over the course of the particles lifetime: + * + * ```js + * scale: { start: 0, end: 1 } + * ``` + * + * The particle scale will start at 0 when emitted and ease to a scale of 1 + * over the course of its lifetime. You can also specify the ease function + * used for this change (the default is Linear): + * + * ```js + * scale: { start: 0, end: 1, ease: 'bounce.out' } + * ``` + * + * ## A start / end random object: + * + * The start and end object can have an optional `random` parameter. + * This forces it to pick a random value between the two values and use + * this as the starting value, then easing to the 'end' parameter over + * its lifetime. + * + * ```js + * scale: { start: 4, end: 0.5, random: true } + * ``` + * + * The particle will start with a random scale between 0.5 and 4 and then + * scale to the end value over its lifetime. You can combine the above + * with the `ease` parameter as well to control the value easing. + * + * ## An interpolation object: + * + * You can provide an array of values which will be used for interpolation + * during the particles lifetime. You can also define the interpolation + * function to be used. There are three provided: `linear` (the default), + * `bezier` and `catmull`, or you can provide your own function. + * + * ```js + * x: { values: [ 50, 500, 200, 800 ], interpolation: 'catmull' } + * ``` + * + * The particle scale will interpolate from 50 when emitted to 800 via the other + * points over the course of its lifetime. You can also specify an ease function + * used to control the rate of change through the values (the default is Linear): + * + * ```js + * x: { values: [ 50, 500, 200, 800 ], interpolation: 'catmull', ease: 'bounce.out } + * ``` + * + * ## A stepped emitter object: + * + * The `steps` parameter allows you to control the placement of sequential + * particles across the start-end range: + * + * ```js + * x: { steps: 32, start: 0, end: 576 } + * ``` + * + * Here we have a range of 576 (start to end). This is divided into 32 steps. + * + * The first particle will emit at the x position of 0. The next will emit + * at the next 'step' along, which would be 18. The following particle will emit + * at the next step, which is 36, and so on. Because the range of 576 has been + * divided by 32, creating 18 pixels steps. When a particle reaches the 'end' + * value the next one will start from the beginning again. + * + * ## A stepped emitter object with yoyo: + * + * You can add the optional `yoyo` property to a stepped object: + * + * ```js + * x: { steps: 32, start: 0, end: 576, yoyo: true } + * ``` + * + * As with the stepped emitter, particles are emitted in sequence, from 'start' + * to 'end' in step sized jumps. Normally, when a stepped emitter reaches the + * end it snaps around to the start value again. However, if you provide the 'yoyo' + * parameter then when it reaches the end it will reverse direction and start + * emitting back down to 'start' again. Depending on the effect you require this + * can often look better. + * + * ## A min / max object: + * + * This allows you to pick a random float value between the min and max properties: + * + * ```js + * x: { min: 100, max: 700 } + * ``` + * + * The x value will be a random float between min and max. + * + * You can force it select an integer by setting the 'int' flag: + * + * ```js + * x: { min: 100, max: 700, int: true } + * ``` + * + * Or, you could use the 'random' array approach (see below) + * + * ## A random object: + * + * This allows you to pick a random integer value between the first and second array elements: + * + * ```js + * x: { random: [ 100, 700 ] } + * ``` + * + * The x value will be a random integer between 100 and 700 as it takes the first + * element in the 'random' array as the 'min' value and the 2nd element as the 'max' value. + * + * ## Custom onEmit and onUpdate callbacks: + * + * If the above won't give you the effect you're after, you can provide your own + * callbacks that will be used when the particle is both emitted and updated: + * + * ```js + * x: { + * onEmit: (particle, key, t, value) => { + * return value; + * }, + * onUpdate: (particle, key, t, value) => { + * return value; + * } + * } + * ``` + * + * You can provide either one or both functions. The `onEmit` is called at the + * start of the particles life and defines the value of the property on birth. + * + * The `onUpdate` function is called every time the Particle Emitter updates + * until the particle dies. Both must return a value. + * + * The properties are: + * + * particle - A reference to the Particle instance. + * key - The string based key of the property, i.e. 'x' or 'lifespan'. + * t - The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + * value - The current property value. At a minimum you should return this. + * + * By using the above configuration options you have an unlimited about of + * control over how your particles behave. + * + * ## v3.55 Differences + * + * Prior to v3.60 Phaser used a `ParticleEmitterManager`. This was removed in v3.60 + * and now calling `this.add.particles` returns a `ParticleEmitter` instance instead. + * + * In order to streamline memory and the display list we have removed the + * `ParticleEmitterManager` entirely. When you call `this.add.particles` you're now + * creating a `ParticleEmitter` instance, which is being added directly to the + * display list and can be manipulated just like any other Game Object, i.e. + * scaled, rotated, positioned, added to a Container, etc. It now extends the + * `GameObject` base class, meaning it's also an event emitter, which allowed us + * to create some handy new events for particles. + * + * So, to create an emitter, you now give it an xy coordinate, a texture and an + * emitter configuration object (you can also set this later, but most commonly + * you'd do it on creation). I.e.: + * + * ```js + * const emitter = this.add.particles(100, 300, 'flares', { + * frame: 'red', + * angle: { min: -30, max: 30 }, + * speed: 150 + * }); + * ``` + * + * This will create a 'red flare' emitter at 100 x 300. + * + * Please update your code to ensure it adheres to the new function signatures. + */ + class ParticleEmitter extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param config Settings for this emitter. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, config?: Phaser.Types.GameObjects.Particles.ParticleEmitterConfig); + + /** + * The Particle Class which will be emitted by this Emitter. + */ + particleClass: Function; + + /** + * An internal object holding all of the EmitterOp instances. + * + * These are populated as part of the Emitter configuration parsing. + * + * You typically do not access them directly, but instead use the + * provided getters and setters on this class, such as `ParticleEmitter.speedX` etc. + */ + ops: Phaser.Types.GameObjects.Particles.ParticleEmitterOps; + + /** + * A radial emitter will emit particles in all directions between angle min and max, + * using {@link Phaser.GameObjects.Particles.ParticleEmitter#speed} as the value. If set to false then this acts as a point Emitter. + * A point emitter will emit particles only in the direction derived from the speedX and speedY values. + */ + radial: boolean; + + /** + * Horizontal acceleration applied to emitted particles, in pixels per second squared. + */ + gravityX: number; + + /** + * Vertical acceleration applied to emitted particles, in pixels per second squared. + */ + gravityY: number; + + /** + * Whether accelerationX and accelerationY are non-zero. Set automatically during configuration. + */ + acceleration: boolean; + + /** + * Whether moveToX and moveToY are set. Set automatically during configuration. + * + * When true the particles move toward the moveToX and moveToY coordinates and arrive at the end of their life. + * Emitter angle, speedX, and speedY are ignored. + */ + moveTo: boolean; + + /** + * A function to call when a particle is emitted. + */ + emitCallback: Phaser.Types.GameObjects.Particles.ParticleEmitterCallback | null; + + /** + * The calling context for {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallback}. + */ + emitCallbackScope: any | null; + + /** + * A function to call when a particle dies. + */ + deathCallback: Phaser.Types.GameObjects.Particles.ParticleDeathCallback | null; + + /** + * The calling context for {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallback}. + */ + deathCallbackScope: any | null; + + /** + * Set to hard limit the amount of particle objects this emitter is allowed to create + * in total. This is the number of `Particle` instances it can create, not the number + * of 'alive' particles. + * + * 0 means unlimited. + */ + maxParticles: number; + + /** + * The maximum number of alive and rendering particles this emitter will update. + * When this limit is reached, a particle needs to die before another can be emitted. + * + * 0 means no limits. + */ + maxAliveParticles: number; + + /** + * If set, either via the Emitter config, or by directly setting this property, + * the Particle Emitter will stop emitting particles once this total has been + * reached. It will then enter a 'stopped' state, firing the `STOP` + * event. Note that entering a stopped state doesn't mean all the particles + * have finished, just that it's not emitting any further ones. + * + * To know when the final particle expires, listen for the COMPLETE event. + * + * Use this if you wish to launch an exact number of particles and then stop + * your emitter afterwards. + * + * The counter is reset each time the `ParticleEmitter.start` method is called. + * + * 0 means the emitter will not stop based on total emitted particles. + */ + stopAfter: number; + + /** + * The number of milliseconds this emitter will emit particles for when in flow mode, + * before it stops emission. A value of 0 (the default) means there is no duration. + * + * When the duration expires the `STOP` event is emitted. Note that entering a + * stopped state doesn't mean all the particles have finished, just that it's + * not emitting any further ones. + * + * To know when the final particle expires, listen for the COMPLETE event. + * + * The counter is reset each time the `ParticleEmitter.start` method is called. + * + * 0 means the emitter will not stop based on duration. + */ + duration: number; + + /** + * For a flow emitter, the time interval (>= 0) between particle flow cycles in ms. + * A value of 0 means there is one particle flow cycle for each logic update (the maximum flow frequency). This is the default setting. + * For an exploding emitter, this value will be -1. + * Calling {@link Phaser.GameObjects.Particles.ParticleEmitter#flow} also puts the emitter in flow mode (frequency >= 0). + * Calling {@link Phaser.GameObjects.Particles.ParticleEmitter#explode} also puts the emitter in explode mode (frequency = -1). + */ + frequency: number; + + /** + * Controls if the emitter is currently emitting a particle flow (when frequency >= 0). + * + * Already alive particles will continue to update until they expire. + * + * Controlled by {@link Phaser.GameObjects.Particles.ParticleEmitter#start} and {@link Phaser.GameObjects.Particles.ParticleEmitter#stop}. + */ + emitting: boolean; + + /** + * Newly emitted particles are added to the top of the particle list, i.e. rendered above those already alive. + * + * Set to false to send them to the back. + * + * Also see the `sortOrder` property for more complex particle sorting. + */ + particleBringToTop: boolean; + + /** + * The time rate applied to active particles, affecting lifespan, movement, and tweens. Values larger than 1 are faster than normal. + */ + timeScale: number; + + /** + * An array containing Particle Emission Zones. These can be either EdgeZones or RandomZones. + * + * Particles are emitted from a randomly selected zone from this array. + * + * Prior to Phaser v3.60 an Emitter could only have one single Emission Zone. + * In 3.60 they can now have an array of Emission Zones. + */ + emitZones: Phaser.Types.GameObjects.Particles.EmitZoneObject[]; + + /** + * An array containing Particle Death Zone objects. A particle is immediately killed as soon as its x/y coordinates + * intersect with any of the configured Death Zones. + * + * Prior to Phaser v3.60 an Emitter could only have one single Death Zone. + * In 3.60 they can now have an array of Death Zones. + */ + deathZones: Phaser.GameObjects.Particles.Zones.DeathZone[]; + + /** + * An optional Rectangle object that is used during rendering to cull Particles from + * display. For example, if your particles are limited to only move within a 300x300 + * sized area from their origin, then you can set this Rectangle to those dimensions. + * + * The renderer will check to see if the `viewBounds` Rectangle intersects with the + * Camera bounds during the render step and if not it will skip rendering the Emitter + * entirely. + * + * This allows you to create many emitters in a Scene without the cost of + * rendering if the contents aren't visible. + * + * Note that the Emitter will not perform any checks to see if the Particles themselves + * are outside of these bounds, or not. It will simply check the bounds against the + * camera. Use the `getBounds` method with the `advance` parameter to help define + * the location and placement of the view bounds. + */ + viewBounds: Phaser.Geom.Rectangle | null; + + /** + * A Game Object whose position is used as the particle origin. + */ + follow: Phaser.Types.Math.Vector2Like | null; + + /** + * The offset of the particle origin from the {@link Phaser.GameObjects.Particles.ParticleEmitter#follow} target. + */ + followOffset: Phaser.Math.Vector2; + + /** + * Whether the emitter's {@link Phaser.GameObjects.Particles.ParticleEmitter#visible} state will track + * the {@link Phaser.GameObjects.Particles.ParticleEmitter#follow} target's visibility state. + */ + trackVisible: boolean; + + /** + * The texture frames assigned to particles. + */ + frames: Phaser.Textures.Frame[]; + + /** + * Whether texture {@link Phaser.GameObjects.Particles.ParticleEmitter#frames} are selected at random. + */ + randomFrame: boolean; + + /** + * The number of consecutive particles that receive a single texture frame (per frame cycle). + */ + frameQuantity: number; + + /** + * The animations assigned to particles. + */ + anims: string[]; + + /** + * Whether animations {@link Phaser.GameObjects.Particles.ParticleEmitter#anims} are selected at random. + */ + randomAnim: boolean; + + /** + * The number of consecutive particles that receive a single animation (per frame cycle). + */ + animQuantity: number; + + /** + * An internal property used to tell when the emitter is in fast-forwarc mode. + */ + skipping: boolean; + + /** + * An internal Transform Matrix used to cache this emitters world matrix. + */ + worldMatrix: Phaser.GameObjects.Components.TransformMatrix; + + /** + * Optionally sort the particles before they render based on this + * property. The property must exist on the `Particle` class, such + * as `y`, `lifeT`, `scaleX`, etc. + * + * When set this overrides the `particleBringToTop` setting. + * + * To reset this and disable sorting, so this property to an empty string. + */ + sortProperty: string; + + /** + * When `sortProperty` is defined this controls the sorting order, + * either ascending or descending. Toggle to control the visual effect. + */ + sortOrderAsc: boolean; + + /** + * The callback used to sort the particles. Only used if `sortProperty` + * has been set. Set this via the `setSortCallback` method. + */ + sortCallback: Phaser.Types.GameObjects.Particles.ParticleSortCallback | null; + + /** + * A list of Particle Processors being managed by this Emitter. + */ + processors: Phaser.Structs.List; + + /** + * The tint fill mode used by the Particles in this Emitter. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Takes an Emitter Configuration file and resets this Emitter, using any + * properties defined in the config to then set it up again. + * @param config Settings for this emitter. + */ + setConfig(config: Phaser.Types.GameObjects.Particles.ParticleEmitterConfig): this; + + /** + * Creates a description of this emitter suitable for JSON serialization. + */ + toJSON(): Phaser.Types.GameObjects.JSONGameObject; + + /** + * Resets the internal counter trackers. + * + * You shouldn't ever need to call this directly. + * @param frequency The frequency counter. + * @param on Set the complete flag. + */ + resetCounters(frequency: number, on: boolean): void; + + /** + * Continuously moves the particle origin to follow a Game Object's position. + * @param target The Object to follow. + * @param offsetX Horizontal offset of the particle origin from the Game Object. Default 0. + * @param offsetY Vertical offset of the particle origin from the Game Object. Default 0. + * @param trackVisible Whether the emitter's visible state will track the target's visible state. Default false. + */ + startFollow(target: Phaser.Types.Math.Vector2Like, offsetX?: number, offsetY?: number, trackVisible?: boolean): this; + + /** + * Stops following a Game Object. + */ + stopFollow(): this; + + /** + * Chooses a texture frame from {@link Phaser.GameObjects.Particles.ParticleEmitter#frames}. + */ + getFrame(): Phaser.Textures.Frame; + + /** + * Sets a pattern for assigning texture frames to emitted particles. The `frames` configuration can be any of: + * + * frame: 0 + * frame: 'red' + * frame: [ 0, 1, 2, 3 ] + * frame: [ 'red', 'green', 'blue', 'pink', 'white' ] + * frame: { frames: [ 'red', 'green', 'blue', 'pink', 'white' ], [cycle: bool], [quantity: int] } + * @param frames One or more texture frames, or a configuration object. + * @param pickRandom Whether frames should be assigned at random from `frames`. Default true. + * @param quantity The number of consecutive particles that will receive each frame. Default 1. + */ + setEmitterFrame(frames: any[] | string | number | Phaser.Types.GameObjects.Particles.ParticleEmitterFrameConfig, pickRandom?: boolean, quantity?: number): this; + + /** + * Chooses an animation from {@link Phaser.GameObjects.Particles.ParticleEmitter#anims}, if populated. + */ + getAnim(): string; + + /** + * Sets a pattern for assigning animations to emitted particles. The `anims` configuration can be any of: + * + * anim: 'red' + * anim: [ 'red', 'green', 'blue', 'pink', 'white' ] + * anim: { anims: [ 'red', 'green', 'blue', 'pink', 'white' ], [cycle: bool], [quantity: int] } + * @param anims One or more animations, or a configuration object. + * @param pickRandom Whether animations should be assigned at random from `anims`. If a config object is given, this parameter is ignored. Default true. + * @param quantity The number of consecutive particles that will receive each animation. If a config object is given, this parameter is ignored. Default 1. + */ + setAnim(anims: string | string[] | Phaser.Types.GameObjects.Particles.ParticleEmitterAnimConfig, pickRandom?: boolean, quantity?: number): this; + + /** + * Turns {@link Phaser.GameObjects.Particles.ParticleEmitter#radial} particle movement on or off. + * @param value Radial mode (true) or point mode (true). Default true. + */ + setRadial(value?: boolean): this; + + /** + * Creates a Particle Bounds processor and adds it to this Emitter. + * + * This processor will check to see if any of the active Particles hit + * the defined boundary, as specified by a Rectangle shape in world-space. + * + * If so, they are 'rebounded' back again by having their velocity adjusted. + * + * The strength of the rebound is controlled by the `Particle.bounce` + * property. + * + * You should be careful to ensure that you emit particles within a bounds, + * if set, otherwise it will lead to unpredictable visual results as the + * particles are hastily repositioned. + * + * The Particle Bounds processor is returned from this method. If you wish + * to modify the area you can directly change its `bounds` property, along + * with the `collideLeft` etc values. + * + * To disable the bounds you can either set its `active` property to `false`, + * or if you no longer require it, call `ParticleEmitter.removeParticleProcessor`. + * @param x The x-coordinate of the left edge of the boundary, or an object representing a rectangle. + * @param y The y-coordinate of the top edge of the boundary. + * @param width The width of the boundary. + * @param height The height of the boundary. + * @param collideLeft Whether particles interact with the left edge of the bounds. Default true. + * @param collideRight Whether particles interact with the right edge of the bounds. Default true. + * @param collideTop Whether particles interact with the top edge of the bounds. Default true. + * @param collideBottom Whether particles interact with the bottom edge of the bounds. Default true. + */ + addParticleBounds(x: number | Phaser.Types.GameObjects.Particles.ParticleEmitterBounds | Phaser.Types.GameObjects.Particles.ParticleEmitterBoundsAlt, y?: number, width?: number, height?: number, collideLeft?: boolean, collideRight?: boolean, collideTop?: boolean, collideBottom?: boolean): Phaser.GameObjects.Particles.ParticleBounds; + + /** + * Sets the initial radial speed of emitted particles. + * + * Changes the emitter to radial mode. + * @param x The horizontal speed of the emitted Particles. + * @param y The vertical speed of emitted Particles. If not set it will use the `x` value. Default x. + */ + setParticleSpeed(x: number, y?: number): this; + + /** + * Sets the vertical and horizontal scale of the emitted particles. + * + * You can also set the scale of the entire emitter via `setScale`. + * @param x The horizontal scale of the emitted Particles. Default 1. + * @param y The vertical scale of emitted Particles. If not set it will use the `x` value. Default x. + */ + setParticleScale(x?: number, y?: number): this; + + /** + * Sets the gravity applied to emitted particles. + * @param x Horizontal acceleration due to gravity, in pixels per second squared. Set to zero for no gravity. + * @param y Vertical acceleration due to gravity, in pixels per second squared. Set to zero for no gravity. + */ + setParticleGravity(x: number, y: number): this; + + /** + * Sets the opacity (alpha) of emitted particles. + * + * You can also set the alpha of the entire emitter via `setAlpha`. + * @param value A value between 0 (transparent) and 1 (opaque). + */ + setParticleAlpha(value: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType): this; + + /** + * Sets the color tint of emitted particles. + * + * This is a WebGL only feature. + * @param value A value between 0 and 0xffffff. + */ + setParticleTint(value: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType): this; + + /** + * Sets the angle of a {@link Phaser.GameObjects.Particles.ParticleEmitter#radial} particle stream. + * + * The value is given in degrees using Phaser's right-handed coordinate system. + * @param value The angle of the initial velocity of emitted particles, in degrees. + */ + setEmitterAngle(value: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType): this; + + /** + * Sets the lifespan of newly emitted particles in milliseconds. + * @param value The lifespan of a particle, in ms. + */ + setParticleLifespan(value: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType): this; + + /** + * Sets the number of particles released at each flow cycle or explosion. + * @param quantity The number of particles to release at each flow cycle or explosion. + */ + setQuantity(quantity: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType): this; + + /** + * Sets the emitter's {@link Phaser.GameObjects.Particles.ParticleEmitter#frequency} + * and {@link Phaser.GameObjects.Particles.ParticleEmitter#quantity}. + * @param frequency The time interval (>= 0) of each flow cycle, in ms; or -1 to put the emitter in explosion mode. + * @param quantity The number of particles to release at each flow cycle or explosion. + */ + setFrequency(frequency: number, quantity?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType): this; + + /** + * Adds a new Particle Death Zone to this Emitter. + * + * A particle is immediately killed as soon as its x/y coordinates intersect + * with any of the configured Death Zones. + * + * The `source` can be a Geometry Shape, such as a Circle, Rectangle or Triangle. + * Any valid object from the `Phaser.Geometry` namespace is allowed, as long as + * it supports a `contains` function. You can set the `type` to be either `onEnter` + * or `onLeave`. + * + * A single Death Zone instance can only exist once within this Emitter, but can belong + * to multiple Emitters. + * @param config A Death Zone configuration object, a Death Zone instance, a valid Geometry object or an array of them. + */ + addDeathZone(config: Phaser.Types.GameObjects.Particles.DeathZoneObject | Phaser.Types.GameObjects.Particles.DeathZoneObject[]): Phaser.GameObjects.Particles.Zones.DeathZone[]; + + /** + * Removes the given Particle Death Zone from this Emitter. + * @param zone The Death Zone that should be removed from this Emitter. + */ + removeDeathZone(zone: Phaser.GameObjects.Particles.Zones.DeathZone): this; + + /** + * Clear all Death Zones from this Particle Emitter. + */ + clearDeathZones(): this; + + /** + * Adds a new Particle Emission Zone to this Emitter. + * + * An {@link Phaser.Types.GameObjects.Particles.ParticleEmitterEdgeZoneConfig EdgeZone} places particles on its edges. + * Its {@link Phaser.Types.GameObjects.Particles.EdgeZoneSource source} can be a Curve, Path, Circle, Ellipse, Line, Polygon, Rectangle, or Triangle; + * or any object with a suitable {@link Phaser.Types.GameObjects.Particles.EdgeZoneSourceCallback getPoints} method. + * + * A {@link Phaser.Types.GameObjects.Particles.ParticleEmitterRandomZoneConfig RandomZone} places the particles randomly within its interior. + * Its {@link RandomZoneSource source} can be a Circle, Ellipse, Line, Polygon, Rectangle, or Triangle; or any object with a suitable {@link Phaser.Types.GameObjects.Particles.RandomZoneSourceCallback getRandomPoint} method. + * + * An Emission Zone can only exist once within this Emitter. + * @param zone An Emission Zone configuration object, a RandomZone or EdgeZone instance, or an array of them. + */ + addEmitZone(zone: Phaser.Types.GameObjects.Particles.EmitZoneData | Phaser.Types.GameObjects.Particles.EmitZoneData[]): Phaser.Types.GameObjects.Particles.EmitZoneObject[]; + + /** + * Removes the given Particle Emission Zone from this Emitter. + * @param zone The Emission Zone that should be removed from this Emitter. + */ + removeEmitZone(zone: Phaser.GameObjects.Particles.Zones.EdgeZone | Phaser.GameObjects.Particles.Zones.RandomZone): this; + + /** + * Clear all Emission Zones from this Particle Emitter. + */ + clearEmitZones(): this; + + /** + * Takes the given particle and sets its x/y coordinates to match the next available + * emission zone, if any have been configured. This method is called automatically + * as part of the `Particle.fire` process. + * + * The Emit Zones are iterated in sequence. Once a zone has had a particle emitted + * from it, then the next zone is used and so on, in a loop. + * @param particle The particle to set the emission zone for. + */ + getEmitZone(particle: Phaser.GameObjects.Particles.Particle): void; + + /** + * Takes the given particle and checks to see if any of the configured Death Zones + * will kill it and returns the result. This method is called automatically as part + * of the `Particle.update` process. + * @param particle The particle to test against the Death Zones. + */ + getDeathZone(particle: Phaser.GameObjects.Particles.Particle): boolean; + + /** + * Changes the currently active Emission Zone. The zones should have already + * been added to this Emitter either via the emitter config, or the + * `addEmitZone` method. + * + * Call this method by passing either a numeric zone index value, or + * the zone instance itself. + * + * Prior to v3.60 an Emitter could only have a single Emit Zone and this + * method was how you set it. From 3.60 and up it now performs a different + * function and swaps between all available active zones. + * @param zone The Emit Zone to set as the active zone. + */ + setEmitZone(zone: number | Phaser.GameObjects.Particles.Zones.EdgeZone | Phaser.GameObjects.Particles.Zones.RandomZone): this; + + /** + * Adds a Particle Processor, such as a Gravity Well, to this Emitter. + * + * It will start processing particles from the next update as long as its `active` + * property is set. + * @param processor The Particle Processor to add to this Emitter Manager. + */ + addParticleProcessor(processor: T): T; + + /** + * Removes a Particle Processor from this Emitter. + * + * The Processor must belong to this Emitter to be removed. + * + * It is not destroyed when removed, allowing you to move it to another Emitter Manager, + * so if you no longer require it you should call its `destroy` method directly. + * @param processor The Particle Processor to remove from this Emitter Manager. + */ + removeParticleProcessor(processor: T): T | null; + + /** + * Gets all active Particle Processors. + */ + getProcessors(): Phaser.GameObjects.Particles.ParticleProcessor[]; + + /** + * Creates a new Gravity Well, adds it to this Emitter and returns a reference to it. + * @param config Configuration settings for the Gravity Well to create. + */ + createGravityWell(config: Phaser.Types.GameObjects.Particles.GravityWellConfig): Phaser.GameObjects.Particles.GravityWell; + + /** + * Creates inactive particles and adds them to this emitter's pool. + * + * If `ParticleEmitter.maxParticles` is set it will limit the + * value passed to this method to make sure it's not exceeded. + * @param count The number of particles to create. + */ + reserve(count: number): this; + + /** + * Gets the number of active (in-use) particles in this emitter. + */ + getAliveParticleCount(): number; + + /** + * Gets the number of inactive (available) particles in this emitter. + */ + getDeadParticleCount(): number; + + /** + * Gets the total number of particles in this emitter. + */ + getParticleCount(): number; + + /** + * Whether this emitter is at either its hard-cap limit (maxParticles), if set, or + * the max allowed number of 'alive' particles (maxAliveParticles). + */ + atLimit(): boolean; + + /** + * Sets a function to call for each newly emitted particle. + * @param callback The function. + * @param context The calling context. + */ + onParticleEmit(callback: Phaser.Types.GameObjects.Particles.ParticleEmitterCallback, context?: any): this; + + /** + * Sets a function to call for each particle death. + * @param callback The function. + * @param context The function's calling context. + */ + onParticleDeath(callback: Phaser.Types.GameObjects.Particles.ParticleDeathCallback, context?: any): this; + + /** + * Deactivates every particle in this emitter immediately. + * + * This particles are killed but do not emit an event or callback. + */ + killAll(): this; + + /** + * Calls a function for each active particle in this emitter. The function is + * sent two parameters: a reference to the Particle instance and to this Emitter. + * @param callback The function. + * @param context The functions calling context. + */ + forEachAlive(callback: Phaser.Types.GameObjects.Particles.ParticleEmitterCallback, context: any): this; + + /** + * Calls a function for each inactive particle in this emitter. + * @param callback The function. + * @param context The functions calling context. + */ + forEachDead(callback: Phaser.Types.GameObjects.Particles.ParticleEmitterCallback, context: any): this; + + /** + * Turns {@link Phaser.GameObjects.Particles.ParticleEmitter#on} the emitter and resets the flow counter. + * + * If this emitter is in flow mode (frequency >= 0; the default), the particle flow will start (or restart). + * + * If this emitter is in explode mode (frequency = -1), nothing will happen. + * Use {@link Phaser.GameObjects.Particles.ParticleEmitter#explode} or {@link Phaser.GameObjects.Particles.ParticleEmitter#flow} instead. + * + * Calling this method will emit the `START` event. + * @param advance Advance this number of ms in time through the emitter. Default 0. + * @param duration Limit this emitter to only emit particles for the given number of ms. Setting this parameter will override any duration already set in the Emitter configuration object. Default 0. + */ + start(advance?: number, duration?: number): this; + + /** + * Turns {@link Phaser.GameObjects.Particles.ParticleEmitter#emitting off} the emitter and + * stops it from emitting further particles. Currently alive particles will remain + * active until they naturally expire unless you set the `kill` parameter to `true`. + * + * Calling this method will emit the `STOP` event. When the final particle has + * expired the `COMPLETE` event will be emitted. + * @param kill Kill all particles immediately (true), or leave them to die after their lifespan expires? (false, the default) Default false. + */ + stop(kill?: boolean): this; + + /** + * {@link Phaser.GameObjects.Particles.ParticleEmitter#active Deactivates} the emitter. + */ + pause(): this; + + /** + * {@link Phaser.GameObjects.Particles.ParticleEmitter#active Activates} the emitter. + */ + resume(): this; + + /** + * Set the property by which active particles are sorted prior to be rendered. + * + * It allows you to control the rendering order of the particles. + * + * This can be any valid property of the `Particle` class, such as `y`, `alpha` + * or `lifeT`. + * + * The 'alive' particles array is sorted in place each game frame. Setting a + * sort property will override the `particleBringToTop` setting. + * + * If you wish to use your own sorting function, see `setSortCallback` instead. + * @param property The property on the `Particle` class to sort by. + * @param ascending Should the particles be sorted in ascending or descending order? Default true. + */ + setSortProperty(property?: string, ascending?: boolean): this; + + /** + * Sets a callback to be used to sort the particles before rendering each frame. + * + * This allows you to define your own logic and behavior in the callback. + * + * The callback will be sent two parameters: the two Particles being compared, + * and must adhere to the criteria of the `compareFn` in `Array.sort`: + * + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#description + * + * Call this method with no parameters to reset the sort callback. + * + * Setting your own callback will override both the `particleBringToTop` and + * `sortProperty` settings of this Emitter. + * @param callback The callback to invoke when the particles are sorted. Leave undefined to reset to the default. + */ + setSortCallback(callback?: Phaser.Types.GameObjects.Particles.ParticleSortCallback): this; + + /** + * Sorts active particles with {@link Phaser.GameObjects.Particles.ParticleEmitter#depthSortCallback}. + */ + depthSort(): this; + + /** + * Calculates the difference of two particles, for sorting them by depth. + * @param a The first particle. + * @param b The second particle. + */ + depthSortCallback(a: object, b: object): number; + + /** + * Puts the emitter in flow mode (frequency >= 0) and starts (or restarts) a particle flow. + * + * To resume a flow at the current frequency and quantity, use {@link Phaser.GameObjects.Particles.ParticleEmitter#start} instead. + * @param frequency The time interval (>= 0) of each flow cycle, in ms. + * @param count The number of particles to emit at each flow cycle. Default 1. + * @param stopAfter Stop this emitter from firing any more particles once this value is reached. Set to zero for unlimited. Setting this parameter will override any `stopAfter` value already set in the Emitter configuration object. + */ + flow(frequency: number, count?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType, stopAfter?: number): this; + + /** + * Puts the emitter in explode mode (frequency = -1), stopping any current particle flow, and emits several particles all at once. + * @param count The number of Particles to emit. Default this.quantity. + * @param x The x coordinate to emit the Particles from. Default this.x. + * @param y The y coordinate to emit the Particles from. Default this.x. + */ + explode(count?: number, x?: number, y?: number): Phaser.GameObjects.Particles.Particle | undefined; + + /** + * Emits particles at the given position. If no position is given, it will + * emit from this Emitters current location. + * @param x The x coordinate to emit the Particles from. Default this.x. + * @param y The y coordinate to emit the Particles from. Default this.x. + * @param count The number of Particles to emit. Default this.quantity. + */ + emitParticleAt(x?: number, y?: number, count?: number): Phaser.GameObjects.Particles.Particle | undefined; + + /** + * Emits particles at a given position (or the emitters current position). + * @param count The number of Particles to emit. Default this.quantity. + * @param x The x coordinate to emit the Particles from. Default this.x. + * @param y The y coordinate to emit the Particles from. Default this.x. + */ + emitParticle(count?: number, x?: number, y?: number): Phaser.GameObjects.Particles.Particle | undefined; + + /** + * Fast forwards this Particle Emitter and all of its particles. + * + * Works by running the Emitter `preUpdate` handler in a loop until the `time` + * has been reached at `delta` steps per loop. + * + * All callbacks and emitter related events that would normally be fired + * will still be invoked. + * + * You can make an emitter 'fast forward' via the emitter config using the + * `advance` property. Set this value to the number of ms you wish the + * emitter to be fast-forwarded by. Or, call this method post-creation. + * @param time The number of ms to advance the Particle Emitter by. + * @param delta The amount of delta to use for each step. Defaults to 1000 / 60. + */ + fastForward(time: number, delta?: number): this; + + /** + * Updates this emitter and its particles. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + preUpdate(time: number, delta: number): void; + + /** + * Takes either a Rectangle Geometry object or an Arcade Physics Body and tests + * to see if it intersects with any currently alive Particle in this Emitter. + * + * Overlapping particles are returned in an array, where you can perform further + * processing on them. If nothing overlaps then the array will be empty. + * @param target A Rectangle or Arcade Physics Body to check for intersection against all alive particles. + */ + overlap(target: Phaser.Geom.Rectangle | Phaser.Physics.Arcade.Body): Phaser.GameObjects.Particles.Particle[]; + + /** + * Returns a bounds Rectangle calculated from the bounds of all currently + * _active_ Particles in this Emitter. If this Emitter has only just been + * created and not yet rendered, then calling this method will return a Rectangle + * with a max safe integer for dimensions. Use the `advance` parameter to + * avoid this. + * + * Typically it takes a few seconds for a flow Emitter to 'warm up'. You can + * use the `advance` and `delta` parameters to force the Emitter to + * 'fast forward' in time to try and allow the bounds to be more accurate, + * as it will calculate the bounds based on the particle bounds across all + * timesteps, giving a better result. + * + * You can also use the `padding` parameter to increase the size of the + * bounds. Emitters with a lot of randomness in terms of direction or lifespan + * can often return a bounds smaller than their possible maximum. By using + * the `padding` (and `advance` if needed) you can help limit this. + * @param padding The amount of padding, in pixels, to add to the bounds Rectangle. + * @param advance The number of ms to advance the Particle Emitter by. Defaults to 0, i.e. not used. + * @param delta The amount of delta to use for each step. Defaults to 1000 / 60. + * @param output The Rectangle to store the results in. If not given a new one will be created. + */ + getBounds(padding?: number, advance?: number, delta?: number, output?: Phaser.Geom.Rectangle): Phaser.Geom.Rectangle; + + /** + * Prints a warning to the console if you mistakenly call this function + * thinking it works the same way as Phaser v3.55. + */ + createEmitter(): void; + + /** + * The x coordinate the particles are emitted from. + * + * This is relative to the Emitters x coordinate and that of any parent. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleX: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + + /** + * The y coordinate the particles are emitted from. + * + * This is relative to the Emitters x coordinate and that of any parent. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleY: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + + /** + * The horizontal acceleration applied to emitted particles, in pixels per second squared. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + accelerationX: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The vertical acceleration applied to emitted particles, in pixels per second squared. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + accelerationY: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The maximum horizontal velocity emitted particles can reach, in pixels per second squared. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + maxVelocityX: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The maximum vertical velocity emitted particles can reach, in pixels per second squared. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + maxVelocityY: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The initial speed of emitted particles, in pixels per second. + * + * If using this as a getter it will return the `speedX` value. + * + * If using it as a setter it will update both `speedX` and `speedY` to the + * given value. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + speed: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The initial horizontal speed of emitted particles, in pixels per second. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + speedX: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The initial vertical speed of emitted particles, in pixels per second. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + speedY: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The x coordinate emitted particles move toward, when {@link Phaser.GameObjects.Particles.ParticleEmitter#moveTo} is true. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + moveToX: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The y coordinate emitted particles move toward, when {@link Phaser.GameObjects.Particles.ParticleEmitter#moveTo} is true. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + moveToY: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The amount of velocity particles will use when rebounding off the + * emitter bounds, if set. A value of 0 means no bounce. A value of 1 + * means a full rebound. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + bounce: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The horizontal scale of emitted particles. + * + * This is relative to the Emitters scale and that of any parent. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleScaleX: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The vertical scale of emitted particles. + * + * This is relative to the Emitters scale and that of any parent. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleScaleY: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * A color tint value that is applied to the texture of the emitted + * particle. The value should be given in hex format, i.e. 0xff0000 + * for a red tint, and should not include the alpha channel. + * + * Tints are additive, meaning a tint value of white (0xffffff) will + * effectively reset the tint to nothing. + * + * Modify the `ParticleEmitter.tintFill` property to change between + * an additive and replacement tint mode. + * + * When you define the color via the Emitter config you should give + * it as an array of color values. The Particle will then interpolate + * through these colors over the course of its lifespan. Setting this + * will override any `tint` value that may also be given. + * + * This is a WebGL only feature. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleColor: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * Controls the easing function used when you have created an + * Emitter that uses the `color` property to interpolate the + * tint of Particles over their lifetime. + * + * Setting this has no effect if you haven't also applied a + * `particleColor` to this Emitter. + */ + colorEase: string; + + /** + * A color tint value that is applied to the texture of the emitted + * particle. The value should be given in hex format, i.e. 0xff0000 + * for a red tint, and should not include the alpha channel. + * + * Tints are additive, meaning a tint value of white (0xffffff) will + * effectively reset the tint to nothing. + * + * Modify the `ParticleEmitter.tintFill` property to change between + * an additive and replacement tint mode. + * + * The `tint` value will be overriden if a `color` array is provided. + * + * This is a WebGL only feature. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleTint: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The alpha value of the emitted particles. This is a value + * between 0 and 1. Particles with alpha zero are invisible + * and are therefore not rendered, but are still processed + * by the Emitter. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleAlpha: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The lifespan of the emitted particles. This value is given + * in milliseconds and defaults to 1000ms (1 second). When a + * particle reaches this amount it is killed. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + lifespan: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The angle at which the particles are emitted. The values are + * given in degrees. This allows you to control the direction + * of the emitter. If you wish instead to change the rotation + * of the particles themselves, see the `particleRotate` property. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleAngle: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The rotation (or angle) of each particle when it is emitted. + * The value is given in degrees and uses a right-handed + * coordinate system, where 0 degrees points to the right, 90 degrees + * points down and -90 degrees points up. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleRotate: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The number of particles that are emitted each time an emission + * occurs, i.e. from one 'explosion' or each frame in a 'flow' cycle. + * + * The default is 1. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + quantity: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The number of milliseconds to wait after emission before + * the particles start updating. This allows you to emit particles + * that appear 'static' or still on-screen and then, after this value, + * begin to move. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + delay: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The number of milliseconds to wait after a particle has finished + * its life before it will be removed. This allows you to 'hold' a + * particle on the screen once it has reached its final state + * before it then vanishes. + * + * Note that all particle updates will cease, including changing + * alpha, scale, movement or animation. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + hold: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The internal flow counter. + * + * Treat this property as read-only. + */ + flowCounter: number; + + /** + * The internal frame counter. + * + * Treat this property as read-only. + */ + frameCounter: number; + + /** + * The internal animation counter. + * + * Treat this property as read-only. + */ + animCounter: number; + + /** + * The internal elasped counter. + * + * Treat this property as read-only. + */ + elapsed: number; + + /** + * The internal stop counter. + * + * Treat this property as read-only. + */ + stopCounter: number; + + /** + * The internal complete flag. + * + * Treat this property as read-only. + */ + completeFlag: boolean; + + /** + * The internal zone index. + * + * Treat this property as read-only. + */ + zoneIndex: number; + + /** + * The internal zone total. + * + * Treat this property as read-only. + */ + zoneTotal: number; + + /** + * The current frame index. + * + * Treat this property as read-only. + */ + currentFrame: number; + + /** + * The current animation index. + * + * Treat this property as read-only. + */ + currentAnim: number; + + /** + * Destroys this Particle Emitter and all Particles it owns. + */ + preDestroy(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * This class provides the structured required for all Particle Processors. + * + * You should extend it and add the functionality required for your processor, + * including tidying up any resources this may create in the `destroy` method. + * + * See the GravityWell for an example of a processor. + */ + class ParticleProcessor { + /** + * + * @param x The x coordinate of the Particle Processor, in world space. Default 0. + * @param y The y coordinate of the Particle Processor, in world space. Default 0. + * @param active The active state of this Particle Processor. Default true. + */ + constructor(x?: number, y?: number, active?: boolean); + + /** + * A reference to the Particle Emitter that owns this Processor. + * This is set automatically when the Processor is added to an Emitter + * and nulled when removed or destroyed. + */ + manager: Phaser.GameObjects.Particles.ParticleEmitter; + + /** + * The x coordinate of the Particle Processor, in world space. + */ + x: number; + + /** + * The y coordinate of the Particle Processor, in world space. + */ + y: number; + + /** + * The active state of the Particle Processor. + * + * An inactive Particle Processor will be skipped for processing by + * its parent Emitter. + */ + active: boolean; + + /** + * The Particle Processor update method should be overriden by your own + * method and handle the processing of the particles, typically modifying + * their velocityX/Y values based on the criteria of this processor. + * @param particle The Particle to update. + * @param delta The delta time in ms. + * @param step The delta value divided by 1000. + * @param t The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + */ + update(particle: Phaser.GameObjects.Particles.Particle, delta: number, step: number, t: number): void; + + /** + * Destroys this Particle Processor by removing all external references. + * + * This is called automatically when the owning Particle Emitter is destroyed. + */ + destroy(): void; + + } + + namespace Zones { + /** + * A Death Zone. + * + * A Death Zone is a special type of zone that will kill a Particle as soon as it either enters, or leaves, the zone. + * + * The zone consists of a `source` which could be a Geometric shape, such as a Rectangle or Ellipse, or your own + * object as long as it includes a `contains` method for which the Particles can be tested against. + */ + class DeathZone { + /** + * + * @param source An object instance that has a `contains` method that returns a boolean when given `x` and `y` arguments. + * @param killOnEnter Should the Particle be killed when it enters the zone? `true` or leaves it? `false` + */ + constructor(source: Phaser.Types.GameObjects.Particles.DeathZoneSource, killOnEnter: boolean); + + /** + * An object instance that has a `contains` method that returns a boolean when given `x` and `y` arguments. + * This could be a Geometry shape, such as `Phaser.Geom.Circle`, or your own custom object. + */ + source: Phaser.Types.GameObjects.Particles.DeathZoneSource; + + /** + * Set to `true` if the Particle should be killed if it enters this zone. + * Set to `false` to kill the Particle if it leaves this zone. + */ + killOnEnter: boolean; + + /** + * Checks if the given Particle will be killed or not by this zone. + * @param particle The particle to test against this Death Zones. + */ + willKill(particle: Phaser.GameObjects.Particles.Particle): boolean; + + } + + /** + * A zone that places particles on a shape's edges. + */ + class EdgeZone { + /** + * + * @param source An object instance with a `getPoints(quantity, stepRate)` method returning an array of points. + * @param quantity The number of particles to place on the source edge. Set to 0 to use `stepRate` instead. + * @param stepRate The distance between each particle. When set, `quantity` is implied and should be set to 0. + * @param yoyo Whether particles are placed from start to end and then end to start. Default false. + * @param seamless Whether one endpoint will be removed if it's identical to the other. Default true. + * @param total The total number of particles this zone will emit before passing over to the next emission zone in the Emitter. -1 means it will never pass over and you must use `setEmitZone` to change it. Default -1. + */ + constructor(source: Phaser.Types.GameObjects.Particles.EdgeZoneSource, quantity: number, stepRate?: number, yoyo?: boolean, seamless?: boolean, total?: number); + + /** + * An object instance with a `getPoints(quantity, stepRate)` method returning an array of points. + */ + source: Phaser.Types.GameObjects.Particles.EdgeZoneSource | Phaser.Types.GameObjects.Particles.RandomZoneSource; + + /** + * The points placed on the source edge. + */ + points: Phaser.Geom.Point[]; + + /** + * The number of particles to place on the source edge. Set to 0 to use `stepRate` instead. + */ + quantity: number; + + /** + * The distance between each particle. When set, `quantity` is implied and should be set to 0. + */ + stepRate: number; + + /** + * Whether particles are placed from start to end and then end to start. + */ + yoyo: boolean; + + /** + * The counter used for iterating the EdgeZone's points. + */ + counter: number; + + /** + * Whether one endpoint will be removed if it's identical to the other. + */ + seamless: boolean; + + /** + * The total number of particles this zone will emit before the Emitter + * transfers control over to the next zone in its emission zone list. + * + * By default this is -1, meaning it will never pass over from this + * zone to another one. You can call the `ParticleEmitter.setEmitZone` + * method to change it, or set this value to something else via the + * config, or directly at runtime. + * + * A value of 1 would mean the zones rotate in order, but it can + * be set to any integer value. + */ + total: number; + + /** + * Update the {@link Phaser.GameObjects.Particles.Zones.EdgeZone#points} from the EdgeZone's + * {@link Phaser.GameObjects.Particles.Zones.EdgeZone#source}. + * + * Also updates internal properties. + */ + updateSource(): this; + + /** + * Change the source of the EdgeZone. + * @param source An object instance with a `getPoints(quantity, stepRate)` method returning an array of points. + */ + changeSource(source: Phaser.Types.GameObjects.Particles.EdgeZoneSource): this; + + /** + * Get the next point in the Zone and set its coordinates on the given Particle. + * @param particle The Particle. + */ + getPoint(particle: Phaser.GameObjects.Particles.Particle): void; + + } + + /** + * A zone that places particles randomly within a shapes area. + */ + class RandomZone { + /** + * + * @param source An object instance with a `getRandomPoint(point)` method. + */ + constructor(source: Phaser.Types.GameObjects.Particles.RandomZoneSource); + + /** + * An object instance with a `getRandomPoint(point)` method. + */ + source: Phaser.Types.GameObjects.Particles.RandomZoneSource; + + /** + * The total number of particles this zone will emit before the Emitter + * transfers control over to the next zone in its emission zone list. + * + * By default this is -1, meaning it will never pass over from this + * zone to another one. You can call the `ParticleEmitter.setEmitZone` + * method to change it, or set this value to something else via the + * config, or directly at runtime. + * + * A value of 1 would mean the zones rotate in order, but it can + * be set to any integer value. + */ + total: number; + + /** + * Get the next point in the Zone and set its coordinates on the given Particle. + * @param particle The Particle. + */ + getPoint(particle: Phaser.GameObjects.Particles.Particle): void; + + } + + } + + } + + /** + * A PathFollower Game Object. + * + * A PathFollower is a Sprite Game Object with some extra helpers to allow it to follow a Path automatically. + * + * Anything you can do with a standard Sprite can be done with this PathFollower, such as animate it, tint it, + * scale it and so on. + * + * PathFollowers are bound to a single Path at any one time and can traverse the length of the Path, from start + * to finish, forwards or backwards, or from any given point on the Path to its end. They can optionally rotate + * to face the direction of the path, be offset from the path coordinates or rotate independently of the Path. + */ + class PathFollower extends Phaser.GameObjects.Sprite implements Phaser.GameObjects.Components.PathFollower { + /** + * + * @param scene The Scene to which this PathFollower belongs. + * @param path The Path this PathFollower is following. It can only follow one Path at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, path: Phaser.Curves.Path, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number); + + /** + * If the PathFollower is rotating to match the Path (@see Phaser.GameObjects.PathFollower#rotateToPath) + * this value is added to the rotation value. This allows you to rotate objects to a path but control + * the angle of the rotation as well. + */ + pathRotationOffset: number; + + /** + * An additional vector to add to the PathFollowers position, allowing you to offset it from the + * Path coordinates. + */ + pathOffset: Phaser.Math.Vector2; + + /** + * A Vector2 that stores the current point of the path the follower is on. + */ + pathVector: Phaser.Math.Vector2; + + /** + * The distance the follower has traveled from the previous point to the current one, at the last update. + */ + pathDelta: Phaser.Math.Vector2; + + /** + * The Tween used for following the Path. + */ + pathTween: Phaser.Tweens.Tween; + + /** + * Settings for the PathFollower. + */ + pathConfig: Phaser.Types.GameObjects.PathFollower.PathConfig | null; + + /** + * Internal update handler that advances this PathFollower along the path. + * + * Called automatically by the Scene step, should not typically be called directly. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected preUpdate(time: number, delta: number): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * The Path this PathFollower is following. It can only follow one Path at a time. + */ + path: Phaser.Curves.Path; + + /** + * Should the PathFollower automatically rotate to point in the direction of the Path? + */ + rotateToPath: boolean; + + /** + * Set the Path that this PathFollower should follow. + * + * Optionally accepts {@link Phaser.Types.GameObjects.PathFollower.PathConfig} settings. + * @param path The Path this PathFollower is following. It can only follow one Path at a time. + * @param config Settings for the PathFollower. + */ + setPath(path: Phaser.Curves.Path, config?: number | Phaser.Types.GameObjects.PathFollower.PathConfig | Phaser.Types.Tweens.NumberTweenBuilderConfig): this; + + /** + * Set whether the PathFollower should automatically rotate to point in the direction of the Path. + * @param value Whether the PathFollower should automatically rotate to point in the direction of the Path. + * @param offset Rotation offset in degrees. Default 0. + */ + setRotateToPath(value: boolean, offset?: number): this; + + /** + * Is this PathFollower actively following a Path or not? + * + * To be considered as `isFollowing` it must be currently moving on a Path, and not paused. + */ + isFollowing(): boolean; + + /** + * Starts this PathFollower following its given Path. + * @param config The duration of the follow, or a PathFollower config object. Default {}. + * @param startAt Optional start position of the follow, between 0 and 1. Default 0. + */ + startFollow(config?: number | Phaser.Types.GameObjects.PathFollower.PathConfig | Phaser.Types.Tweens.NumberTweenBuilderConfig, startAt?: number): this; + + /** + * Pauses this PathFollower. It will still continue to render, but it will remain motionless at the + * point on the Path at which you paused it. + */ + pauseFollow(): this; + + /** + * Resumes a previously paused PathFollower. + * + * If the PathFollower was not paused this has no effect. + */ + resumeFollow(): this; + + /** + * Stops this PathFollower from following the path any longer. + * + * This will invoke any 'stop' conditions that may exist on the Path, or for the follower. + */ + stopFollow(): this; + + /** + * Internal update handler that advances this PathFollower along the path. + * + * Called automatically by the Scene step, should not typically be called directly. + */ + pathUpdate(): void; + + } + + /** + * A Plane Game Object. + * + * The Plane Game Object is a helper class that takes the Mesh Game Object and extends it, + * allowing for fast and easy creation of Planes. A Plane is a one-sided grid of cells, + * where you specify the number of cells in each dimension. The Plane can have a texture + * that is either repeated (tiled) across each cell, or applied to the full Plane. + * + * The Plane can then be manipulated in 3D space, with rotation across all 3 axis. + * + * This allows you to create effects not possible with regular Sprites, such as perspective + * distortion. You can also adjust the vertices on a per-vertex basis. Plane data becomes + * part of the WebGL batch, just like standard Sprites, so doesn't introduce any additional + * shader overhead. Because the Plane just generates vertices into the WebGL batch, like any + * other Sprite, you can use all of the common Game Object components on a Plane too, + * such as a custom pipeline, mask, blend mode or texture. + * + * You can use the `uvScroll` and `uvScale` methods to adjust the placement and scaling + * of the texture if this Plane is using a single texture, and not a frame from a texture + * atlas or sprite sheet. + * + * The Plane Game Object also has the Animation component, allowing you to play animations + * across the Plane just as you would with a Sprite. The animation frame size must be fixed + * as the first frame will be the size of the entire animation, for example use a `SpriteSheet`. + * + * Note that the Plane object is WebGL only and does not have a Canvas counterpart. + * + * The Plane origin is always 0.5 x 0.5 and cannot be changed. + */ + class Plane extends Phaser.GameObjects.Mesh { + /** + * + * @param scene The Scene to which this Plane belongs. A Plane can only belong to one Scene at a time. + * @param x The horizontal position of this Plane in the world. + * @param y The vertical position of this Plane in the world. + * @param texture The key, or instance of the Texture this Plane will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Plane is rendering with. + * @param width The width of this Plane, in cells, not pixels. Default 8. + * @param height The height of this Plane, in cells, not pixels. Default 8. + * @param tile Is the texture tiled? I.e. repeated across each cell. Default false. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number, width?: number, height?: number, tile?: boolean); + + /** + * The Animation State component of this Sprite. + * + * This component provides features to apply animations to this Sprite. + * It is responsible for playing, loading, queuing animations for later playback, + * mixing between animations and setting the current animation frame to this Sprite. + */ + anims: Phaser.Animations.AnimationState; + + /** + * The width of this Plane in cells, not pixels. + * + * This value is read-only. To adjust it, see the `setGridSize` method. + */ + readonly gridWidth: number; + + /** + * The height of this Plane in cells, not pixels. + * + * This value is read-only. To adjust it, see the `setGridSize` method. + */ + readonly gridHeight: number; + + /** + * Is the texture of this Plane tiled across all cells, or not? + * + * This value is read-only. To adjust it, see the `setGridSize` method. + */ + readonly isTiled: boolean; + + /** + * Do not change this value. It has no effect other than to break things. + */ + readonly originX: number; + + /** + * Do not change this value. It has no effect other than to break things. + */ + readonly originY: number; + + /** + * Modifies the layout of this Plane by adjusting the grid dimensions to the + * given width and height. The values are given in cells, not pixels. + * + * The `tile` parameter allows you to control if the texture is tiled, or + * applied across the entire Plane? A tiled texture will repeat with one + * iteration per cell. A non-tiled texture will be applied across the whole + * Plane. + * + * Note that if this Plane is using a single texture, not from a texture atlas + * or sprite sheet, then you can use the `Plane.uvScale` method to have much + * more fine-grained control over the texture tiling. + * @param width The width of this Plane, in cells, not pixels. Default 8. + * @param height The height of this Plane, in cells, not pixels. Default 8. + * @param tile Is the texture tiled? I.e. repeated across each cell. Default false. + */ + preDestroy(width?: number, height?: number, tile?: boolean): void; + + /** + * Sets the height of this Plane to match the given value, in pixels. + * + * This adjusts the `Plane.viewPosition.z` value to achieve this. + * + * If no `value` parameter is given, it will set the view height to match + * that of the current texture frame the Plane is using. + * @param value The height, in pixels, to set this Plane view height to. + */ + setViewHeight(value?: number): void; + + /** + * Creates a checkerboard style texture, based on the given colors and alpha + * values and applies it to this Plane, replacing any current texture it may + * have. + * + * The colors are used in an alternating pattern, like a chess board. + * + * Calling this method generates a brand new 16x16 pixel WebGLTexture internally + * and applies it to this Plane. While quite fast to do, you should still be + * mindful of calling this method either extensively, or in tight parts of + * your game. + * @param color1 The odd cell color, specified as a hex value. Default 0xffffff. + * @param color2 The even cell color, specified as a hex value. Default 0x0000ff. + * @param alpha1 The odd cell alpha value, specified as a number between 0 and 255. Default 255. + * @param alpha2 The even cell alpha value, specified as a number between 0 and 255. Default 255. + * @param height The view height of the Plane after creation, in pixels. Default 128. + */ + createCheckerboard(color1?: number, color2?: number, alpha1?: number, alpha2?: number, height?: number): void; + + /** + * If this Plane has a Checkerboard Texture, this method will destroy it + * and reset the internal flag for it. + */ + removeCheckerboard(): void; + + /** + * Start playing the given animation on this Plane. + * + * Animations in Phaser can either belong to the global Animation Manager, or specifically to this Plane. + * + * The benefit of a global animation is that multiple Game Objects can all play the same animation, without + * having to duplicate the data. You can just create it once and then play it on any animating Game Object. + * + * The following code shows how to create a global repeating animation. The animation will be created + * from all of the frames within the sprite sheet that was loaded with the key 'muybridge': + * + * ```javascript + * var config = { + * key: 'run', + * frames: 'muybridge', + * frameRate: 15, + * repeat: -1 + * }; + * + * // This code should be run from within a Scene: + * this.anims.create(config); + * ``` + * + * However, if you wish to create an animation that is unique to this Plane, and this Plane alone, + * you can call the `Animation.create` method instead. It accepts the exact same parameters as when + * creating a global animation, however the resulting data is kept locally in this Plane. + * + * With the animation created, either globally or locally, you can now play it on this Plane: + * + * ```javascript + * const plane = this.add.plane(...); + * plane.play('run'); + * ``` + * + * Alternatively, if you wish to run it at a different frame rate for example, you can pass a config + * object instead: + * + * ```javascript + * const plane = this.add.plane(...); + * plane.play({ key: 'run', frameRate: 24 }); + * ``` + * + * When playing an animation on a Plane it will first check to see if it can find a matching key + * locally within the Plane. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * If you need a Plane to be able to play both local and global animations, make sure they don't + * have conflicting keys. + * + * See the documentation for the `PlayAnimationConfig` config object for more details about this. + * + * Also, see the documentation in the Animation Manager for further details on creating animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If an animation is already playing then ignore this call. Default false. + */ + play(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): this; + + /** + * Start playing the given animation on this Plane, in reverse. + * + * Animations in Phaser can either belong to the global Animation Manager, or specifically to a Game Object. + * + * The benefit of a global animation is that multiple Game Objects can all play the same animation, without + * having to duplicate the data. You can just create it once and then play it on any animating Game Object. + * + * The following code shows how to create a global repeating animation. The animation will be created + * from all of the frames within the sprite sheet that was loaded with the key 'muybridge': + * + * ```javascript + * var config = { + * key: 'run', + * frames: 'muybridge', + * frameRate: 15, + * repeat: -1 + * }; + * + * // This code should be run from within a Scene: + * this.anims.create(config); + * ``` + * + * However, if you wish to create an animation that is unique to this Game Object, and this Game Object alone, + * you can call the `Animation.create` method instead. It accepts the exact same parameters as when + * creating a global animation, however the resulting data is kept locally in this Game Object. + * + * With the animation created, either globally or locally, you can now play it on this Game Object: + * + * ```javascript + * const plane = this.add.plane(...); + * plane.playReverse('run'); + * ``` + * + * Alternatively, if you wish to run it at a different frame rate, for example, you can pass a config + * object instead: + * + * ```javascript + * const plane = this.add.plane(...); + * plane.playReverse({ key: 'run', frameRate: 24 }); + * ``` + * + * When playing an animation on a Game Object it will first check to see if it can find a matching key + * locally within the Game Object. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * If you need a Game Object to be able to play both local and global animations, make sure they don't + * have conflicting keys. + * + * See the documentation for the `PlayAnimationConfig` config object for more details about this. + * + * Also, see the documentation in the Animation Manager for further details on creating animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If an animation is already playing then ignore this call. Default false. + */ + playReverse(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): this; + + /** + * Waits for the specified delay, in milliseconds, then starts playback of the given animation. + * + * If the animation _also_ has a delay value set in its config, it will be **added** to the delay given here. + * + * If an animation is already running and a new animation is given to this method, it will wait for + * the given delay before starting the new animation. + * + * If no animation is currently running, the given one begins after the delay. + * + * When playing an animation on a Game Object it will first check to see if it can find a matching key + * locally within the Game Object. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param delay The delay, in milliseconds, to wait before starting the animation playing. + */ + playAfterDelay(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, delay: number): this; + + /** + * Waits for the current animation to complete the `repeatCount` number of repeat cycles, then starts playback + * of the given animation. + * + * You can use this to ensure there are no harsh jumps between two sets of animations, i.e. going from an + * idle animation to a walking animation, by making them blend smoothly into each other. + * + * If no animation is currently running, the given one will start immediately. + * + * When playing an animation on a Game Object it will first check to see if it can find a matching key + * locally within the Game Object. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param repeatCount How many times should the animation repeat before the next one starts? Default 1. + */ + playAfterRepeat(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, repeatCount?: number): this; + + /** + * Immediately stops the current animation from playing and dispatches the `ANIMATION_STOP` events. + * + * If no animation is playing, no event will be dispatched. + * + * If there is another animation queued (via the `chain` method) then it will start playing immediately. + */ + stop(): this; + + /** + * Stops the current animation from playing after the specified time delay, given in milliseconds. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param delay The number of milliseconds to wait before stopping this animation. + */ + stopAfterDelay(delay: number): this; + + /** + * Stops the current animation from playing after the given number of repeats. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param repeatCount How many times should the animation repeat before stopping? Default 1. + */ + stopAfterRepeat(repeatCount?: number): this; + + /** + * Stops the current animation from playing when it next sets the given frame. + * If this frame doesn't exist within the animation it will not stop it from playing. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param frame The frame to check before stopping this animation. + */ + stopOnFrame(frame: Phaser.Animations.AnimationFrame): this; + + /** + * Runs the preUpdate for this Plane, which will check its Animation State, + * if one is playing, and refresh view / model matrices, if updated. + * @param time The current timestamp. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected preUpdate(time: number, delta: number): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * An internal method that resets the perspective projection for this Plane + * when it changes texture or frame, and also resets the cell UV coordinates, + * if required. + * @param resetUV Reset all of the cell UV coordinates? Default true. + */ + setSizeToFrame(resetUV?: boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Point Light Game Object provides a way to add a point light effect into your game, + * without the expensive shader processing requirements of the traditional Light Game Object. + * + * The difference is that the Point Light renders using a custom shader, designed to give the + * impression of a point light source, of variable radius, intensity and color, in your game. + * However, unlike the Light Game Object, it does not impact any other Game Objects, or use their + * normal maps for calcuations. This makes them extremely fast to render compared to Lights + * and perfect for special effects, such as flickering torches or muzzle flashes. + * + * For maximum performance you should batch Point Light Game Objects together. This means + * ensuring they follow each other consecutively on the display list. Ideally, use a Layer + * Game Object and then add just Point Lights to it, so that it can batch together the rendering + * of the lights. You don't _have_ to do this, and if you've only a handful of Point Lights in + * your game then it's perfectly safe to mix them into the dislay list as normal. However, if + * you're using a large number of them, please consider how they are mixed into the display list. + * + * The renderer will automatically cull Point Lights. Those with a radius that does not intersect + * with the Camera will be skipped in the rendering list. This happens automatically and the + * culled state is refreshed every frame, for every camera. + * + * The origin of a Point Light is always 0.5 and it cannot be changed. + * + * Point Lights are a WebGL only feature and do not have a Canvas counterpart. + */ + class PointLight extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Point Light belongs. A Point Light can only belong to one Scene at a time. + * @param x The horizontal position of this Point Light in the world. + * @param y The vertical position of this Point Light in the world. + * @param color The color of the Point Light, given as a hex value. Default 0xffffff. + * @param radius The radius of the Point Light. Default 128. + * @param intensity The intensity, or color blend, of the Point Light. Default 1. + * @param attenuation The attenuation of the Point Light. This is the reduction of light from the center point. Default 0.1. + */ + constructor(scene: Phaser.Scene, x: number, y: number, color?: number, radius?: number, intensity?: number, attenuation?: number); + + /** + * The color of this Point Light. This property is an instance of a + * Color object, so you can use the methods within it, such as `setTo(r, g, b)` + * to change the color value. + */ + color: Phaser.Display.Color; + + /** + * The intensity of the Point Light. + * + * The colors of the light are multiplied by this value during rendering. + */ + intensity: number; + + /** + * The attenuation of the Point Light. + * + * This value controls the force with which the light falls-off from the center of the light. + * + * Use small float-based values, i.e. 0.1. + */ + attenuation: number; + + /** + * The radius of the Point Light. + */ + radius: number; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Render Texture is a combination of Dynamic Texture and an Image Game Object, that uses the + * Dynamic Texture to display itself with. + * + * A Dynamic Texture is a special texture that allows you to draw textures, frames and most kind of + * Game Objects directly to it. + * + * You can take many complex objects and draw them to this one texture, which can then be used as the + * base texture for other Game Objects, such as Sprites. Should you then update this texture, all + * Game Objects using it will instantly be updated as well, reflecting the changes immediately. + * + * It's a powerful way to generate dynamic textures at run-time that are WebGL friendly and don't invoke + * expensive GPU uploads on each change. + * + * In versions of Phaser before 3.60 a Render Texture was the only way you could create a texture + * like this, that had the ability to be drawn on. But in 3.60 we split the core functions out to + * the Dynamic Texture class as it made a lot more sense for them to reside in there. As a result, + * the Render Texture is now a light-weight shim that sits on-top of an Image Game Object and offers + * proxy methods to the features available from a Dynamic Texture. + * + * **When should you use a Render Texture vs. a Dynamic Texture?** + * + * You should use a Dynamic Texture if the texture is going to be used by multiple Game Objects, + * or you want to use it across multiple Scenes, because textures are globally stored. + * + * You should use a Dynamic Texture if the texture isn't going to be displayed in-game, but is + * instead going to be used for something like a mask or shader. + * + * You should use a Render Texture if you need to display the texture in-game on a single Game Object, + * as it provides the convenience of wrapping an Image and Dynamic Texture together for you. + * + * Under WebGL1, a FrameBuffer, which is what this Dynamic Texture uses internally, cannot be anti-aliased. + * This means that when drawing objects such as Shapes or Graphics instances to this texture, they may appear + * to be drawn with no aliasing around the edges. This is a technical limitation of WebGL1. To get around it, + * create your shape as a texture in an art package, then draw that to this texture. + */ + class RenderTexture extends Phaser.GameObjects.Image { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the Render Texture. Default 32. + * @param height The height of the Render Texture. Default 32. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, width?: number, height?: number); + + /** + * An internal Camera that can be used to move around this Render Texture. + * + * Control it just like you would any Scene Camera. The difference is that it only impacts + * the placement of Game Objects that you then draw to this texture. + * + * You can scroll, zoom and rotate this Camera. + * + * This property is a reference to `RenderTexture.texture.camera`. + */ + camera: Phaser.Cameras.Scene2D.BaseCamera; + + /** + * Sets the internal size of this Render Texture, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Resizes the Render Texture to the new dimensions given. + * + * In WebGL it will destroy and then re-create the frame buffer being used by the Render Texture. + * In Canvas it will resize the underlying canvas element. + * + * Both approaches will erase everything currently drawn to the Render Texture. + * + * If the dimensions given are the same as those already being used, calling this method will do nothing. + * @param width The new width of the Render Texture. + * @param height The new height of the Render Texture. If not specified, will be set the same as the `width`. Default width. + */ + resize(width: number, height?: number): this; + + /** + * Stores a copy of this Render Texture in the Texture Manager using the given key. + * + * After doing this, any texture based Game Object, such as a Sprite, can use the contents of this + * Render Texture by using the texture key: + * + * ```javascript + * var rt = this.add.renderTexture(0, 0, 128, 128); + * + * // Draw something to the Render Texture + * + * rt.saveTexture('doodle'); + * + * this.add.image(400, 300, 'doodle'); + * ``` + * + * Updating the contents of this Render Texture will automatically update _any_ Game Object + * that is using it as a texture. Calling `saveTexture` again will not save another copy + * of the same texture, it will just rename the key of the existing copy. + * + * By default it will create a single base texture. You can add frames to the texture + * by using the `Texture.add` method. After doing this, you can then allow Game Objects + * to use a specific frame from a Render Texture. + * + * If you destroy this Render Texture, any Game Object using it via the Texture Manager will + * stop rendering. Ensure you remove the texture from the Texture Manager and any Game Objects + * using it first, before destroying this Render Texture. + * @param key The unique key to store the texture as within the global Texture Manager. + */ + saveTexture(key: string): Phaser.Textures.DynamicTexture; + + /** + * Fills this Render Texture with the given color. + * + * By default it will fill the entire texture, however you can set it to fill a specific + * rectangular area by using the x, y, width and height arguments. + * + * The color should be given in hex format, i.e. 0xff0000 for red, 0x00ff00 for green, etc. + * @param rgb The color to fill this Render Texture with, such as 0xff0000 for red. + * @param alpha The alpha value used by the fill. Default 1. + * @param x The left coordinate of the fill rectangle. Default 0. + * @param y The top coordinate of the fill rectangle. Default 0. + * @param width The width of the fill rectangle. Default this.width. + * @param height The height of the fill rectangle. Default this.height. + */ + fill(rgb: number, alpha?: number, x?: number, y?: number, width?: number, height?: number): this; + + /** + * Fully clears this Render Texture, erasing everything from it and resetting it back to + * a blank, transparent, texture. + */ + clear(): this; + + /** + * Takes the given texture key and frame and then stamps it at the given + * x and y coordinates. You can use the optional 'config' argument to provide + * lots more options about how the stamp is applied, including the alpha, + * tint, angle, scale and origin. + * + * By default, the frame will stamp on the x/y coordinates based on its center. + * + * If you wish to stamp from the top-left, set the config `originX` and + * `originY` properties both to zero. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. Set to `null` to skip this argument if not required. + * @param x The x position to draw the frame at. Default 0. + * @param y The y position to draw the frame at. Default 0. + * @param config The stamp configuration object, allowing you to set the alpha, tint, angle, scale and origin of the stamp. + */ + stamp(key: string, frame?: string | number, x?: number, y?: number, config?: Phaser.Types.Textures.StampConfig): this; + + /** + * Draws the given object, or an array of objects, to this Render Texture using a blend mode of ERASE. + * This has the effect of erasing any filled pixels present in the objects from this texture. + * + * It can accept any of the following: + * + * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite. + * * Tilemap Layers. + * * A Group. The contents of which will be iterated and drawn in turn. + * * A Container. The contents of which will be iterated fully, and drawn in turn. + * * A Scene Display List. Pass in `Scene.children` to draw the whole list. + * * Another Dynamic Texture, or a Render Texture. + * * A Texture Frame instance. + * * A string. This is used to look-up the texture from the Texture Manager. + * + * Note: You cannot erase a Render Texture from itself. + * + * If passing in a Group or Container it will only draw children that return `true` + * when their `willRender()` method is called. I.e. a Container with 10 children, + * 5 of which have `visible=false` will only draw the 5 visible ones. + * + * If passing in an array of Game Objects it will draw them all, regardless if + * they pass a `willRender` check or not. + * + * You can pass in a string in which case it will look for a texture in the Texture + * Manager matching that string, and draw the base frame. + * + * You can pass in the `x` and `y` coordinates to draw the objects at. The use of + * the coordinates differ based on what objects are being drawn. If the object is + * a Group, Container or Display List, the coordinates are _added_ to the positions + * of the children. For all other types of object, the coordinates are exact. + * + * Calling this method causes the WebGL batch to flush, so it can write the texture + * data to the framebuffer being used internally. The batch is flushed at the end, + * after the entries have been iterated. So if you've a bunch of objects to draw, + * try and pass them in an array in one single call, rather than making lots of + * separate calls. + * @param entries Any renderable Game Object, or Group, Container, Display List, Render Texture, Texture Frame, or an array of any of these. + * @param x The x position to draw the Frame at, or the offset applied to the object. Default 0. + * @param y The y position to draw the Frame at, or the offset applied to the object. Default 0. + */ + erase(entries: any, x?: number, y?: number): this; + + /** + * Draws the given object, or an array of objects, to this Render Texture. + * + * It can accept any of the following: + * + * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite. + * * Tilemap Layers. + * * A Group. The contents of which will be iterated and drawn in turn. + * * A Container. The contents of which will be iterated fully, and drawn in turn. + * * A Scene Display List. Pass in `Scene.children` to draw the whole list. + * * Another Dynamic Texture, or a Render Texture. + * * A Texture Frame instance. + * * A string. This is used to look-up the texture from the Texture Manager. + * + * Note 1: You cannot draw a Render Texture to itself. + * + * Note 2: For Game Objects that have Post FX Pipelines, the pipeline _cannot_ be + * used when drawn to this texture. + * + * If passing in a Group or Container it will only draw children that return `true` + * when their `willRender()` method is called. I.e. a Container with 10 children, + * 5 of which have `visible=false` will only draw the 5 visible ones. + * + * If passing in an array of Game Objects it will draw them all, regardless if + * they pass a `willRender` check or not. + * + * You can pass in a string in which case it will look for a texture in the Texture + * Manager matching that string, and draw the base frame. If you need to specify + * exactly which frame to draw then use the method `drawFrame` instead. + * + * You can pass in the `x` and `y` coordinates to draw the objects at. The use of + * the coordinates differ based on what objects are being drawn. If the object is + * a Group, Container or Display List, the coordinates are _added_ to the positions + * of the children. For all other types of object, the coordinates are exact. + * + * The `alpha` and `tint` values are only used by Texture Frames. + * Game Objects use their own alpha and tint values when being drawn. + * + * Calling this method causes the WebGL batch to flush, so it can write the texture + * data to the framebuffer being used internally. The batch is flushed at the end, + * after the entries have been iterated. So if you've a bunch of objects to draw, + * try and pass them in an array in one single call, rather than making lots of + * separate calls. + * @param entries Any renderable Game Object, or Group, Container, Display List, other Render Texture, Texture Frame or an array of any of these. + * @param x The x position to draw the Frame at, or the offset applied to the object. Default 0. + * @param y The y position to draw the Frame at, or the offset applied to the object. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Game Objects use their own alpha. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. Game Objects use their own tint. WebGL only. Default 0xffffff. + */ + draw(entries: any, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Draws the Texture Frame to the Render Texture at the given position. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * ```javascript + * var rt = this.add.renderTexture(0, 0, 800, 600); + * rt.drawFrame(key, frame); + * ``` + * + * You can optionally provide a position, alpha and tint value to apply to the frame + * before it is drawn. + * + * Calling this method will cause a batch flush, so if you've got a stack of things to draw + * in a tight loop, try using the `draw` method instead. + * + * If you need to draw a Sprite to this Render Texture, use the `draw` method instead. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. Set to `null` to skip this argument if not required. + * @param x The x position to draw the frame at. Default 0. + * @param y The y position to draw the frame at. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. WebGL only. Default 0xffffff. + */ + drawFrame(key: string, frame?: string | number, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Takes the given Texture Frame and draws it to this Render Texture as a fill pattern, + * i.e. in a grid-layout based on the frame dimensions. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * You can optionally provide a position, width, height, alpha and tint value to apply to + * the frames before they are drawn. The position controls the top-left where the repeating + * fill will start from. The width and height control the size of the filled area. + * + * The position can be negative if required, but the dimensions cannot. + * + * Calling this method will cause a batch flush by default. Use the `skipBatch` argument + * to disable this if this call is part of a larger batch draw. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. Set to `null` to skip this argument if not required. + * @param x The x position to start drawing the frames from (can be negative to offset). Default 0. + * @param y The y position to start drawing the frames from (can be negative to offset). Default 0. + * @param width The width of the area to repeat the frame within. Defaults to the width of this Dynamic Texture. Default this.width. + * @param height The height of the area to repeat the frame within. Defaults to the height of this Dynamic Texture. Default this.height. + * @param alpha The alpha to use. Defaults to 1, no alpha. Default 1. + * @param tint WebGL only. The tint color to use. Leave as undefined, or 0xffffff to have no tint. Default 0xffffff. + * @param skipBatch Skip beginning and ending a batch with this call. Use if this is part of a bigger batched draw. Default false. + */ + repeat(key: string, frame?: string | number, x?: number, y?: number, width?: number, height?: number, alpha?: number, tint?: number, skipBatch?: boolean): this; + + /** + * Use this method if you need to batch draw a large number of Game Objects to + * this Render Texture in a single pass, or on a frequent basis. This is especially + * useful under WebGL, however, if your game is using Canvas only, it will not make + * any speed difference in that situation. + * + * This method starts the beginning of a batched draw, unless one is already open. + * + * Batched drawing is faster than calling `draw` in loop, but you must be careful + * to manage the flow of code and remember to call `endDraw()` when you're finished. + * + * If you don't need to draw large numbers of objects it's much safer and easier + * to use the `draw` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * RenderTexture.beginDraw(); + * + * // repeat n times: + * RenderTexture.batchDraw(); + * // or + * RenderTexture.batchDrawFrame(); + * + * // Call once: + * RenderTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Render Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `RenderTexture.texture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + */ + beginDraw(): this; + + /** + * Use this method if you have already called `beginDraw` and need to batch + * draw a large number of objects to this Render Texture. + * + * This method batches the drawing of the given objects to this texture, + * without causing a WebGL bind or batch flush for each one. + * + * It is faster than calling `draw`, but you must be careful to manage the + * flow of code and remember to call `endDraw()`. If you don't need to draw large + * numbers of objects it's much safer and easier to use the `draw` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * RenderTexture.beginDraw(); + * + * // repeat n times: + * RenderTexture.batchDraw(); + * // or + * RenderTexture.batchDrawFrame(); + * + * // Call once: + * RenderTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Render Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `RenderTexture.texture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + * + * This method can accept any of the following: + * + * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite. + * * Tilemap Layers. + * * A Group. The contents of which will be iterated and drawn in turn. + * * A Container. The contents of which will be iterated fully, and drawn in turn. + * * A Scene's Display List. Pass in `Scene.children` to draw the whole list. + * * Another Dynamic Texture or Render Texture. + * * A Texture Frame instance. + * * A string. This is used to look-up a texture from the Texture Manager. + * + * Note: You cannot draw a Render Texture to itself. + * + * If passing in a Group or Container it will only draw children that return `true` + * when their `willRender()` method is called. I.e. a Container with 10 children, + * 5 of which have `visible=false` will only draw the 5 visible ones. + * + * If passing in an array of Game Objects it will draw them all, regardless if + * they pass a `willRender` check or not. + * + * You can pass in a string in which case it will look for a texture in the Texture + * Manager matching that string, and draw the base frame. If you need to specify + * exactly which frame to draw then use the method `drawFrame` instead. + * + * You can pass in the `x` and `y` coordinates to draw the objects at. The use of + * the coordinates differ based on what objects are being drawn. If the object is + * a Group, Container or Display List, the coordinates are _added_ to the positions + * of the children. For all other types of object, the coordinates are exact. + * + * The `alpha` and `tint` values are only used by Texture Frames. + * Game Objects use their own alpha and tint values when being drawn. + * @param entries Any renderable Game Object, or Group, Container, Display List, other Dynamic or Texture, Texture Frame or an array of any of these. + * @param x The x position to draw the Frame at, or the offset applied to the object. Default 0. + * @param y The y position to draw the Frame at, or the offset applied to the object. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Game Objects use their own alpha. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. Game Objects use their own tint. WebGL only. Default 0xffffff. + */ + batchDraw(entries: any, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Use this method if you have already called `beginDraw` and need to batch + * draw a large number of texture frames to this Render Texture. + * + * This method batches the drawing of the given frames to this Render Texture, + * without causing a WebGL bind or batch flush for each one. + * + * It is faster than calling `drawFrame`, but you must be careful to manage the + * flow of code and remember to call `endDraw()`. If you don't need to draw large + * numbers of frames it's much safer and easier to use the `drawFrame` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * RenderTexture.beginDraw(); + * + * // repeat n times: + * RenderTexture.batchDraw(); + * // or + * RenderTexture.batchDrawFrame(); + * + * // Call once: + * RenderTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Render Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `RenderTexture.texture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * You can optionally provide a position, alpha and tint value to apply to the frame + * before it is drawn. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + * @param x The x position to draw the frame at. Default 0. + * @param y The y position to draw the frame at. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Game Objects use their own alpha. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. Game Objects use their own tint. WebGL only. Default 0xffffff. + */ + batchDrawFrame(key: string, frame?: string | number, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Use this method to finish batch drawing to this Render Texture. + * + * Doing so will stop the WebGL Renderer from capturing draws and then blit the + * framebuffer to the Render Target owned by this texture. + * + * Calling this method without first calling `beginDraw` will have no effect. + * + * Batch drawing is faster than calling `draw`, but you must be careful to manage the + * flow of code and remember to call `endDraw()` when you're finished. + * + * If you don't need to draw large numbers of objects it's much safer and easier + * to use the `draw` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * RenderTexture.beginDraw(); + * + * // repeat n times: + * RenderTexture.batchDraw(); + * // or + * RenderTexture.batchDrawFrame(); + * + * // Call once: + * RenderTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Render Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `RenderTexture.texture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + * @param erase Draws all objects in this batch using a blend mode of ERASE. This has the effect of erasing any filled pixels in the objects being drawn. Default false. + */ + endDraw(erase?: boolean): this; + + /** + * Takes a snapshot of the given area of this Render Texture. + * + * The snapshot is taken immediately, but the results are returned via the given callback. + * + * To capture the whole Render Texture see the `snapshot` method. + * To capture just a specific pixel, see the `snapshotPixel` method. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer + * into an ArrayBufferView. It then parses this, copying the contents to a temporary Canvas and finally + * creating an Image object from it, which is the image returned to the callback provided. + * + * All in all, this is a computationally expensive and blocking process, which gets more expensive + * the larger the resolution this Render Texture has, so please be careful how you employ this in your game. + * @param x The x coordinate to grab from. + * @param y The y coordinate to grab from. + * @param width The width of the area to grab. + * @param height The height of the area to grab. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshotArea(x: number, y: number, width: number, height: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Takes a snapshot of the whole of this Render Texture. + * + * The snapshot is taken immediately, but the results are returned via the given callback. + * + * To capture a portion of this Render Texture see the `snapshotArea` method. + * To capture just a specific pixel, see the `snapshotPixel` method. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer + * into an ArrayBufferView. It then parses this, copying the contents to a temporary Canvas and finally + * creating an Image object from it, which is the image returned to the callback provided. + * + * All in all, this is a computationally expensive and blocking process, which gets more expensive + * the larger the resolution this Render Texture has, so please be careful how you employ this in your game. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshot(callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Takes a snapshot of the given pixel from this Render Texture. + * + * The snapshot is taken immediately, but the results are returned via the given callback. + * + * To capture the whole Render Texture see the `snapshot` method. + * To capture a portion of this Render Texture see the `snapshotArea` method. + * + * Unlike the two other snapshot methods, this one will send your callback a `Color` object + * containing the color data for the requested pixel. It doesn't need to create an internal + * Canvas or Image object, so is a lot faster to execute, using less memory than the other snapshot methods. + * @param x The x coordinate of the pixel to get. + * @param y The y coordinate of the pixel to get. + * @param callback The Function to invoke after the snapshot pixel data is extracted. + */ + snapshotPixel(x: number, y: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback): this; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Rope Game Object. + * + * The Rope object is WebGL only and does not have a Canvas counterpart. + * + * A Rope is a special kind of Game Object that has a texture is stretched along its entire length. + * + * Unlike a Sprite, it isn't restricted to using just a quad and can have as many vertices as you define + * when creating it. The vertices can be arranged in a horizontal or vertical strip and have their own + * color and alpha values as well. + * + * A Ropes origin is always 0.5 x 0.5 and cannot be changed. + */ + class Rope extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible, Phaser.GameObjects.Components.ScrollFactor { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param texture The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. If not given, `__DEFAULT` is used. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param points An array containing the vertices data for this Rope, or a number that indicates how many segments to split the texture frame into. If none is provided a simple quad is created. See `setPoints` to set this post-creation. Default 2. + * @param horizontal Should the vertices of this Rope be aligned horizontally (`true`), or vertically (`false`)? Default true. + * @param colors An optional array containing the color data for this Rope. You should provide one color value per pair of vertices. + * @param alphas An optional array containing the alpha data for this Rope. You should provide one alpha value per pair of vertices. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, texture?: string, frame?: string | number | null, points?: number | Phaser.Types.Math.Vector2Like[], horizontal?: boolean, colors?: number[], alphas?: number[]); + + /** + * The Animation State of this Rope. + */ + anims: Phaser.Animations.AnimationState; + + /** + * An array containing the points data for this Rope. + * + * Each point should be given as a Vector2Like object (i.e. a Vector2, Geom.Point or object with public x/y properties). + * + * The point coordinates are given in local space, where 0 x 0 is the start of the Rope strip. + * + * You can modify the contents of this array directly in real-time to create interesting effects. + * If you do so, be sure to call `setDirty` _after_ modifying this array, so that the vertices data is + * updated before the next render. Alternatively, you can use the `setPoints` method instead. + * + * Should you need to change the _size_ of this array, then you should always use the `setPoints` method. + */ + points: Phaser.Types.Math.Vector2Like[]; + + /** + * An array containing the vertices data for this Rope. + * + * This data is calculated automatically in the `updateVertices` method, based on the points provided. + */ + vertices: Float32Array; + + /** + * An array containing the uv data for this Rope. + * + * This data is calculated automatically in the `setPoints` method, based on the points provided. + */ + uv: Float32Array; + + /** + * An array containing the color data for this Rope. + * + * Colors should be given as numeric RGB values, such as 0xff0000. + * You should provide _two_ color values for every point in the Rope, one for the top and one for the bottom of each quad. + * + * You can modify the contents of this array directly in real-time, however, should you need to change the _size_ + * of the array, then you should use the `setColors` method instead. + */ + colors: Uint32Array; + + /** + * An array containing the alpha data for this Rope. + * + * Alphas should be given as float values, such as 0.5. + * You should provide _two_ alpha values for every point in the Rope, one for the top and one for the bottom of each quad. + * + * You can modify the contents of this array directly in real-time, however, should you need to change the _size_ + * of the array, then you should use the `setAlphas` method instead. + */ + alphas: Float32Array; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * If the Rope is marked as `dirty` it will automatically recalculate its vertices + * the next time it renders. You can also force this by calling `updateVertices`. + */ + dirty: boolean; + + /** + * Are the Rope vertices aligned horizontally, in a strip, or vertically, in a column? + * + * This property is set during instantiation and cannot be changed directly. + * See the `setVertical` and `setHorizontal` methods. + */ + readonly horizontal: boolean; + + /** + * You can optionally choose to render the vertices of this Rope to a Graphics instance. + * + * Achieve this by setting the `debugCallback` and the `debugGraphic` properties. + * + * You can do this in a single call via the `Rope.setDebug` method, which will use the + * built-in debug function. You can also set it to your own callback. The callback + * will be invoked _once per render_ and sent the following parameters: + * + * `debugCallback(src, meshLength, verts)` + * + * `src` is the Rope instance being debugged. + * `meshLength` is the number of mesh vertices in total. + * `verts` is an array of the translated vertex coordinates. + * + * To disable rendering, set this property back to `null`. + */ + debugCallback: Function; + + /** + * The Graphics instance that the debug vertices will be drawn to, if `setDebug` has + * been called. + */ + debugGraphic: Phaser.GameObjects.Graphics; + + /** + * The Rope update loop. + * @param time The current timestamp. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected preUpdate(time: number, delta: number): void; + + /** + * Start playing the given animation. + * @param key The string-based key of the animation to play. + * @param ignoreIfPlaying If an animation is already playing then ignore this call. Default false. + * @param startFrame Optionally start the animation playing from this frame index. Default 0. + */ + play(key: string, ignoreIfPlaying?: boolean, startFrame?: number): this; + + /** + * Flags this Rope as being dirty. A dirty rope will recalculate all of its vertices data + * the _next_ time it renders. You should set this rope as dirty if you update the points + * array directly. + */ + setDirty(): this; + + /** + * Sets the alignment of the points in this Rope to be horizontal, in a strip format. + * + * Calling this method will reset this Rope. The current points, vertices, colors and alpha + * values will be reset to thoes values given as parameters. + * @param points An array containing the vertices data for this Rope, or a number that indicates how many segments to split the texture frame into. If none is provided the current points length is used. + * @param colors Either a single color value, or an array of values. + * @param alphas Either a single alpha value, or an array of values. + */ + setHorizontal(points?: number | Phaser.Types.Math.Vector2Like[], colors?: number | number[], alphas?: number | number[]): this; + + /** + * Sets the alignment of the points in this Rope to be vertical, in a column format. + * + * Calling this method will reset this Rope. The current points, vertices, colors and alpha + * values will be reset to thoes values given as parameters. + * @param points An array containing the vertices data for this Rope, or a number that indicates how many segments to split the texture frame into. If none is provided the current points length is used. + * @param colors Either a single color value, or an array of values. + * @param alphas Either a single alpha value, or an array of values. + */ + setVertical(points?: number | Phaser.Types.Math.Vector2Like[], colors?: number | number[], alphas?: number | number[]): this; + + /** + * Sets the tint fill mode. + * + * Mode 0 (`false`) is an additive tint, the default, which blends the vertices colors with the texture. + * This mode respects the texture alpha. + * + * Mode 1 (`true`) is a fill tint. Unlike an additive tint, a fill-tint literally replaces the pixel colors + * from the texture with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. This mode respects the texture alpha. + * + * See the `setColors` method for details of how to color each of the vertices. + * @param value Set to `false` for an Additive tint or `true` fill tint with alpha. Default false. + */ + setTintFill(value?: boolean): this; + + /** + * Set the alpha values used by the Rope during rendering. + * + * You can provide the values in a number of ways: + * + * 1) One single numeric value: `setAlphas(0.5)` - This will set a single alpha for the whole Rope. + * 2) Two numeric value: `setAlphas(1, 0.5)` - This will set a 'top' and 'bottom' alpha value across the whole Rope. + * 3) An array of values: `setAlphas([ 1, 0.5, 0.2 ])` + * + * If you provide an array of values and the array has exactly the same number of values as `points` in the Rope, it + * will use each alpha value per rope segment. + * + * If the provided array has a different number of values than `points` then it will use the values in order, from + * the first Rope segment and on, until it runs out of values. This allows you to control the alpha values at all + * vertices in the Rope. + * + * Note this method is called `setAlphas` (plural) and not `setAlpha`. + * @param alphas Either a single alpha value, or an array of values. If nothing is provided alpha is reset to 1. + * @param bottomAlpha An optional bottom alpha value. See the method description for details. + */ + setAlphas(alphas?: number | number[], bottomAlpha?: number): this; + + /** + * Set the color values used by the Rope during rendering. + * + * Colors are used to control the level of tint applied across the Rope texture. + * + * You can provide the values in a number of ways: + * + * * One single numeric value: `setColors(0xff0000)` - This will set a single color tint for the whole Rope. + * * An array of values: `setColors([ 0xff0000, 0x00ff00, 0x0000ff ])` + * + * If you provide an array of values and the array has exactly the same number of values as `points` in the Rope, it + * will use each color per rope segment. + * + * If the provided array has a different number of values than `points` then it will use the values in order, from + * the first Rope segment and on, until it runs out of values. This allows you to control the color values at all + * vertices in the Rope. + * @param colors Either a single color value, or an array of values. If nothing is provided color is reset to 0xffffff. + */ + setColors(colors?: number | number[]): this; + + /** + * Sets the points used by this Rope. + * + * The points should be provided as an array of Vector2, or vector2-like objects (i.e. those with public x/y properties). + * + * Each point corresponds to one segment of the Rope. The more points in the array, the more segments the rope has. + * + * Point coordinates are given in local-space, not world-space, and are directly related to the size of the texture + * this Rope object is using. + * + * For example, a Rope using a 512 px wide texture, split into 4 segments (128px each) would use the following points: + * + * ```javascript + * rope.setPoints([ + * { x: 0, y: 0 }, + * { x: 128, y: 0 }, + * { x: 256, y: 0 }, + * { x: 384, y: 0 } + * ]); + * ``` + * + * Or, you can provide an integer to do the same thing: + * + * ```javascript + * rope.setPoints(4); + * ``` + * + * Which will divide the Rope into 4 equally sized segments based on the frame width. + * + * Note that calling this method with a different number of points than the Rope has currently will + * _reset_ the color and alpha values, unless you provide them as arguments to this method. + * @param points An array containing the vertices data for this Rope, or a number that indicates how many segments to split the texture frame into. If none is provided a simple quad is created. Default 2. + * @param colors Either a single color value, or an array of values. + * @param alphas Either a single alpha value, or an array of values. + */ + setPoints(points?: number | Phaser.Types.Math.Vector2Like[], colors?: number | number[], alphas?: number | number[]): this; + + /** + * Updates all of the UVs based on the Rope.points and `flipX` and `flipY` settings. + */ + updateUVs(): this; + + /** + * Resizes all of the internal arrays: `vertices`, `uv`, `colors` and `alphas` to the new + * given Rope segment total. + * @param newSize The amount of segments to split the Rope in to. + */ + resizeArrays(newSize: number): this; + + /** + * Updates the vertices based on the Rope points. + * + * This method is called automatically during rendering if `Rope.dirty` is `true`, which is set + * by the `setPoints` and `setDirty` methods. You should flag the Rope as being dirty if you modify + * the Rope points directly. + */ + updateVertices(): this; + + /** + * This method enables rendering of the Rope vertices to the given Graphics instance. + * + * If you enable this feature, you **must** call `Graphics.clear()` in your Scene `update`, + * otherwise the Graphics instance you provide to debug will fill-up with draw calls, + * eventually crashing the browser. This is not done automatically to allow you to debug + * draw multiple Rope objects to a single Graphics instance. + * + * The Rope class has a built-in debug rendering callback `Rope.renderDebugVerts`, however + * you can also provide your own callback to be used instead. Do this by setting the `callback` parameter. + * + * The callback is invoked _once per render_ and sent the following parameters: + * + * `callback(src, meshLength, verts)` + * + * `src` is the Rope instance being debugged. + * `meshLength` is the number of mesh vertices in total. + * `verts` is an array of the translated vertex coordinates. + * + * If using your own callback you do not have to provide a Graphics instance to this method. + * + * To disable debug rendering, to either your own callback or the built-in one, call this method + * with no arguments. + * @param graphic The Graphic instance to render to if using the built-in callback. + * @param callback The callback to invoke during debug render. Leave as undefined to use the built-in callback. + */ + setDebug(graphic?: Phaser.GameObjects.Graphics, callback?: Function): this; + + /** + * The built-in Rope vertices debug rendering method. + * + * See `Rope.setDebug` for more details. + * @param src The Rope object being rendered. + * @param meshLength The number of vertices in the mesh. + * @param verts An array of translated vertex coordinates. + */ + renderDebugVerts(src: Phaser.GameObjects.Rope, meshLength: number, verts: number[]): void; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + } + + /** + * A Shader Game Object. + * + * This Game Object allows you to easily add a quad with its own shader into the display list, and manipulate it + * as you would any other Game Object, including scaling, rotating, positioning and adding to Containers. Shaders + * can be masked with either Bitmap or Geometry masks and can also be used as a Bitmap Mask for a Camera or other + * Game Object. They can also be made interactive and used for input events. + * + * It works by taking a reference to a `Phaser.Display.BaseShader` instance, as found in the Shader Cache. These can + * be created dynamically at runtime, or loaded in via the GLSL File Loader: + * + * ```javascript + * function preload () + * { + * this.load.glsl('fire', 'shaders/fire.glsl.js'); + * } + * + * function create () + * { + * this.add.shader('fire', 400, 300, 512, 512); + * } + * ``` + * + * Please see the Phaser 3 Examples GitHub repo for examples of loading and creating shaders dynamically. + * + * Due to the way in which they work, you cannot directly change the alpha or blend mode of a Shader. This should + * be handled via exposed uniforms in the shader code itself. + * + * By default a Shader will be created with a standard set of uniforms. These were added to match those + * found on sites such as ShaderToy or GLSLSandbox, and provide common functionality a shader may need, + * such as the timestamp, resolution or pointer position. You can replace them by specifying your own uniforms + * in the Base Shader. + * + * These Shaders work by halting the current pipeline during rendering, creating a viewport matched to the + * size of this Game Object and then renders a quad using the bound shader. At the end, the pipeline is restored. + * + * Because it blocks the pipeline it means it will interrupt any batching that is currently going on, so you should + * use these Game Objects sparingly. If you need to have a fully batched custom shader, then please look at using + * a custom pipeline instead. However, for background or special masking effects, they are extremely effective. + */ + class Shader extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.ComputedSize, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param key The key of the shader to use from the shader cache, or a BaseShader instance. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the Game Object. Default 128. + * @param height The height of the Game Object. Default 128. + * @param textures Optional array of texture keys to bind to the iChannel0...3 uniforms. The textures must already exist in the Texture Manager. + * @param textureData Additional texture data if you want to create shader with none NPOT textures. + */ + constructor(scene: Phaser.Scene, key: string | Phaser.Display.BaseShader, x?: number, y?: number, width?: number, height?: number, textures?: string[], textureData?: any); + + /** + * The underlying shader object being used. + * Empty by default and set during a call to the `setShader` method. + */ + shader: Phaser.Display.BaseShader; + + /** + * A reference to the current renderer. + * Shaders only work with the WebGL Renderer. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The WebGL context belonging to the renderer. + */ + gl: WebGLRenderingContext; + + /** + * Raw byte buffer of vertices this Shader uses. + */ + vertexData: ArrayBuffer; + + /** + * The WebGL vertex buffer object this shader uses. + */ + vertexBuffer: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper; + + /** + * The WebGL shader program this shader uses. + */ + program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper; + + /** + * Uint8 view to the vertex raw buffer. Used for uploading vertex buffer resources to the GPU. + */ + bytes: Uint8Array; + + /** + * Float32 view of the array buffer containing the shaders vertices. + */ + vertexViewF32: Float32Array; + + /** + * The view matrix the shader uses during rendering. + */ + readonly viewMatrix: Float32Array; + + /** + * The projection matrix the shader uses during rendering. + */ + readonly projectionMatrix: Float32Array; + + /** + * The default uniform mappings. These can be added to (or replaced) by specifying your own uniforms when + * creating this shader game object. The uniforms are updated automatically during the render step. + * + * The defaults are: + * + * `resolution` (2f) - Set to the size of this shader. + * `time` (1f) - The elapsed game time, in seconds. + * `mouse` (2f) - If a pointer has been bound (with `setPointer`), this uniform contains its position each frame. + * `date` (4fv) - A vec4 containing the year, month, day and time in seconds. + * `sampleRate` (1f) - Sound sample rate. 44100 by default. + * `iChannel0...3` (sampler2D) - Input channels 0 to 3. `null` by default. + */ + uniforms: any; + + /** + * The pointer bound to this shader, if any. + * Set via the chainable `setPointer` method, or by modifying this property directly. + */ + pointer: Phaser.Input.Pointer; + + /** + * A reference to the GL Frame Buffer this Shader is drawing to. + * This property is only set if you have called `Shader.setRenderToTexture`. + */ + framebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper | null; + + /** + * A reference to the WebGLTextureWrapper this Shader is rendering to. + * This property is only set if you have called `Shader.setRenderToTexture`. + */ + glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * A flag that indicates if this Shader has been set to render to a texture instead of the display list. + * + * This property is `true` if you have called `Shader.setRenderToTexture`, otherwise it's `false`. + * + * A Shader that is rendering to a texture _does not_ appear on the display list. + */ + readonly renderToTexture: boolean; + + /** + * A reference to the Phaser.Textures.Texture that has been stored in the Texture Manager for this Shader. + * + * This property is only set if you have called `Shader.setRenderToTexture` with a key, otherwise it is `null`. + */ + texture: Phaser.Textures.Texture; + + /** + * Compares the renderMask with the renderFlags to see if this Game Object will render or not. + * Also checks the Game Object against the given Cameras exclusion list. + * @param camera The Camera to check against this Game Object. + */ + willRender(camera: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Changes this Shader so instead of rendering to the display list it renders to a + * WebGL Framebuffer and WebGL Texture instead. This allows you to use the output + * of this shader as an input for another shader, by mapping a sampler2D uniform + * to it. + * + * After calling this method the `Shader.framebuffer` and `Shader.glTexture` properties + * are populated. + * + * Additionally, you can provide a key to this method. Doing so will create a Phaser Texture + * from this Shader and save it into the Texture Manager, allowing you to then use it for + * any texture-based Game Object, such as a Sprite or Image: + * + * ```javascript + * var shader = this.add.shader('myShader', x, y, width, height); + * + * shader.setRenderToTexture('doodle'); + * + * this.add.image(400, 300, 'doodle'); + * ``` + * + * Note that it stores an active reference to this Shader. That means as this shader updates, + * so does the texture and any object using it to render with. Also, if you destroy this + * shader, be sure to clear any objects that may have been using it as a texture too. + * + * You can access the Phaser Texture that is created via the `Shader.texture` property. + * + * By default it will create a single base texture. You can add frames to the texture + * by using the `Texture.add` method. After doing this, you can then allow Game Objects + * to use a specific frame from a Render Texture. + * @param key The unique key to store the texture as within the global Texture Manager. + * @param flipY Does this texture need vertically flipping before rendering? This should usually be set to `true` if being fed from a buffer. Default false. + */ + setRenderToTexture(key?: string, flipY?: boolean): this; + + /** + * Sets the fragment and, optionally, the vertex shader source code that this Shader will use. + * This will immediately delete the active shader program, if set, and then create a new one + * with the given source. Finally, the shader uniforms are initialized. + * @param key The key of the shader to use from the shader cache, or a BaseShader instance. + * @param textures Optional array of texture keys to bind to the iChannel0...3 uniforms. The textures must already exist in the Texture Manager. + * @param textureData Additional texture data. + */ + setShader(key: string | Phaser.Display.BaseShader, textures?: string[], textureData?: any): this; + + /** + * Binds a Phaser Pointer object to this Shader. + * + * The screen position of the pointer will be set in to the shaders `mouse` uniform + * automatically every frame. Call this method with no arguments to unbind the pointer. + * @param pointer The Pointer to bind to this shader. + */ + setPointer(pointer?: Phaser.Input.Pointer): this; + + /** + * Sets this shader to use an orthographic projection matrix. + * This matrix is stored locally in the `projectionMatrix` property, + * as well as being bound to the `uProjectionMatrix` uniform. + * @param left The left value. + * @param right The right value. + * @param bottom The bottom value. + * @param top The top value. + */ + projOrtho(left: number, right: number, bottom: number, top: number): void; + + /** + * Sets a sampler2D uniform on this shader where the source texture is a WebGLTextureBuffer. + * + * This allows you to feed the output from one Shader into another: + * + * ```javascript + * let shader1 = this.add.shader(baseShader1, 0, 0, 512, 512).setRenderToTexture(); + * let shader2 = this.add.shader(baseShader2, 0, 0, 512, 512).setRenderToTexture('output'); + * + * shader1.setSampler2DBuffer('iChannel0', shader2.glTexture, 512, 512); + * shader2.setSampler2DBuffer('iChannel0', shader1.glTexture, 512, 512); + * ``` + * + * In the above code, the result of baseShader1 is fed into Shader2 as the `iChannel0` sampler2D uniform. + * The result of baseShader2 is then fed back into shader1 again, creating a feedback loop. + * + * If you wish to use an image from the Texture Manager as a sampler2D input for this shader, + * see the `Shader.setSampler2D` method. + * @param uniformKey The key of the sampler2D uniform to be updated, i.e. `iChannel0`. + * @param texture A texture reference. + * @param width The width of the texture. + * @param height The height of the texture. + * @param textureIndex The texture index. Default 0. + * @param textureData Additional texture data. + */ + setSampler2DBuffer(uniformKey: string, texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, width: number, height: number, textureIndex?: number, textureData?: any): this; + + /** + * Sets a sampler2D uniform on this shader. + * + * The textureKey given is the key from the Texture Manager cache. You cannot use a single frame + * from a texture, only the full image. Also, lots of shaders expect textures to be power-of-two sized. + * + * If you wish to use another Shader as a sampler2D input for this shader, see the `Shader.setSampler2DBuffer` method. + * @param uniformKey The key of the sampler2D uniform to be updated, i.e. `iChannel0`. + * @param textureKey The key of the texture, as stored in the Texture Manager. Must already be loaded. + * @param textureIndex The texture index. Default 0. + * @param textureData Additional texture data. + */ + setSampler2D(uniformKey: string, textureKey: string, textureIndex?: number, textureData?: any): this; + + /** + * Sets a property of a uniform already present on this shader. + * + * To modify the value of a uniform such as a 1f or 1i use the `value` property directly: + * + * ```javascript + * shader.setUniform('size.value', 16); + * ``` + * + * You can use dot notation to access deeper values, for example: + * + * ```javascript + * shader.setUniform('resolution.value.x', 512); + * ``` + * + * The change to the uniform will take effect the next time the shader is rendered. + * @param key The key of the uniform to modify. Use dots for deep properties, i.e. `resolution.value.x`. + * @param value The value to set into the uniform. + */ + setUniform(key: string, value: any): this; + + /** + * Returns the uniform object for the given key, or `null` if the uniform couldn't be found. + * @param key The key of the uniform to return the value for. + */ + getUniform(key: string): any; + + /** + * A short-cut method that will directly set the texture being used by the `iChannel0` sampler2D uniform. + * + * The textureKey given is the key from the Texture Manager cache. You cannot use a single frame + * from a texture, only the full image. Also, lots of shaders expect textures to be power-of-two sized. + * @param textureKey The key of the texture, as stored in the Texture Manager. Must already be loaded. + * @param textureData Additional texture data. + */ + setChannel0(textureKey: string, textureData?: any): this; + + /** + * A short-cut method that will directly set the texture being used by the `iChannel1` sampler2D uniform. + * + * The textureKey given is the key from the Texture Manager cache. You cannot use a single frame + * from a texture, only the full image. Also, lots of shaders expect textures to be power-of-two sized. + * @param textureKey The key of the texture, as stored in the Texture Manager. Must already be loaded. + * @param textureData Additional texture data. + */ + setChannel1(textureKey: string, textureData?: any): this; + + /** + * A short-cut method that will directly set the texture being used by the `iChannel2` sampler2D uniform. + * + * The textureKey given is the key from the Texture Manager cache. You cannot use a single frame + * from a texture, only the full image. Also, lots of shaders expect textures to be power-of-two sized. + * @param textureKey The key of the texture, as stored in the Texture Manager. Must already be loaded. + * @param textureData Additional texture data. + */ + setChannel2(textureKey: string, textureData?: any): this; + + /** + * A short-cut method that will directly set the texture being used by the `iChannel3` sampler2D uniform. + * + * The textureKey given is the key from the Texture Manager cache. You cannot use a single frame + * from a texture, only the full image. Also, lots of shaders expect textures to be power-of-two sized. + * @param textureKey The key of the texture, as stored in the Texture Manager. Must already be loaded. + * @param textureData Additional texture data. + */ + setChannel3(textureKey: string, textureData?: any): this; + + /** + * Called automatically during render. + * + * This method performs matrix ITRS and then stores the resulting value in the `uViewMatrix` uniform. + * It then sets up the vertex buffer and shader, updates and syncs the uniforms ready + * for flush to be called. + * @param matrix2D The transform matrix to use during rendering. + */ + load(matrix2D?: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Called automatically during render. + * + * Sets the active shader, loads the vertex buffer and then draws. + */ + flush(): void; + + /** + * Run any logic that was deferred during context loss. + */ + onContextRestored(): void; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Arc Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * When it renders it displays an arc shape. You can control the start and end angles of the arc, + * as well as if the angles are winding clockwise or anti-clockwise. With the default settings + * it renders as a complete circle. By changing the angles you can create other arc shapes, + * such as half-circles. + * + * Arcs also have an `iterations` property and corresponding `setIterations` method. This allows + * you to control how smooth the shape renders in WebGL, by controlling the number of iterations + * that take place during construction. + */ + class Arc extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param radius The radius of the arc. Default 128. + * @param startAngle The start angle of the arc, in degrees. Default 0. + * @param endAngle The end angle of the arc, in degrees. Default 360. + * @param anticlockwise The winding order of the start and end angles. Default false. + * @param fillColor The color the arc will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the arc will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, radius?: number, startAngle?: number, endAngle?: number, anticlockwise?: boolean, fillColor?: number, fillAlpha?: number); + + /** + * The number of iterations used when drawing the arc. + * Increase this value for smoother arcs, at the cost of more polygons being rendered. + * Modify this value by small amounts, such as 0.01. + */ + iterations: number; + + /** + * The radius of the arc. + */ + radius: number; + + /** + * The start angle of the arc, in degrees. + */ + startAngle: number; + + /** + * The end angle of the arc, in degrees. + */ + endAngle: number; + + /** + * The winding order of the start and end angles. + */ + anticlockwise: boolean; + + /** + * Sets the radius of the arc. + * This call can be chained. + * @param value The value to set the radius to. + */ + setRadius(value: number): this; + + /** + * Sets the number of iterations used when drawing the arc. + * Increase this value for smoother arcs, at the cost of more polygons being rendered. + * Modify this value by small amounts, such as 0.01. + * This call can be chained. + * @param value The value to set the iterations to. + */ + setIterations(value: number): this; + + /** + * Sets the starting angle of the arc, in degrees. + * This call can be chained. + * @param value The value to set the starting angle to. + */ + setStartAngle(value: number): this; + + /** + * Sets the ending angle of the arc, in degrees. + * This call can be chained. + * @param value The value to set the ending angle to. + */ + setEndAngle(value: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Curve Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * To render a Curve Shape you must first create a `Phaser.Curves.Curve` object, then pass it to + * the Curve Shape in the constructor. + * + * The Curve shape also has a `smoothness` property and corresponding `setSmoothness` method. + * This allows you to control how smooth the shape renders in WebGL, by controlling the number of iterations + * that take place during construction. Increase and decrease the default value for smoother, or more + * jagged, shapes. + */ + class Curve extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param curve The Curve object to use to create the Shape. + * @param fillColor The color the curve will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the curve will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, curve?: Phaser.Curves.Curve, fillColor?: number, fillAlpha?: number); + + /** + * The smoothness of the curve. The number of points used when rendering it. + * Increase this value for smoother curves, at the cost of more polygons being rendered. + */ + smoothness: number; + + /** + * Sets the smoothness of the curve. The number of points used when rendering it. + * Increase this value for smoother curves, at the cost of more polygons being rendered. + * This call can be chained. + * @param value The value to set the smoothness to. + */ + setSmoothness(value: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Ellipse Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * When it renders it displays an ellipse shape. You can control the width and height of the ellipse. + * If the width and height match it will render as a circle. If the width is less than the height, + * it will look more like an egg shape. + * + * The Ellipse shape also has a `smoothness` property and corresponding `setSmoothness` method. + * This allows you to control how smooth the shape renders in WebGL, by controlling the number of iterations + * that take place during construction. Increase and decrease the default value for smoother, or more + * jagged, shapes. + */ + class Ellipse extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the ellipse. An ellipse with equal width and height renders as a circle. Default 128. + * @param height The height of the ellipse. An ellipse with equal width and height renders as a circle. Default 128. + * @param fillColor The color the ellipse will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the ellipse will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, width?: number, height?: number, fillColor?: number, fillAlpha?: number); + + /** + * The smoothness of the ellipse. The number of points used when rendering it. + * Increase this value for a smoother ellipse, at the cost of more polygons being rendered. + */ + smoothness: number; + + /** + * Sets the size of the ellipse by changing the underlying geometry data, rather than scaling the object. + * This call can be chained. + * @param width The width of the ellipse. + * @param height The height of the ellipse. + */ + setSize(width: number, height: number): this; + + /** + * Sets the smoothness of the ellipse. The number of points used when rendering it. + * Increase this value for a smoother ellipse, at the cost of more polygons being rendered. + * This call can be chained. + * @param value The value to set the smoothness to. + */ + setSmoothness(value: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Grid Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only fill colors and cannot be stroked. + * + * A Grid Shape allows you to display a grid in your game, where you can control the size of the + * grid as well as the width and height of the grid cells. You can set a fill color for each grid + * cell as well as an alternate fill color. When the alternate fill color is set then the grid + * cells will alternate the fill colors as they render, creating a chess-board effect. You can + * also optionally have an outline fill color. If set, this draws lines between the grid cells + * in the given color. If you specify an outline color with an alpha of zero, then it will draw + * the cells spaced out, but without the lines between them. + */ + class Grid extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the grid. Default 128. + * @param height The height of the grid. Default 128. + * @param cellWidth The width of one cell in the grid. Default 32. + * @param cellHeight The height of one cell in the grid. Default 32. + * @param fillColor The color the grid cells will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + * @param outlineFillColor The color of the lines between the grid cells. See the `setOutline` method. + * @param outlineFillAlpha The alpha of the lines between the grid cells. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, width?: number, height?: number, cellWidth?: number, cellHeight?: number, fillColor?: number, fillAlpha?: number, outlineFillColor?: number, outlineFillAlpha?: number); + + /** + * The width of each grid cell. + * Must be a positive value. + */ + cellWidth: number; + + /** + * The height of each grid cell. + * Must be a positive value. + */ + cellHeight: number; + + /** + * Will the grid render its cells in the `fillColor`? + */ + showCells: boolean; + + /** + * The color of the lines between each grid cell. + */ + outlineFillColor: number; + + /** + * The alpha value for the color of the lines between each grid cell. + */ + outlineFillAlpha: number; + + /** + * Will the grid display the lines between each cell when it renders? + */ + showOutline: boolean; + + /** + * Will the grid render the alternating cells in the `altFillColor`? + */ + showAltCells: boolean; + + /** + * The color the alternating grid cells will be filled with, i.e. 0xff0000 for red. + */ + altFillColor: number; + + /** + * The alpha the alternating grid cells will be filled with. + * You can also set the alpha of the overall Shape using its `alpha` property. + */ + altFillAlpha: number; + + /** + * Sets the fill color and alpha level the grid cells will use when rendering. + * + * If this method is called with no values then the grid cells will not be rendered, + * however the grid lines and alternating cells may still be. + * + * Also see the `setOutlineStyle` and `setAltFillStyle` methods. + * + * This call can be chained. + * @param fillColor The color the grid cells will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. Default 1. + */ + setFillStyle(fillColor?: number, fillAlpha?: number): this; + + /** + * Sets the fill color and alpha level that the alternating grid cells will use. + * + * If this method is called with no values then alternating grid cells will not be rendered in a different color. + * + * Also see the `setOutlineStyle` and `setFillStyle` methods. + * + * This call can be chained. + * @param fillColor The color the alternating grid cells will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the alternating grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. Default 1. + */ + setAltFillStyle(fillColor?: number, fillAlpha?: number): this; + + /** + * Sets the fill color and alpha level that the lines between each grid cell will use. + * + * If this method is called with no values then the grid lines will not be rendered at all, however + * the cells themselves may still be if they have colors set. + * + * Also see the `setFillStyle` and `setAltFillStyle` methods. + * + * This call can be chained. + * @param fillColor The color the lines between the grid cells will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the lines between the grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. Default 1. + */ + setOutlineStyle(fillColor?: number, fillAlpha?: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The IsoBox Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only fill colors and cannot be stroked. + * + * An IsoBox is an 'isometric' rectangle. Each face of it has a different fill color. You can set + * the color of the top, left and right faces of the rectangle respectively. You can also choose + * which of the faces are rendered via the `showTop`, `showLeft` and `showRight` properties. + * + * You cannot view an IsoBox from under-neath, however you can change the 'angle' by setting + * the `projection` property. + */ + class IsoBox extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param size The width of the iso box in pixels. The left and right faces will be exactly half this value. Default 48. + * @param height The height of the iso box. The left and right faces will be this tall. The overall height of the isobox will be this value plus half the `size` value. Default 32. + * @param fillTop The fill color of the top face of the iso box. Default 0xeeeeee. + * @param fillLeft The fill color of the left face of the iso box. Default 0x999999. + * @param fillRight The fill color of the right face of the iso box. Default 0xcccccc. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, size?: number, height?: number, fillTop?: number, fillLeft?: number, fillRight?: number); + + /** + * The projection level of the iso box. Change this to change the 'angle' at which you are looking at the box. + */ + projection: number; + + /** + * The color used to fill in the top of the iso box. + */ + fillTop: number; + + /** + * The color used to fill in the left-facing side of the iso box. + */ + fillLeft: number; + + /** + * The color used to fill in the right-facing side of the iso box. + */ + fillRight: number; + + /** + * Controls if the top-face of the iso box be rendered. + */ + showTop: boolean; + + /** + * Controls if the left-face of the iso box be rendered. + */ + showLeft: boolean; + + /** + * Controls if the right-face of the iso box be rendered. + */ + showRight: boolean; + + /** + * Sets the projection level of the iso box. Change this to change the 'angle' at which you are looking at the box. + * This call can be chained. + * @param value The value to set the projection to. + */ + setProjection(value: number): this; + + /** + * Sets which faces of the iso box will be rendered. + * This call can be chained. + * @param showTop Show the top-face of the iso box. Default true. + * @param showLeft Show the left-face of the iso box. Default true. + * @param showRight Show the right-face of the iso box. Default true. + */ + setFaces(showTop?: boolean, showLeft?: boolean, showRight?: boolean): this; + + /** + * Sets the fill colors for each face of the iso box. + * This call can be chained. + * @param fillTop The color used to fill the top of the iso box. + * @param fillLeft The color used to fill in the left-facing side of the iso box. + * @param fillRight The color used to fill in the right-facing side of the iso box. + */ + setFillStyle(fillTop?: number, fillLeft?: number, fillRight?: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The IsoTriangle Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only fill colors and cannot be stroked. + * + * An IsoTriangle is an 'isometric' triangle. Think of it like a pyramid. Each face has a different + * fill color. You can set the color of the top, left and right faces of the triangle respectively + * You can also choose which of the faces are rendered via the `showTop`, `showLeft` and `showRight` properties. + * + * You cannot view an IsoTriangle from under-neath, however you can change the 'angle' by setting + * the `projection` property. The `reversed` property controls if the IsoTriangle is rendered upside + * down or not. + */ + class IsoTriangle extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param size The width of the iso triangle in pixels. The left and right faces will be exactly half this value. Default 48. + * @param height The height of the iso triangle. The left and right faces will be this tall. The overall height of the iso triangle will be this value plus half the `size` value. Default 32. + * @param reversed Is the iso triangle upside down? Default false. + * @param fillTop The fill color of the top face of the iso triangle. Default 0xeeeeee. + * @param fillLeft The fill color of the left face of the iso triangle. Default 0x999999. + * @param fillRight The fill color of the right face of the iso triangle. Default 0xcccccc. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, size?: number, height?: number, reversed?: boolean, fillTop?: number, fillLeft?: number, fillRight?: number); + + /** + * The projection level of the iso box. Change this to change the 'angle' at which you are looking at the box. + */ + projection: number; + + /** + * The color used to fill in the top of the iso triangle. This is only used if the triangle is reversed. + */ + fillTop: number; + + /** + * The color used to fill in the left-facing side of the iso triangle. + */ + fillLeft: number; + + /** + * The color used to fill in the right-facing side of the iso triangle. + */ + fillRight: number; + + /** + * Controls if the top-face of the iso triangle be rendered. + */ + showTop: boolean; + + /** + * Controls if the left-face of the iso triangle be rendered. + */ + showLeft: boolean; + + /** + * Controls if the right-face of the iso triangle be rendered. + */ + showRight: boolean; + + /** + * Sets if the iso triangle will be rendered upside down or not. + */ + isReversed: boolean; + + /** + * Sets the projection level of the iso triangle. Change this to change the 'angle' at which you are looking at the pyramid. + * This call can be chained. + * @param value The value to set the projection to. + */ + setProjection(value: number): this; + + /** + * Sets if the iso triangle will be rendered upside down or not. + * This call can be chained. + * @param reversed Sets if the iso triangle will be rendered upside down or not. + */ + setReversed(reversed: boolean): this; + + /** + * Sets which faces of the iso triangle will be rendered. + * This call can be chained. + * @param showTop Show the top-face of the iso triangle (only if `reversed` is true) Default true. + * @param showLeft Show the left-face of the iso triangle. Default true. + * @param showRight Show the right-face of the iso triangle. Default true. + */ + setFaces(showTop?: boolean, showLeft?: boolean, showRight?: boolean): this; + + /** + * Sets the fill colors for each face of the iso triangle. + * This call can be chained. + * @param fillTop The color used to fill the top of the iso triangle. + * @param fillLeft The color used to fill in the left-facing side of the iso triangle. + * @param fillRight The color used to fill in the right-facing side of the iso triangle. + */ + setFillStyle(fillTop?: number, fillLeft?: number, fillRight?: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Line Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only stroke colors and cannot be filled. + * + * A Line Shape allows you to draw a line between two points in your game. You can control the + * stroke color and thickness of the line. In WebGL only you can also specify a different + * thickness for the start and end of the line, allowing you to render lines that taper-off. + * + * If you need to draw multiple lines in a sequence you may wish to use the Polygon Shape instead. + * + * Be aware that as with all Game Objects the default origin is 0.5. If you need to draw a Line + * between two points and want the x1/y1 values to match the x/y values, then set the origin to 0. + */ + class Line extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param x1 The horizontal position of the start of the line. Default 0. + * @param y1 The vertical position of the start of the line. Default 0. + * @param x2 The horizontal position of the end of the line. Default 128. + * @param y2 The vertical position of the end of the line. Default 0. + * @param strokeColor The color the line will be drawn in, i.e. 0xff0000 for red. + * @param strokeAlpha The alpha the line will be drawn in. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, x1?: number, y1?: number, x2?: number, y2?: number, strokeColor?: number, strokeAlpha?: number); + + /** + * The width (or thickness) of the line. + * See the setLineWidth method for extra details on changing this on WebGL. + */ + lineWidth: number; + + /** + * Sets the width of the line. + * + * When using the WebGL renderer you can have different start and end widths. + * When using the Canvas renderer only the `startWidth` value is used. The `endWidth` is ignored. + * + * This call can be chained. + * @param startWidth The start width of the line. + * @param endWidth The end width of the line. Only used in WebGL. + */ + setLineWidth(startWidth: number, endWidth?: number): this; + + /** + * Sets the start and end coordinates of this Line. + * @param x1 The horizontal position of the start of the line. Default 0. + * @param y1 The vertical position of the start of the line. Default 0. + * @param x2 The horizontal position of the end of the line. Default 0. + * @param y2 The vertical position of the end of the line. Default 0. + */ + setTo(x1?: number, y1?: number, x2?: number, y2?: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Polygon Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * The Polygon Shape is created by providing a list of points, which are then used to create an + * internal Polygon geometry object. The points can be set from a variety of formats: + * + * - A string containing paired values separated by a single space: `'40 0 40 20 100 20 100 80 40 80 40 100 0 50'` + * - An array of Point or Vector2 objects: `[new Phaser.Math.Vector2(x1, y1), ...]` + * - An array of objects with public x/y properties: `[obj1, obj2, ...]` + * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]` + * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]` + * + * By default the `x` and `y` coordinates of this Shape refer to the center of it. However, depending + * on the coordinates of the points provided, the final shape may be rendered offset from its origin. + * + * Note: The method `getBounds` will return incorrect bounds if any of the points in the Polygon are negative. + * If this is the case, please use the function `Phaser.Geom.Polygon.GetAABB(polygon.geom)` instead and then + * adjust the returned Rectangle position accordingly. + */ + class Polygon extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param points The points that make up the polygon. + * @param fillColor The color the polygon will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the polygon will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, points?: any, fillColor?: number, fillAlpha?: number); + + /** + * Smooths the polygon over the number of iterations specified. + * The base polygon data will be updated and replaced with the smoothed values. + * This call can be chained. + * @param iterations The number of times to apply the polygon smoothing. Default 1. + */ + smooth(iterations?: number): this; + + /** + * Sets this Polygon to the given points. + * + * The points can be set from a variety of formats: + * + * - A string containing paired values separated by a single space: `'40 0 40 20 100 20 100 80 40 80 40 100 0 50'` + * - An array of Point objects: `[new Phaser.Point(x1, y1), ...]` + * - An array of objects with public x/y properties: `[obj1, obj2, ...]` + * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]` + * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]` + * + * Calling this method will reset the size (width, height) and display origin of this Shape. + * + * It also runs both GetAABB and EarCut on the given points, so please be careful not to do this + * at a high frequency, or with too many points. + * @param points Points defining the perimeter of this polygon. Please check function description above for the different supported formats. + */ + setTo(points?: string | number[] | Phaser.Types.Math.Vector2Like[]): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Rectangle Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * You can change the size of the rectangle by changing the `width` and `height` properties. + */ + class Rectangle extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param width The width of the rectangle. Default 128. + * @param height The height of the rectangle. Default 128. + * @param fillColor The color the rectangle will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the rectangle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x: number, y: number, width?: number, height?: number, fillColor?: number, fillAlpha?: number); + + /** + * Sets the internal size of this Rectangle, as used for frame or physics body creation. + * + * If you have assigned a custom input hit area for this Rectangle, changing the Rectangle size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Shape Game Object is a base class for the various different shapes, such as the Arc, Star or Polygon. + * You cannot add a Shape directly to your Scene, it is meant as a base for your own custom Shape classes. + */ + class Shape extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param type The internal type of the Shape. + * @param data The data of the source shape geometry, if any. + */ + constructor(scene: Phaser.Scene, type?: string, data?: any); + + /** + * The source Shape data. Typically a geometry object. + * You should not manipulate this directly. + */ + readonly geom: any; + + /** + * Holds the polygon path data for filled rendering. + */ + readonly pathData: number[]; + + /** + * Holds the earcut polygon path index data for filled rendering. + */ + readonly pathIndexes: number[]; + + /** + * The fill color used by this Shape. + */ + fillColor: number; + + /** + * The fill alpha value used by this Shape. + */ + fillAlpha: number; + + /** + * The stroke color used by this Shape. + */ + strokeColor: number; + + /** + * The stroke alpha value used by this Shape. + */ + strokeAlpha: number; + + /** + * The stroke line width used by this Shape. + */ + lineWidth: number; + + /** + * Controls if this Shape is filled or not. + * Note that some Shapes do not support being filled (such as Line shapes) + */ + isFilled: boolean; + + /** + * Controls if this Shape is stroked or not. + * Note that some Shapes do not support being stroked (such as Iso Box shapes) + */ + isStroked: boolean; + + /** + * Controls if this Shape path is closed during rendering when stroked. + * Note that some Shapes are always closed when stroked (such as Ellipse shapes) + */ + closePath: boolean; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * Sets the fill color and alpha for this Shape. + * + * If you wish for the Shape to not be filled then call this method with no arguments, or just set `isFilled` to `false`. + * + * Note that some Shapes do not support fill colors, such as the Line shape. + * + * This call can be chained. + * @param color The color used to fill this shape. If not provided the Shape will not be filled. + * @param alpha The alpha value used when filling this shape, if a fill color is given. Default 1. + */ + setFillStyle(color?: number, alpha?: number): this; + + /** + * Sets the stroke color and alpha for this Shape. + * + * If you wish for the Shape to not be stroked then call this method with no arguments, or just set `isStroked` to `false`. + * + * Note that some Shapes do not support being stroked, such as the Iso Box shape. + * + * This call can be chained. + * @param lineWidth The width of line to stroke with. If not provided or undefined the Shape will not be stroked. + * @param color The color used to stroke this shape. If not provided the Shape will not be stroked. + * @param alpha The alpha value used when stroking this shape, if a stroke color is given. Default 1. + */ + setStrokeStyle(lineWidth?: number, color?: number, alpha?: number): this; + + /** + * Sets if this Shape path is closed during rendering when stroked. + * Note that some Shapes are always closed when stroked (such as Ellipse shapes) + * + * This call can be chained. + * @param value Set to `true` if the Shape should be closed when stroked, otherwise `false`. + */ + setClosePath(value: boolean): this; + + /** + * Sets the display size of this Shape. + * + * Calling this will adjust the scale. + * @param width The display width of this Shape. + * @param height The display height of this Shape. + */ + setDisplaySize(width: number, height: number): this; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Star Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * As the name implies, the Star shape will display a star in your game. You can control several + * aspects of it including the number of points that constitute the star. The default is 5. If + * you change it to 4 it will render as a diamond. If you increase them, you'll get a more spiky + * star shape. + * + * You can also control the inner and outer radius, which is how 'long' each point of the star is. + * Modify these values to create more interesting shapes. + */ + class Star extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param points The number of points on the star. Default 5. + * @param innerRadius The inner radius of the star. Default 32. + * @param outerRadius The outer radius of the star. Default 64. + * @param fillColor The color the star will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the star will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, points?: number, innerRadius?: number, outerRadius?: number, fillColor?: number, fillAlpha?: number); + + /** + * Sets the number of points that make up the Star shape. + * This call can be chained. + * @param value The amount of points the Star will have. + */ + setPoints(value: number): this; + + /** + * Sets the inner radius of the Star shape. + * This call can be chained. + * @param value The amount to set the inner radius to. + */ + setInnerRadius(value: number): this; + + /** + * Sets the outer radius of the Star shape. + * This call can be chained. + * @param value The amount to set the outer radius to. + */ + setOuterRadius(value: number): this; + + /** + * The number of points that make up the Star shape. + */ + points: number; + + /** + * The inner radius of the Star shape. + */ + innerRadius: number; + + /** + * The outer radius of the Star shape. + */ + outerRadius: number; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Triangle Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * The Triangle consists of 3 lines, joining up to form a triangular shape. You can control the + * position of each point of these lines. The triangle is always closed and cannot have an open + * face. If you require that, consider using a Polygon instead. + */ + class Triangle extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param x1 The horizontal position of the first point in the triangle. Default 0. + * @param y1 The vertical position of the first point in the triangle. Default 128. + * @param x2 The horizontal position of the second point in the triangle. Default 64. + * @param y2 The vertical position of the second point in the triangle. Default 0. + * @param x3 The horizontal position of the third point in the triangle. Default 128. + * @param y3 The vertical position of the third point in the triangle. Default 128. + * @param fillColor The color the triangle will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the triangle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, x1?: number, y1?: number, x2?: number, y2?: number, x3?: number, y3?: number, fillColor?: number, fillAlpha?: number); + + /** + * Sets the data for the lines that make up this Triangle shape. + * @param x1 The horizontal position of the first point in the triangle. Default 0. + * @param y1 The vertical position of the first point in the triangle. Default 0. + * @param x2 The horizontal position of the second point in the triangle. Default 0. + * @param y2 The vertical position of the second point in the triangle. Default 0. + * @param x3 The horizontal position of the third point in the triangle. Default 0. + * @param y3 The vertical position of the third point in the triangle. Default 0. + */ + setTo(x1?: number, y1?: number, x2?: number, y2?: number, x3?: number, y3?: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Sprite Game Object. + * + * A Sprite Game Object is used for the display of both static and animated images in your game. + * Sprites can have input events and physics bodies. They can also be tweened, tinted, scrolled + * and animated. + * + * The main difference between a Sprite and an Image Game Object is that you cannot animate Images. + * As such, Sprites take a fraction longer to process and have a larger API footprint due to the Animation + * Component. If you do not require animation then you can safely use Images to replace Sprites in all cases. + */ + class Sprite extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.TextureCrop, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number); + + /** + * The Animation State component of this Sprite. + * + * This component provides features to apply animations to this Sprite. + * It is responsible for playing, loading, queuing animations for later playback, + * mixing between animations and setting the current animation frame to this Sprite. + */ + anims: Phaser.Animations.AnimationState; + + /** + * Update this Sprite's animations. + * @param time The current timestamp. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected preUpdate(time: number, delta: number): void; + + /** + * Start playing the given animation on this Sprite. + * + * Animations in Phaser can either belong to the global Animation Manager, or specifically to this Sprite. + * + * The benefit of a global animation is that multiple Sprites can all play the same animation, without + * having to duplicate the data. You can just create it once and then play it on any Sprite. + * + * The following code shows how to create a global repeating animation. The animation will be created + * from all of the frames within the sprite sheet that was loaded with the key 'muybridge': + * + * ```javascript + * var config = { + * key: 'run', + * frames: 'muybridge', + * frameRate: 15, + * repeat: -1 + * }; + * + * // This code should be run from within a Scene: + * this.anims.create(config); + * ``` + * + * However, if you wish to create an animation that is unique to this Sprite, and this Sprite alone, + * you can call the `Animation.create` method instead. It accepts the exact same parameters as when + * creating a global animation, however the resulting data is kept locally in this Sprite. + * + * With the animation created, either globally or locally, you can now play it on this Sprite: + * + * ```javascript + * this.add.sprite(x, y).play('run'); + * ``` + * + * Alternatively, if you wish to run it at a different frame rate, for example, you can pass a config + * object instead: + * + * ```javascript + * this.add.sprite(x, y).play({ key: 'run', frameRate: 24 }); + * ``` + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * If you need a Sprite to be able to play both local and global animations, make sure they don't + * have conflicting keys. + * + * See the documentation for the `PlayAnimationConfig` config object for more details about this. + * + * Also, see the documentation in the Animation Manager for further details on creating animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If an animation is already playing then ignore this call. Default false. + */ + play(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): this; + + /** + * Start playing the given animation on this Sprite, in reverse. + * + * Animations in Phaser can either belong to the global Animation Manager, or specifically to this Sprite. + * + * The benefit of a global animation is that multiple Sprites can all play the same animation, without + * having to duplicate the data. You can just create it once and then play it on any Sprite. + * + * The following code shows how to create a global repeating animation. The animation will be created + * from all of the frames within the sprite sheet that was loaded with the key 'muybridge': + * + * ```javascript + * var config = { + * key: 'run', + * frames: 'muybridge', + * frameRate: 15, + * repeat: -1 + * }; + * + * // This code should be run from within a Scene: + * this.anims.create(config); + * ``` + * + * However, if you wish to create an animation that is unique to this Sprite, and this Sprite alone, + * you can call the `Animation.create` method instead. It accepts the exact same parameters as when + * creating a global animation, however the resulting data is kept locally in this Sprite. + * + * With the animation created, either globally or locally, you can now play it on this Sprite: + * + * ```javascript + * this.add.sprite(x, y).playReverse('run'); + * ``` + * + * Alternatively, if you wish to run it at a different frame rate, for example, you can pass a config + * object instead: + * + * ```javascript + * this.add.sprite(x, y).playReverse({ key: 'run', frameRate: 24 }); + * ``` + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * If you need a Sprite to be able to play both local and global animations, make sure they don't + * have conflicting keys. + * + * See the documentation for the `PlayAnimationConfig` config object for more details about this. + * + * Also, see the documentation in the Animation Manager for further details on creating animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If an animation is already playing then ignore this call. Default false. + */ + playReverse(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): this; + + /** + * Waits for the specified delay, in milliseconds, then starts playback of the given animation. + * + * If the animation _also_ has a delay value set in its config, it will be **added** to the delay given here. + * + * If an animation is already running and a new animation is given to this method, it will wait for + * the given delay before starting the new animation. + * + * If no animation is currently running, the given one begins after the delay. + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * Prior to Phaser 3.50 this method was called 'delayedPlay'. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param delay The delay, in milliseconds, to wait before starting the animation playing. + */ + playAfterDelay(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, delay: number): this; + + /** + * Waits for the current animation to complete the `repeatCount` number of repeat cycles, then starts playback + * of the given animation. + * + * You can use this to ensure there are no harsh jumps between two sets of animations, i.e. going from an + * idle animation to a walking animation, by making them blend smoothly into each other. + * + * If no animation is currently running, the given one will start immediately. + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param repeatCount How many times should the animation repeat before the next one starts? Default 1. + */ + playAfterRepeat(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, repeatCount?: number): this; + + /** + * Sets an animation, or an array of animations, to be played immediately after the current one completes or stops. + * + * The current animation must enter a 'completed' state for this to happen, i.e. finish all of its repeats, delays, etc, + * or have the `stop` method called directly on it. + * + * An animation set to repeat forever will never enter a completed state. + * + * You can chain a new animation at any point, including before the current one starts playing, during it, + * or when it ends (via its `animationcomplete` event). + * + * Chained animations are specific to a Game Object, meaning different Game Objects can have different chained + * animations without impacting the animation they're playing. + * + * Call this method with no arguments to reset all currently chained animations. + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object, or an array of them. + */ + chain(key?: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig | string[] | Phaser.Animations.Animation[] | Phaser.Types.Animations.PlayAnimationConfig[]): this; + + /** + * Immediately stops the current animation from playing and dispatches the `ANIMATION_STOP` events. + * + * If no animation is playing, no event will be dispatched. + * + * If there is another animation queued (via the `chain` method) then it will start playing immediately. + */ + stop(): this; + + /** + * Stops the current animation from playing after the specified time delay, given in milliseconds. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param delay The number of milliseconds to wait before stopping this animation. + */ + stopAfterDelay(delay: number): this; + + /** + * Stops the current animation from playing after the given number of repeats. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param repeatCount How many times should the animation repeat before stopping? Default 1. + */ + stopAfterRepeat(repeatCount?: number): this; + + /** + * Stops the current animation from playing when it next sets the given frame. + * If this frame doesn't exist within the animation it will not stop it from playing. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param frame The frame to check before stopping this animation. + */ + stopOnFrame(frame: Phaser.Animations.AnimationFrame): this; + + /** + * Build a JSON representation of this Sprite. + */ + toJSON(): Phaser.Types.GameObjects.JSONGameObject; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * Returns an object containing dimensions of the Text object. + * @param text The Text object to calculate the size from. + * @param size The Text metrics to use when calculating the size. + * @param lines The lines of text to calculate the size from. + */ + function GetTextSize(text: Phaser.GameObjects.Text, size: Phaser.Types.GameObjects.Text.TextMetrics, lines: string[]): Phaser.Types.GameObjects.Text.GetTextSizeObject; + + /** + * Calculates the ascent, descent and fontSize of a given font style. + * @param textStyle The TextStyle object to measure. + */ + function MeasureText(textStyle: Phaser.GameObjects.TextStyle): Phaser.Types.GameObjects.Text.TextMetrics; + + /** + * A Text Game Object. + * + * Text objects work by creating their own internal hidden Canvas and then renders text to it using + * the standard Canvas `fillText` API. It then creates a texture from this canvas which is rendered + * to your game during the render pass. + * + * Because it uses the Canvas API you can take advantage of all the features this offers, such as + * applying gradient fills to the text, or strokes, shadows and more. You can also use custom fonts + * loaded externally, such as Google or TypeKit Web fonts. + * + * **Important:** The font name must be quoted if it contains certain combinations of digits or + * special characters, either when creating the Text object, or when setting the font via `setFont` + * or `setFontFamily`, e.g.: + * + * ```javascript + * this.add.text(0, 0, 'Hello World', { fontFamily: 'Georgia, "Goudy Bookletter 1911", Times, serif' }); + * ``` + * + * ```javascript + * this.add.text(0, 0, 'Hello World', { font: '"Press Start 2P"' }); + * ``` + * + * You can only display fonts that are currently loaded and available to the browser: therefore fonts must + * be pre-loaded. Phaser does not do this for you, so you will require the use of a 3rd party font loader, + * or have the fonts ready available in the CSS on the page in which your Phaser game resides. + * + * See {@link http://www.jordanm.co.uk/tinytype this compatibility table} for the available default fonts + * across mobile browsers. + * + * A note on performance: Every time the contents of a Text object changes, i.e. changing the text being + * displayed, or the style of the text, it needs to remake the Text canvas, and if on WebGL, re-upload the + * new texture to the GPU. This can be an expensive operation if used often, or with large quantities of + * Text objects in your game. If you run into performance issues you would be better off using Bitmap Text + * instead, as it benefits from batching and avoids expensive Canvas API calls. + */ + class Text extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.ComputedSize, Phaser.GameObjects.Components.Crop, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param text The text this Text object will display. + * @param style The text style configuration object. + */ + constructor(scene: Phaser.Scene, x: number, y: number, text: string | string[], style: Phaser.Types.GameObjects.Text.TextStyle); + + /** + * The renderer in use by this Text object. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The canvas element that the text is rendered to. + */ + canvas: HTMLCanvasElement; + + /** + * The context of the canvas element that the text is rendered to. + */ + context: CanvasRenderingContext2D; + + /** + * The Text Style object. + * + * Manages the style of this Text object. + */ + style: Phaser.GameObjects.TextStyle; + + /** + * Whether to automatically round line positions. + */ + autoRound: boolean; + + /** + * The Regular Expression that is used to split the text up into lines, in + * multi-line text. By default this is `/(?:\r\n|\r|\n)/`. + * You can change this RegExp to be anything else that you may need. + */ + splitRegExp: object; + + /** + * Specify a padding value which is added to the line width and height when calculating the Text size. + * Allows you to add extra spacing if the browser is unable to accurately determine the true font dimensions. + */ + padding: Phaser.Types.GameObjects.Text.TextPadding; + + /** + * The width of this Text object. + */ + width: number; + + /** + * The height of this Text object. + */ + height: number; + + /** + * The line spacing value. + * This value is added to the font height to calculate the overall line height. + * Only has an effect if this Text object contains multiple lines of text. + * + * If you update this property directly, instead of using the `setLineSpacing` method, then + * be sure to call `updateText` after, or you won't see the change reflected in the Text object. + */ + lineSpacing: number; + + /** + * Adds / Removes spacing between characters. + * Can be a negative or positive number. + * + * If you update this property directly, instead of using the `setLetterSpacing` method, then + * be sure to call `updateText` after, or you won't see the change reflected in the Text object. + */ + letterSpacing: number; + + /** + * Initialize right to left text. + */ + initRTL(): void; + + /** + * Greedy wrapping algorithm that will wrap words as the line grows longer than its horizontal + * bounds. + * @param text The text to perform word wrap detection against. + */ + runWordWrap(text: string): string; + + /** + * Advanced wrapping algorithm that will wrap words as the line grows longer than its horizontal + * bounds. Consecutive spaces will be collapsed and replaced with a single space. Lines will be + * trimmed of white space before processing. Throws an error if wordWrapWidth is less than a + * single character. + * @param text The text to perform word wrap detection against. + * @param context The Canvas Rendering Context. + * @param wordWrapWidth The word wrap width. + */ + advancedWordWrap(text: string, context: CanvasRenderingContext2D, wordWrapWidth: number): string; + + /** + * Greedy wrapping algorithm that will wrap words as the line grows longer than its horizontal + * bounds. Spaces are not collapsed and whitespace is not trimmed. + * @param text The text to perform word wrap detection against. + * @param context The Canvas Rendering Context. + * @param wordWrapWidth The word wrap width. + */ + basicWordWrap(text: string, context: CanvasRenderingContext2D, wordWrapWidth: number): string; + + /** + * Runs the given text through this Text objects word wrapping and returns the results as an + * array, where each element of the array corresponds to a wrapped line of text. + * @param text The text for which the wrapping will be calculated. If unspecified, the Text objects current text will be used. + */ + getWrappedText(text?: string): string[]; + + /** + * Set the text to display. + * + * An array of strings will be joined with `\n` line breaks. + * @param value The string, or array of strings, to be set as the content of this Text object. + */ + setText(value: string | string[]): this; + + /** + * Appends the given text to the content already being displayed by this Text object. + * + * An array of strings will be joined with `\n` line breaks. + * @param value The string, or array of strings, to be appended to the existing content of this Text object. + * @param addCR Insert a carriage-return before the string value. Default true. + */ + appendText(value: string | string[], addCR?: boolean): this; + + /** + * Set the text style. + * @param style The style settings to set. + */ + setStyle(style: object): this; + + /** + * Set the font. + * + * If a string is given, the font family is set. + * + * If an object is given, the `fontFamily`, `fontSize` and `fontStyle` + * properties of that object are set. + * + * **Important:** The font name must be quoted if it contains certain combinations of digits or + * special characters: + * + * ```javascript + * Text.setFont('"Press Start 2P"'); + * ``` + * + * Equally, if you wish to provide a list of fallback fonts, then you should ensure they are all + * quoted properly, too: + * + * ```javascript + * Text.setFont('Georgia, "Goudy Bookletter 1911", Times, serif'); + * ``` + * @param font The font family or font settings to set. + */ + setFont(font: string): this; + + /** + * Set the font family. + * + * **Important:** The font name must be quoted if it contains certain combinations of digits or + * special characters: + * + * ```javascript + * Text.setFont('"Press Start 2P"'); + * ``` + * + * Equally, if you wish to provide a list of fallback fonts, then you should ensure they are all + * quoted properly, too: + * + * ```javascript + * Text.setFont('Georgia, "Goudy Bookletter 1911", Times, serif'); + * ``` + * @param family The font family. + */ + setFontFamily(family: string): this; + + /** + * Set the font size. Can be a string with a valid CSS unit, i.e. `16px`, or a number. + * @param size The font size. + */ + setFontSize(size: string | number): this; + + /** + * Set the font style. + * @param style The font style. + */ + setFontStyle(style: string): this; + + /** + * Set a fixed width and height for the text. + * + * Pass in `0` for either of these parameters to disable fixed width or height respectively. + * @param width The fixed width to set. `0` disables fixed width. + * @param height The fixed height to set. `0` disables fixed height. + */ + setFixedSize(width: number, height: number): this; + + /** + * Set the background color. + * @param color The background color. + */ + setBackgroundColor(color: string): this; + + /** + * Set the fill style to be used by the Text object. + * + * This can be any valid CanvasRenderingContext2D fillStyle value, such as + * a color (in hex, rgb, rgba, hsl or named values), a gradient or a pattern. + * + * See the [MDN fillStyle docs](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/fillStyle) for more details. + * @param color The text fill style. Can be any valid CanvasRenderingContext `fillStyle` value. + */ + setFill(color: string | CanvasGradient | CanvasPattern): this; + + /** + * Set the text fill color. + * @param color The text fill color. + */ + setColor(color: string | CanvasGradient | CanvasPattern): this; + + /** + * Set the stroke settings. + * @param color The stroke color. + * @param thickness The stroke thickness. + */ + setStroke(color: string | CanvasGradient | CanvasPattern, thickness: number): this; + + /** + * Set the shadow settings. + * @param x The horizontal shadow offset. Default 0. + * @param y The vertical shadow offset. Default 0. + * @param color The shadow color. Default '#000'. + * @param blur The shadow blur radius. Default 0. + * @param shadowStroke Whether to stroke the shadow. Default false. + * @param shadowFill Whether to fill the shadow. Default true. + */ + setShadow(x?: number, y?: number, color?: string, blur?: number, shadowStroke?: boolean, shadowFill?: boolean): this; + + /** + * Set the shadow offset. + * @param x The horizontal shadow offset. + * @param y The vertical shadow offset. + */ + setShadowOffset(x: number, y: number): this; + + /** + * Set the shadow color. + * @param color The shadow color. + */ + setShadowColor(color: string): this; + + /** + * Set the shadow blur radius. + * @param blur The shadow blur radius. + */ + setShadowBlur(blur: number): this; + + /** + * Enable or disable shadow stroke. + * @param enabled Whether shadow stroke is enabled or not. + */ + setShadowStroke(enabled: boolean): this; + + /** + * Enable or disable shadow fill. + * @param enabled Whether shadow fill is enabled or not. + */ + setShadowFill(enabled: boolean): this; + + /** + * Set the width (in pixels) to use for wrapping lines. Pass in null to remove wrapping by width. + * @param width The maximum width of a line in pixels. Set to null to remove wrapping. + * @param useAdvancedWrap Whether or not to use the advanced wrapping + * algorithm. If true, spaces are collapsed and whitespace is trimmed from lines. If false, + * spaces and whitespace are left as is. Default false. + */ + setWordWrapWidth(width: number | undefined, useAdvancedWrap?: boolean): this; + + /** + * Set a custom callback for wrapping lines. Pass in null to remove wrapping by callback. + * @param callback A custom function that will be responsible for wrapping the + * text. It will receive two arguments: text (the string to wrap), textObject (this Text + * instance). It should return the wrapped lines either as an array of lines or as a string with + * newline characters in place to indicate where breaks should happen. + * @param scope The scope that will be applied when the callback is invoked. Default null. + */ + setWordWrapCallback(callback: TextStyleWordWrapCallback, scope?: object): this; + + /** + * Set the alignment of the text in this Text object. + * + * The argument can be one of: `left`, `right`, `center` or `justify`. + * + * Alignment only works if the Text object has more than one line of text. + * @param align The text alignment for multi-line text. Default 'left'. + */ + setAlign(align?: string): this; + + /** + * Set the resolution used by this Text object. + * + * It allows for much clearer text on High DPI devices, at the cost of memory because it uses larger + * internal Canvas textures for the Text. + * + * Therefore, please use with caution, as the more high res Text you have, the more memory it uses. + * @param value The resolution for this Text object to use. + */ + setResolution(value: number): this; + + /** + * Sets the line spacing value. + * + * This value is _added_ to the height of the font when calculating the overall line height. + * This only has an effect if this Text object consists of multiple lines of text. + * @param value The amount to add to the font height to achieve the overall line height. + */ + setLineSpacing(value: number): this; + + /** + * Sets the letter spacing value. + * + * This will add, or remove spacing between each character of this Text Game Object. The value can be + * either positive or negative. Positive values increase the space between each character, whilst negative + * values decrease it. Note that some fonts are spaced naturally closer together than others. + * + * Please understand that enabling this feature will cause Phaser to render each character in this Text object + * one by one, rather than use a draw for the whole string. This makes it extremely expensive when used with + * either long strings, or lots of strings in total. You will be better off creating bitmap font text if you + * need to display large quantities of characters with fine control over the letter spacing. + * @param value The amount to add to the letter width. Set to zero to disable. + */ + setLetterSpacing(value: number): this; + + /** + * Set the text padding. + * + * 'left' can be an object. + * + * If only 'left' and 'top' are given they are treated as 'x' and 'y'. + * @param left The left padding value, or a padding config object. + * @param top The top padding value. + * @param right The right padding value. + * @param bottom The bottom padding value. + */ + setPadding(left: number | Phaser.Types.GameObjects.Text.TextPadding, top?: number, right?: number, bottom?: number): this; + + /** + * Set the maximum number of lines to draw. + * @param max The maximum number of lines to draw. Default 0. + */ + setMaxLines(max?: number): this; + + /** + * Render text from right-to-left or left-to-right. + * @param rtl Set to `true` to render from right-to-left. Default true. + */ + setRTL(rtl?: boolean): this; + + /** + * Update the displayed text. + */ + updateText(): this; + + /** + * Get the current text metrics. + */ + getTextMetrics(): Phaser.Types.GameObjects.Text.TextMetrics; + + /** + * The text string being rendered by this Text Game Object. + */ + text: string; + + /** + * Build a JSON representation of the Text object. + */ + toJSON(): Phaser.Types.GameObjects.JSONGameObject; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A TextStyle class manages all of the style settings for a Text object. + * + * Text Game Objects create a TextStyle instance automatically, which is + * accessed via the `Text.style` property. You do not normally need to + * instantiate one yourself. + */ + class TextStyle { + /** + * + * @param text The Text object that this TextStyle is styling. + * @param style The style settings to set. + */ + constructor(text: Phaser.GameObjects.Text, style: Phaser.Types.GameObjects.Text.TextStyle); + + /** + * The Text object that this TextStyle is styling. + */ + parent: Phaser.GameObjects.Text; + + /** + * The font family. + */ + fontFamily: string; + + /** + * The font size. + */ + fontSize: string | number; + + /** + * The font style. + */ + fontStyle: string; + + /** + * The background color. + */ + backgroundColor: string; + + /** + * The text fill color. + */ + color: string | CanvasGradient | CanvasPattern; + + /** + * The text stroke color. + */ + stroke: string | CanvasGradient | CanvasPattern; + + /** + * The text stroke thickness. + */ + strokeThickness: number; + + /** + * The horizontal shadow offset. + */ + shadowOffsetX: number; + + /** + * The vertical shadow offset. + */ + shadowOffsetY: number; + + /** + * The shadow color. + */ + shadowColor: string; + + /** + * The shadow blur radius. + */ + shadowBlur: number; + + /** + * Whether shadow stroke is enabled or not. + */ + shadowStroke: boolean; + + /** + * Whether shadow fill is enabled or not. + */ + shadowFill: boolean; + + /** + * The text alignment. + */ + align: string; + + /** + * The maximum number of lines to draw. + */ + maxLines: number; + + /** + * The fixed width of the text. + * + * `0` means no fixed with. + */ + fixedWidth: number; + + /** + * The fixed height of the text. + * + * `0` means no fixed height. + */ + fixedHeight: number; + + /** + * The resolution the text is rendered to its internal canvas at. + * The default is 0, which means it will use the resolution set in the Game Config. + */ + resolution: number; + + /** + * Whether the text should render right to left. + */ + rtl: boolean; + + /** + * The test string to use when measuring the font. + */ + testString: string; + + /** + * The amount of horizontal padding added to the width of the text when calculating the font metrics. + */ + baselineX: number; + + /** + * The amount of vertical padding added to the height of the text when calculating the font metrics. + */ + baselineY: number; + + /** + * The maximum width of a line of text in pixels. Null means no line wrapping. Setting this + * property directly will not re-run the word wrapping algorithm. To change the width and + * re-wrap, use {@link Phaser.GameObjects.TextStyle#setWordWrapWidth}. + */ + wordWrapWidth: number | null; + + /** + * A custom function that will be responsible for wrapping the text. It will receive two + * arguments: text (the string to wrap), textObject (this Text instance). It should return + * the wrapped lines either as an array of lines or as a string with newline characters in + * place to indicate where breaks should happen. Setting this directly will not re-run the + * word wrapping algorithm. To change the callback and re-wrap, use + * {@link Phaser.GameObjects.TextStyle#setWordWrapCallback}. + */ + wordWrapCallback: TextStyleWordWrapCallback | null; + + /** + * The scope that will be applied when the wordWrapCallback is invoked. Setting this directly will not re-run the + * word wrapping algorithm. To change the callback and re-wrap, use + * {@link Phaser.GameObjects.TextStyle#setWordWrapCallback}. + */ + wordWrapCallbackScope: object | null; + + /** + * Whether or not to use the advanced wrapping algorithm. If true, spaces are collapsed and + * whitespace is trimmed from lines. If false, spaces and whitespace are left as is. Setting + * this property directly will not re-run the word wrapping algorithm. To change the + * advanced setting and re-wrap, use {@link Phaser.GameObjects.TextStyle#setWordWrapWidth}. + */ + wordWrapUseAdvanced: boolean; + + /** + * Set the text style. + * @param style The style settings to set. + * @param updateText Whether to update the text immediately. Default true. + * @param setDefaults Use the default values is not set, or the local values. Default false. + */ + setStyle(style: Phaser.Types.GameObjects.Text.TextStyle, updateText?: boolean, setDefaults?: boolean): Phaser.GameObjects.Text; + + /** + * Synchronize the font settings to the given Canvas Rendering Context. + * @param canvas The Canvas Element. + * @param context The Canvas Rendering Context. + */ + syncFont(canvas: HTMLCanvasElement, context: CanvasRenderingContext2D): void; + + /** + * Synchronize the text style settings to the given Canvas Rendering Context. + * @param canvas The Canvas Element. + * @param context The Canvas Rendering Context. + */ + syncStyle(canvas: HTMLCanvasElement, context: CanvasRenderingContext2D): void; + + /** + * Synchronize the shadow settings to the given Canvas Rendering Context. + * @param context The Canvas Rendering Context. + * @param enabled Whether shadows are enabled or not. + */ + syncShadow(context: CanvasRenderingContext2D, enabled: boolean): void; + + /** + * Update the style settings for the parent Text object. + * @param recalculateMetrics Whether to recalculate font and text metrics. + */ + update(recalculateMetrics: boolean): Phaser.GameObjects.Text; + + /** + * Set the font. + * + * If a string is given, the font family is set. + * + * If an object is given, the `fontFamily`, `fontSize` and `fontStyle` + * properties of that object are set. + * @param font The font family or font settings to set. + * @param updateText Whether to update the text immediately. Default true. + */ + setFont(font: string | object, updateText?: boolean): Phaser.GameObjects.Text; + + /** + * Set the font family. + * @param family The font family. + */ + setFontFamily(family: string): Phaser.GameObjects.Text; + + /** + * Set the font style. + * @param style The font style. + */ + setFontStyle(style: string): Phaser.GameObjects.Text; + + /** + * Set the font size. Can be a string with a valid CSS unit, i.e. `16px`, or a number. + * @param size The font size. + */ + setFontSize(size: number | string): Phaser.GameObjects.Text; + + /** + * Set the test string to use when measuring the font. + * @param string The test string to use when measuring the font. + */ + setTestString(string: string): Phaser.GameObjects.Text; + + /** + * Set a fixed width and height for the text. + * + * Pass in `0` for either of these parameters to disable fixed width or height respectively. + * @param width The fixed width to set. + * @param height The fixed height to set. + */ + setFixedSize(width: number, height: number): Phaser.GameObjects.Text; + + /** + * Set the background color. + * @param color The background color. + */ + setBackgroundColor(color: string): Phaser.GameObjects.Text; + + /** + * Set the text fill color. + * @param color The text fill color. + */ + setFill(color: string | CanvasGradient | CanvasPattern): Phaser.GameObjects.Text; + + /** + * Set the text fill color. + * @param color The text fill color. + */ + setColor(color: string | CanvasGradient | CanvasPattern): Phaser.GameObjects.Text; + + /** + * Set the resolution used by the Text object. + * + * It allows for much clearer text on High DPI devices, at the cost of memory because + * it uses larger internal Canvas textures for the Text. + * + * Please use with caution, as the more high res Text you have, the more memory it uses up. + * @param value The resolution for this Text object to use. + */ + setResolution(value: number): Phaser.GameObjects.Text; + + /** + * Set the stroke settings. + * @param color The stroke color. + * @param thickness The stroke thickness. + */ + setStroke(color: string | CanvasGradient | CanvasPattern, thickness: number): Phaser.GameObjects.Text; + + /** + * Set the shadow settings. + * + * Calling this method always re-measures the parent Text object, + * so only call it when you actually change the shadow settings. + * @param x The horizontal shadow offset. Default 0. + * @param y The vertical shadow offset. Default 0. + * @param color The shadow color. Default '#000'. + * @param blur The shadow blur radius. Default 0. + * @param shadowStroke Whether to stroke the shadow. Default false. + * @param shadowFill Whether to fill the shadow. Default true. + */ + setShadow(x?: number, y?: number, color?: string, blur?: number, shadowStroke?: boolean, shadowFill?: boolean): Phaser.GameObjects.Text; + + /** + * Set the shadow offset. + * @param x The horizontal shadow offset. Default 0. + * @param y The vertical shadow offset. Default 0. + */ + setShadowOffset(x?: number, y?: number): Phaser.GameObjects.Text; + + /** + * Set the shadow color. + * @param color The shadow color. Default '#000'. + */ + setShadowColor(color?: string): Phaser.GameObjects.Text; + + /** + * Set the shadow blur radius. + * @param blur The shadow blur radius. Default 0. + */ + setShadowBlur(blur?: number): Phaser.GameObjects.Text; + + /** + * Enable or disable shadow stroke. + * @param enabled Whether shadow stroke is enabled or not. + */ + setShadowStroke(enabled: boolean): Phaser.GameObjects.Text; + + /** + * Enable or disable shadow fill. + * @param enabled Whether shadow fill is enabled or not. + */ + setShadowFill(enabled: boolean): Phaser.GameObjects.Text; + + /** + * Set the width (in pixels) to use for wrapping lines. + * + * Pass in null to remove wrapping by width. + * @param width The maximum width of a line in pixels. Set to null to remove wrapping. + * @param useAdvancedWrap Whether or not to use the advanced wrapping + * algorithm. If true, spaces are collapsed and whitespace is trimmed from lines. If false, + * spaces and whitespace are left as is. Default false. + */ + setWordWrapWidth(width: number, useAdvancedWrap?: boolean): Phaser.GameObjects.Text; + + /** + * Set a custom callback for wrapping lines. + * + * Pass in null to remove wrapping by callback. + * @param callback A custom function that will be responsible for wrapping the + * text. It will receive two arguments: text (the string to wrap), textObject (this Text + * instance). It should return the wrapped lines either as an array of lines or as a string with + * newline characters in place to indicate where breaks should happen. + * @param scope The scope that will be applied when the callback is invoked. Default null. + */ + setWordWrapCallback(callback: TextStyleWordWrapCallback, scope?: object): Phaser.GameObjects.Text; + + /** + * Set the alignment of the text in this Text object. + * + * The argument can be one of: `left`, `right`, `center` or `justify`. + * + * Alignment only works if the Text object has more than one line of text. + * @param align The text alignment for multi-line text. Default 'left'. + */ + setAlign(align?: string): Phaser.GameObjects.Text; + + /** + * Set the maximum number of lines to draw. + * @param max The maximum number of lines to draw. Default 0. + */ + setMaxLines(max?: number): Phaser.GameObjects.Text; + + /** + * Get the current text metrics. + */ + getTextMetrics(): Phaser.Types.GameObjects.Text.TextMetrics; + + /** + * Build a JSON representation of this Text Style. + */ + toJSON(): object; + + /** + * Destroy this Text Style. + */ + destroy(): void; + + } + + /** + * A TileSprite is a Sprite that has a repeating texture. + * + * The texture can be scrolled and scaled independently of the TileSprite itself. Textures will automatically wrap and + * are designed so that you can create game backdrops using seamless textures as a source. + * + * You shouldn't ever create a TileSprite any larger than your actual canvas size. If you want to create a large repeating background + * that scrolls across the whole map of your game, then you create a TileSprite that fits the canvas size and then use the `tilePosition` + * property to scroll the texture as the player moves. If you create a TileSprite that is thousands of pixels in size then it will + * consume huge amounts of memory and cause performance issues. Remember: use `tilePosition` to scroll your texture and `tileScale` to + * adjust the scale of the texture - don't resize the sprite itself or make it larger than it needs. + * + * An important note about Tile Sprites and NPOT textures: Internally, TileSprite textures use GL_REPEAT to provide + * seamless repeating of the textures. This, combined with the way in which the textures are handled in WebGL, means + * they need to be POT (power-of-two) sizes in order to wrap. If you provide a NPOT (non power-of-two) texture to a + * TileSprite it will generate a POT sized canvas and draw your texture to it, scaled up to the POT size. It's then + * scaled back down again during rendering to the original dimensions. While this works, in that it allows you to use + * any size texture for a Tile Sprite, it does mean that NPOT textures are going to appear anti-aliased when rendered, + * due to the interpolation that took place when it was resized into a POT texture. This is especially visible in + * pixel art graphics. If you notice it and it becomes an issue, the only way to avoid it is to ensure that you + * provide POT textures for Tile Sprites. + */ + class TileSprite extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.ComputedSize, Phaser.GameObjects.Components.Crop, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param width The width of the Game Object. If zero it will use the size of the texture frame. + * @param height The height of the Game Object. If zero it will use the size of the texture frame. + * @param textureKey The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. Cannot be a DynamicTexture. + * @param frameKey An optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, x: number, y: number, width: number, height: number, textureKey: string, frameKey?: string | number); + + /** + * Whether the Tile Sprite has changed in some way, requiring an re-render of its tile texture. + * + * Such changes include the texture frame and scroll position of the Tile Sprite. + */ + dirty: boolean; + + /** + * The renderer in use by this Tile Sprite. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The Canvas element that the TileSprite renders its fill pattern in to. + * Only used in Canvas mode. + */ + canvas: HTMLCanvasElement | null; + + /** + * The Context of the Canvas element that the TileSprite renders its fill pattern in to. + * Only used in Canvas mode. + */ + context: CanvasRenderingContext2D; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * The next power of two value from the width of the Fill Pattern frame. + */ + potWidth: number; + + /** + * The next power of two value from the height of the Fill Pattern frame. + */ + potHeight: number; + + /** + * The Canvas that the TileSprites texture is rendered to. + * This is used to create a WebGL texture from. + */ + fillCanvas: HTMLCanvasElement; + + /** + * The Canvas Context used to render the TileSprites texture. + */ + fillContext: CanvasRenderingContext2D; + + /** + * The texture that the Tile Sprite is rendered to, which is then rendered to a Scene. + * In WebGL this is a WebGLTextureWrapper. In Canvas it's a Canvas Fill Pattern. + */ + fillPattern: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | CanvasPattern | null; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * The Frame has to belong to the current Texture being used. + * + * It can be either a string or an index. + * @param frame The name or index of the frame within the Texture. + */ + setFrame(frame: string | number): this; + + /** + * Sets {@link Phaser.GameObjects.TileSprite#tilePositionX} and {@link Phaser.GameObjects.TileSprite#tilePositionY}. + * @param x The x position of this sprite's tiling texture. + * @param y The y position of this sprite's tiling texture. + */ + setTilePosition(x?: number, y?: number): this; + + /** + * Sets {@link Phaser.GameObjects.TileSprite#tileScaleX} and {@link Phaser.GameObjects.TileSprite#tileScaleY}. + * @param x The horizontal scale of the tiling texture. If not given it will use the current `tileScaleX` value. + * @param y The vertical scale of the tiling texture. If not given it will use the `x` value. Default x. + */ + setTileScale(x?: number, y?: number): this; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * The horizontal scroll position of the Tile Sprite. + */ + tilePositionX: number; + + /** + * The vertical scroll position of the Tile Sprite. + */ + tilePositionY: number; + + /** + * The horizontal scale of the Tile Sprite texture. + */ + tileScaleX: number; + + /** + * The vertical scale of the Tile Sprite texture. + */ + tileScaleY: number; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Update List plugin. + * + * Update Lists belong to a Scene and maintain the list Game Objects to be updated every frame. + * + * Some or all of these Game Objects may also be part of the Scene's [Display List]{@link Phaser.GameObjects.DisplayList}, for Rendering. + */ + class UpdateList extends Phaser.Structs.ProcessQueue { + /** + * + * @param scene The Scene that the Update List belongs to. + */ + constructor(scene: Phaser.Scene); + + /** + * The Scene that the Update List belongs to. + */ + scene: Phaser.Scene; + + /** + * The Scene's Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * The update step. + * + * Pre-updates every active Game Object in the list. + * @param time The current timestamp. + * @param delta The delta time elapsed since the last frame. + */ + sceneUpdate(time: number, delta: number): void; + + /** + * The Scene that owns this plugin is shutting down. + * + * We need to kill and reset all internal properties as well as stop listening to Scene events. + */ + shutdown(): void; + + /** + * The Scene that owns this plugin is being destroyed. + * + * We need to shutdown and then kill off all external references. + */ + destroy(): void; + + } + + /** + * A Video Game Object. + * + * This Game Object is capable of handling playback of a video file, video stream or media stream. + * + * You can optionally 'preload' the video into the Phaser Video Cache: + * + * ```javascript + * preload () { + * this.load.video('ripley', 'assets/aliens.mp4'); + * } + * + * create () { + * this.add.video(400, 300, 'ripley'); + * } + * ``` + * + * You don't have to 'preload' the video. You can also play it directly from a URL: + * + * ```javascript + * create () { + * this.add.video(400, 300).loadURL('assets/aliens.mp4'); + * } + * ``` + * + * To all intents and purposes, a video is a standard Game Object, just like a Sprite. And as such, you can do + * all the usual things to it, such as scaling, rotating, cropping, tinting, making interactive, giving a + * physics body, etc. + * + * Transparent videos are also possible via the WebM file format. Providing the video file has was encoded with + * an alpha channel, and providing the browser supports WebM playback (not all of them do), then it will render + * in-game with full transparency. + * + * Playback is handled entirely via the Request Video Frame API, which is supported by most modern browsers. + * A polyfill is provided for older browsers. + * + * ### Autoplaying Videos + * + * Videos can only autoplay if the browser has been unlocked with an interaction, or satisfies the MEI settings. + * The policies that control autoplaying are vast and vary between browser. You can, and should, read more about + * it here: https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide + * + * If your video doesn't contain any audio, then set the `noAudio` parameter to `true` when the video is _loaded_, + * and it will often allow the video to play immediately: + * + * ```javascript + * preload () { + * this.load.video('pixar', 'nemo.mp4', true); + * } + * ``` + * + * The 3rd parameter in the load call tells Phaser that the video doesn't contain any audio tracks. Video without + * audio can autoplay without requiring a user interaction. Video with audio cannot do this unless it satisfies + * the browsers MEI settings. See the MDN Autoplay Guide for further details. + * + * Or: + * + * ```javascript + * create () { + * this.add.video(400, 300).loadURL('assets/aliens.mp4', true); + * } + * ``` + * + * You can set the `noAudio` parameter to `true` even if the video does contain audio. It will still allow the video + * to play immediately, but the audio will not start. + * + * Note that due to a bug in IE11 you cannot play a video texture to a Sprite in WebGL. For IE11 force Canvas mode. + * + * More details about video playback and the supported media formats can be found on MDN: + * + * https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement + * https://developer.mozilla.org/en-US/docs/Web/Media/Formats + */ + class Video extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.ComputedSize, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.TextureCrop, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param key Optional key of the Video this Game Object will play, as stored in the Video Cache. + */ + constructor(scene: Phaser.Scene, x: number, y: number, key?: string); + + /** + * A reference to the HTML Video Element this Video Game Object is playing. + * + * Will be `undefined` until a video is loaded for playback. + */ + video: HTMLVideoElement | null; + + /** + * The Phaser Texture this Game Object is using to render the video to. + * + * Will be `undefined` until a video is loaded for playback. + */ + videoTexture: Phaser.Textures.Texture | null; + + /** + * A reference to the TextureSource backing the `videoTexture` Texture object. + * + * Will be `undefined` until a video is loaded for playback. + */ + videoTextureSource: Phaser.Textures.TextureSource | null; + + /** + * A Phaser `CanvasTexture` instance that holds the most recent snapshot taken from the video. + * + * This will only be set if the `snapshot` or `snapshotArea` methods have been called. + * + * Until those methods are called, this property will be `undefined`. + */ + snapshotTexture: Phaser.Textures.CanvasTexture | null; + + /** + * If you have saved this video to a texture via the `saveTexture` method, this controls if the video + * is rendered with `flipY` in WebGL or not. You often need to set this if you wish to use the video texture + * as the input source for a shader. If you find your video is appearing upside down within a shader or + * custom pipeline, flip this property. + */ + flipY: boolean; + + /** + * An internal flag holding the current state of the video lock, should document interaction be required + * before playback can begin. + */ + readonly touchLocked: boolean; + + /** + * Should the video auto play when document interaction is required and happens? + */ + playWhenUnlocked: boolean; + + /** + * Has the video created its texture and populated it with the first frame of video? + */ + frameReady: boolean; + + /** + * This read-only property returns `true` if the video is currently stalled, i.e. it has stopped + * playing due to a lack of data, or too much data, but hasn't yet reached the end of the video. + * + * This is set if the Video DOM element emits any of the following events: + * + * `stalled` + * `suspend` + * `waiting` + * + * And is cleared if the Video DOM element emits the `playing` event, or handles + * a requestVideoFrame call. + * + * Listen for the Phaser Event `VIDEO_STALLED` to be notified and inspect the event + * to see which DOM event caused it. + * + * Note that being stalled isn't always a negative thing. A video can be stalled if it + * has downloaded enough data in to its buffer to not need to download any more until + * the current batch of frames have rendered. + */ + readonly isStalled: boolean; + + /** + * Records the number of times the video has failed to play, + * typically because the user hasn't interacted with the page yet. + */ + failedPlayAttempts: number; + + /** + * If the browser supports the Request Video Frame API then this + * property will hold the metadata that is returned from + * the callback each time it is invoked. + * + * See https://wicg.github.io/video-rvfc/#video-frame-metadata-callback + * for a complete list of all properties that will be in this object. + * Likely of most interest is the `mediaTime` property: + * + * The media presentation timestamp (PTS) in seconds of the frame presented + * (e.g. its timestamp on the video.currentTime timeline). MAY have a zero + * value for live-streams or WebRTC applications. + * + * If the browser doesn't support the API then this property will be undefined. + */ + metadata: VideoFrameCallbackMetadata; + + /** + * The current retry elapsed time. + */ + retry: number; + + /** + * If a video fails to play due to a lack of user interaction, this is the + * amount of time, in ms, that the video will wait before trying again to + * play. The default is 500ms. + */ + retryInterval: number; + + /** + * An object containing in and out markers for sequence playback. + */ + markers: any; + + /** + * The key of the current video as stored in the Video cache. + * + * If the video did not come from the cache this will be an empty string. + */ + readonly cacheKey: string; + + /** + * Is the video currently seeking? + * + * This is set to `true` when the `seeking` event is fired, + * and set to `false` when the `seeked` event is fired. + */ + readonly isSeeking: boolean; + + /** + * Loads a Video from the Video Cache, ready for playback with the `Video.play` method. + * + * If a video is already playing, this method allows you to change the source of the current video element. + * It works by first stopping the current video and then starts playback of the new source through the existing video element. + * + * The reason you may wish to do this is because videos that require interaction to unlock, remain in an unlocked + * state, even if you change the source of the video. By changing the source to a new video you avoid having to + * go through the unlock process again. + * @param key The key of the Video this Game Object will play, as stored in the Video Cache. + */ + load(key: string): this; + + /** + * This method allows you to change the source of the current video element. It works by first stopping the + * current video, if playing. Then deleting the video texture, if one has been created. Finally, it makes a + * new video texture and starts playback of the new source through the existing video element. + * + * The reason you may wish to do this is because videos that require interaction to unlock, remain in an unlocked + * state, even if you change the source of the video. By changing the source to a new video you avoid having to + * go through the unlock process again. + * @param key The key of the Video this Game Object will swap to playing, as stored in the Video Cache. + * @param autoplay Should the video start playing immediately, once the swap is complete? Default true. + * @param loop Should the video loop automatically when it reaches the end? Please note that not all browsers support _seamless_ video looping for all encoding formats. Default false. + * @param markerIn Optional in marker time, in seconds, for playback of a sequence of the video. + * @param markerOut Optional out marker time, in seconds, for playback of a sequence of the video. + */ + changeSource(key: string, autoplay?: boolean, loop?: boolean, markerIn?: number, markerOut?: number): this; + + /** + * Returns the key of the currently played video, as stored in the Video Cache. + * + * If the video did not come from the cache this will return an empty string. + */ + getVideoKey(): string; + + /** + * Loads a Video from the given URL, ready for playback with the `Video.play` method. + * + * If a video is already playing, this method allows you to change the source of the current video element. + * It works by first stopping the current video and then starts playback of the new source through the existing video element. + * + * The reason you may wish to do this is because videos that require interaction to unlock, remain in an unlocked + * state, even if you change the source of the video. By changing the source to a new video you avoid having to + * go through the unlock process again. + * @param urls The absolute or relative URL to load the video files from. + * @param noAudio Does the video have an audio track? If not you can enable auto-playing on it. Default false. + * @param crossOrigin The value to use for the `crossOrigin` property in the video load request. Either undefined, `anonymous` or `use-credentials`. If no value is given, `crossorigin` will not be set in the request. + */ + loadURL(urls?: string | string[] | Phaser.Types.Loader.FileTypes.VideoFileURLConfig | Phaser.Types.Loader.FileTypes.VideoFileURLConfig[], noAudio?: boolean, crossOrigin?: string): this; + + /** + * Loads a Video from the given MediaStream object, ready for playback with the `Video.play` method. + * @param stream The MediaStream object. + * @param noAudio Does the video have an audio track? If not you can enable auto-playing on it. Default false. + * @param crossOrigin The value to use for the `crossOrigin` property in the video load request. Either undefined, `anonymous` or `use-credentials`. If no value is given, `crossorigin` will not be set in the request. + */ + loadMediaStream(stream: string, noAudio?: boolean, crossOrigin?: string): this; + + /** + * Internal method that loads a Video from the given URL, ready for playback with the + * `Video.play` method. + * + * Normally you don't call this method directly, but instead use the `Video.loadURL` method, + * or the `Video.load` method if you have preloaded the video. + * + * Calling this method will skip checking if the browser supports the given format in + * the URL, where-as the other two methods enforce these checks. + * @param url The absolute or relative URL to load the video file from. Set to `null` if passing in a MediaStream object. + * @param noAudio Does the video have an audio track? If not you can enable auto-playing on it. + * @param crossOrigin The value to use for the `crossOrigin` property in the video load request. Either undefined, `anonymous` or `use-credentials`. If no value is given, `crossorigin` will not be set in the request. + * @param stream A MediaStream object if this is playing a stream instead of a file. + */ + loadHandler(url?: string, noAudio?: boolean, crossOrigin?: string, stream?: string): this; + + /** + * This method handles the Request Video Frame callback. + * + * It is called by the browser when a new video frame is ready to be displayed. + * + * It's also responsible for the creation of the video texture, if it doesn't + * already exist. If it does, it updates the texture as required. + * + * For more details about the Request Video Frame callback, see: + * https://web.dev/requestvideoframecallback-rvfc + * @param now The current time in milliseconds. + * @param metadata Useful metadata about the video frame that was most recently presented for composition. See https://wicg.github.io/video-rvfc/#video-frame-metadata-callback + */ + requestVideoFrame(now: DOMHighResTimeStamp, metadata: VideoFrameCallbackMetadata): void; + + /** + * Starts this video playing. + * + * If the video is already playing, or has been queued to play with `changeSource` then this method just returns. + * + * Videos can only autoplay if the browser has been unlocked. This happens if you have interacted with the browser, i.e. + * by clicking on it or pressing a key, or due to server settings. The policies that control autoplaying are vast and + * vary between browser. You can read more here: https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide + * + * If your video doesn't contain any audio, then set the `noAudio` parameter to `true` when the video is loaded, + * and it will often allow the video to play immediately: + * + * ```javascript + * preload () { + * this.load.video('pixar', 'nemo.mp4', true); + * } + * ``` + * + * The 3rd parameter in the load call tells Phaser that the video doesn't contain any audio tracks. Video without + * audio can autoplay without requiring a user interaction. Video with audio cannot do this unless it satisfies + * the browsers MEI settings. See the MDN Autoplay Guide for details. + * + * If you need audio in your videos, then you'll have to consider the fact that the video cannot start playing until the + * user has interacted with the browser, into your game flow. + * @param loop Should the video loop automatically when it reaches the end? Please note that not all browsers support _seamless_ video looping for all encoding formats. Default false. + * @param markerIn Optional in marker time, in seconds, for playback of a sequence of the video. + * @param markerOut Optional out marker time, in seconds, for playback of a sequence of the video. + */ + play(loop?: boolean, markerIn?: number, markerOut?: number): this; + + /** + * Adds the loading specific event handlers to the video element. + */ + addLoadEventHandlers(): void; + + /** + * Removes the loading specific event handlers from the video element. + */ + removeLoadEventHandlers(): void; + + /** + * Adds the playback specific event handlers to the video element. + */ + addEventHandlers(): void; + + /** + * Removes the playback specific event handlers from the video element. + */ + removeEventHandlers(): void; + + /** + * Creates the video.play promise and adds the success and error handlers to it. + * + * Not all browsers support the video.play promise, so this method will fall back to + * the old-school way of handling the video.play call. + * + * See https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play#browser_compatibility for details. + * @param catchError Should the error be caught and the video marked as failed to play? Default true. + */ + createPlayPromise(catchError?: boolean): void; + + /** + * Adds a sequence marker to this video. + * + * Markers allow you to split a video up into sequences, delineated by a start and end time, given in seconds. + * + * You can then play back specific markers via the `playMarker` method. + * + * Note that marker timing is _not_ frame-perfect. You should construct your videos in such a way that you allow for + * plenty of extra padding before and after each sequence to allow for discrepancies in browser seek and currentTime accuracy. + * + * See https://github.com/w3c/media-and-entertainment/issues/4 for more details about this issue. + * @param key A unique name to give this marker. + * @param markerIn The time, in seconds, representing the start of this marker. + * @param markerOut The time, in seconds, representing the end of this marker. + */ + addMarker(key: string, markerIn: number, markerOut: number): this; + + /** + * Plays a pre-defined sequence in this video. + * + * Markers allow you to split a video up into sequences, delineated by a start and end time, given in seconds and + * specified via the `addMarker` method. + * + * Note that marker timing is _not_ frame-perfect. You should construct your videos in such a way that you allow for + * plenty of extra padding before and after each sequence to allow for discrepancies in browser seek and currentTime accuracy. + * + * See https://github.com/w3c/media-and-entertainment/issues/4 for more details about this issue. + * @param key The name of the marker sequence to play. + * @param loop Should the video loop automatically when it reaches the end? Please note that not all browsers support _seamless_ video looping for all encoding formats. Default false. + */ + playMarker(key: string, loop?: boolean): this; + + /** + * Removes a previously set marker from this video. + * + * If the marker is currently playing it will _not_ stop playback. + * @param key The name of the marker to remove. + */ + removeMarker(key: string): this; + + /** + * Takes a snapshot of the current frame of the video and renders it to a CanvasTexture object, + * which is then returned. You can optionally resize the grab by passing a width and height. + * + * This method returns a reference to the `Video.snapshotTexture` object. Calling this method + * multiple times will overwrite the previous snapshot with the most recent one. + * @param width The width of the resulting CanvasTexture. + * @param height The height of the resulting CanvasTexture. + */ + snapshot(width?: number, height?: number): Phaser.Textures.CanvasTexture; + + /** + * Takes a snapshot of the specified area of the current frame of the video and renders it to a CanvasTexture object, + * which is then returned. You can optionally resize the grab by passing a different `destWidth` and `destHeight`. + * + * This method returns a reference to the `Video.snapshotTexture` object. Calling this method + * multiple times will overwrite the previous snapshot with the most recent one. + * @param x The horizontal location of the top-left of the area to grab from. Default 0. + * @param y The vertical location of the top-left of the area to grab from. Default 0. + * @param srcWidth The width of area to grab from the video. If not given it will grab the full video dimensions. + * @param srcHeight The height of area to grab from the video. If not given it will grab the full video dimensions. + * @param destWidth The destination width of the grab, allowing you to resize it. + * @param destHeight The destination height of the grab, allowing you to resize it. + */ + snapshotArea(x?: number, y?: number, srcWidth?: number, srcHeight?: number, destWidth?: number, destHeight?: number): Phaser.Textures.CanvasTexture; + + /** + * Stores a copy of this Videos `snapshotTexture` in the Texture Manager using the given key. + * + * This texture is created when the `snapshot` or `snapshotArea` methods are called. + * + * After doing this, any texture based Game Object, such as a Sprite, can use the contents of the + * snapshot by using the texture key: + * + * ```javascript + * var vid = this.add.video(0, 0, 'intro'); + * + * vid.snapshot(); + * + * vid.saveSnapshotTexture('doodle'); + * + * this.add.image(400, 300, 'doodle'); + * ``` + * + * Updating the contents of the `snapshotTexture`, for example by calling `snapshot` again, + * will automatically update _any_ Game Object that is using it as a texture. + * Calling `saveSnapshotTexture` again will not save another copy of the same texture, + * it will just rename the existing one. + * + * By default it will create a single base texture. You can add frames to the texture + * by using the `Texture.add` method. After doing this, you can then allow Game Objects + * to use a specific frame. + * @param key The unique key to store the texture as within the global Texture Manager. + */ + saveSnapshotTexture(key: string): Phaser.Textures.CanvasTexture; + + /** + * This internal method is called automatically if the playback Promise resolves successfully. + */ + playSuccess(): void; + + /** + * This internal method is called automatically if the playback Promise fails to resolve. + * @param error The Promise DOM Exception error. + */ + playError(error: DOMException): void; + + /** + * Called when the video emits a `playing` event. + * + * This is the legacy handler for browsers that don't support Promise based playback. + */ + legacyPlayHandler(): void; + + /** + * Called when the video emits a `playing` event. + */ + playingHandler(): void; + + /** + * This internal method is called automatically if the video fails to load. + * @param event The error Event. + */ + loadErrorHandler(event: Event): void; + + /** + * This internal method is called automatically when the video metadata is available. + * @param event The loadedmetadata Event. + */ + metadataHandler(event: Event): void; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * This internal method is called automatically if the video stalls, for whatever reason. + * @param event The error Event. + */ + stalledHandler(event: Event): void; + + /** + * Called when the video completes playback, i.e. reaches an `ended` state. + * + * This will never happen if the video is coming from a live stream, where the duration is `Infinity`. + */ + completeHandler(): void; + + /** + * Seeks to a given point in the video. The value is given as a float between 0 and 1, + * where 0 represents the start of the video and 1 represents the end. + * + * Seeking only works if the video has a duration, so will not work for live streams. + * + * When seeking begins, this video will emit a `seeking` event. When the video completes + * seeking (i.e. reaches its designated timestamp) it will emit a `seeked` event. + * + * If you wish to seek based on time instead, use the `Video.setCurrentTime` method. + * + * Unfortunately, the DOM video element does not guarantee frame-accurate seeking. + * This has been an ongoing subject of discussion: https://github.com/w3c/media-and-entertainment/issues/4 + * @param value The point in the video to seek to. A value between 0 and 1. + */ + seekTo(value: number): this; + + /** + * A double-precision floating-point value indicating the current playback time in seconds. + * + * If the media has not started to play and has not been seeked, this value is the media's initial playback time. + * + * For a more accurate value, use the `Video.metadata.mediaTime` property instead. + */ + getCurrentTime(): number; + + /** + * Seeks to a given playback time in the video. The value is given in _seconds_ or as a string. + * + * Seeking only works if the video has a duration, so will not work for live streams. + * + * When seeking begins, this video will emit a `seeking` event. When the video completes + * seeking (i.e. reaches its designated timestamp) it will emit a `seeked` event. + * + * You can provide a string prefixed with either a `+` or a `-`, such as `+2.5` or `-2.5`. + * In this case it will seek to +/- the value given, relative to the _current time_. + * + * If you wish to seek based on a duration percentage instead, use the `Video.seekTo` method. + * @param value The playback time to seek to in seconds. Can be expressed as a string, such as `+2` to seek 2 seconds ahead from the current time. + */ + setCurrentTime(value: string | number): this; + + /** + * Returns the current progress of the video as a float. + * + * Progress is defined as a value between 0 (the start) and 1 (the end). + * + * Progress can only be returned if the video has a duration. Some videos, + * such as those coming from a live stream, do not have a duration. In this + * case the method will return -1. + */ + getProgress(): number; + + /** + * A double-precision floating-point value which indicates the duration (total length) of the media in seconds, + * on the media's timeline. If no media is present on the element, or the media is not valid, the returned value is NaN. + * + * If the media has no known end (such as for live streams of unknown duration, web radio, media incoming from WebRTC, + * and so forth), this value is +Infinity. + * + * If no video has been loaded, this method will return 0. + */ + getDuration(): number; + + /** + * Sets the muted state of the currently playing video, if one is loaded. + * @param value The mute value. `true` if the video should be muted, otherwise `false`. Default true. + */ + setMute(value?: boolean): this; + + /** + * Returns a boolean indicating if this Video is currently muted. + */ + isMuted(): boolean; + + /** + * Sets the paused state of the currently loaded video. + * + * If the video is playing, calling this method with `true` will pause playback. + * If the video is paused, calling this method with `false` will resume playback. + * + * If no video is loaded, this method does nothing. + * + * If the video has not yet been played, `Video.play` will be called with no parameters. + * + * If the video has ended, this method will do nothing. + * @param value The paused value. `true` if the video should be paused, `false` to resume it. Default true. + */ + setPaused(value?: boolean): this; + + /** + * Pauses the current Video, if one is playing. + * + * If no video is loaded, this method does nothing. + * + * Call `Video.resume` to resume playback. + */ + pause(): this; + + /** + * Resumes the current Video, if one was previously playing and has been paused. + * + * If no video is loaded, this method does nothing. + * + * Call `Video.pause` to pause playback. + */ + resume(): this; + + /** + * Returns a double indicating the audio volume, from 0.0 (silent) to 1.0 (loudest). + */ + getVolume(): number; + + /** + * Sets the volume of the currently playing video. + * + * The value given is a double indicating the audio volume, from 0.0 (silent) to 1.0 (loudest). + * @param value A double indicating the audio volume, from 0.0 (silent) to 1.0 (loudest). Default 1. + */ + setVolume(value?: number): this; + + /** + * Returns a double that indicates the rate at which the media is being played back. + */ + getPlaybackRate(): number; + + /** + * Sets the playback rate of the current video. + * + * The value given is a double that indicates the rate at which the media is being played back. + * @param rate A double that indicates the rate at which the media is being played back. + */ + setPlaybackRate(rate?: number): this; + + /** + * Returns a boolean which indicates whether the media element should start over when it reaches the end. + */ + getLoop(): boolean; + + /** + * Sets the loop state of the current video. + * + * The value given is a boolean which indicates whether the media element will start over when it reaches the end. + * + * Not all videos can loop, for example live streams. + * + * Please note that not all browsers support _seamless_ video looping for all encoding formats. + * @param value A boolean which indicates whether the media element will start over when it reaches the end. Default true. + */ + setLoop(value?: boolean): this; + + /** + * Returns a boolean which indicates whether the video is currently playing. + */ + isPlaying(): boolean; + + /** + * Returns a boolean which indicates whether the video is currently paused. + */ + isPaused(): boolean; + + /** + * Stores this Video in the Texture Manager using the given key as a dynamic texture, + * which any texture-based Game Object, such as a Sprite, can use as its source: + * + * ```javascript + * const vid = this.add.video(0, 0, 'intro'); + * + * vid.play(); + * + * vid.saveTexture('doodle'); + * + * this.add.image(400, 300, 'doodle'); + * ``` + * + * If the video is not yet playing then you need to listen for the `TEXTURE_READY` event before + * you can use this texture on a Game Object: + * + * ```javascript + * const vid = this.add.video(0, 0, 'intro'); + * + * vid.play(); + * + * vid.once('textureready', (video, texture, key) => { + * + * this.add.image(400, 300, key); + * + * }); + * + * vid.saveTexture('doodle'); + * ``` + * + * The saved texture is automatically updated as the video plays. If you pause this video, + * or change its source, then the saved texture updates instantly. + * + * Calling `saveTexture` again will not save another copy of the same texture, it will just rename the existing one. + * + * By default it will create a single base texture. You can add frames to the texture + * by using the `Texture.add` method. After doing this, you can then allow Game Objects + * to use a specific frame. + * + * If you intend to save the texture so you can use it as the input for a Shader, you may need to set the + * `flipY` parameter to `true` if you find the video renders upside down in your shader. + * @param key The unique key to store the texture as within the global Texture Manager. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y` during upload? Default false. + */ + saveTexture(key: string, flipY?: boolean): boolean; + + /** + * Stops the video playing and clears all internal event listeners. + * + * If you only wish to pause playback of the video, and resume it a later time, use the `Video.pause` method instead. + * + * If the video hasn't finished downloading, calling this method will not abort the download. To do that you need to + * call `destroy` instead. + * @param emitStopEvent Should the `VIDEO_STOP` event be emitted? Default true. + */ + stop(emitStopEvent?: boolean): this; + + /** + * Removes the Video element from the DOM by calling parentNode.removeChild on itself. + * + * Also removes the autoplay and src attributes and nulls the `Video.video` reference. + * + * If you loaded an external video via `Video.loadURL` then you should call this function + * to clear up once you are done with the instance, but don't want to destroy this + * Video Game Object. + * + * This method is called automatically by `Video.destroy`. + */ + removeVideoElement(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Zone Game Object. + * + * A Zone is a non-rendering rectangular Game Object that has a position and size. + * It has no texture and never displays, but does live on the display list and + * can be moved, scaled and rotated like any other Game Object. + * + * Its primary use is for creating Drop Zones and Input Hit Areas and it has a couple of helper methods + * specifically for this. It is also useful for object overlap checks, or as a base for your own + * non-displaying Game Objects. + * The default origin is 0.5, the center of the Zone, the same as with Game Objects. + */ + class Zone extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param width The width of the Game Object. Default 1. + * @param height The height of the Game Object. Default 1. + */ + constructor(scene: Phaser.Scene, x: number, y: number, width?: number, height?: number); + + /** + * The native (un-scaled) width of this Game Object. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + */ + height: number; + + /** + * The Blend Mode of the Game Object. + * Although a Zone never renders, it still has a blend mode to allow it to fit seamlessly into + * display lists without causing a batch flush. + */ + blendMode: number; + + /** + * The displayed width of this Game Object. + * This value takes into account the scale factor. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * This value takes into account the scale factor. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + * @param resizeInput If this Zone has a Rectangle for a hit area this argument will resize the hit area as well. Default true. + */ + setSize(width: number, height: number, resizeInput?: boolean): this; + + /** + * Sets the display size of this Game Object. + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * Sets this Zone to be a Circular Drop Zone. + * The circle is centered on this Zones `x` and `y` coordinates. + * @param radius The radius of the Circle that will form the Drop Zone. + */ + setCircleDropZone(radius: number): this; + + /** + * Sets this Zone to be a Rectangle Drop Zone. + * The rectangle is centered on this Zones `x` and `y` coordinates. + * @param width The width of the rectangle drop zone. + * @param height The height of the rectangle drop zone. + */ + setRectangleDropZone(width: number, height: number): this; + + /** + * Allows you to define your own Geometry shape to be used as a Drop Zone. + * @param hitArea A Geometry shape instance, such as Phaser.Geom.Ellipse, or your own custom shape. If not given it will try to create a Rectangle based on the size of this zone. + * @param hitAreaCallback A function that will return `true` if the given x/y coords it is sent are within the shape. If you provide a shape you must also provide a callback. + */ + setDropZone(hitArea?: object, hitAreaCallback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + } + + namespace Geom { + /** + * A Circle object. + * + * This is a geometry object, containing numerical values and related methods to inspect and modify them. + * It is not a Game Object, in that you cannot add it to the display list, and it has no texture. + * To render a Circle you should look at the capabilities of the Graphics class. + */ + class Circle { + /** + * + * @param x The x position of the center of the circle. Default 0. + * @param y The y position of the center of the circle. Default 0. + * @param radius The radius of the circle. Default 0. + */ + constructor(x?: number, y?: number, radius?: number); + + /** + * Calculates the area of the circle. + * @param circle The Circle to get the area of. + */ + static Area(circle: Phaser.Geom.Circle): number; + + /** + * The geometry constant type of this object: `GEOM_CONST.CIRCLE`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * The x position of the center of the circle. + */ + x: number; + + /** + * The y position of the center of the circle. + */ + y: number; + + /** + * Check to see if the Circle contains the given x / y coordinates. + * @param x The x coordinate to check within the circle. + * @param y The y coordinate to check within the circle. + */ + contains(x: number, y: number): boolean; + + /** + * Returns a Point object containing the coordinates of a point on the circumference of the Circle + * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point + * at 180 degrees around the circle. + * @param position A value between 0 and 1, where 0 equals 0 degrees, 0.5 equals 180 degrees and 1 equals 360 around the circle. + * @param out An object to store the return values in. If not given a Point object will be created. + */ + getPoint(position: number, out?: O): O; + + /** + * Returns an array of Point objects containing the coordinates of the points around the circumference of the Circle, + * based on the given quantity or stepRate values. + * @param quantity The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead. + * @param stepRate Sets the quantity by getting the circumference of the circle and dividing it by the stepRate. + * @param output An array to insert the points in to. If not provided a new array will be created. + */ + getPoints(quantity: number, stepRate?: number, output?: O): O; + + /** + * Returns a uniformly distributed random point from anywhere within the Circle. + * @param point A Point or point-like object to set the random `x` and `y` values in. + */ + getRandomPoint(point?: O): O; + + /** + * Sets the x, y and radius of this circle. + * @param x The x position of the center of the circle. Default 0. + * @param y The y position of the center of the circle. Default 0. + * @param radius The radius of the circle. Default 0. + */ + setTo(x?: number, y?: number, radius?: number): this; + + /** + * Sets this Circle to be empty with a radius of zero. + * Does not change its position. + */ + setEmpty(): this; + + /** + * Sets the position of this Circle. + * @param x The x position of the center of the circle. Default 0. + * @param y The y position of the center of the circle. Default 0. + */ + setPosition(x?: number, y?: number): this; + + /** + * Checks to see if the Circle is empty: has a radius of zero. + */ + isEmpty(): boolean; + + /** + * The radius of the Circle. + */ + radius: number; + + /** + * The diameter of the Circle. + */ + diameter: number; + + /** + * The left position of the Circle. + */ + left: number; + + /** + * The right position of the Circle. + */ + right: number; + + /** + * The top position of the Circle. + */ + top: number; + + /** + * The bottom position of the Circle. + */ + bottom: number; + + /** + * Returns the circumference of the given Circle. + * @param circle The Circle to get the circumference of. + */ + static Circumference(circle: Phaser.Geom.Circle): number; + + /** + * Returns a Point object containing the coordinates of a point on the circumference of the Circle based on the given angle. + * @param circle The Circle to get the circumference point on. + * @param angle The angle from the center of the Circle to the circumference to return the point from. Given in radians. + * @param out A Point, or point-like object, to store the results in. If not given a Point will be created. + */ + static CircumferencePoint(circle: Phaser.Geom.Circle, angle: number, out?: O): O; + + /** + * Creates a new Circle instance based on the values contained in the given source. + * @param source The Circle to be cloned. Can be an instance of a Circle or a circle-like object, with x, y and radius properties. + */ + static Clone(source: Phaser.Geom.Circle | object): Phaser.Geom.Circle; + + /** + * Check to see if the Circle contains the given x / y coordinates. + * @param circle The Circle to check. + * @param x The x coordinate to check within the circle. + * @param y The y coordinate to check within the circle. + */ + static Contains(circle: Phaser.Geom.Circle, x: number, y: number): boolean; + + /** + * Check to see if the Circle contains the given Point object. + * @param circle The Circle to check. + * @param point The Point object to check if it's within the Circle or not. + */ + static ContainsPoint(circle: Phaser.Geom.Circle, point: Phaser.Geom.Point | object): boolean; + + /** + * Check to see if the Circle contains all four points of the given Rectangle object. + * @param circle The Circle to check. + * @param rect The Rectangle object to check if it's within the Circle or not. + */ + static ContainsRect(circle: Phaser.Geom.Circle, rect: Phaser.Geom.Rectangle | object): boolean; + + /** + * Copies the `x`, `y` and `radius` properties from the `source` Circle + * into the given `dest` Circle, then returns the `dest` Circle. + * @param source The source Circle to copy the values from. + * @param dest The destination Circle to copy the values to. + */ + static CopyFrom(source: Phaser.Geom.Circle, dest: O): O; + + /** + * Compares the `x`, `y` and `radius` properties of the two given Circles. + * Returns `true` if they all match, otherwise returns `false`. + * @param circle The first Circle to compare. + * @param toCompare The second Circle to compare. + */ + static Equals(circle: Phaser.Geom.Circle, toCompare: Phaser.Geom.Circle): boolean; + + /** + * Returns the bounds of the Circle object. + * @param circle The Circle to get the bounds from. + * @param out A Rectangle, or rectangle-like object, to store the circle bounds in. If not given a new Rectangle will be created. + */ + static GetBounds(circle: Phaser.Geom.Circle, out?: O): O; + + /** + * Returns a Point object containing the coordinates of a point on the circumference of the Circle + * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point + * at 180 degrees around the circle. + * @param circle The Circle to get the circumference point on. + * @param position A value between 0 and 1, where 0 equals 0 degrees, 0.5 equals 180 degrees and 1 equals 360 around the circle. + * @param out An object to store the return values in. If not given a Point object will be created. + */ + static GetPoint(circle: Phaser.Geom.Circle, position: number, out?: O): O; + + /** + * Returns an array of Point objects containing the coordinates of the points around the circumference of the Circle, + * based on the given quantity or stepRate values. + * @param circle The Circle to get the points from. + * @param quantity The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead. + * @param stepRate Sets the quantity by getting the circumference of the circle and dividing it by the stepRate. + * @param output An array to insert the points in to. If not provided a new array will be created. + */ + static GetPoints(circle: Phaser.Geom.Circle, quantity: number, stepRate?: number, output?: any[]): Phaser.Geom.Point[]; + + /** + * Offsets the Circle by the values given. + * @param circle The Circle to be offset (translated.) + * @param x The amount to horizontally offset the Circle by. + * @param y The amount to vertically offset the Circle by. + */ + static Offset(circle: O, x: number, y: number): O; + + /** + * Offsets the Circle by the values given in the `x` and `y` properties of the Point object. + * @param circle The Circle to be offset (translated.) + * @param point The Point object containing the values to offset the Circle by. + */ + static OffsetPoint(circle: O, point: Phaser.Geom.Point | object): O; + + /** + * Returns a uniformly distributed random point from anywhere within the given Circle. + * @param circle The Circle to get a random point from. + * @param out A Point or point-like object to set the random `x` and `y` values in. + */ + static Random(circle: Phaser.Geom.Circle, out?: O): O; + + } + + /** + * A Circle Geometry object type. + */ + var CIRCLE: number; + + /** + * An Ellipse Geometry object type. + */ + var ELLIPSE: number; + + /** + * A Line Geometry object type. + */ + var LINE: number; + + /** + * A Point Geometry object type. + */ + var POINT: number; + + /** + * A Polygon Geometry object type. + */ + var POLYGON: number; + + /** + * A Rectangle Geometry object type. + */ + var RECTANGLE: number; + + /** + * A Triangle Geometry object type. + */ + var TRIANGLE: number; + + /** + * An Ellipse object. + * + * This is a geometry object, containing numerical values and related methods to inspect and modify them. + * It is not a Game Object, in that you cannot add it to the display list, and it has no texture. + * To render an Ellipse you should look at the capabilities of the Graphics class. + */ + class Ellipse { + /** + * + * @param x The x position of the center of the ellipse. Default 0. + * @param y The y position of the center of the ellipse. Default 0. + * @param width The width of the ellipse. Default 0. + * @param height The height of the ellipse. Default 0. + */ + constructor(x?: number, y?: number, width?: number, height?: number); + + /** + * Calculates the area of the Ellipse. + * @param ellipse The Ellipse to get the area of. + */ + static Area(ellipse: Phaser.Geom.Ellipse): number; + + /** + * Returns the circumference of the given Ellipse. + * @param ellipse The Ellipse to get the circumference of. + */ + static Circumference(ellipse: Phaser.Geom.Ellipse): number; + + /** + * Returns a Point object containing the coordinates of a point on the circumference of the Ellipse based on the given angle. + * @param ellipse The Ellipse to get the circumference point on. + * @param angle The angle from the center of the Ellipse to the circumference to return the point from. Given in radians. + * @param out A Point, or point-like object, to store the results in. If not given a Point will be created. + */ + static CircumferencePoint(ellipse: Phaser.Geom.Ellipse, angle: number, out?: O): O; + + /** + * Creates a new Ellipse instance based on the values contained in the given source. + * @param source The Ellipse to be cloned. Can be an instance of an Ellipse or a ellipse-like object, with x, y, width and height properties. + */ + static Clone(source: Phaser.Geom.Ellipse): Phaser.Geom.Ellipse; + + /** + * Check to see if the Ellipse contains the given x / y coordinates. + * @param ellipse The Ellipse to check. + * @param x The x coordinate to check within the ellipse. + * @param y The y coordinate to check within the ellipse. + */ + static Contains(ellipse: Phaser.Geom.Ellipse, x: number, y: number): boolean; + + /** + * Check to see if the Ellipse contains the given Point object. + * @param ellipse The Ellipse to check. + * @param point The Point object to check if it's within the Circle or not. + */ + static ContainsPoint(ellipse: Phaser.Geom.Ellipse, point: Phaser.Geom.Point | object): boolean; + + /** + * Check to see if the Ellipse contains all four points of the given Rectangle object. + * @param ellipse The Ellipse to check. + * @param rect The Rectangle object to check if it's within the Ellipse or not. + */ + static ContainsRect(ellipse: Phaser.Geom.Ellipse, rect: Phaser.Geom.Rectangle | object): boolean; + + /** + * Copies the `x`, `y`, `width` and `height` properties from the `source` Ellipse + * into the given `dest` Ellipse, then returns the `dest` Ellipse. + * @param source The source Ellipse to copy the values from. + * @param dest The destination Ellipse to copy the values to. + */ + static CopyFrom(source: Phaser.Geom.Ellipse, dest: O): O; + + /** + * The geometry constant type of this object: `GEOM_CONST.ELLIPSE`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * The x position of the center of the ellipse. + */ + x: number; + + /** + * The y position of the center of the ellipse. + */ + y: number; + + /** + * The width of the ellipse. + */ + width: number; + + /** + * The height of the ellipse. + */ + height: number; + + /** + * Check to see if the Ellipse contains the given x / y coordinates. + * @param x The x coordinate to check within the ellipse. + * @param y The y coordinate to check within the ellipse. + */ + contains(x: number, y: number): boolean; + + /** + * Returns a Point object containing the coordinates of a point on the circumference of the Ellipse + * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point + * at 180 degrees around the circle. + * @param position A value between 0 and 1, where 0 equals 0 degrees, 0.5 equals 180 degrees and 1 equals 360 around the ellipse. + * @param out An object to store the return values in. If not given a Point object will be created. + */ + getPoint(position: number, out?: O): O; + + /** + * Returns an array of Point objects containing the coordinates of the points around the circumference of the Ellipse, + * based on the given quantity or stepRate values. + * @param quantity The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead. + * @param stepRate Sets the quantity by getting the circumference of the ellipse and dividing it by the stepRate. + * @param output An array to insert the points in to. If not provided a new array will be created. + */ + getPoints(quantity: number, stepRate?: number, output?: O): O; + + /** + * Returns a uniformly distributed random point from anywhere within the given Ellipse. + * @param point A Point or point-like object to set the random `x` and `y` values in. + */ + getRandomPoint(point?: O): O; + + /** + * Sets the x, y, width and height of this ellipse. + * @param x The x position of the center of the ellipse. + * @param y The y position of the center of the ellipse. + * @param width The width of the ellipse. + * @param height The height of the ellipse. + */ + setTo(x: number, y: number, width: number, height: number): this; + + /** + * Sets this Ellipse to be empty with a width and height of zero. + * Does not change its position. + */ + setEmpty(): this; + + /** + * Sets the position of this Ellipse. + * @param x The x position of the center of the ellipse. + * @param y The y position of the center of the ellipse. + */ + setPosition(x: number, y: number): this; + + /** + * Sets the size of this Ellipse. + * Does not change its position. + * @param width The width of the ellipse. + * @param height The height of the ellipse. Default width. + */ + setSize(width: number, height?: number): this; + + /** + * Checks to see if the Ellipse is empty: has a width or height equal to zero. + */ + isEmpty(): boolean; + + /** + * Returns the minor radius of the ellipse. Also known as the Semi Minor Axis. + */ + getMinorRadius(): number; + + /** + * Returns the major radius of the ellipse. Also known as the Semi Major Axis. + */ + getMajorRadius(): number; + + /** + * The left position of the Ellipse. + */ + left: number; + + /** + * The right position of the Ellipse. + */ + right: number; + + /** + * The top position of the Ellipse. + */ + top: number; + + /** + * The bottom position of the Ellipse. + */ + bottom: number; + + /** + * Compares the `x`, `y`, `width` and `height` properties of the two given Ellipses. + * Returns `true` if they all match, otherwise returns `false`. + * @param ellipse The first Ellipse to compare. + * @param toCompare The second Ellipse to compare. + */ + static Equals(ellipse: Phaser.Geom.Ellipse, toCompare: Phaser.Geom.Ellipse): boolean; + + /** + * Returns the bounds of the Ellipse object. + * @param ellipse The Ellipse to get the bounds from. + * @param out A Rectangle, or rectangle-like object, to store the ellipse bounds in. If not given a new Rectangle will be created. + */ + static GetBounds(ellipse: Phaser.Geom.Ellipse, out?: O): O; + + /** + * Returns a Point object containing the coordinates of a point on the circumference of the Ellipse + * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point + * at 180 degrees around the circle. + * @param ellipse The Ellipse to get the circumference point on. + * @param position A value between 0 and 1, where 0 equals 0 degrees, 0.5 equals 180 degrees and 1 equals 360 around the ellipse. + * @param out An object to store the return values in. If not given a Point object will be created. + */ + static GetPoint(ellipse: Phaser.Geom.Ellipse, position: number, out?: O): O; + + /** + * Returns an array of Point objects containing the coordinates of the points around the circumference of the Ellipse, + * based on the given quantity or stepRate values. + * @param ellipse The Ellipse to get the points from. + * @param quantity The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead. + * @param stepRate Sets the quantity by getting the circumference of the ellipse and dividing it by the stepRate. + * @param out An array to insert the points in to. If not provided a new array will be created. + */ + static GetPoints(ellipse: Phaser.Geom.Ellipse, quantity: number, stepRate?: number, out?: O): O; + + /** + * Offsets the Ellipse by the values given. + * @param ellipse The Ellipse to be offset (translated.) + * @param x The amount to horizontally offset the Ellipse by. + * @param y The amount to vertically offset the Ellipse by. + */ + static Offset(ellipse: O, x: number, y: number): O; + + /** + * Offsets the Ellipse by the values given in the `x` and `y` properties of the Point object. + * @param ellipse The Ellipse to be offset (translated.) + * @param point The Point object containing the values to offset the Ellipse by. + */ + static OffsetPoint(ellipse: O, point: Phaser.Geom.Point | object): O; + + /** + * Returns a uniformly distributed random point from anywhere within the given Ellipse. + * @param ellipse The Ellipse to get a random point from. + * @param out A Point or point-like object to set the random `x` and `y` values in. + */ + static Random(ellipse: Phaser.Geom.Ellipse, out?: O): O; + + } + + namespace Intersects { + /** + * Checks if two Circles intersect. + * @param circleA The first Circle to check for intersection. + * @param circleB The second Circle to check for intersection. + */ + function CircleToCircle(circleA: Phaser.Geom.Circle, circleB: Phaser.Geom.Circle): boolean; + + /** + * Checks for intersection between a circle and a rectangle. + * @param circle The circle to be checked. + * @param rect The rectangle to be checked. + */ + function CircleToRectangle(circle: Phaser.Geom.Circle, rect: Phaser.Geom.Rectangle): boolean; + + /** + * Checks if two Circles intersect and returns the intersection points as a Point object array. + * @param circleA The first Circle to check for intersection. + * @param circleB The second Circle to check for intersection. + * @param out An optional array in which to store the points of intersection. + */ + function GetCircleToCircle(circleA: Phaser.Geom.Circle, circleB: Phaser.Geom.Circle, out?: any[]): any[]; + + /** + * Checks for intersection between a circle and a rectangle, + * and returns the intersection points as a Point object array. + * @param circle The circle to be checked. + * @param rect The rectangle to be checked. + * @param out An optional array in which to store the points of intersection. + */ + function GetCircleToRectangle(circle: Phaser.Geom.Circle, rect: Phaser.Geom.Rectangle, out?: any[]): any[]; + + /** + * Checks for intersection between the line segment and circle, + * and returns the intersection points as a Point object array. + * @param line The line segment to check. + * @param circle The circle to check against the line. + * @param out An optional array in which to store the points of intersection. + */ + function GetLineToCircle(line: Phaser.Geom.Line, circle: Phaser.Geom.Circle, out?: any[]): any[]; + + /** + * Checks for intersection between the two line segments, or a ray and a line segment, + * and returns the intersection point as a Vector3, or `null` if the lines are parallel, or do not intersect. + * + * The `z` property of the Vector3 contains the intersection distance, which can be used to find + * the closest intersecting point from a group of line segments. + * @param line1 The first line segment, or a ray, to check. + * @param line2 The second line segment to check. + * @param isRay Is `line1` a ray or a line segment? Default false. + * @param out A Vector3 to store the intersection results in. + */ + function GetLineToLine(line1: Phaser.Geom.Line, line2: Phaser.Geom.Line, isRay?: boolean, out?: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Checks for the closest point of intersection between a line segment and an array of points, where each pair + * of points are converted to line segments for the intersection tests. + * + * If no intersection is found, this function returns `null`. + * + * If intersection was found, a Vector3 is returned with the following properties: + * + * The `x` and `y` components contain the point of the intersection. + * The `z` component contains the closest distance. + * @param line The line segment, or ray, to check. If a ray, set the `isRay` parameter to `true`. + * @param points An array of points to check. + * @param isRay Is `line` a ray or a line segment? Default false. + * @param out A Vector3 to store the intersection results in. + */ + function GetLineToPoints(line: Phaser.Geom.Line, points: Phaser.Math.Vector2[] | Phaser.Geom.Point[], isRay?: boolean, out?: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Checks for the closest point of intersection between a line segment and an array of polygons. + * + * If no intersection is found, this function returns `null`. + * + * If intersection was found, a Vector4 is returned with the following properties: + * + * The `x` and `y` components contain the point of the intersection. + * The `z` component contains the closest distance. + * The `w` component contains the index of the polygon, in the given array, that triggered the intersection. + * @param line The line segment, or ray, to check. If a ray, set the `isRay` parameter to `true`. + * @param polygons A single polygon, or array of polygons, to check. + * @param isRay Is `line` a ray or a line segment? Default false. + * @param out A Vector4 to store the intersection results in. + */ + function GetLineToPolygon(line: Phaser.Geom.Line, polygons: Phaser.Geom.Polygon | Phaser.Geom.Polygon[], isRay?: boolean, out?: Phaser.Math.Vector4): Phaser.Math.Vector4; + + /** + * Checks for intersection between the Line and a Rectangle shape, + * and returns the intersection points as a Point object array. + * @param line The Line to check for intersection. + * @param rect The Rectangle to check for intersection. + * @param out An optional array in which to store the points of intersection. + */ + function GetLineToRectangle(line: Phaser.Geom.Line, rect: Phaser.Geom.Rectangle | object, out?: any[]): any[]; + + /** + * Projects rays out from the given point to each line segment of the polygons. + * + * If the rays intersect with the polygons, the points of intersection are returned in an array. + * + * If no intersections are found, the returned array will be empty. + * + * Each Vector4 intersection result has the following properties: + * + * The `x` and `y` components contain the point of the intersection. + * The `z` component contains the angle of intersection. + * The `w` component contains the index of the polygon, in the given array, that triggered the intersection. + * @param x The x coordinate to project the rays from. + * @param y The y coordinate to project the rays from. + * @param polygons A single polygon, or array of polygons, to check against the rays. + */ + function GetRaysFromPointToPolygon(x: number, y: number, polygons: Phaser.Geom.Polygon | Phaser.Geom.Polygon[]): Phaser.Math.Vector4[]; + + /** + * Checks if two Rectangle shapes intersect and returns the area of this intersection as Rectangle object. + * + * If optional `output` parameter is omitted, new Rectangle object is created and returned. If there is intersection, it will contain intersection area. If there is no intersection, it wil be empty Rectangle (all values set to zero). + * + * If Rectangle object is passed as `output` and there is intersection, then intersection area data will be loaded into it and it will be returned. If there is no intersection, it will be returned without any change. + * @param rectA The first Rectangle object. + * @param rectB The second Rectangle object. + * @param output Optional Rectangle object. If given, the intersection data will be loaded into it (in case of no intersection, it will be left unchanged). Otherwise, new Rectangle object will be created and returned with either intersection data or empty (all values set to zero), if there is no intersection. + */ + function GetRectangleIntersection(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle, output?: O): O; + + /** + * Checks if two Rectangles intersect and returns the intersection points as a Point object array. + * + * A Rectangle intersects another Rectangle if any part of its bounds is within the other Rectangle's bounds. As such, the two Rectangles are considered "solid". A Rectangle with no width or no height will never intersect another Rectangle. + * @param rectA The first Rectangle to check for intersection. + * @param rectB The second Rectangle to check for intersection. + * @param out An optional array in which to store the points of intersection. + */ + function GetRectangleToRectangle(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle, out?: any[]): any[]; + + /** + * Checks for intersection between Rectangle shape and Triangle shape, + * and returns the intersection points as a Point object array. + * @param rect Rectangle object to test. + * @param triangle Triangle object to test. + * @param out An optional array in which to store the points of intersection. + */ + function GetRectangleToTriangle(rect: Phaser.Geom.Rectangle, triangle: Phaser.Geom.Triangle, out?: any[]): any[]; + + /** + * Checks if a Triangle and a Circle intersect, and returns the intersection points as a Point object array. + * + * A Circle intersects a Triangle if its center is located within it or if any of the Triangle's sides intersect the Circle. As such, the Triangle and the Circle are considered "solid" for the intersection. + * @param triangle The Triangle to check for intersection. + * @param circle The Circle to check for intersection. + * @param out An optional array in which to store the points of intersection. + */ + function GetTriangleToCircle(triangle: Phaser.Geom.Triangle, circle: Phaser.Geom.Circle, out?: any[]): any[]; + + /** + * Checks if a Triangle and a Line intersect, and returns the intersection points as a Point object array. + * + * The Line intersects the Triangle if it starts inside of it, ends inside of it, or crosses any of the Triangle's sides. Thus, the Triangle is considered "solid". + * @param triangle The Triangle to check with. + * @param line The Line to check with. + * @param out An optional array in which to store the points of intersection. + */ + function GetTriangleToLine(triangle: Phaser.Geom.Triangle, line: Phaser.Geom.Line, out?: any[]): any[]; + + /** + * Checks if two Triangles intersect, and returns the intersection points as a Point object array. + * + * A Triangle intersects another Triangle if any pair of their lines intersects or if any point of one Triangle is within the other Triangle. Thus, the Triangles are considered "solid". + * @param triangleA The first Triangle to check for intersection. + * @param triangleB The second Triangle to check for intersection. + * @param out An optional array in which to store the points of intersection. + */ + function GetTriangleToTriangle(triangleA: Phaser.Geom.Triangle, triangleB: Phaser.Geom.Triangle, out?: any[]): any[]; + + /** + * Checks for intersection between the line segment and circle. + * + * Based on code by [Matt DesLauriers](https://github.com/mattdesl/line-circle-collision/blob/master/LICENSE.md). + * @param line The line segment to check. + * @param circle The circle to check against the line. + * @param nearest An optional Point-like object. If given the closest point on the Line where the circle intersects will be stored in this object. + */ + function LineToCircle(line: Phaser.Geom.Line, circle: Phaser.Geom.Circle, nearest?: Phaser.Geom.Point | any): boolean; + + /** + * Checks if two Lines intersect. If the Lines are identical, they will be treated as parallel and thus non-intersecting. + * @param line1 The first Line to check. + * @param line2 The second Line to check. + * @param out An optional point-like object in which to store the coordinates of intersection, if needed. + */ + function LineToLine(line1: Phaser.Geom.Line, line2: Phaser.Geom.Line, out?: Phaser.Types.Math.Vector2Like): boolean; + + /** + * Checks for intersection between the Line and a Rectangle shape, or a rectangle-like + * object, with public `x`, `y`, `right` and `bottom` properties, such as a Sprite or Body. + * + * An intersection is considered valid if: + * + * The line starts within, or ends within, the Rectangle. + * The line segment intersects one of the 4 rectangle edges. + * + * The for the purposes of this function rectangles are considered 'solid'. + * @param line The Line to check for intersection. + * @param rect The Rectangle to check for intersection. + */ + function LineToRectangle(line: Phaser.Geom.Line, rect: Phaser.Geom.Rectangle | object): boolean; + + /** + * Checks if the a Point falls between the two end-points of a Line, based on the given line thickness. + * + * Assumes that the line end points are circular, not square. + * @param point The point, or point-like object to check. + * @param line The line segment to test for intersection on. + * @param lineThickness The line thickness. Assumes that the line end points are circular. Default 1. + */ + function PointToLine(point: Phaser.Geom.Point | any, line: Phaser.Geom.Line, lineThickness?: number): boolean; + + /** + * Checks if a Point is located on the given line segment. + * @param point The Point to check for intersection. + * @param line The line segment to check for intersection. + */ + function PointToLineSegment(point: Phaser.Geom.Point, line: Phaser.Geom.Line): boolean; + + /** + * Checks if two Rectangles intersect. + * + * A Rectangle intersects another Rectangle if any part of its bounds is within the other Rectangle's bounds. + * As such, the two Rectangles are considered "solid". + * A Rectangle with no width or no height will never intersect another Rectangle. + * @param rectA The first Rectangle to check for intersection. + * @param rectB The second Rectangle to check for intersection. + */ + function RectangleToRectangle(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle): boolean; + + /** + * Checks for intersection between Rectangle shape and Triangle shape. + * @param rect Rectangle object to test. + * @param triangle Triangle object to test. + */ + function RectangleToTriangle(rect: Phaser.Geom.Rectangle, triangle: Phaser.Geom.Triangle): boolean; + + /** + * Check if rectangle intersects with values. + * @param rect The rectangle object + * @param left The x coordinate of the left of the Rectangle. + * @param right The x coordinate of the right of the Rectangle. + * @param top The y coordinate of the top of the Rectangle. + * @param bottom The y coordinate of the bottom of the Rectangle. + * @param tolerance Tolerance allowed in the calculation, expressed in pixels. Default 0. + */ + function RectangleToValues(rect: Phaser.Geom.Rectangle, left: number, right: number, top: number, bottom: number, tolerance?: number): boolean; + + /** + * Checks if a Triangle and a Circle intersect. + * + * A Circle intersects a Triangle if its center is located within it or if any of the Triangle's sides intersect the Circle. As such, the Triangle and the Circle are considered "solid" for the intersection. + * @param triangle The Triangle to check for intersection. + * @param circle The Circle to check for intersection. + */ + function TriangleToCircle(triangle: Phaser.Geom.Triangle, circle: Phaser.Geom.Circle): boolean; + + /** + * Checks if a Triangle and a Line intersect. + * + * The Line intersects the Triangle if it starts inside of it, ends inside of it, or crosses any of the Triangle's sides. Thus, the Triangle is considered "solid". + * @param triangle The Triangle to check with. + * @param line The Line to check with. + */ + function TriangleToLine(triangle: Phaser.Geom.Triangle, line: Phaser.Geom.Line): boolean; + + /** + * Checks if two Triangles intersect. + * + * A Triangle intersects another Triangle if any pair of their lines intersects or if any point of one Triangle is within the other Triangle. Thus, the Triangles are considered "solid". + * @param triangleA The first Triangle to check for intersection. + * @param triangleB The second Triangle to check for intersection. + */ + function TriangleToTriangle(triangleA: Phaser.Geom.Triangle, triangleB: Phaser.Geom.Triangle): boolean; + + } + + /** + * Defines a Line segment, a part of a line between two endpoints. + */ + class Line { + /** + * + * @param x1 The x coordinate of the lines starting point. Default 0. + * @param y1 The y coordinate of the lines starting point. Default 0. + * @param x2 The x coordinate of the lines ending point. Default 0. + * @param y2 The y coordinate of the lines ending point. Default 0. + */ + constructor(x1?: number, y1?: number, x2?: number, y2?: number); + + /** + * Calculate the angle of the line in radians. + * @param line The line to calculate the angle of. + */ + static Angle(line: Phaser.Geom.Line): number; + + /** + * Using Bresenham's line algorithm this will return an array of all coordinates on this line. + * + * The `start` and `end` points are rounded before this runs as the algorithm works on integers. + * @param line The line. + * @param stepRate The optional step rate for the points on the line. Default 1. + * @param results An optional array to push the resulting coordinates into. + */ + static BresenhamPoints(line: Phaser.Geom.Line, stepRate?: number, results?: Phaser.Types.Math.Vector2Like[]): Phaser.Types.Math.Vector2Like[]; + + /** + * Center a line on the given coordinates. + * @param line The line to center. + * @param x The horizontal coordinate to center the line on. + * @param y The vertical coordinate to center the line on. + */ + static CenterOn(line: Phaser.Geom.Line, x: number, y: number): Phaser.Geom.Line; + + /** + * Clone the given line. + * @param source The source line to clone. + */ + static Clone(source: Phaser.Geom.Line): Phaser.Geom.Line; + + /** + * Copy the values of one line to a destination line. + * @param source The source line to copy the values from. + * @param dest The destination line to copy the values to. + */ + static CopyFrom(source: Phaser.Geom.Line, dest: O): O; + + /** + * Compare two lines for strict equality. + * @param line The first line to compare. + * @param toCompare The second line to compare. + */ + static Equals(line: Phaser.Geom.Line, toCompare: Phaser.Geom.Line): boolean; + + /** + * Extends the start and end points of a Line by the given amounts. + * + * The amounts can be positive or negative. Positive points will increase the length of the line, + * while negative ones will decrease it. + * + * If no `right` value is provided it will extend the length of the line equally in both directions. + * + * Pass a value of zero to leave the start or end point unchanged. + * @param line The line instance to extend. + * @param left The amount to extend the start of the line by. + * @param right The amount to extend the end of the line by. If not given it will be set to the `left` value. + */ + static Extend(line: Phaser.Geom.Line, left: number, right?: number): Phaser.Geom.Line; + + /** + * Returns an array of `quantity` Points where each point is taken from the given Line, + * spaced out according to the ease function specified. + * + * ```javascript + * const line = new Phaser.Geom.Line(100, 300, 700, 300); + * const points = Phaser.Geom.Line.GetEasedPoints(line, 'sine.out', 32) + * ``` + * + * In the above example, the `points` array will contain 32 points spread-out across + * the length of `line`, where the position of each point is determined by the `Sine.out` + * ease function. + * + * You can optionally provide a collinear threshold. In this case, the resulting points + * are checked against each other, and if they are `< collinearThreshold` distance apart, + * they are dropped from the results. This can help avoid lots of clustered points at + * far ends of the line with tightly-packed eases such as Quartic. Leave the value set + * to zero to skip this check. + * + * Note that if you provide a collinear threshold, the resulting array may not always + * contain `quantity` points. + * @param line The Line object. + * @param ease The ease to use. This can be either a string from the EaseMap, or a custom function. + * @param quantity The number of points to return. Note that if you provide a `collinearThreshold`, the resulting array may not always contain this number of points. + * @param collinearThreshold An optional threshold. The final array is reduced so that each point is spaced out at least this distance apart. This helps reduce clustering in noisey eases. Default 0. + * @param easeParams An optional array of ease parameters to go with the ease. + */ + static GetEasedPoints(line: Phaser.Geom.Line, ease: string | Function, quantity: number, collinearThreshold?: number, easeParams?: number[]): O; + + /** + * Get the midpoint of the given line. + * @param line The line to get the midpoint of. + * @param out An optional point object to store the midpoint in. + */ + static GetMidPoint(line: Phaser.Geom.Line, out?: O): O; + + /** + * Get the nearest point on a line perpendicular to the given point. + * @param line The line to get the nearest point on. + * @param point The point to get the nearest point to. + * @param out An optional point, or point-like object, to store the coordinates of the nearest point on the line. + */ + static GetNearestPoint(line: Phaser.Geom.Line, point: Phaser.Geom.Point | object, out?: O): O; + + /** + * Calculate the normal of the given line. + * + * The normal of a line is a vector that points perpendicular from it. + * @param line The line to calculate the normal of. + * @param out An optional point object to store the normal in. + */ + static GetNormal(line: Phaser.Geom.Line, out?: O): O; + + /** + * Get a point on a line that's a given percentage along its length. + * @param line The line. + * @param position A value between 0 and 1, where 0 is the start, 0.5 is the middle and 1 is the end of the line. + * @param out An optional point, or point-like object, to store the coordinates of the point on the line. + */ + static GetPoint(line: Phaser.Geom.Line, position: number, out?: O): O; + + /** + * Get a number of points along a line's length. + * + * Provide a `quantity` to get an exact number of points along the line. + * + * Provide a `stepRate` to ensure a specific distance between each point on the line. Set `quantity` to `0` when + * providing a `stepRate`. + * + * See also `GetEasedPoints` for a way to distribute the points across the line according to an ease type or input function. + * @param line The line. + * @param quantity The number of points to place on the line. Set to `0` to use `stepRate` instead. + * @param stepRate The distance between each point on the line. When set, `quantity` is implied and should be set to `0`. + * @param out An optional array of Points, or point-like objects, to store the coordinates of the points on the line. + */ + static GetPoints(line: Phaser.Geom.Line, quantity: number, stepRate?: number, out?: O): O; + + /** + * Get the shortest distance from a Line to the given Point. + * @param line The line to get the distance from. + * @param point The point to get the shortest distance to. + */ + static GetShortestDistance(line: Phaser.Geom.Line, point: Phaser.Types.Math.Vector2Like): boolean | number; + + /** + * Calculate the height of the given line. + * @param line The line to calculate the height of. + */ + static Height(line: Phaser.Geom.Line): number; + + /** + * Calculate the length of the given line. + * @param line The line to calculate the length of. + */ + static Length(line: Phaser.Geom.Line): number; + + /** + * The geometry constant type of this object: `GEOM_CONST.LINE`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * The x coordinate of the lines starting point. + */ + x1: number; + + /** + * The y coordinate of the lines starting point. + */ + y1: number; + + /** + * The x coordinate of the lines ending point. + */ + x2: number; + + /** + * The y coordinate of the lines ending point. + */ + y2: number; + + /** + * Get a point on a line that's a given percentage along its length. + * @param position A value between 0 and 1, where 0 is the start, 0.5 is the middle and 1 is the end of the line. + * @param output An optional point, or point-like object, to store the coordinates of the point on the line. + */ + getPoint(position: number, output?: O): O; + + /** + * Get a number of points along a line's length. + * + * Provide a `quantity` to get an exact number of points along the line. + * + * Provide a `stepRate` to ensure a specific distance between each point on the line. Set `quantity` to `0` when + * providing a `stepRate`. + * @param quantity The number of points to place on the line. Set to `0` to use `stepRate` instead. + * @param stepRate The distance between each point on the line. When set, `quantity` is implied and should be set to `0`. + * @param output An optional array of Points, or point-like objects, to store the coordinates of the points on the line. + */ + getPoints(quantity: number, stepRate?: number, output?: O): O; + + /** + * Get a random Point on the Line. + * @param point An instance of a Point to be modified. + */ + getRandomPoint(point?: O): O; + + /** + * Set new coordinates for the line endpoints. + * @param x1 The x coordinate of the lines starting point. Default 0. + * @param y1 The y coordinate of the lines starting point. Default 0. + * @param x2 The x coordinate of the lines ending point. Default 0. + * @param y2 The y coordinate of the lines ending point. Default 0. + */ + setTo(x1?: number, y1?: number, x2?: number, y2?: number): this; + + /** + * Sets this Line to match the x/y coordinates of the two given Vector2Like objects. + * @param start Any object with public `x` and `y` properties, whose values will be assigned to the x1/y1 components of this Line. + * @param end Any object with public `x` and `y` properties, whose values will be assigned to the x2/y2 components of this Line. + */ + setFromObjects(start: Phaser.Types.Math.Vector2Like, end: Phaser.Types.Math.Vector2Like): this; + + /** + * Returns a Vector2 object that corresponds to the start of this Line. + * @param vec2 A Vector2 object to set the results in. If `undefined` a new Vector2 will be created. + */ + getPointA(vec2?: O): O; + + /** + * Returns a Vector2 object that corresponds to the end of this Line. + * @param vec2 A Vector2 object to set the results in. If `undefined` a new Vector2 will be created. + */ + getPointB(vec2?: O): O; + + /** + * The left position of the Line. + */ + left: number; + + /** + * The right position of the Line. + */ + right: number; + + /** + * The top position of the Line. + */ + top: number; + + /** + * The bottom position of the Line. + */ + bottom: number; + + /** + * Get the angle of the normal of the given line in radians. + * @param line The line to calculate the angle of the normal of. + */ + static NormalAngle(line: Phaser.Geom.Line): number; + + /** + * Returns the x component of the normal vector of the given line. + * @param line The Line object to get the normal value from. + */ + static NormalX(line: Phaser.Geom.Line): number; + + /** + * The Y value of the normal of the given line. + * The normal of a line is a vector that points perpendicular from it. + * @param line The line to calculate the normal of. + */ + static NormalY(line: Phaser.Geom.Line): number; + + /** + * Offset a line by the given amount. + * @param line The line to offset. + * @param x The horizontal offset to add to the line. + * @param y The vertical offset to add to the line. + */ + static Offset(line: O, x: number, y: number): O; + + /** + * Calculate the perpendicular slope of the given line. + * @param line The line to calculate the perpendicular slope of. + */ + static PerpSlope(line: Phaser.Geom.Line): number; + + /** + * Returns a random point on a given Line. + * @param line The Line to calculate the random Point on. + * @param out An instance of a Point to be modified. + */ + static Random(line: Phaser.Geom.Line, out?: O): O; + + /** + * Calculate the reflected angle between two lines. + * + * This is the outgoing angle based on the angle of Line 1 and the normalAngle of Line 2. + * @param lineA The first line. + * @param lineB The second line. + */ + static ReflectAngle(lineA: Phaser.Geom.Line, lineB: Phaser.Geom.Line): number; + + /** + * Rotate a line around its midpoint by the given angle in radians. + * @param line The line to rotate. + * @param angle The angle of rotation in radians. + */ + static Rotate(line: O, angle: number): O; + + /** + * Rotate a line around a point by the given angle in radians. + * @param line The line to rotate. + * @param point The point to rotate the line around. + * @param angle The angle of rotation in radians. + */ + static RotateAroundPoint(line: O, point: Phaser.Geom.Point | object, angle: number): O; + + /** + * Rotate a line around the given coordinates by the given angle in radians. + * @param line The line to rotate. + * @param x The horizontal coordinate to rotate the line around. + * @param y The vertical coordinate to rotate the line around. + * @param angle The angle of rotation in radians. + */ + static RotateAroundXY(line: O, x: number, y: number, angle: number): O; + + /** + * Set a line to a given position, angle and length. + * @param line The line to set. + * @param x The horizontal start position of the line. + * @param y The vertical start position of the line. + * @param angle The angle of the line in radians. + * @param length The length of the line. + */ + static SetToAngle(line: O, x: number, y: number, angle: number, length: number): O; + + /** + * Calculate the slope of the given line. + * @param line The line to calculate the slope of. + */ + static Slope(line: Phaser.Geom.Line): number; + + /** + * Calculate the width of the given line. + * @param line The line to calculate the width of. + */ + static Width(line: Phaser.Geom.Line): number; + + } + + namespace Mesh { + /** + * A Face Geometry Object. + * + * A Face is used by the Mesh Game Object. A Mesh consists of one, or more, faces that are + * used to render the Mesh Game Objects in WebGL. + * + * A Face consists of 3 Vertex instances, for the 3 corners of the face and methods to help + * you modify and test them. + */ + class Face { + /** + * + * @param vertex1 The first vertex of the Face. + * @param vertex2 The second vertex of the Face. + * @param vertex3 The third vertex of the Face. + */ + constructor(vertex1: Phaser.Geom.Mesh.Vertex, vertex2: Phaser.Geom.Mesh.Vertex, vertex3: Phaser.Geom.Mesh.Vertex); + + /** + * The first vertex in this Face. + */ + vertex1: Phaser.Geom.Mesh.Vertex; + + /** + * The second vertex in this Face. + */ + vertex2: Phaser.Geom.Mesh.Vertex; + + /** + * The third vertex in this Face. + */ + vertex3: Phaser.Geom.Mesh.Vertex; + + /** + * The bounds of this Face. + * + * Be sure to call the `Face.updateBounds` method _before_ using this property. + */ + bounds: Phaser.Geom.Rectangle; + + /** + * Calculates and returns the in-center position of this Face. + * @param local Return the in center from the un-transformed vertex positions (`true`), or transformed? (`false`) Default true. + */ + getInCenter(local?: boolean): Phaser.Math.Vector2; + + /** + * Checks if the given coordinates are within this Face. + * + * You can optionally provide a transform matrix. If given, the Face vertices + * will be transformed first, before being checked against the coordinates. + * @param x The horizontal position to check. + * @param y The vertical position to check. + * @param calcMatrix Optional transform matrix to apply to the vertices before comparison. + */ + contains(x: number, y: number, calcMatrix?: Phaser.GameObjects.Components.TransformMatrix): boolean; + + /** + * Checks if the vertices in this Face are orientated counter-clockwise, or not. + * + * It checks the transformed position of the vertices, not the local one. + * @param z The z-axis value to test against. Typically the `Mesh.modelPosition.z`. + */ + isCounterClockwise(z: number): boolean; + + /** + * Loads the data from this Vertex into the given Typed Arrays. + * @param F32 A Float32 Array to insert the position, UV and unit data in to. + * @param U32 A Uint32 Array to insert the color and alpha data in to. + * @param offset The index of the array to insert this Vertex to. + * @param textureUnit The texture unit currently in use. + * @param tintEffect The tint effect to use. + */ + load(F32: Float32Array, U32: Uint32Array, offset: number, textureUnit: number, tintEffect: number): number; + + /** + * Transforms all Face vertices by the given matrix, storing the results in their `vx`, `vy` and `vz` properties. + * @param transformMatrix The transform matrix to apply to this vertex. + * @param width The width of the parent Mesh. + * @param height The height of the parent Mesh. + * @param cameraZ The z position of the MeshCamera. + */ + transformCoordinatesLocal(transformMatrix: Phaser.Math.Matrix4, width: number, height: number, cameraZ: number): this; + + /** + * Updates the bounds of this Face, based on the translated values of the vertices. + * + * Call this method prior to accessing the `Face.bounds` property. + */ + updateBounds(): this; + + /** + * Checks if this Face is within the view of the given Camera. + * + * This method is called in the `MeshWebGLRenderer` function. It performs the following tasks: + * + * First, the `Vertex.update` method is called on each of the vertices. This populates them + * with the new translated values, updating their `tx`, `ty` and `ta` properties. + * + * Then it tests to see if this face is visible due to the alpha values, if not, it returns. + * + * After this, if `hideCCW` is set, it calls `isCounterClockwise` and returns if not. + * + * Finally, it will update the `Face.bounds` based on the newly translated vertex values + * and return the results of an intersection test between the bounds and the camera world view + * rectangle. + * @param camera The Camera to check against. + * @param hideCCW Test the counter-clockwise orientation of the verts? + * @param z The Cameras z position, used in the CCW test. + * @param alpha The alpha of the parent object. + * @param a The parent transform matrix data a component. + * @param b The parent transform matrix data b component. + * @param c The parent transform matrix data c component. + * @param d The parent transform matrix data d component. + * @param e The parent transform matrix data e component. + * @param f The parent transform matrix data f component. + * @param roundPixels Round the vertex position or not? + */ + isInView(camera: Phaser.Cameras.Scene2D.Camera, hideCCW: boolean, z: number, alpha: number, a: number, b: number, c: number, d: number, e: number, f: number, roundPixels: boolean): boolean; + + /** + * Translates the original UV positions of each vertex by the given amounts. + * + * The original properties `Vertex.u` and `Vertex.v` + * remain unchanged, only the translated properties + * `Vertex.tu` and `Vertex.tv`, as used in rendering, + * are updated. + * @param x The amount to scroll the UV u coordinate by. + * @param y The amount to scroll the UV v coordinate by. + */ + scrollUV(x: number, y: number): this; + + /** + * Scales the original UV values of each vertex by the given amounts. + * + * The original properties `Vertex.u` and `Vertex.v` + * remain unchanged, only the translated properties + * `Vertex.tu` and `Vertex.tv`, as used in rendering, + * are updated. + * @param x The amount to scale the UV u coordinate by. + * @param y The amount to scale the UV v coordinate by. + */ + scaleUV(x: number, y: number): this; + + /** + * Sets the color value for each Vertex in this Face. + * @param color The color value for each vertex. + */ + setColor(color: number): this; + + /** + * Calls the `Vertex.update` method on each of the vertices. This populates them + * with the new translated values, updating their `tx`, `ty` and `ta` properties. + * @param alpha The alpha of the parent object. + * @param a The parent transform matrix data a component. + * @param b The parent transform matrix data b component. + * @param c The parent transform matrix data c component. + * @param d The parent transform matrix data d component. + * @param e The parent transform matrix data e component. + * @param f The parent transform matrix data f component. + * @param roundPixels Round the vertex position or not? + */ + update(alpha: number, a: number, b: number, c: number, d: number, e: number, f: number, roundPixels: boolean): this; + + /** + * Translates the vertices of this Face by the given amounts. + * + * The actual vertex positions are adjusted, not their transformed position. + * + * Therefore, this updates the vertex data directly. + * @param x The amount to horizontally translate by. + * @param y The amount to vertically translate by. Default 0. + */ + translate(x: number, y?: number): this; + + /** + * The x coordinate of this Face, based on the in center position of the Face. + */ + x: number; + + /** + * The y coordinate of this Face, based on the in center position of the Face. + */ + y: number; + + /** + * Set the alpha value of this Face. + * + * Each vertex is given the same value. If you need to adjust the alpha on a per-vertex basis + * then use the `Vertex.alpha` property instead. + * + * When getting the alpha of this Face, it will return an average of the alpha + * component of all three vertices. + */ + alpha: number; + + /** + * The depth of this Face, which is an average of the z component of all three vertices. + * + * The depth is calculated based on the transformed z value, not the local one. + */ + readonly depth: number; + + /** + * Destroys this Face and nulls the references to the vertices. + */ + destroy(): void; + + } + + /** + * Creates a grid of vertices based on the given configuration object and optionally adds it to a Mesh. + * + * The size of the grid is given in pixels. An example configuration may be: + * + * `{ width: 256, height: 256, widthSegments: 2, heightSegments: 2, tile: true }` + * + * This will create a grid 256 x 256 pixels in size, split into 2 x 2 segments, with + * the texture tiling across the cells. + * + * You can split the grid into segments both vertically and horizontally. This will + * generate two faces per grid segment as a result. + * + * The `tile` parameter allows you to control if the tile will repeat across the grid + * segments, or be displayed in full. + * + * If adding this grid to a Mesh you can offset the grid via the `x` and `y` properties. + * + * UV coordinates are generated based on the given texture and frame in the config. For + * example, no frame is given, the UVs will be in the range 0 to 1. If a frame is given, + * such as from a texture atlas, the UVs will be generated within the range of that frame. + * @param config A Grid configuration object. + */ + function GenerateGridVerts(config: Phaser.Types.Geom.Mesh.GenerateGridConfig): Phaser.Types.Geom.Mesh.GenerateGridVertsResult; + + /** + * This method will return an object containing Face and Vertex instances, generated + * from the parsed triangulated OBJ Model data given to this function. + * + * The obj data should have been parsed in advance via the ParseObj function: + * + * ```javascript + * var data = Phaser.Geom.Mesh.ParseObj(rawData, flipUV); + * + * var results = GenerateObjVerts(data); + * ``` + * + * Alternatively, you can parse obj files loaded via the OBJFile loader: + * + * ```javascript + * preload () + * { + * this.load.obj('alien', 'assets/3d/alien.obj); + * } + * + * var results = GenerateObjVerts(this.cache.obj.get('alien)); + * ``` + * + * Make sure your 3D package has triangulated the model data prior to exporting it. + * + * You can use the data returned by this function to populate the vertices of a Mesh Game Object. + * + * You may add multiple models to a single Mesh, although they will act as one when + * moved or rotated. You can scale the model data, should it be too small (or large) to visualize. + * You can also offset the model via the `x`, `y` and `z` parameters. + * @param data The parsed OBJ model data. + * @param mesh An optional Mesh Game Object. If given, the generated Faces will be automatically added to this Mesh. Set to `null` to skip. + * @param scale An amount to scale the model data by. Use this if the model has exported too small, or large, to see. Default 1. + * @param x Translate the model x position by this amount. Default 0. + * @param y Translate the model y position by this amount. Default 0. + * @param z Translate the model z position by this amount. Default 0. + * @param rotateX Rotate the model on the x axis by this amount, in radians. Default 0. + * @param rotateY Rotate the model on the y axis by this amount, in radians. Default 0. + * @param rotateZ Rotate the model on the z axis by this amount, in radians. Default 0. + * @param zIsUp Is the z axis up (true), or is y axis up (false)? Default true. + */ + function GenerateObjVerts(data: Phaser.Types.Geom.Mesh.OBJData, mesh?: Phaser.GameObjects.Mesh, scale?: number, x?: number, y?: number, z?: number, rotateX?: number, rotateY?: number, rotateZ?: number, zIsUp?: boolean): Phaser.Types.Geom.Mesh.GenerateVertsResult; + + /** + * Generates a set of Face and Vertex objects by parsing the given data. + * + * This method will take vertex data in one of two formats, based on the `containsZ` parameter. + * + * If your vertex data are `x`, `y` pairs, then `containsZ` should be `false` (this is the default) + * + * If your vertex data is groups of `x`, `y` and `z` values, then the `containsZ` parameter must be true. + * + * The `uvs` parameter is a numeric array consisting of `u` and `v` pairs. + * + * The `normals` parameter is a numeric array consisting of `x`, `y` vertex normal values and, if `containsZ` is true, `z` values as well. + * + * The `indicies` parameter is an optional array that, if given, is an indexed list of vertices to be added. + * + * The `colors` parameter is an optional array, or single value, that if given sets the color of each vertex created. + * + * The `alphas` parameter is an optional array, or single value, that if given sets the alpha of each vertex created. + * + * When providing indexed data it is assumed that _all_ of the arrays are indexed, not just the vertices. + * + * The following example will create a 256 x 256 sized quad using an index array: + * + * ```javascript + * const vertices = [ + * -128, 128, + * 128, 128, + * -128, -128, + * 128, -128 + * ]; + * + * const uvs = [ + * 0, 1, + * 1, 1, + * 0, 0, + * 1, 0 + * ]; + * + * const indices = [ 0, 2, 1, 2, 3, 1 ]; + * + * GenerateVerts(vertices, uvs, indicies); + * ``` + * + * If the data is not indexed, it's assumed that the arrays all contain sequential data. + * @param vertices The vertices array. Either `xy` pairs, or `xyz` if the `containsZ` parameter is `true`. + * @param uvs The UVs pairs array. + * @param indicies Optional vertex indicies array. If you don't have one, pass `null` or an empty array. + * @param containsZ Does the vertices data include a `z` component? Default false. + * @param normals Optional vertex normals array. If you don't have one, pass `null` or an empty array. + * @param colors An array of colors, one per vertex, or a single color value applied to all vertices. Default 0xffffff. + * @param alphas An array of alpha values, one per vertex, or a single alpha value applied to all vertices. Default 1. + * @param flipUV Flip the UV coordinates? Default false. + */ + function GenerateVerts(vertices: number[], uvs: number[], indicies?: number[], containsZ?: boolean, normals?: number[], colors?: number | number[], alphas?: number | number[], flipUV?: boolean): Phaser.Types.Geom.Mesh.GenerateVertsResult; + + /** + * Parses a Wavefront OBJ File, extracting the models from it and returning them in an array. + * + * The model data *must* be triangulated for a Mesh Game Object to be able to render it. + * @param data The OBJ File data as a raw string. + * @param flipUV Flip the UV coordinates? Default true. + */ + function ParseObj(data: string, flipUV?: boolean): Phaser.Types.Geom.Mesh.OBJData; + + /** + * Takes a Wavefront Material file and extracts the diffuse reflectivity of the named + * materials, converts them to integer color values and returns them. + * + * This is used internally by the `addOBJ` and `addModel` methods, but is exposed for + * public consumption as well. + * + * Note this only works with diffuse values, specified in the `Kd r g b` format, where + * `g` and `b` are optional, but `r` is required. It does not support spectral rfl files, + * or any other material statement (such as `Ka` or `Ks`) + * @param mtl The OBJ MTL file as a raw string, i.e. loaded via `this.load.text`. + */ + function ParseObjMaterial(mtl: string): object; + + /** + * Rotates the vertices of a Face to the given angle. + * + * The actual vertex positions are adjusted, not their transformed positions. + * + * Therefore, this updates the vertex data directly. + * @param face The Face to rotate. + * @param angle The angle to rotate to, in radians. + * @param cx An optional center of rotation. If not given, the Face in-center is used. + * @param cy An optional center of rotation. If not given, the Face in-center is used. + */ + function RotateFace(face: Phaser.Geom.Mesh.Face, angle: number, cx?: number, cy?: number): void; + + /** + * A Vertex Geometry Object. + * + * This class consists of all the information required for a single vertex within a Face Geometry Object. + * + * Faces, and thus Vertex objects, are used by the Mesh Game Object in order to render objects in WebGL. + */ + class Vertex extends Phaser.Math.Vector3 { + /** + * + * @param x The x position of the vertex. + * @param y The y position of the vertex. + * @param z The z position of the vertex. + * @param u The UV u coordinate of the vertex. + * @param v The UV v coordinate of the vertex. + * @param color The color value of the vertex. Default 0xffffff. + * @param alpha The alpha value of the vertex. Default 1. + * @param nx The x normal value of the vertex. Default 0. + * @param ny The y normal value of the vertex. Default 0. + * @param nz The z normal value of the vertex. Default 0. + */ + constructor(x: number, y: number, z: number, u: number, v: number, color?: number, alpha?: number, nx?: number, ny?: number, nz?: number); + + /** + * The projected x coordinate of this vertex. + */ + vx: number; + + /** + * The projected y coordinate of this vertex. + */ + vy: number; + + /** + * The projected z coordinate of this vertex. + */ + vz: number; + + /** + * The normalized projected x coordinate of this vertex. + */ + nx: number; + + /** + * The normalized projected y coordinate of this vertex. + */ + ny: number; + + /** + * The normalized projected z coordinate of this vertex. + */ + nz: number; + + /** + * UV u coordinate of this vertex. + */ + u: number; + + /** + * UV v coordinate of this vertex. + */ + v: number; + + /** + * The color value of this vertex. + */ + color: number; + + /** + * The alpha value of this vertex. + */ + alpha: number; + + /** + * The translated x coordinate of this vertex. + */ + tx: number; + + /** + * The translated y coordinate of this vertex. + */ + ty: number; + + /** + * The translated alpha value of this vertex. + */ + ta: number; + + /** + * The translated uv u coordinate of this vertex. + */ + tu: number; + + /** + * The translated uv v coordinate of this vertex. + */ + tv: number; + + /** + * Sets the U and V properties. + * + * Also resets the translated uv properties, undoing any scale + * or shift they may have had. + * @param u The UV u coordinate of the vertex. + * @param v The UV v coordinate of the vertex. + */ + setUVs(u: number, v: number): this; + + /** + * Translates the original UV positions by the given amounts. + * + * The original properties `Vertex.u` and `Vertex.v` + * remain unchanged, only the translated properties + * `Vertex.tu` and `Vertex.tv`, as used in rendering, + * are updated. + * @param x The amount to scroll the UV u coordinate by. + * @param y The amount to scroll the UV v coordinate by. + */ + scrollUV(x: number, y: number): this; + + /** + * Scales the original UV values by the given amounts. + * + * The original properties `Vertex.u` and `Vertex.v` + * remain unchanged, only the translated properties + * `Vertex.tu` and `Vertex.tv`, as used in rendering, + * are updated. + * @param x The amount to scale the UV u coordinate by. + * @param y The amount to scale the UV v coordinate by. + */ + scaleUV(x: number, y: number): this; + + /** + * Transforms this vertex by the given matrix, storing the results in `vx`, `vy` and `vz`. + * @param transformMatrix The transform matrix to apply to this vertex. + * @param width The width of the parent Mesh. + * @param height The height of the parent Mesh. + * @param cameraZ The z position of the MeshCamera. + */ + transformCoordinatesLocal(transformMatrix: Phaser.Math.Matrix4, width: number, height: number, cameraZ: number): void; + + /** + * Resizes this Vertex by setting the x and y coordinates, then transforms this vertex + * by an identity matrix and dimensions, storing the results in `vx`, `vy` and `vz`. + * @param x The x position of the vertex. + * @param y The y position of the vertex. + * @param width The width of the parent Mesh. + * @param height The height of the parent Mesh. + * @param originX The originX of the parent Mesh. + * @param originY The originY of the parent Mesh. + */ + resize(x: number, y: number, width: number, height: number, originX: number, originY: number): this; + + /** + * Updates this Vertex based on the given transform. + * @param a The parent transform matrix data a component. + * @param b The parent transform matrix data b component. + * @param c The parent transform matrix data c component. + * @param d The parent transform matrix data d component. + * @param e The parent transform matrix data e component. + * @param f The parent transform matrix data f component. + * @param roundPixels Round the vertex position or not? + * @param alpha The alpha of the parent object. + */ + update(a: number, b: number, c: number, d: number, e: number, f: number, roundPixels: boolean, alpha: number): this; + + /** + * Loads the data from this Vertex into the given Typed Arrays. + * @param F32 A Float32 Array to insert the position, UV and unit data in to. + * @param U32 A Uint32 Array to insert the color and alpha data in to. + * @param offset The index of the array to insert this Vertex to. + * @param textureUnit The texture unit currently in use. + * @param tintEffect The tint effect to use. + */ + load(F32: Float32Array, U32: Uint32Array, offset: number, textureUnit: number, tintEffect: number): number; + + } + + } + + /** + * Defines a Point in 2D space, with an x and y component. + */ + class Point { + /** + * + * @param x The x coordinate of this Point. Default 0. + * @param y The y coordinate of this Point. Default x. + */ + constructor(x?: number, y?: number); + + /** + * Apply `Math.ceil()` to each coordinate of the given Point. + * @param point The Point to ceil. + */ + static Ceil(point: O): O; + + /** + * Clone the given Point. + * @param source The source Point to clone. + */ + static Clone(source: Phaser.Geom.Point): Phaser.Geom.Point; + + /** + * Copy the values of one Point to a destination Point. + * @param source The source Point to copy the values from. + * @param dest The destination Point to copy the values to. + */ + static CopyFrom(source: Phaser.Geom.Point, dest: O): O; + + /** + * A comparison of two `Point` objects to see if they are equal. + * @param point The original `Point` to compare against. + * @param toCompare The second `Point` to compare. + */ + static Equals(point: Phaser.Geom.Point, toCompare: Phaser.Geom.Point): boolean; + + /** + * Apply `Math.ceil()` to each coordinate of the given Point. + * @param point The Point to floor. + */ + static Floor(point: O): O; + + /** + * Get the centroid or geometric center of a plane figure (the arithmetic mean position of all the points in the figure). + * Informally, it is the point at which a cutout of the shape could be perfectly balanced on the tip of a pin. + * @param points An array of Vector2Like objects to get the geometric center of. + * @param out A Point object to store the output coordinates in. If not given, a new Point instance is created. + */ + static GetCentroid(points: Phaser.Types.Math.Vector2Like[], out?: O): O; + + /** + * Calculate the magnitude of the point, which equivalent to the length of the line from the origin to this point. + * @param point The point to calculate the magnitude for + */ + static GetMagnitude(point: Phaser.Geom.Point): number; + + /** + * Calculates the square of magnitude of given point.(Can be used for fast magnitude calculation of point) + * @param point Returns square of the magnitude/length of given point. + */ + static GetMagnitudeSq(point: Phaser.Geom.Point): number; + + /** + * Calculates the Axis Aligned Bounding Box (or aabb) from an array of points. + * @param points An array of Vector2Like objects to get the AABB from. + * @param out A Rectangle object to store the results in. If not given, a new Rectangle instance is created. + */ + static GetRectangleFromPoints(points: Phaser.Types.Math.Vector2Like[], out?: O): O; + + /** + * Returns the linear interpolation point between the two given points, based on `t`. + * @param pointA The starting `Point` for the interpolation. + * @param pointB The target `Point` for the interpolation. + * @param t The amount to interpolate between the two points. Generally, a value between 0 (returns the starting `Point`) and 1 (returns the target `Point`). If omitted, 0 is used. Default 0. + * @param out An optional `Point` object whose `x` and `y` values will be set to the result of the interpolation (can also be any object with `x` and `y` properties). If omitted, a new `Point` created and returned. + */ + static Interpolate(pointA: Phaser.Geom.Point, pointB: Phaser.Geom.Point, t?: number, out?: O): O; + + /** + * Swaps the X and the Y coordinate of a point. + * @param point The Point to modify. + */ + static Invert(point: O): O; + + /** + * Inverts a Point's coordinates. + * @param point The Point to invert. + * @param out The Point to return the inverted coordinates in. + */ + static Negative(point: Phaser.Geom.Point, out?: O): O; + + /** + * The geometry constant type of this object: `GEOM_CONST.POINT`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * The x coordinate of this Point. + */ + x: number; + + /** + * The y coordinate of this Point. + */ + y: number; + + /** + * Set the x and y coordinates of the point to the given values. + * @param x The x coordinate of this Point. Default 0. + * @param y The y coordinate of this Point. Default x. + */ + setTo(x?: number, y?: number): this; + + /** + * Calculates the vector projection of `pointA` onto the nonzero `pointB`. This is the + * orthogonal projection of `pointA` onto a straight line parallel to `pointB`. + * @param pointA Point A, to be projected onto Point B. + * @param pointB Point B, to have Point A projected upon it. + * @param out The Point object to store the position in. If not given, a new Point instance is created. + */ + static Project(pointA: Phaser.Geom.Point, pointB: Phaser.Geom.Point, out?: O): O; + + /** + * Calculates the vector projection of `pointA` onto the nonzero `pointB`. This is the + * orthogonal projection of `pointA` onto a straight line paralle to `pointB`. + * @param pointA Point A, to be projected onto Point B. Must be a normalized point with a magnitude of 1. + * @param pointB Point B, to have Point A projected upon it. + * @param out The Point object to store the position in. If not given, a new Point instance is created. + */ + static ProjectUnit(pointA: Phaser.Geom.Point, pointB: Phaser.Geom.Point, out?: O): O; + + /** + * Changes the magnitude (length) of a two-dimensional vector without changing its direction. + * @param point The Point to treat as the end point of the vector. + * @param magnitude The new magnitude of the vector. + */ + static SetMagnitude(point: O, magnitude: number): O; + + } + + /** + * A Polygon object + * + * The polygon is a closed shape consists of a series of connected straight lines defined by list of ordered points. + * Several formats are supported to define the list of points, check the setTo method for details. + * This is a geometry object allowing you to define and inspect the shape. + * It is not a Game Object, in that you cannot add it to the display list, and it has no texture. + * To render a Polygon you should look at the capabilities of the Graphics class. + */ + class Polygon { + /** + * + * @param points List of points defining the perimeter of this Polygon. Several formats are supported: + * - A string containing paired x y values separated by a single space: `'40 0 40 20 100 20 100 80 40 80 40 100 0 50'` + * - An array of Point objects: `[new Phaser.Point(x1, y1), ...]` + * - An array of objects with public x y properties: `[obj1, obj2, ...]` + * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]` + * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]` + */ + constructor(points?: string | number[] | Phaser.Types.Math.Vector2Like[]); + + /** + * Create a new polygon which is a copy of the specified polygon + * @param polygon The polygon to create a clone of + */ + static Clone(polygon: Phaser.Geom.Polygon): Phaser.Geom.Polygon; + + /** + * Checks if a point is within the bounds of a Polygon. + * @param polygon The Polygon to check against. + * @param x The X coordinate of the point to check. + * @param y The Y coordinate of the point to check. + */ + static Contains(polygon: Phaser.Geom.Polygon, x: number, y: number): boolean; + + /** + * Checks the given Point again the Polygon to see if the Point lays within its vertices. + * @param polygon The Polygon to check. + * @param point The Point to check if it's within the Polygon. + */ + static ContainsPoint(polygon: Phaser.Geom.Polygon, point: Phaser.Geom.Point): boolean; + + /** + * This module implements a modified ear slicing algorithm, optimized by z-order curve hashing and extended to + * handle holes, twisted polygons, degeneracies and self-intersections in a way that doesn't guarantee correctness + * of triangulation, but attempts to always produce acceptable results for practical data. + * + * Example: + * + * ```javascript + * const triangles = Phaser.Geom.Polygon.Earcut([10,0, 0,50, 60,60, 70,10]); // returns [1,0,3, 3,2,1] + * ``` + * + * Each group of three vertex indices in the resulting array forms a triangle. + * + * ```javascript + * // triangulating a polygon with a hole + * earcut([0,0, 100,0, 100,100, 0,100, 20,20, 80,20, 80,80, 20,80], [4]); + * // [3,0,4, 5,4,0, 3,4,7, 5,0,1, 2,3,7, 6,5,1, 2,7,6, 6,1,2] + * + * // triangulating a polygon with 3d coords + * earcut([10,0,1, 0,50,2, 60,60,3, 70,10,4], null, 3); + * // [1,0,3, 3,2,1] + * ``` + * + * If you pass a single vertex as a hole, Earcut treats it as a Steiner point. + * + * If your input is a multi-dimensional array (e.g. GeoJSON Polygon), you can convert it to the format + * expected by Earcut with `Phaser.Geom.Polygon.Earcut.flatten`: + * + * ```javascript + * var data = earcut.flatten(geojson.geometry.coordinates); + * var triangles = earcut(data.vertices, data.holes, data.dimensions); + * ``` + * + * After getting a triangulation, you can verify its correctness with `Phaser.Geom.Polygon.Earcut.deviation`: + * + * ```javascript + * var deviation = earcut.deviation(vertices, holes, dimensions, triangles); + * ``` + * Returns the relative difference between the total area of triangles and the area of the input polygon. + * 0 means the triangulation is fully correct. + * + * For more information see https://github.com/mapbox/earcut + * @param data A flat array of vertex coordinate, like [x0,y0, x1,y1, x2,y2, ...] + * @param holeIndices An array of hole indices if any (e.g. [5, 8] for a 12-vertex input would mean one hole with vertices 5–7 and another with 8–11). + * @param dimensions The number of coordinates per vertex in the input array (2 by default). Default 2. + */ + static Earcut(data: number[], holeIndices?: number[], dimensions?: number): number[]; + + /** + * Calculates the bounding AABB rectangle of a polygon. + * @param polygon The polygon that should be calculated. + * @param out The rectangle or object that has x, y, width, and height properties to store the result. Optional. + */ + static GetAABB(polygon: Phaser.Geom.Polygon, out?: O): O; + + /** + * Stores all of the points of a Polygon into a flat array of numbers following the sequence [ x,y, x,y, x,y ], + * i.e. each point of the Polygon, in the order it's defined, corresponds to two elements of the resultant + * array for the point's X and Y coordinate. + * @param polygon The Polygon whose points to export. + * @param output An array to which the points' coordinates should be appended. + */ + static GetNumberArray(polygon: Phaser.Geom.Polygon, output?: O): O; + + /** + * Returns an array of Point objects containing the coordinates of the points around the perimeter of the Polygon, + * based on the given quantity or stepRate values. + * @param polygon The Polygon to get the points from. + * @param quantity The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead. + * @param stepRate Sets the quantity by getting the perimeter of the Polygon and dividing it by the stepRate. + * @param output An array to insert the points in to. If not provided a new array will be created. + */ + static GetPoints(polygon: Phaser.Geom.Polygon, quantity: number, stepRate?: number, output?: any[]): Phaser.Geom.Point[]; + + /** + * Returns the perimeter of the given Polygon. + * @param polygon The Polygon to get the perimeter of. + */ + static Perimeter(polygon: Phaser.Geom.Polygon): number; + + /** + * The geometry constant type of this object: `GEOM_CONST.POLYGON`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * The area of this Polygon. + */ + area: number; + + /** + * An array of number pair objects that make up this polygon. I.e. [ {x,y}, {x,y}, {x,y} ] + */ + points: Phaser.Geom.Point[]; + + /** + * Check to see if the Polygon contains the given x / y coordinates. + * @param x The x coordinate to check within the polygon. + * @param y The y coordinate to check within the polygon. + */ + contains(x: number, y: number): boolean; + + /** + * Sets this Polygon to the given points. + * + * The points can be set from a variety of formats: + * + * - A string containing paired values separated by a single space: `'40 0 40 20 100 20 100 80 40 80 40 100 0 50'` + * - An array of Point objects: `[new Phaser.Point(x1, y1), ...]` + * - An array of objects with public x/y properties: `[obj1, obj2, ...]` + * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]` + * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]` + * + * `setTo` may also be called without any arguments to remove all points. + * @param points Points defining the perimeter of this polygon. Please check function description above for the different supported formats. + */ + setTo(points?: string | number[] | Phaser.Types.Math.Vector2Like[]): this; + + /** + * Calculates the area of the Polygon. This is available in the property Polygon.area + */ + calculateArea(): number; + + /** + * Returns an array of Point objects containing the coordinates of the points around the perimeter of the Polygon, + * based on the given quantity or stepRate values. + * @param quantity The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead. + * @param stepRate Sets the quantity by getting the perimeter of the Polygon and dividing it by the stepRate. + * @param output An array to insert the points in to. If not provided a new array will be created. + */ + getPoints(quantity: number, stepRate?: number, output?: O): O; + + /** + * Reverses the order of the points of a Polygon. + * @param polygon The Polygon to modify. + */ + static Reverse(polygon: O): O; + + /** + * Takes a Polygon object and simplifies the points by running them through a combination of + * Douglas-Peucker and Radial Distance algorithms. Simplification dramatically reduces the number of + * points in a polygon while retaining its shape, giving a huge performance boost when processing + * it and also reducing visual noise. + * @param polygon The polygon to be simplified. The polygon will be modified in-place and returned. + * @param tolerance Affects the amount of simplification (in the same metric as the point coordinates). Default 1. + * @param highestQuality Excludes distance-based preprocessing step which leads to highest quality simplification but runs ~10-20 times slower. Default false. + */ + static Simplify(polygon: O, tolerance?: number, highestQuality?: boolean): O; + + /** + * Takes a Polygon object and applies Chaikin's smoothing algorithm on its points. + * @param polygon The polygon to be smoothed. The polygon will be modified in-place and returned. + */ + static Smooth(polygon: O): O; + + /** + * Tranlates the points of the given Polygon. + * @param polygon The Polygon to modify. + * @param x The amount to horizontally translate the points by. + * @param y The amount to vertically translate the points by. + */ + static Translate(polygon: O, x: number, y: number): O; + + } + + /** + * Encapsulates a 2D rectangle defined by its corner point in the top-left and its extends in x (width) and y (height) + */ + class Rectangle { + /** + * + * @param x The X coordinate of the top left corner of the Rectangle. Default 0. + * @param y The Y coordinate of the top left corner of the Rectangle. Default 0. + * @param width The width of the Rectangle. Default 0. + * @param height The height of the Rectangle. Default 0. + */ + constructor(x?: number, y?: number, width?: number, height?: number); + + /** + * Calculates the area of the given Rectangle object. + * @param rect The rectangle to calculate the area of. + */ + static Area(rect: Phaser.Geom.Rectangle): number; + + /** + * Rounds a Rectangle's position up to the smallest integer greater than or equal to each current coordinate. + * @param rect The Rectangle to adjust. + */ + static Ceil(rect: O): O; + + /** + * Rounds a Rectangle's position and size up to the smallest integer greater than or equal to each respective value. + * @param rect The Rectangle to modify. + */ + static CeilAll(rect: O): O; + + /** + * Moves the top-left corner of a Rectangle so that its center is at the given coordinates. + * @param rect The Rectangle to be centered. + * @param x The X coordinate of the Rectangle's center. + * @param y The Y coordinate of the Rectangle's center. + */ + static CenterOn(rect: O, x: number, y: number): O; + + /** + * Creates a new Rectangle which is identical to the given one. + * @param source The Rectangle to clone. + */ + static Clone(source: Phaser.Geom.Rectangle): Phaser.Geom.Rectangle; + + /** + * Checks if a given point is inside a Rectangle's bounds. + * @param rect The Rectangle to check. + * @param x The X coordinate of the point to check. + * @param y The Y coordinate of the point to check. + */ + static Contains(rect: Phaser.Geom.Rectangle, x: number, y: number): boolean; + + /** + * Determines whether the specified point is contained within the rectangular region defined by this Rectangle object. + * @param rect The Rectangle object. + * @param point The point object to be checked. Can be a Phaser Point object or any object with x and y values. + */ + static ContainsPoint(rect: Phaser.Geom.Rectangle, point: Phaser.Geom.Point): boolean; + + /** + * Tests if one rectangle fully contains another. + * @param rectA The first rectangle. + * @param rectB The second rectangle. + */ + static ContainsRect(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle): boolean; + + /** + * Copy the values of one Rectangle to a destination Rectangle. + * @param source The source Rectangle to copy the values from. + * @param dest The destination Rectangle to copy the values to. + */ + static CopyFrom(source: Phaser.Geom.Rectangle, dest: O): O; + + /** + * Create an array of points for each corner of a Rectangle + * If an array is specified, each point object will be added to the end of the array, otherwise a new array will be created. + * @param rect The Rectangle object to be decomposed. + * @param out If provided, each point will be added to this array. + */ + static Decompose(rect: Phaser.Geom.Rectangle, out?: any[]): any[]; + + /** + * Compares the `x`, `y`, `width` and `height` properties of two rectangles. + * @param rect Rectangle A + * @param toCompare Rectangle B + */ + static Equals(rect: Phaser.Geom.Rectangle, toCompare: Phaser.Geom.Rectangle): boolean; + + /** + * Adjusts the target rectangle, changing its width, height and position, + * so that it fits inside the area of the source rectangle, while maintaining its original + * aspect ratio. + * + * Unlike the `FitOutside` function, there may be some space inside the source area not covered. + * @param target The target rectangle to adjust. + * @param source The source rectangle to envelop the target in. + */ + static FitInside(target: O, source: Phaser.Geom.Rectangle): O; + + /** + * Adjusts the target rectangle, changing its width, height and position, + * so that it fully covers the area of the source rectangle, while maintaining its original + * aspect ratio. + * + * Unlike the `FitInside` function, the target rectangle may extend further out than the source. + * @param target The target rectangle to adjust. + * @param source The source rectangle to envelope the target in. + */ + static FitOutside(target: O, source: Phaser.Geom.Rectangle): O; + + /** + * Rounds down (floors) the top left X and Y coordinates of the given Rectangle to the largest integer less than or equal to them + * @param rect The rectangle to floor the top left X and Y coordinates of + */ + static Floor(rect: O): O; + + /** + * Rounds a Rectangle's position and size down to the largest integer less than or equal to each current coordinate or dimension. + * @param rect The Rectangle to adjust. + */ + static FloorAll(rect: O): O; + + /** + * Constructs new Rectangle or repositions and resizes an existing Rectangle so that all of the given points are on or within its bounds. + * + * The `points` parameter is an array of Point-like objects: + * + * ```js + * const points = [ + * [100, 200], + * [200, 400], + * { x: 30, y: 60 } + * ] + * ``` + * @param points An array of points (either arrays with two elements corresponding to the X and Y coordinate or an object with public `x` and `y` properties) which should be surrounded by the Rectangle. + * @param out Optional Rectangle to adjust. + */ + static FromPoints(points: any[], out?: O): O; + + /** + * Create the smallest Rectangle containing two coordinate pairs. + * @param x1 The X coordinate of the first point. + * @param y1 The Y coordinate of the first point. + * @param x2 The X coordinate of the second point. + * @param y2 The Y coordinate of the second point. + * @param out Optional Rectangle to adjust. + */ + static FromXY(x1: number, y1: number, x2: number, y2: number, out?: O): O; + + /** + * Calculates the width/height ratio of a rectangle. + * @param rect The rectangle. + */ + static GetAspectRatio(rect: Phaser.Geom.Rectangle): number; + + /** + * Returns the center of a Rectangle as a Point. + * @param rect The Rectangle to get the center of. + * @param out Optional point-like object to update with the center coordinates. + */ + static GetCenter(rect: Phaser.Geom.Rectangle, out?: O): O; + + /** + * Calculates the coordinates of a point at a certain `position` on the Rectangle's perimeter. + * + * The `position` is a fraction between 0 and 1 which defines how far into the perimeter the point is. + * + * A value of 0 or 1 returns the point at the top left corner of the rectangle, while a value of 0.5 returns the point at the bottom right corner of the rectangle. Values between 0 and 0.5 are on the top or the right side and values between 0.5 and 1 are on the bottom or the left side. + * @param rectangle The Rectangle to get the perimeter point from. + * @param position The normalized distance into the Rectangle's perimeter to return. + * @param out An object to update with the `x` and `y` coordinates of the point. + */ + static GetPoint(rectangle: Phaser.Geom.Rectangle, position: number, out?: O): O; + + /** + * Return an array of points from the perimeter of the rectangle, each spaced out based on the quantity or step required. + * @param rectangle The Rectangle object to get the points from. + * @param step Step between points. Used to calculate the number of points to return when quantity is falsey. Ignored if quantity is positive. + * @param quantity The number of evenly spaced points from the rectangles perimeter to return. If falsey, step param will be used to calculate the number of points. + * @param out An optional array to store the points in. + */ + static GetPoints(rectangle: Phaser.Geom.Rectangle, step: number, quantity: number, out?: O): O; + + /** + * Returns the size of the Rectangle, expressed as a Point object. + * With the value of the `width` as the `x` property and the `height` as the `y` property. + * @param rect The Rectangle to get the size from. + * @param out The Point object to store the size in. If not given, a new Point instance is created. + */ + static GetSize(rect: Phaser.Geom.Rectangle, out?: O): O; + + /** + * Increases the size of a Rectangle by a specified amount. + * + * The center of the Rectangle stays the same. The amounts are added to each side, so the actual increase in width or height is two times bigger than the respective argument. + * @param rect The Rectangle to inflate. + * @param x How many pixels the left and the right side should be moved by horizontally. + * @param y How many pixels the top and the bottom side should be moved by vertically. + */ + static Inflate(rect: O, x: number, y: number): O; + + /** + * Takes two Rectangles and first checks to see if they intersect. + * If they intersect it will return the area of intersection in the `out` Rectangle. + * If they do not intersect, the `out` Rectangle will have a width and height of zero. + * @param rectA The first Rectangle to get the intersection from. + * @param rectB The second Rectangle to get the intersection from. + * @param out A Rectangle to store the intersection results in. + */ + static Intersection(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle, out?: Phaser.Geom.Rectangle): O; + + /** + * Returns an array of points from the perimeter of the Rectangle, where each point is spaced out based + * on either the `step` value, or the `quantity`. + * @param rect The Rectangle to get the perimeter points from. + * @param step The distance between each point of the perimeter. Set to `null` if you wish to use the `quantity` parameter instead. + * @param quantity The total number of points to return. The step is then calculated based on the length of the Rectangle, divided by this value. + * @param out An array in which the perimeter points will be stored. If not given, a new array instance is created. + */ + static MarchingAnts(rect: Phaser.Geom.Rectangle, step?: number, quantity?: number, out?: O): O; + + /** + * Merges a Rectangle with a list of points by repositioning and/or resizing it such that all points are located on or within its bounds. + * @param target The Rectangle which should be merged. + * @param points An array of Points (or any object with public `x` and `y` properties) which should be merged with the Rectangle. + */ + static MergePoints(target: O, points: Phaser.Geom.Point[]): O; + + /** + * Merges the source rectangle into the target rectangle and returns the target. + * Neither rectangle should have a negative width or height. + * @param target Target rectangle. Will be modified to include source rectangle. + * @param source Rectangle that will be merged into target rectangle. + */ + static MergeRect(target: O, source: Phaser.Geom.Rectangle): O; + + /** + * Merges a Rectangle with a point by repositioning and/or resizing it so that the point is on or within its bounds. + * @param target The Rectangle which should be merged and modified. + * @param x The X coordinate of the point which should be merged. + * @param y The Y coordinate of the point which should be merged. + */ + static MergeXY(target: O, x: number, y: number): O; + + /** + * Nudges (translates) the top left corner of a Rectangle by a given offset. + * @param rect The Rectangle to adjust. + * @param x The distance to move the Rectangle horizontally. + * @param y The distance to move the Rectangle vertically. + */ + static Offset(rect: O, x: number, y: number): O; + + /** + * Nudges (translates) the top-left corner of a Rectangle by the coordinates of a point (translation vector). + * @param rect The Rectangle to adjust. + * @param point The point whose coordinates should be used as an offset. + */ + static OffsetPoint(rect: O, point: Phaser.Geom.Point | Phaser.Math.Vector2): O; + + /** + * Checks if two Rectangles overlap. If a Rectangle is within another Rectangle, the two will be considered overlapping. Thus, the Rectangles are treated as "solid". + * @param rectA The first Rectangle to check. + * @param rectB The second Rectangle to check. + */ + static Overlaps(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle): boolean; + + /** + * Calculates the perimeter of a Rectangle. + * @param rect The Rectangle to use. + */ + static Perimeter(rect: Phaser.Geom.Rectangle): number; + + /** + * Returns a Point from the perimeter of a Rectangle based on the given angle. + * @param rectangle The Rectangle to get the perimeter point from. + * @param angle The angle of the point, in degrees. + * @param out The Point object to store the position in. If not given, a new Point instance is created. + */ + static PerimeterPoint(rectangle: Phaser.Geom.Rectangle, angle: number, out?: O): O; + + /** + * Returns a random point within a Rectangle. + * @param rect The Rectangle to return a point from. + * @param out The object to update with the point's coordinates. + */ + static Random(rect: Phaser.Geom.Rectangle, out: O): O; + + /** + * Calculates a random point that lies within the `outer` Rectangle, but outside of the `inner` Rectangle. + * The inner Rectangle must be fully contained within the outer rectangle. + * @param outer The outer Rectangle to get the random point within. + * @param inner The inner Rectangle to exclude from the returned point. + * @param out A Point, or Point-like object to store the result in. If not specified, a new Point will be created. + */ + static RandomOutside(outer: Phaser.Geom.Rectangle, inner: Phaser.Geom.Rectangle, out?: O): O; + + /** + * The geometry constant type of this object: `GEOM_CONST.RECTANGLE`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * The X coordinate of the top left corner of the Rectangle. + */ + x: number; + + /** + * The Y coordinate of the top left corner of the Rectangle. + */ + y: number; + + /** + * The width of the Rectangle, i.e. the distance between its left side (defined by `x`) and its right side. + */ + width: number; + + /** + * The height of the Rectangle, i.e. the distance between its top side (defined by `y`) and its bottom side. + */ + height: number; + + /** + * Checks if the given point is inside the Rectangle's bounds. + * @param x The X coordinate of the point to check. + * @param y The Y coordinate of the point to check. + */ + contains(x: number, y: number): boolean; + + /** + * Calculates the coordinates of a point at a certain `position` on the Rectangle's perimeter. + * + * The `position` is a fraction between 0 and 1 which defines how far into the perimeter the point is. + * + * A value of 0 or 1 returns the point at the top left corner of the rectangle, while a value of 0.5 returns the point at the bottom right corner of the rectangle. Values between 0 and 0.5 are on the top or the right side and values between 0.5 and 1 are on the bottom or the left side. + * @param position The normalized distance into the Rectangle's perimeter to return. + * @param output An object to update with the `x` and `y` coordinates of the point. + */ + getPoint(position: number, output?: O): O; + + /** + * Returns an array of points from the perimeter of the Rectangle, each spaced out based on the quantity or step required. + * @param quantity The number of points to return. Set to `false` or 0 to return an arbitrary number of points (`perimeter / stepRate`) evenly spaced around the Rectangle based on the `stepRate`. + * @param stepRate If `quantity` is 0, determines the normalized distance between each returned point. + * @param output An array to which to append the points. + */ + getPoints(quantity: number, stepRate?: number, output?: O): O; + + /** + * Returns a random point within the Rectangle's bounds. + * @param point The object in which to store the `x` and `y` coordinates of the point. + */ + getRandomPoint(point?: O): O; + + /** + * Sets the position, width, and height of the Rectangle. + * @param x The X coordinate of the top left corner of the Rectangle. + * @param y The Y coordinate of the top left corner of the Rectangle. + * @param width The width of the Rectangle. + * @param height The height of the Rectangle. + */ + setTo(x: number, y: number, width: number, height: number): this; + + /** + * Resets the position, width, and height of the Rectangle to 0. + */ + setEmpty(): this; + + /** + * Sets the position of the Rectangle. + * @param x The X coordinate of the top left corner of the Rectangle. + * @param y The Y coordinate of the top left corner of the Rectangle. Default x. + */ + setPosition(x: number, y?: number): this; + + /** + * Sets the width and height of the Rectangle. + * @param width The width to set the Rectangle to. + * @param height The height to set the Rectangle to. Default width. + */ + setSize(width: number, height?: number): this; + + /** + * Determines if the Rectangle is empty. A Rectangle is empty if its width or height is less than or equal to 0. + */ + isEmpty(): boolean; + + /** + * Returns a Line object that corresponds to the top of this Rectangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineA(line?: O): O; + + /** + * Returns a Line object that corresponds to the right of this Rectangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineB(line?: O): O; + + /** + * Returns a Line object that corresponds to the bottom of this Rectangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineC(line?: O): O; + + /** + * Returns a Line object that corresponds to the left of this Rectangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineD(line?: O): O; + + /** + * The x coordinate of the left of the Rectangle. + * Changing the left property of a Rectangle object has no effect on the y and height properties. However it does affect the width property, whereas changing the x value does not affect the width property. + */ + left: number; + + /** + * The sum of the x and width properties. + * Changing the right property of a Rectangle object has no effect on the x, y and height properties, however it does affect the width property. + */ + right: number; + + /** + * The y coordinate of the top of the Rectangle. Changing the top property of a Rectangle object has no effect on the x and width properties. + * However it does affect the height property, whereas changing the y value does not affect the height property. + */ + top: number; + + /** + * The sum of the y and height properties. + * Changing the bottom property of a Rectangle object has no effect on the x, y and width properties, but does change the height property. + */ + bottom: number; + + /** + * The x coordinate of the center of the Rectangle. + */ + centerX: number; + + /** + * The y coordinate of the center of the Rectangle. + */ + centerY: number; + + /** + * Determines if the two objects (either Rectangles or Rectangle-like) have the same width and height values under strict equality. + * @param rect The first Rectangle object. + * @param toCompare The second Rectangle object. + */ + static SameDimensions(rect: Phaser.Geom.Rectangle, toCompare: Phaser.Geom.Rectangle): boolean; + + /** + * Scales the width and height of this Rectangle by the given amounts. + * @param rect The `Rectangle` object that will be scaled by the specified amount(s). + * @param x The factor by which to scale the rectangle horizontally. + * @param y The amount by which to scale the rectangle vertically. If this is not specified, the rectangle will be scaled by the factor `x` in both directions. + */ + static Scale(rect: O, x: number, y: number): O; + + /** + * Creates a new Rectangle or repositions and/or resizes an existing Rectangle so that it encompasses the two given Rectangles, i.e. calculates their union. + * @param rectA The first Rectangle to use. + * @param rectB The second Rectangle to use. + * @param out The Rectangle to store the union in. + */ + static Union(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle, out?: O): O; + + } + + /** + * A triangle is a plane created by connecting three points. + * The first two arguments specify the first point, the middle two arguments + * specify the second point, and the last two arguments specify the third point. + */ + class Triangle { + /** + * + * @param x1 `x` coordinate of the first point. Default 0. + * @param y1 `y` coordinate of the first point. Default 0. + * @param x2 `x` coordinate of the second point. Default 0. + * @param y2 `y` coordinate of the second point. Default 0. + * @param x3 `x` coordinate of the third point. Default 0. + * @param y3 `y` coordinate of the third point. Default 0. + */ + constructor(x1?: number, y1?: number, x2?: number, y2?: number, x3?: number, y3?: number); + + /** + * Returns the area of a Triangle. + * @param triangle The Triangle to use. + */ + static Area(triangle: Phaser.Geom.Triangle): number; + + /** + * Builds an equilateral triangle. In the equilateral triangle, all the sides are the same length (congruent) and all the angles are the same size (congruent). + * The x/y specifies the top-middle of the triangle (x1/y1) and length is the length of each side. + * @param x x coordinate of the top point of the triangle. + * @param y y coordinate of the top point of the triangle. + * @param length Length of each side of the triangle. + */ + static BuildEquilateral(x: number, y: number, length: number): Phaser.Geom.Triangle; + + /** + * Takes an array of vertex coordinates, and optionally an array of hole indices, then returns an array + * of Triangle instances, where the given vertices have been decomposed into a series of triangles. + * @param data A flat array of vertex coordinates like [x0,y0, x1,y1, x2,y2, ...] + * @param holes An array of hole indices if any (e.g. [5, 8] for a 12-vertex input would mean one hole with vertices 5–7 and another with 8–11). Default null. + * @param scaleX Horizontal scale factor to multiply the resulting points by. Default 1. + * @param scaleY Vertical scale factor to multiply the resulting points by. Default 1. + * @param out An array to store the resulting Triangle instances in. If not provided, a new array is created. + */ + static BuildFromPolygon(data: any[], holes?: any[], scaleX?: number, scaleY?: number, out?: O): O; + + /** + * Builds a right triangle, i.e. one which has a 90-degree angle and two acute angles. + * @param x The X coordinate of the right angle, which will also be the first X coordinate of the constructed Triangle. + * @param y The Y coordinate of the right angle, which will also be the first Y coordinate of the constructed Triangle. + * @param width The length of the side which is to the left or to the right of the right angle. + * @param height The length of the side which is above or below the right angle. + */ + static BuildRight(x: number, y: number, width: number, height: number): Phaser.Geom.Triangle; + + /** + * Positions the Triangle so that it is centered on the given coordinates. + * @param triangle The triangle to be positioned. + * @param x The horizontal coordinate to center on. + * @param y The vertical coordinate to center on. + * @param centerFunc The function used to center the triangle. Defaults to Centroid centering. + */ + static CenterOn(triangle: O, x: number, y: number, centerFunc?: CenterFunction): O; + + /** + * Calculates the position of a Triangle's centroid, which is also its center of mass (center of gravity). + * + * The centroid is the point in a Triangle at which its three medians (the lines drawn from the vertices to the bisectors of the opposite sides) meet. It divides each one in a 2:1 ratio. + * @param triangle The Triangle to use. + * @param out An object to store the coordinates in. + */ + static Centroid(triangle: Phaser.Geom.Triangle, out?: O): O; + + /** + * Computes the circumcentre of a triangle. The circumcentre is the centre of + * the circumcircle, the smallest circle which encloses the triangle. It is also + * the common intersection point of the perpendicular bisectors of the sides of + * the triangle, and is the only point which has equal distance to all three + * vertices of the triangle. + * @param triangle The Triangle to get the circumcenter of. + * @param out The Vector2 object to store the position in. If not given, a new Vector2 instance is created. + */ + static CircumCenter(triangle: Phaser.Geom.Triangle, out?: O): O; + + /** + * Finds the circumscribed circle (circumcircle) of a Triangle object. The circumcircle is the circle which touches all of the triangle's vertices. + * @param triangle The Triangle to use as input. + * @param out An optional Circle to store the result in. + */ + static CircumCircle(triangle: Phaser.Geom.Triangle, out?: O): O; + + /** + * Clones a Triangle object. + * @param source The Triangle to clone. + */ + static Clone(source: Phaser.Geom.Triangle): Phaser.Geom.Triangle; + + /** + * Checks if a point (as a pair of coordinates) is inside a Triangle's bounds. + * @param triangle The Triangle to check. + * @param x The X coordinate of the point to check. + * @param y The Y coordinate of the point to check. + */ + static Contains(triangle: Phaser.Geom.Triangle, x: number, y: number): boolean; + + /** + * Filters an array of point-like objects to only those contained within a triangle. + * If `returnFirst` is true, will return an array containing only the first point in the provided array that is within the triangle (or an empty array if there are no such points). + * @param triangle The triangle that the points are being checked in. + * @param points An array of point-like objects (objects that have an `x` and `y` property) + * @param returnFirst If `true`, return an array containing only the first point found that is within the triangle. Default false. + * @param out If provided, the points that are within the triangle will be appended to this array instead of being added to a new array. If `returnFirst` is true, only the first point found within the triangle will be appended. This array will also be returned by this function. + */ + static ContainsArray(triangle: Phaser.Geom.Triangle, points: Phaser.Geom.Point[], returnFirst?: boolean, out?: any[]): Phaser.Geom.Point[]; + + /** + * Tests if a triangle contains a point. + * @param triangle The triangle. + * @param point The point to test, or any point-like object with public `x` and `y` properties. + */ + static ContainsPoint(triangle: Phaser.Geom.Triangle, point: Phaser.Geom.Point | Phaser.Math.Vector2 | any): boolean; + + /** + * Copy the values of one Triangle to a destination Triangle. + * @param source The source Triangle to copy the values from. + * @param dest The destination Triangle to copy the values to. + */ + static CopyFrom(source: Phaser.Geom.Triangle, dest: O): O; + + /** + * Decomposes a Triangle into an array of its points. + * @param triangle The Triangle to decompose. + * @param out An array to store the points into. + */ + static Decompose(triangle: Phaser.Geom.Triangle, out?: any[]): any[]; + + /** + * Returns true if two triangles have the same coordinates. + * @param triangle The first triangle to check. + * @param toCompare The second triangle to check. + */ + static Equals(triangle: Phaser.Geom.Triangle, toCompare: Phaser.Geom.Triangle): boolean; + + /** + * Returns a Point from around the perimeter of a Triangle. + * @param triangle The Triangle to get the point on its perimeter from. + * @param position The position along the perimeter of the triangle. A value between 0 and 1. + * @param out An option Point, or Point-like object to store the value in. If not given a new Point will be created. + */ + static GetPoint(triangle: Phaser.Geom.Triangle, position: number, out?: O): O; + + /** + * Returns an array of evenly spaced points on the perimeter of a Triangle. + * @param triangle The Triangle to get the points from. + * @param quantity The number of evenly spaced points to return. Set to 0 to return an arbitrary number of points based on the `stepRate`. + * @param stepRate If `quantity` is 0, the distance between each returned point. + * @param out An array to which the points should be appended. + */ + static GetPoints(triangle: Phaser.Geom.Triangle, quantity: number, stepRate: number, out?: O): O; + + /** + * Calculates the position of the incenter of a Triangle object. This is the point where its three angle bisectors meet and it's also the center of the incircle, which is the circle inscribed in the triangle. + * @param triangle The Triangle to find the incenter of. + * @param out An optional Point in which to store the coordinates. + */ + static InCenter(triangle: Phaser.Geom.Triangle, out?: O): O; + + /** + * Moves each point (vertex) of a Triangle by a given offset, thus moving the entire Triangle by that offset. + * @param triangle The Triangle to move. + * @param x The horizontal offset (distance) by which to move each point. Can be positive or negative. + * @param y The vertical offset (distance) by which to move each point. Can be positive or negative. + */ + static Offset(triangle: O, x: number, y: number): O; + + /** + * Gets the length of the perimeter of the given triangle. + * Calculated by adding together the length of each of the three sides. + * @param triangle The Triangle to get the length from. + */ + static Perimeter(triangle: Phaser.Geom.Triangle): number; + + /** + * Returns a random Point from within the area of the given Triangle. + * @param triangle The Triangle to get a random point from. + * @param out The Point object to store the position in. If not given, a new Point instance is created. + */ + static Random(triangle: Phaser.Geom.Triangle, out?: O): O; + + /** + * Rotates a Triangle about its incenter, which is the point at which its three angle bisectors meet. + * @param triangle The Triangle to rotate. + * @param angle The angle by which to rotate the Triangle, in radians. + */ + static Rotate(triangle: O, angle: number): O; + + /** + * Rotates a Triangle at a certain angle about a given Point or object with public `x` and `y` properties. + * @param triangle The Triangle to rotate. + * @param point The Point to rotate the Triangle about. + * @param angle The angle by which to rotate the Triangle, in radians. + */ + static RotateAroundPoint(triangle: O, point: Phaser.Geom.Point, angle: number): O; + + /** + * Rotates an entire Triangle at a given angle about a specific point. + * @param triangle The Triangle to rotate. + * @param x The X coordinate of the point to rotate the Triangle about. + * @param y The Y coordinate of the point to rotate the Triangle about. + * @param angle The angle by which to rotate the Triangle, in radians. + */ + static RotateAroundXY(triangle: O, x: number, y: number, angle: number): O; + + /** + * The geometry constant type of this object: `GEOM_CONST.TRIANGLE`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * `x` coordinate of the first point. + */ + x1: number; + + /** + * `y` coordinate of the first point. + */ + y1: number; + + /** + * `x` coordinate of the second point. + */ + x2: number; + + /** + * `y` coordinate of the second point. + */ + y2: number; + + /** + * `x` coordinate of the third point. + */ + x3: number; + + /** + * `y` coordinate of the third point. + */ + y3: number; + + /** + * Checks whether a given points lies within the triangle. + * @param x The x coordinate of the point to check. + * @param y The y coordinate of the point to check. + */ + contains(x: number, y: number): boolean; + + /** + * Returns a specific point on the triangle. + * @param position Position as float within `0` and `1`. `0` equals the first point. + * @param output Optional Point, or point-like object, that the calculated point will be written to. + */ + getPoint(position: number, output?: O): O; + + /** + * Calculates a list of evenly distributed points on the triangle. It is either possible to pass an amount of points to be generated (`quantity`) or the distance between two points (`stepRate`). + * @param quantity Number of points to be generated. Can be falsey when `stepRate` should be used. All points have the same distance along the triangle. + * @param stepRate Distance between two points. Will only be used when `quantity` is falsey. + * @param output Optional Array for writing the calculated points into. Otherwise a new array will be created. + */ + getPoints(quantity: number, stepRate?: number, output?: O): O; + + /** + * Returns a random point along the triangle. + * @param point Optional `Point` that should be modified. Otherwise a new one will be created. + */ + getRandomPoint(point?: O): O; + + /** + * Sets all three points of the triangle. Leaving out any coordinate sets it to be `0`. + * @param x1 `x` coordinate of the first point. Default 0. + * @param y1 `y` coordinate of the first point. Default 0. + * @param x2 `x` coordinate of the second point. Default 0. + * @param y2 `y` coordinate of the second point. Default 0. + * @param x3 `x` coordinate of the third point. Default 0. + * @param y3 `y` coordinate of the third point. Default 0. + */ + setTo(x1?: number, y1?: number, x2?: number, y2?: number, x3?: number, y3?: number): this; + + /** + * Returns a Line object that corresponds to Line A of this Triangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineA(line?: O): O; + + /** + * Returns a Line object that corresponds to Line B of this Triangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineB(line?: O): O; + + /** + * Returns a Line object that corresponds to Line C of this Triangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineC(line?: O): O; + + /** + * Left most X coordinate of the triangle. Setting it moves the triangle on the X axis accordingly. + */ + left: number; + + /** + * Right most X coordinate of the triangle. Setting it moves the triangle on the X axis accordingly. + */ + right: number; + + /** + * Top most Y coordinate of the triangle. Setting it moves the triangle on the Y axis accordingly. + */ + top: number; + + /** + * Bottom most Y coordinate of the triangle. Setting it moves the triangle on the Y axis accordingly. + */ + bottom: number; + + } + + } + + namespace Input { + /** + * The mouse pointer is being held down. + */ + var MOUSE_DOWN: number; + + /** + * The mouse pointer is being moved. + */ + var MOUSE_MOVE: number; + + /** + * The mouse pointer is released. + */ + var MOUSE_UP: number; + + /** + * A touch pointer has been started. + */ + var TOUCH_START: number; + + /** + * A touch pointer has been started. + */ + var TOUCH_MOVE: number; + + /** + * A touch pointer has been started. + */ + var TOUCH_END: number; + + /** + * The pointer lock has changed. + */ + var POINTER_LOCK_CHANGE: number; + + /** + * A touch pointer has been been cancelled by the browser. + */ + var TOUCH_CANCEL: number; + + /** + * The mouse wheel changes. + */ + var MOUSE_WHEEL: number; + + /** + * Creates a new Interactive Object. + * + * This is called automatically by the Input Manager when you enable a Game Object for input. + * + * The resulting Interactive Object is mapped to the Game Object's `input` property. + * @param gameObject The Game Object to which this Interactive Object is bound. + * @param hitArea The hit area for this Interactive Object. Typically a geometry shape, like a Rectangle or Circle. + * @param hitAreaCallback The 'contains' check callback that the hit area shape will use for all hit tests. + */ + function CreateInteractiveObject(gameObject: Phaser.GameObjects.GameObject, hitArea: any, hitAreaCallback: Phaser.Types.Input.HitAreaCallback): Phaser.Types.Input.InteractiveObject; + + /** + * Creates a new Pixel Perfect Handler function. + * + * Access via `InputPlugin.makePixelPerfect` rather than calling it directly. + * @param textureManager A reference to the Texture Manager. + * @param alphaTolerance The alpha level that the pixel should be above to be included as a successful interaction. + */ + function CreatePixelPerfectHandler(textureManager: Phaser.Textures.TextureManager, alphaTolerance: number): Function; + + namespace Events { + /** + * The Input Plugin Boot Event. + * + * This internal event is dispatched by the Input Plugin when it boots, signalling to all of its systems to create themselves. + */ + const BOOT: string; + + /** + * The Input Plugin Destroy Event. + * + * This internal event is dispatched by the Input Plugin when it is destroyed, signalling to all of its systems to destroy themselves. + */ + const DESTROY: string; + + /** + * The Pointer Drag End Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer stops dragging a Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('dragend', listener)`. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_END]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_END} event instead. + */ + const DRAG_END: string; + + /** + * The Pointer Drag Enter Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer drags a Game Object into a Drag Target. + * + * Listen to this event from within a Scene using: `this.input.on('dragenter', listener)`. + * + * A Pointer can only drag a single Game Object at once. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_ENTER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_ENTER} event instead. + */ + const DRAG_ENTER: string; + + /** + * The Pointer Drag Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves while dragging a Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('drag', listener)`. + * + * A Pointer can only drag a single Game Object at once. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG} event instead. + */ + const DRAG: string; + + /** + * The Pointer Drag Leave Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer drags a Game Object out of a Drag Target. + * + * Listen to this event from within a Scene using: `this.input.on('dragleave', listener)`. + * + * A Pointer can only drag a single Game Object at once. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_LEAVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_LEAVE} event instead. + */ + const DRAG_LEAVE: string; + + /** + * The Pointer Drag Over Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer drags a Game Object over a Drag Target. + * + * When the Game Object first enters the drag target it will emit a `dragenter` event. If it then moves while within + * the drag target, it will emit this event instead. + * + * Listen to this event from within a Scene using: `this.input.on('dragover', listener)`. + * + * A Pointer can only drag a single Game Object at once. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_OVER} event instead. + */ + const DRAG_OVER: string; + + /** + * The Pointer Drag Start Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer starts to drag any Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('dragstart', listener)`. + * + * A Pointer can only drag a single Game Object at once. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_START]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_START} event instead. + */ + const DRAG_START: string; + + /** + * The Pointer Drop Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer drops a Game Object on a Drag Target. + * + * Listen to this event from within a Scene using: `this.input.on('drop', listener)`. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DROP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DROP} event instead. + */ + const DROP: string; + + /** + * The Game Object Down Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is pressed down on _any_ interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('gameobjectdown', listener)`. + * + * To receive this event, the Game Objects must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN} event instead. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN} + * 2. [GAMEOBJECT_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DOWN} + * 3. [POINTER_DOWN]{@linkcode Phaser.Input.Events#event:POINTER_DOWN} or [POINTER_DOWN_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_DOWN_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_DOWN: string; + + /** + * The Game Object Drag End Event. + * + * This event is dispatched by an interactive Game Object if a pointer stops dragging it. + * + * Listen to this event from a Game Object using: `gameObject.on('dragend', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive](Phaser.GameObjects.GameObject#setInteractive) for more details. + */ + const GAMEOBJECT_DRAG_END: string; + + /** + * The Game Object Drag Enter Event. + * + * This event is dispatched by an interactive Game Object if a pointer drags it into a drag target. + * + * Listen to this event from a Game Object using: `gameObject.on('dragenter', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + */ + const GAMEOBJECT_DRAG_ENTER: string; + + /** + * The Game Object Drag Event. + * + * This event is dispatched by an interactive Game Object if a pointer moves while dragging it. + * + * Listen to this event from a Game Object using: `gameObject.on('drag', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + */ + const GAMEOBJECT_DRAG: string; + + /** + * The Game Object Drag Leave Event. + * + * This event is dispatched by an interactive Game Object if a pointer drags it out of a drag target. + * + * Listen to this event from a Game Object using: `gameObject.on('dragleave', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + */ + const GAMEOBJECT_DRAG_LEAVE: string; + + /** + * The Game Object Drag Over Event. + * + * This event is dispatched by an interactive Game Object if a pointer drags it over a drag target. + * + * When the Game Object first enters the drag target it will emit a `dragenter` event. If it then moves while within + * the drag target, it will emit this event instead. + * + * Listen to this event from a Game Object using: `gameObject.on('dragover', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + */ + const GAMEOBJECT_DRAG_OVER: string; + + /** + * The Game Object Drag Start Event. + * + * This event is dispatched by an interactive Game Object if a pointer starts to drag it. + * + * Listen to this event from a Game Object using: `gameObject.on('dragstart', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * There are lots of useful drag related properties that are set within the Game Object when dragging occurs. + * For example, `gameObject.input.dragStartX`, `dragStartY` and so on. + */ + const GAMEOBJECT_DRAG_START: string; + + /** + * The Game Object Drop Event. + * + * This event is dispatched by an interactive Game Object if a pointer drops it on a Drag Target. + * + * Listen to this event from a Game Object using: `gameObject.on('drop', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + */ + const GAMEOBJECT_DROP: string; + + /** + * The Game Object Move Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is moved across _any_ interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('gameobjectmove', listener)`. + * + * To receive this event, the Game Objects must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_MOVE} event instead. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_MOVE} + * 2. [GAMEOBJECT_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_MOVE} + * 3. [POINTER_MOVE]{@linkcode Phaser.Input.Events#event:POINTER_MOVE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_MOVE: string; + + /** + * The Game Object Out Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves out of _any_ interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('gameobjectout', listener)`. + * + * To receive this event, the Game Objects must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OUT} event instead. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OUT} + * 2. [GAMEOBJECT_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OUT} + * 3. [POINTER_OUT]{@linkcode Phaser.Input.Events#event:POINTER_OUT} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + * + * If the pointer leaves the game canvas itself, it will not trigger an this event. To handle those cases, + * please listen for the [GAME_OUT]{@linkcode Phaser.Input.Events#event:GAME_OUT} event. + */ + const GAMEOBJECT_OUT: string; + + /** + * The Game Object Over Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves over _any_ interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('gameobjectover', listener)`. + * + * To receive this event, the Game Objects must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OVER} event instead. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OVER} + * 2. [GAMEOBJECT_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OVER} + * 3. [POINTER_OVER]{@linkcode Phaser.Input.Events#event:POINTER_OVER} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_OVER: string; + + /** + * The Game Object Pointer Down Event. + * + * This event is dispatched by an interactive Game Object if a pointer is pressed down on it. + * + * Listen to this event from a Game Object using: `gameObject.on('pointerdown', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN} + * 2. [GAMEOBJECT_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DOWN} + * 3. [POINTER_DOWN]{@linkcode Phaser.Input.Events#event:POINTER_DOWN} or [POINTER_DOWN_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_DOWN_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_POINTER_DOWN: string; + + /** + * The Game Object Pointer Move Event. + * + * This event is dispatched by an interactive Game Object if a pointer is moved while over it. + * + * Listen to this event from a Game Object using: `gameObject.on('pointermove', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_MOVE} + * 2. [GAMEOBJECT_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_MOVE} + * 3. [POINTER_MOVE]{@linkcode Phaser.Input.Events#event:POINTER_MOVE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_POINTER_MOVE: string; + + /** + * The Game Object Pointer Out Event. + * + * This event is dispatched by an interactive Game Object if a pointer moves out of it. + * + * Listen to this event from a Game Object using: `gameObject.on('pointerout', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OUT} + * 2. [GAMEOBJECT_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OUT} + * 3. [POINTER_OUT]{@linkcode Phaser.Input.Events#event:POINTER_OUT} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + * + * If the pointer leaves the game canvas itself, it will not trigger an this event. To handle those cases, + * please listen for the [GAME_OUT]{@linkcode Phaser.Input.Events#event:GAME_OUT} event. + */ + const GAMEOBJECT_POINTER_OUT: string; + + /** + * The Game Object Pointer Over Event. + * + * This event is dispatched by an interactive Game Object if a pointer moves over it. + * + * Listen to this event from a Game Object using: `gameObject.on('pointerover', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OVER} + * 2. [GAMEOBJECT_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OVER} + * 3. [POINTER_OVER]{@linkcode Phaser.Input.Events#event:POINTER_OVER} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_POINTER_OVER: string; + + /** + * The Game Object Pointer Up Event. + * + * This event is dispatched by an interactive Game Object if a pointer is released while over it. + * + * Listen to this event from a Game Object using: `gameObject.on('pointerup', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP} + * 2. [GAMEOBJECT_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_UP} + * 3. [POINTER_UP]{@linkcode Phaser.Input.Events#event:POINTER_UP} or [POINTER_UP_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_UP_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_POINTER_UP: string; + + /** + * The Game Object Pointer Wheel Event. + * + * This event is dispatched by an interactive Game Object if a pointer has its wheel moved while over it. + * + * Listen to this event from a Game Object using: `gameObject.on('wheel', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_WHEEL} + * 2. [GAMEOBJECT_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_WHEEL} + * 3. [POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:POINTER_WHEEL} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_POINTER_WHEEL: string; + + /** + * The Game Object Up Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is released while over _any_ interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('gameobjectup', listener)`. + * + * To receive this event, the Game Objects must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP} event instead. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP} + * 2. [GAMEOBJECT_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_UP} + * 3. [POINTER_UP]{@linkcode Phaser.Input.Events#event:POINTER_UP} or [POINTER_UP_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_UP_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_UP: string; + + /** + * The Game Object Wheel Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer has its wheel moved while over _any_ interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('gameobjectwheel', listener)`. + * + * To receive this event, the Game Objects must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_WHEEL} event instead. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_WHEEL} + * 2. [GAMEOBJECT_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_WHEEL} + * 3. [POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:POINTER_WHEEL} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_WHEEL: string; + + /** + * The Input Plugin Game Out Event. + * + * This event is dispatched by the Input Plugin if the active pointer leaves the game canvas and is now + * outside of it, elsewhere on the web page. + * + * Listen to this event from within a Scene using: `this.input.on('gameout', listener)`. + */ + const GAME_OUT: string; + + /** + * The Input Plugin Game Over Event. + * + * This event is dispatched by the Input Plugin if the active pointer enters the game canvas and is now + * over of it, having previously been elsewhere on the web page. + * + * Listen to this event from within a Scene using: `this.input.on('gameover', listener)`. + */ + const GAME_OVER: string; + + /** + * The Input Manager Boot Event. + * + * This internal event is dispatched by the Input Manager when it boots. + */ + const MANAGER_BOOT: string; + + /** + * The Input Manager Process Event. + * + * This internal event is dispatched by the Input Manager when not using the legacy queue system, + * and it wants the Input Plugins to update themselves. + */ + const MANAGER_PROCESS: string; + + /** + * The Input Manager Update Event. + * + * This internal event is dispatched by the Input Manager as part of its update step. + */ + const MANAGER_UPDATE: string; + + /** + * The Input Manager Pointer Lock Change Event. + * + * This event is dispatched by the Input Manager when it is processing a native Pointer Lock Change DOM Event. + */ + const POINTERLOCK_CHANGE: string; + + /** + * The Pointer Down Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is pressed down anywhere. + * + * Listen to this event from within a Scene using: `this.input.on('pointerdown', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN} + * 2. [GAMEOBJECT_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DOWN} + * 3. [POINTER_DOWN]{@linkcode Phaser.Input.Events#event:POINTER_DOWN} or [POINTER_DOWN_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_DOWN_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_DOWN: string; + + /** + * The Pointer Down Outside Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is pressed down anywhere outside of the game canvas. + * + * Listen to this event from within a Scene using: `this.input.on('pointerdownoutside', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN} + * 2. [GAMEOBJECT_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DOWN} + * 3. [POINTER_DOWN]{@linkcode Phaser.Input.Events#event:POINTER_DOWN} or [POINTER_DOWN_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_DOWN_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_DOWN_OUTSIDE: string; + + /** + * The Pointer Move Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is moved anywhere. + * + * Listen to this event from within a Scene using: `this.input.on('pointermove', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_MOVE} + * 2. [GAMEOBJECT_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_MOVE} + * 3. [POINTER_MOVE]{@linkcode Phaser.Input.Events#event:POINTER_MOVE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_MOVE: string; + + /** + * The Pointer Out Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves out of any interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('pointerout', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OUT} + * 2. [GAMEOBJECT_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OUT} + * 3. [POINTER_OUT]{@linkcode Phaser.Input.Events#event:POINTER_OUT} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + * + * If the pointer leaves the game canvas itself, it will not trigger an this event. To handle those cases, + * please listen for the [GAME_OUT]{@linkcode Phaser.Input.Events#event:GAME_OUT} event. + */ + const POINTER_OUT: string; + + /** + * The Pointer Over Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves over any interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('pointerover', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OVER} + * 2. [GAMEOBJECT_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OVER} + * 3. [POINTER_OVER]{@linkcode Phaser.Input.Events#event:POINTER_OVER} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_OVER: string; + + /** + * The Pointer Up Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is released anywhere. + * + * Listen to this event from within a Scene using: `this.input.on('pointerup', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP} + * 2. [GAMEOBJECT_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_UP} + * 3. [POINTER_UP]{@linkcode Phaser.Input.Events#event:POINTER_UP} or [POINTER_UP_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_UP_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_UP: string; + + /** + * The Pointer Up Outside Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is released anywhere outside of the game canvas. + * + * Listen to this event from within a Scene using: `this.input.on('pointerupoutside', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP} + * 2. [GAMEOBJECT_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_UP} + * 3. [POINTER_UP]{@linkcode Phaser.Input.Events#event:POINTER_UP} or [POINTER_UP_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_UP_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_UP_OUTSIDE: string; + + /** + * The Pointer Wheel Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer has its wheel updated. + * + * Listen to this event from within a Scene using: `this.input.on('wheel', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_WHEEL} + * 2. [GAMEOBJECT_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_WHEEL} + * 3. [POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:POINTER_WHEEL} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_WHEEL: string; + + /** + * The Input Plugin Pre-Update Event. + * + * This internal event is dispatched by the Input Plugin at the start of its `preUpdate` method. + * This hook is designed specifically for input plugins, but can also be listened to from user-land code. + */ + const PRE_UPDATE: string; + + /** + * The Input Plugin Shutdown Event. + * + * This internal event is dispatched by the Input Plugin when it shuts down, signalling to all of its systems to shut themselves down. + */ + const SHUTDOWN: string; + + /** + * The Input Plugin Start Event. + * + * This internal event is dispatched by the Input Plugin when it has finished setting-up, + * signalling to all of its internal systems to start. + */ + const START: string; + + /** + * The Input Plugin Update Event. + * + * This internal event is dispatched by the Input Plugin at the start of its `update` method. + * This hook is designed specifically for input plugins, but can also be listened to from user-land code. + */ + const UPDATE: string; + + } + + namespace Gamepad { + /** + * Contains information about a specific Gamepad Axis. + * Axis objects are created automatically by the Gamepad as they are needed. + */ + class Axis { + /** + * + * @param pad A reference to the Gamepad that this Axis belongs to. + * @param index The index of this Axis. + */ + constructor(pad: Phaser.Input.Gamepad.Gamepad, index: number); + + /** + * A reference to the Gamepad that this Axis belongs to. + */ + pad: Phaser.Input.Gamepad.Gamepad; + + /** + * An event emitter to use to emit the axis events. + */ + events: Phaser.Events.EventEmitter; + + /** + * The index of this Axis. + */ + index: number; + + /** + * The raw axis value, between -1 and 1 with 0 being dead center. + * Use the method `getValue` to get a normalized value with the threshold applied. + */ + value: number; + + /** + * Movement tolerance threshold below which axis values are ignored in `getValue`. + */ + threshold: number; + + /** + * Applies the `threshold` value to the axis and returns it. + */ + getValue(): number; + + /** + * Destroys this Axis instance and releases external references it holds. + */ + destroy(): void; + + } + + /** + * Contains information about a specific button on a Gamepad. + * Button objects are created automatically by the Gamepad as they are needed. + */ + class Button { + /** + * + * @param pad A reference to the Gamepad that this Button belongs to. + * @param index The index of this Button. + */ + constructor(pad: Phaser.Input.Gamepad.Gamepad, index: number); + + /** + * A reference to the Gamepad that this Button belongs to. + */ + pad: Phaser.Input.Gamepad.Gamepad; + + /** + * An event emitter to use to emit the button events. + */ + events: Phaser.Events.EventEmitter; + + /** + * The index of this Button. + */ + index: number; + + /** + * Between 0 and 1. + */ + value: number; + + /** + * Can be set for analogue buttons to enable a 'pressure' threshold, + * before a button is considered as being 'pressed'. + */ + threshold: number; + + /** + * Is the Button being pressed down or not? + */ + pressed: boolean; + + /** + * Destroys this Button instance and releases external references it holds. + */ + destroy(): void; + + } + + namespace Configs { + /** + * Tatar SNES USB Controller Gamepad Configuration. + * USB Gamepad (STANDARD GAMEPAD Vendor: 0079 Product: 0011) + */ + namespace SNES_USB { + /** + * D-Pad up + */ + const UP: number; + + /** + * D-Pad down + */ + const DOWN: number; + + /** + * D-Pad left + */ + const LEFT: number; + + /** + * D-Pad right + */ + const RIGHT: number; + + /** + * Select button + */ + const SELECT: number; + + /** + * Start button + */ + const START: number; + + /** + * B Button (Bottom) + */ + const B: number; + + /** + * A Button (Right) + */ + const A: number; + + /** + * Y Button (Left) + */ + const Y: number; + + /** + * X Button (Top) + */ + const X: number; + + /** + * Left bumper + */ + const LEFT_SHOULDER: number; + + /** + * Right bumper + */ + const RIGHT_SHOULDER: number; + + } + + /** + * PlayStation DualShock 4 Gamepad Configuration. + * Sony PlayStation DualShock 4 (v2) wireless controller + */ + namespace DUALSHOCK_4 { + /** + * D-Pad up + */ + const UP: number; + + /** + * D-Pad down + */ + const DOWN: number; + + /** + * D-Pad left + */ + const LEFT: number; + + /** + * D-Pad up + */ + const RIGHT: number; + + /** + * Share button + */ + const SHARE: number; + + /** + * Options button + */ + const OPTIONS: number; + + /** + * PlayStation logo button + */ + const PS: number; + + /** + * Touchpad click + */ + const TOUCHBAR: number; + + /** + * Cross button (Bottom) + */ + const X: number; + + /** + * Circle button (Right) + */ + const CIRCLE: number; + + /** + * Square button (Left) + */ + const SQUARE: number; + + /** + * Triangle button (Top) + */ + const TRIANGLE: number; + + /** + * Left bumper (L1) + */ + const L1: number; + + /** + * Right bumper (R1) + */ + const R1: number; + + /** + * Left trigger (L2) + */ + const L2: number; + + /** + * Right trigger (R2) + */ + const R2: number; + + /** + * Left stick click (L3) + */ + const L3: number; + + /** + * Right stick click (R3) + */ + const R3: number; + + /** + * Left stick horizontal + */ + const LEFT_STICK_H: number; + + /** + * Left stick vertical + */ + const LEFT_STICK_V: number; + + /** + * Right stick horizontal + */ + const RIGHT_STICK_H: number; + + /** + * Right stick vertical + */ + const RIGHT_STICK_V: number; + + } + + /** + * XBox 360 Gamepad Configuration. + */ + namespace XBOX_360 { + /** + * D-Pad up + */ + const UP: number; + + /** + * D-Pad down + */ + const DOWN: number; + + /** + * D-Pad left + */ + const LEFT: number; + + /** + * D-Pad right + */ + const RIGHT: number; + + /** + * XBox menu button + */ + const MENU: number; + + /** + * A button (Bottom) + */ + const A: number; + + /** + * B button (Right) + */ + const B: number; + + /** + * X button (Left) + */ + const X: number; + + /** + * Y button (Top) + */ + const Y: number; + + /** + * Left Bumper + */ + const LB: number; + + /** + * Right Bumper + */ + const RB: number; + + /** + * Left Trigger + */ + const LT: number; + + /** + * Right Trigger + */ + const RT: number; + + /** + * Back / Change View button + */ + const BACK: number; + + /** + * Start button + */ + const START: number; + + /** + * Left Stick press + */ + const LS: number; + + /** + * Right stick press + */ + const RS: number; + + /** + * Left Stick horizontal + */ + const LEFT_STICK_H: number; + + /** + * Left Stick vertical + */ + const LEFT_STICK_V: number; + + /** + * Right Stick horizontal + */ + const RIGHT_STICK_H: number; + + /** + * Right Stick vertical + */ + const RIGHT_STICK_V: number; + + } + + } + + namespace Events { + /** + * The Gamepad Button Down Event. + * + * This event is dispatched by the Gamepad Plugin when a button has been pressed on any active Gamepad. + * + * Listen to this event from within a Scene using: `this.input.gamepad.on('down', listener)`. + * + * You can also listen for a DOWN event from a Gamepad instance. See the [GAMEPAD_BUTTON_DOWN]{@linkcode Phaser.Input.Gamepad.Events#event:GAMEPAD_BUTTON_DOWN} event for details. + */ + const BUTTON_DOWN: string; + + /** + * The Gamepad Button Up Event. + * + * This event is dispatched by the Gamepad Plugin when a button has been released on any active Gamepad. + * + * Listen to this event from within a Scene using: `this.input.gamepad.on('up', listener)`. + * + * You can also listen for an UP event from a Gamepad instance. See the [GAMEPAD_BUTTON_UP]{@linkcode Phaser.Input.Gamepad.Events#event:GAMEPAD_BUTTON_UP} event for details. + */ + const BUTTON_UP: string; + + /** + * The Gamepad Connected Event. + * + * This event is dispatched by the Gamepad Plugin when a Gamepad has been connected. + * + * Listen to this event from within a Scene using: `this.input.gamepad.once('connected', listener)`. + * + * Note that the browser may require you to press a button on a gamepad before it will allow you to access it, + * this is for security reasons. However, it may also trust the page already, in which case you won't get the + * 'connected' event and instead should check `GamepadPlugin.total` to see if it thinks there are any gamepads + * already connected. + */ + const CONNECTED: string; + + /** + * The Gamepad Disconnected Event. + * + * This event is dispatched by the Gamepad Plugin when a Gamepad has been disconnected. + * + * Listen to this event from within a Scene using: `this.input.gamepad.once('disconnected', listener)`. + */ + const DISCONNECTED: string; + + /** + * The Gamepad Button Down Event. + * + * This event is dispatched by a Gamepad instance when a button has been pressed on it. + * + * Listen to this event from a Gamepad instance. Once way to get this is from the `pad1`, `pad2`, etc properties on the Gamepad Plugin: + * `this.input.gamepad.pad1.on('down', listener)`. + * + * Note that you will not receive any Gamepad button events until the browser considers the Gamepad as being 'connected'. + * + * You can also listen for a DOWN event from the Gamepad Plugin. See the [BUTTON_DOWN]{@linkcode Phaser.Input.Gamepad.Events#event:BUTTON_DOWN} event for details. + */ + const GAMEPAD_BUTTON_DOWN: string; + + /** + * The Gamepad Button Up Event. + * + * This event is dispatched by a Gamepad instance when a button has been released on it. + * + * Listen to this event from a Gamepad instance. Once way to get this is from the `pad1`, `pad2`, etc properties on the Gamepad Plugin: + * `this.input.gamepad.pad1.on('up', listener)`. + * + * Note that you will not receive any Gamepad button events until the browser considers the Gamepad as being 'connected'. + * + * You can also listen for an UP event from the Gamepad Plugin. See the [BUTTON_UP]{@linkcode Phaser.Input.Gamepad.Events#event:BUTTON_UP} event for details. + */ + const GAMEPAD_BUTTON_UP: string; + + } + + /** + * A single Gamepad. + * + * These are created, updated and managed by the Gamepad Plugin. + */ + class Gamepad extends Phaser.Events.EventEmitter { + /** + * + * @param manager A reference to the Gamepad Plugin. + * @param pad The Gamepad object, as extracted from GamepadEvent. + */ + constructor(manager: Phaser.Input.Gamepad.GamepadPlugin, pad: Phaser.Types.Input.Gamepad.Pad); + + /** + * A reference to the Gamepad Plugin. + */ + manager: Phaser.Input.Gamepad.GamepadPlugin; + + /** + * A reference to the native Gamepad object that is connected to the browser. + */ + pad: any; + + /** + * A string containing some information about the controller. + * + * This is not strictly specified, but in Firefox it will contain three pieces of information + * separated by dashes (-): two 4-digit hexadecimal strings containing the USB vendor and + * product id of the controller, and the name of the controller as provided by the driver. + * In Chrome it will contain the name of the controller as provided by the driver, + * followed by vendor and product 4-digit hexadecimal strings. + */ + id: string; + + /** + * An integer that is unique for each Gamepad currently connected to the system. + * This can be used to distinguish multiple controllers. + * Note that disconnecting a device and then connecting a new device may reuse the previous index. + */ + index: number; + + /** + * An array of Gamepad Button objects, corresponding to the different buttons available on the Gamepad. + */ + buttons: Phaser.Input.Gamepad.Button[]; + + /** + * An array of Gamepad Axis objects, corresponding to the different axes available on the Gamepad, if any. + */ + axes: Phaser.Input.Gamepad.Axis[]; + + /** + * The Gamepad's Haptic Actuator (Vibration / Rumble support). + * This is highly experimental and only set if both present on the device, + * and exposed by both the hardware and browser. + */ + vibration: GamepadHapticActuator; + + /** + * A Vector2 containing the most recent values from the Gamepad's left axis stick. + * This is updated automatically as part of the Gamepad.update cycle. + * The H Axis is mapped to the `Vector2.x` property, and the V Axis to the `Vector2.y` property. + * The values are based on the Axis thresholds. + * If the Gamepad does not have a left axis stick, the values will always be zero. + */ + leftStick: Phaser.Math.Vector2; + + /** + * A Vector2 containing the most recent values from the Gamepad's right axis stick. + * This is updated automatically as part of the Gamepad.update cycle. + * The H Axis is mapped to the `Vector2.x` property, and the V Axis to the `Vector2.y` property. + * The values are based on the Axis thresholds. + * If the Gamepad does not have a right axis stick, the values will always be zero. + */ + rightStick: Phaser.Math.Vector2; + + /** + * Gets the total number of axis this Gamepad claims to support. + */ + getAxisTotal(): number; + + /** + * Gets the value of an axis based on the given index. + * The index must be valid within the range of axes supported by this Gamepad. + * The return value will be a float between 0 and 1. + * @param index The index of the axes to get the value for. + */ + getAxisValue(index: number): number; + + /** + * Sets the threshold value of all axis on this Gamepad. + * The value is a float between 0 and 1 and is the amount below which the axis is considered as not having been moved. + * @param value A value between 0 and 1. + */ + setAxisThreshold(value: number): void; + + /** + * Gets the total number of buttons this Gamepad claims to have. + */ + getButtonTotal(): number; + + /** + * Gets the value of a button based on the given index. + * The index must be valid within the range of buttons supported by this Gamepad. + * + * The return value will be either 0 or 1 for an analogue button, or a float between 0 and 1 + * for a pressure-sensitive digital button, such as the shoulder buttons on a Dual Shock. + * @param index The index of the button to get the value for. + */ + getButtonValue(index: number): number; + + /** + * Returns if the button is pressed down or not. + * The index must be valid within the range of buttons supported by this Gamepad. + * @param index The index of the button to get the value for. + */ + isButtonDown(index: number): boolean; + + /** + * Destroys this Gamepad instance, its buttons and axes, and releases external references it holds. + */ + destroy(): void; + + /** + * Is this Gamepad currently connected or not? + */ + connected: boolean; + + /** + * A timestamp containing the most recent time this Gamepad was updated. + */ + timestamp: number; + + /** + * Is the Gamepad's Left button being pressed? + * If the Gamepad doesn't have this button it will always return false. + * This is the d-pad left button under standard Gamepad mapping. + */ + left: boolean; + + /** + * Is the Gamepad's Right button being pressed? + * If the Gamepad doesn't have this button it will always return false. + * This is the d-pad right button under standard Gamepad mapping. + */ + right: boolean; + + /** + * Is the Gamepad's Up button being pressed? + * If the Gamepad doesn't have this button it will always return false. + * This is the d-pad up button under standard Gamepad mapping. + */ + up: boolean; + + /** + * Is the Gamepad's Down button being pressed? + * If the Gamepad doesn't have this button it will always return false. + * This is the d-pad down button under standard Gamepad mapping. + */ + down: boolean; + + /** + * Is the Gamepad's bottom button in the right button cluster being pressed? + * If the Gamepad doesn't have this button it will always return false. + * On a Dual Shock controller it's the X button. + * On an XBox controller it's the A button. + */ + A: boolean; + + /** + * Is the Gamepad's top button in the right button cluster being pressed? + * If the Gamepad doesn't have this button it will always return false. + * On a Dual Shock controller it's the Triangle button. + * On an XBox controller it's the Y button. + */ + Y: boolean; + + /** + * Is the Gamepad's left button in the right button cluster being pressed? + * If the Gamepad doesn't have this button it will always return false. + * On a Dual Shock controller it's the Square button. + * On an XBox controller it's the X button. + */ + X: boolean; + + /** + * Is the Gamepad's right button in the right button cluster being pressed? + * If the Gamepad doesn't have this button it will always return false. + * On a Dual Shock controller it's the Circle button. + * On an XBox controller it's the B button. + */ + B: boolean; + + /** + * Returns the value of the Gamepad's top left shoulder button. + * If the Gamepad doesn't have this button it will always return zero. + * The value is a float between 0 and 1, corresponding to how depressed the button is. + * On a Dual Shock controller it's the L1 button. + * On an XBox controller it's the LB button. + */ + L1: number; + + /** + * Returns the value of the Gamepad's bottom left shoulder button. + * If the Gamepad doesn't have this button it will always return zero. + * The value is a float between 0 and 1, corresponding to how depressed the button is. + * On a Dual Shock controller it's the L2 button. + * On an XBox controller it's the LT button. + */ + L2: number; + + /** + * Returns the value of the Gamepad's top right shoulder button. + * If the Gamepad doesn't have this button it will always return zero. + * The value is a float between 0 and 1, corresponding to how depressed the button is. + * On a Dual Shock controller it's the R1 button. + * On an XBox controller it's the RB button. + */ + R1: number; + + /** + * Returns the value of the Gamepad's bottom right shoulder button. + * If the Gamepad doesn't have this button it will always return zero. + * The value is a float between 0 and 1, corresponding to how depressed the button is. + * On a Dual Shock controller it's the R2 button. + * On an XBox controller it's the RT button. + */ + R2: number; + + } + + /** + * The Gamepad Plugin is an input plugin that belongs to the Scene-owned Input system. + * + * Its role is to listen for native DOM Gamepad Events and then process them. + * + * You do not need to create this class directly, the Input system will create an instance of it automatically. + * + * You can access it from within a Scene using `this.input.gamepad`. + * + * To listen for a gamepad being connected: + * + * ```javascript + * this.input.gamepad.once('connected', function (pad) { + * // 'pad' is a reference to the gamepad that was just connected + * }); + * ``` + * + * Note that the browser may require you to press a button on a gamepad before it will allow you to access it, + * this is for security reasons. However, it may also trust the page already, in which case you won't get the + * 'connected' event and instead should check `GamepadPlugin.total` to see if it thinks there are any gamepads + * already connected. + * + * Once you have received the connected event, or polled the gamepads and found them enabled, you can access + * them via the built-in properties `GamepadPlugin.pad1` to `pad4`, for up to 4 game pads. With a reference + * to the gamepads you can poll its buttons and axis sticks. See the properties and methods available on + * the `Gamepad` class for more details. + * + * As of September 2020 Chrome, and likely other browsers, will soon start to require that games requesting + * access to the Gamepad API are running under SSL. They will actively block API access if they are not. + * + * For more information about Gamepad support in browsers see the following resources: + * + * https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API + * https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API/Using_the_Gamepad_API + * https://www.smashingmagazine.com/2015/11/gamepad-api-in-web-games/ + * http://html5gamepad.com/ + */ + class GamepadPlugin extends Phaser.Events.EventEmitter { + /** + * + * @param sceneInputPlugin A reference to the Scene Input Plugin that the KeyboardPlugin belongs to. + */ + constructor(sceneInputPlugin: Phaser.Input.InputPlugin); + + /** + * A reference to the Scene that this Input Plugin is responsible for. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene Systems Settings. + */ + settings: Phaser.Types.Scenes.SettingsObject; + + /** + * A reference to the Scene Input Plugin that created this Keyboard Plugin. + */ + sceneInputPlugin: Phaser.Input.InputPlugin; + + /** + * A boolean that controls if the Gamepad Manager is enabled or not. + * Can be toggled on the fly. + */ + enabled: boolean; + + /** + * The Gamepad Event target, as defined in the Game Config. + * Typically the browser window, but can be any interactive DOM element. + */ + target: any; + + /** + * An array of the connected Gamepads. + */ + gamepads: Phaser.Input.Gamepad.Gamepad[]; + + /** + * Checks to see if both this plugin and the Scene to which it belongs is active. + */ + isActive(): boolean; + + /** + * Disconnects all current Gamepads. + */ + disconnectAll(): void; + + /** + * Returns an array of all currently connected Gamepads. + */ + getAll(): Phaser.Input.Gamepad.Gamepad[]; + + /** + * Looks-up a single Gamepad based on the given index value. + * @param index The index of the Gamepad to get. + */ + getPad(index: number): Phaser.Input.Gamepad.Gamepad; + + /** + * The total number of connected game pads. + */ + total: number; + + /** + * A reference to the first connected Gamepad. + * + * This will be undefined if either no pads are connected, or the browser + * has not yet issued a gamepadconnect, which can happen even if a Gamepad + * is plugged in, but hasn't yet had any buttons pressed on it. + */ + pad1: Phaser.Input.Gamepad.Gamepad; + + /** + * A reference to the second connected Gamepad. + * + * This will be undefined if either no pads are connected, or the browser + * has not yet issued a gamepadconnect, which can happen even if a Gamepad + * is plugged in, but hasn't yet had any buttons pressed on it. + */ + pad2: Phaser.Input.Gamepad.Gamepad; + + /** + * A reference to the third connected Gamepad. + * + * This will be undefined if either no pads are connected, or the browser + * has not yet issued a gamepadconnect, which can happen even if a Gamepad + * is plugged in, but hasn't yet had any buttons pressed on it. + */ + pad3: Phaser.Input.Gamepad.Gamepad; + + /** + * A reference to the fourth connected Gamepad. + * + * This will be undefined if either no pads are connected, or the browser + * has not yet issued a gamepadconnect, which can happen even if a Gamepad + * is plugged in, but hasn't yet had any buttons pressed on it. + */ + pad4: Phaser.Input.Gamepad.Gamepad; + + } + + } + + /** + * The Input Manager is responsible for handling the pointer related systems in a single Phaser Game instance. + * + * Based on the Game Config it will create handlers for mouse and touch support. + * + * Keyboard and Gamepad are plugins, handled directly by the InputPlugin class. + * + * It then manages the events, pointer creation and general hit test related operations. + * + * You rarely need to interact with the Input Manager directly, and as such, all of its properties and methods + * should be considered private. Instead, you should use the Input Plugin, which is a Scene level system, responsible + * for dealing with all input events for a Scene. + */ + class InputManager { + /** + * + * @param game The Game instance that owns the Input Manager. + * @param config The Input Configuration object, as set in the Game Config. + */ + constructor(game: Phaser.Game, config: object); + + /** + * The Game instance that owns the Input Manager. + * A Game only maintains on instance of the Input Manager at any time. + */ + readonly game: Phaser.Game; + + /** + * A reference to the global Game Scale Manager. + * Used for all bounds checks and pointer scaling. + */ + scaleManager: Phaser.Scale.ScaleManager; + + /** + * The Canvas that is used for all DOM event input listeners. + */ + canvas: HTMLCanvasElement; + + /** + * The Game Configuration object, as set during the game boot. + */ + config: Phaser.Core.Config; + + /** + * If set, the Input Manager will run its update loop every frame. + */ + enabled: boolean; + + /** + * The Event Emitter instance that the Input Manager uses to emit events from. + */ + events: Phaser.Events.EventEmitter; + + /** + * Are any mouse or touch pointers currently over the game canvas? + * This is updated automatically by the canvas over and out handlers. + */ + readonly isOver: boolean; + + /** + * The default CSS cursor to be used when interacting with your game. + * + * See the `setDefaultCursor` method for more details. + */ + defaultCursor: string; + + /** + * A reference to the Keyboard Manager class, if enabled via the `input.keyboard` Game Config property. + */ + keyboard: Phaser.Input.Keyboard.KeyboardManager | null; + + /** + * A reference to the Mouse Manager class, if enabled via the `input.mouse` Game Config property. + */ + mouse: Phaser.Input.Mouse.MouseManager | null; + + /** + * A reference to the Touch Manager class, if enabled via the `input.touch` Game Config property. + */ + touch: Phaser.Input.Touch.TouchManager; + + /** + * An array of Pointers that have been added to the game. + * The first entry is reserved for the Mouse Pointer, the rest are Touch Pointers. + * + * By default there is 1 touch pointer enabled. If you need more use the `addPointer` method to start them, + * or set the `input.activePointers` property in the Game Config. + */ + pointers: Phaser.Input.Pointer[]; + + /** + * The number of touch objects activated and being processed each update. + * + * You can change this by either calling `addPointer` at run-time, or by + * setting the `input.activePointers` property in the Game Config. + */ + readonly pointersTotal: number; + + /** + * The mouse has its own unique Pointer object, which you can reference directly if making a _desktop specific game_. + * If you are supporting both desktop and touch devices then do not use this property, instead use `activePointer` + * which will always map to the most recently interacted pointer. + */ + mousePointer: Phaser.Input.Pointer | null; + + /** + * The most recently active Pointer object. + * + * If you've only 1 Pointer in your game then this will accurately be either the first finger touched, or the mouse. + * + * If your game doesn't need to support multi-touch then you can safely use this property in all of your game + * code and it will adapt to be either the mouse or the touch, based on device. + */ + activePointer: Phaser.Input.Pointer; + + /** + * If the top-most Scene in the Scene List receives an input it will stop input from + * propagating any lower down the scene list, i.e. if you have a UI Scene at the top + * and click something on it, that click will not then be passed down to any other + * Scene below. Disable this to have input events passed through all Scenes, all the time. + */ + globalTopOnly: boolean; + + /** + * The time this Input Manager was last updated. + * This value is populated by the Game Step each frame. + */ + readonly time: number; + + /** + * The Boot handler is called by Phaser.Game when it first starts up. + * The renderer is available by now. + */ + protected boot(): void; + + /** + * Tells the Input system to set a custom cursor. + * + * This cursor will be the default cursor used when interacting with the game canvas. + * + * If an Interactive Object also sets a custom cursor, this is the cursor that is reset after its use. + * + * Any valid CSS cursor value is allowed, including paths to image files, i.e.: + * + * ```javascript + * this.input.setDefaultCursor('url(assets/cursors/sword.cur), pointer'); + * ``` + * + * Please read about the differences between browsers when it comes to the file formats and sizes they support: + * + * https://developer.mozilla.org/en-US/docs/Web/CSS/cursor + * https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_User_Interface/Using_URL_values_for_the_cursor_property + * + * It's up to you to pick a suitable cursor format that works across the range of browsers you need to support. + * @param cursor The CSS to be used when setting the default cursor. + */ + setDefaultCursor(cursor: string): void; + + /** + * Adds new Pointer objects to the Input Manager. + * + * By default Phaser creates 2 pointer objects: `mousePointer` and `pointer1`. + * + * You can create more either by calling this method, or by setting the `input.activePointers` property + * in the Game Config, up to a maximum of 10 pointers. + * + * The first 10 pointers are available via the `InputPlugin.pointerX` properties, once they have been added + * via this method. + * @param quantity The number of new Pointers to create. A maximum of 10 is allowed in total. Default 1. + */ + addPointer(quantity?: number): Phaser.Input.Pointer[]; + + /** + * Internal method that gets a list of all the active Input Plugins in the game + * and updates each of them in turn, in reverse order (top to bottom), to allow + * for DOM top-level event handling simulation. + * @param type The type of event to process. + * @param pointers An array of Pointers on which the event occurred. + */ + updateInputPlugins(type: number, pointers: Phaser.Input.Pointer[]): void; + + /** + * Performs a hit test using the given Pointer and camera, against an array of interactive Game Objects. + * + * The Game Objects are culled against the camera, and then the coordinates are translated into the local camera space + * and used to determine if they fall within the remaining Game Objects hit areas or not. + * + * If nothing is matched an empty array is returned. + * + * This method is called automatically by InputPlugin.hitTestPointer and doesn't usually need to be invoked directly. + * @param pointer The Pointer to test against. + * @param gameObjects An array of interactive Game Objects to check. + * @param camera The Camera which is being tested against. + * @param output An array to store the results in. If not given, a new empty array is created. + */ + hitTest(pointer: Phaser.Input.Pointer, gameObjects: any[], camera: Phaser.Cameras.Scene2D.Camera, output?: any[]): any[]; + + /** + * Checks if the given x and y coordinate are within the hit area of the Game Object. + * + * This method assumes that the coordinate values have already been translated into the space of the Game Object. + * + * If the coordinates are within the hit area they are set into the Game Objects Input `localX` and `localY` properties. + * @param gameObject The interactive Game Object to check against. + * @param x The translated x coordinate for the hit test. + * @param y The translated y coordinate for the hit test. + */ + pointWithinHitArea(gameObject: Phaser.GameObjects.GameObject, x: number, y: number): boolean; + + /** + * Checks if the given x and y coordinate are within the hit area of the Interactive Object. + * + * This method assumes that the coordinate values have already been translated into the space of the Interactive Object. + * + * If the coordinates are within the hit area they are set into the Interactive Objects Input `localX` and `localY` properties. + * @param object The Interactive Object to check against. + * @param x The translated x coordinate for the hit test. + * @param y The translated y coordinate for the hit test. + */ + pointWithinInteractiveObject(object: Phaser.Types.Input.InteractiveObject, x: number, y: number): boolean; + + /** + * Transforms the pageX and pageY values of a Pointer into the scaled coordinate space of the Input Manager. + * @param pointer The Pointer to transform the values for. + * @param pageX The Page X value. + * @param pageY The Page Y value. + * @param wasMove Are we transforming the Pointer from a move event, or an up / down event? + */ + transformPointer(pointer: Phaser.Input.Pointer, pageX: number, pageY: number, wasMove: boolean): void; + + /** + * Destroys the Input Manager and all of its systems. + * + * There is no way to recover from doing this. + */ + destroy(): void; + + } + + /** + * The Input Plugin belongs to a Scene and handles all input related events and operations for it. + * + * You can access it from within a Scene using `this.input`. + * + * It emits events directly. For example, you can do: + * + * ```javascript + * this.input.on('pointerdown', callback, context); + * ``` + * + * To listen for a pointer down event anywhere on the game canvas. + * + * Game Objects can be enabled for input by calling their `setInteractive` method. After which they + * will directly emit input events: + * + * ```javascript + * var sprite = this.add.sprite(x, y, texture); + * sprite.setInteractive(); + * sprite.on('pointerdown', callback, context); + * ``` + * + * There are lots of game configuration options available relating to input. + * See the [Input Config object]{@linkcode Phaser.Types.Core.InputConfig} for more details, including how to deal with Phaser + * listening for input events outside of the canvas, how to set a default number of pointers, input + * capture settings and more. + * + * Please also see the Input examples and tutorials for further information. + * + * **Incorrect input coordinates with Angular** + * + * If you are using Phaser within Angular, and use nglf or the router, to make the component in which the Phaser game resides + * change state (i.e. appear or disappear) then you'll need to notify the Scale Manager about this, as Angular will mess with + * the DOM in a way in which Phaser can't detect directly. Call `this.scale.updateBounds()` as part of your game init in order + * to refresh the canvas DOM bounds values, which Phaser uses for input point position calculations. + */ + class InputPlugin extends Phaser.Events.EventEmitter { + /** + * + * @param scene A reference to the Scene that this Input Plugin is responsible for. + */ + constructor(scene: Phaser.Scene); + + /** + * An instance of the Gamepad Plugin class, if enabled via the `input.gamepad` Scene or Game Config property. + * Use this to create access Gamepads connected to the browser and respond to gamepad buttons. + */ + gamepad: Phaser.Input.Gamepad.GamepadPlugin | null; + + /** + * A reference to the Scene that this Input Plugin is responsible for. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene Systems class. + */ + systems: Phaser.Scenes.Systems; + + /** + * A reference to the Scene Systems Settings. + */ + settings: Phaser.Types.Scenes.SettingsObject; + + /** + * A reference to the Game Input Manager. + */ + manager: Phaser.Input.InputManager; + + /** + * If `true` this Input Plugin will process DOM input events. + */ + enabled: boolean; + + /** + * A reference to the Scene Display List. This property is set during the `boot` method. + */ + displayList: Phaser.GameObjects.DisplayList; + + /** + * A reference to the Scene Cameras Manager. This property is set during the `boot` method. + */ + cameras: Phaser.Cameras.Scene2D.CameraManager; + + /** + * A reference to the Mouse Manager. + * + * This property is only set if Mouse support has been enabled in your Game Configuration file. + * + * If you just wish to get access to the mouse pointer, use the `mousePointer` property instead. + */ + mouse: Phaser.Input.Mouse.MouseManager | null; + + /** + * When set to `true` (the default) the Input Plugin will emulate DOM behavior by only emitting events from + * the top-most Game Objects in the Display List. + * + * If set to `false` it will emit events from all Game Objects below a Pointer, not just the top one. + */ + topOnly: boolean; + + /** + * How often should the Pointers be checked? + * + * The value is a time, given in ms, and is the time that must have elapsed between game steps before + * the Pointers will be polled again. When a pointer is polled it runs a hit test to see which Game + * Objects are currently below it, or being interacted with it. + * + * Pointers will *always* be checked if they have been moved by the user, or press or released. + * + * This property only controls how often they will be polled if they have not been updated. + * You should set this if you want to have Game Objects constantly check against the pointers, even + * if the pointer didn't itself move. + * + * Set to 0 to poll constantly. Set to -1 to only poll on user movement. + */ + pollRate: number; + + /** + * The distance, in pixels, a pointer has to move while being held down, before it thinks it is being dragged. + */ + dragDistanceThreshold: number; + + /** + * The amount of time, in ms, a pointer has to be held down before it thinks it is dragging. + * + * The default polling rate is to poll only on move so once the time threshold is reached the + * drag event will not start until you move the mouse. If you want it to start immediately + * when the time threshold is reached, you must increase the polling rate by calling + * [setPollAlways]{@linkcode Phaser.Input.InputPlugin#setPollAlways} or + * [setPollRate]{@linkcode Phaser.Input.InputPlugin#setPollRate}. + */ + dragTimeThreshold: number; + + /** + * Checks to see if both this plugin and the Scene to which it belongs is active. + */ + isActive(): boolean; + + /** + * This is called automatically by the Input Manager. + * It emits events for plugins to listen to and also handles polling updates, if enabled. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + updatePoll(time: number, delta: number): boolean; + + /** + * Clears a Game Object so it no longer has an Interactive Object associated with it. + * The Game Object is then queued for removal from the Input Plugin on the next update. + * @param gameObject The Game Object that will have its Interactive Object removed. + * @param skipQueue Skip adding this Game Object into the removal queue? Default false. + */ + clear(gameObject: Phaser.GameObjects.GameObject, skipQueue?: boolean): Phaser.GameObjects.GameObject; + + /** + * Disables Input on a single Game Object. + * + * An input disabled Game Object still retains its Interactive Object component and can be re-enabled + * at any time, by passing it to `InputPlugin.enable`. + * @param gameObject The Game Object to have its input system disabled. + */ + disable(gameObject: Phaser.GameObjects.GameObject): this; + + /** + * Enable a Game Object for interaction. + * + * If the Game Object already has an Interactive Object component, it is enabled and returned. + * + * Otherwise, a new Interactive Object component is created and assigned to the Game Object's `input` property. + * + * Input works by using hit areas, these are nearly always geometric shapes, such as rectangles or circles, that act as the hit area + * for the Game Object. However, you can provide your own hit area shape and callback, should you wish to handle some more advanced + * input detection. + * + * If no arguments are provided it will try and create a rectangle hit area based on the texture frame the Game Object is using. If + * this isn't a texture-bound object, such as a Graphics or BitmapText object, this will fail, and you'll need to provide a specific + * shape for it to use. + * + * You can also provide an Input Configuration Object as the only argument to this method. + * @param gameObject The Game Object to be enabled for input. + * @param hitArea Either an input configuration object, or a geometric shape that defines the hit area for the Game Object. If not specified a Rectangle will be used. + * @param hitAreaCallback The 'contains' function to invoke to check if the pointer is within the hit area. + * @param dropZone Is this Game Object a drop zone or not? Default false. + */ + enable(gameObject: Phaser.GameObjects.GameObject, hitArea?: Phaser.Types.Input.InputConfiguration | any, hitAreaCallback?: Phaser.Types.Input.HitAreaCallback, dropZone?: boolean): this; + + /** + * Takes the given Pointer and performs a hit test against it, to see which interactive Game Objects + * it is currently above. + * + * The hit test is performed against which-ever Camera the Pointer is over. If it is over multiple + * cameras, it starts checking the camera at the top of the camera list, and if nothing is found, iterates down the list. + * @param pointer The Pointer to check against the Game Objects. + */ + hitTestPointer(pointer: Phaser.Input.Pointer): Phaser.GameObjects.GameObject[]; + + /** + * Returns the drag state of the given Pointer for this Input Plugin. + * + * The state will be one of the following: + * + * 0 = Not dragging anything + * 1 = Primary button down and objects below, so collect a draglist + * 2 = Pointer being checked if meets drag criteria + * 3 = Pointer meets criteria, notify the draglist + * 4 = Pointer actively dragging the draglist and has moved + * 5 = Pointer actively dragging but has been released, notify draglist + * @param pointer The Pointer to get the drag state for. + */ + getDragState(pointer: Phaser.Input.Pointer): number; + + /** + * Sets the drag state of the given Pointer for this Input Plugin. + * + * The state must be one of the following values: + * + * 0 = Not dragging anything + * 1 = Primary button down and objects below, so collect a draglist + * 2 = Pointer being checked if meets drag criteria + * 3 = Pointer meets criteria, notify the draglist + * 4 = Pointer actively dragging the draglist and has moved + * 5 = Pointer actively dragging but has been released, notify draglist + * @param pointer The Pointer to set the drag state for. + * @param state The drag state value. An integer between 0 and 5. + */ + setDragState(pointer: Phaser.Input.Pointer, state: number): void; + + /** + * Sets the draggable state of the given array of Game Objects. + * + * They can either be set to be draggable, or can have their draggable state removed by passing `false`. + * + * A Game Object will not fire drag events unless it has been specifically enabled for drag. + * @param gameObjects An array of Game Objects to change the draggable state on. + * @param value Set to `true` if the Game Objects should be made draggable, `false` if they should be unset. Default true. + */ + setDraggable(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], value?: boolean): this; + + /** + * Creates a function that can be passed to `setInteractive`, `enable` or `setHitArea` that will handle + * pixel-perfect input detection on an Image or Sprite based Game Object, or any custom class that extends them. + * + * The following will create a sprite that is clickable on any pixel that has an alpha value >= 1. + * + * ```javascript + * this.add.sprite(x, y, key).setInteractive(this.input.makePixelPerfect()); + * ``` + * + * The following will create a sprite that is clickable on any pixel that has an alpha value >= 150. + * + * ```javascript + * this.add.sprite(x, y, key).setInteractive(this.input.makePixelPerfect(150)); + * ``` + * + * Once you have made an Interactive Object pixel perfect it impacts all input related events for it: down, up, + * dragstart, drag, etc. + * + * As a pointer interacts with the Game Object it will constantly poll the texture, extracting a single pixel from + * the given coordinates and checking its color values. This is an expensive process, so should only be enabled on + * Game Objects that really need it. + * + * You cannot make non-texture based Game Objects pixel perfect. So this will not work on Graphics, BitmapText, + * Render Textures, Text, Tilemaps, Containers or Particles. + * @param alphaTolerance The alpha level that the pixel should be above to be included as a successful interaction. Default 1. + */ + makePixelPerfect(alphaTolerance?: number): Function; + + /** + * Sets the hit area for the given array of Game Objects. + * + * A hit area is typically one of the geometric shapes Phaser provides, such as a `Phaser.Geom.Rectangle` + * or `Phaser.Geom.Circle`. However, it can be any object as long as it works with the provided callback. + * + * If no hit area is provided a Rectangle is created based on the size of the Game Object, if possible + * to calculate. + * + * The hit area callback is the function that takes an `x` and `y` coordinate and returns a boolean if + * those values fall within the area of the shape or not. All of the Phaser geometry objects provide this, + * such as `Phaser.Geom.Rectangle.Contains`. + * + * A hit area callback can be supplied to the `hitArea` parameter without using the `hitAreaCallback` parameter. + * @param gameObjects An array of Game Objects to set the hit area on. + * @param hitArea Either an input configuration object, a geometric shape that defines the hit area or a hit area callback. If not specified a Rectangle hit area will be used. + * @param hitAreaCallback The 'contains' function to invoke to check if the pointer is within the hit area. + */ + setHitArea(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], hitArea?: Phaser.Types.Input.InputConfiguration | Phaser.Types.Input.HitAreaCallback | any, hitAreaCallback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Circle` shape, using + * the given coordinates and radius to control its position and size. + * @param gameObjects An array of Game Objects to set as having a circle hit area. + * @param x The center of the circle. + * @param y The center of the circle. + * @param radius The radius of the circle. + * @param callback The hit area callback. If undefined it uses Circle.Contains. + */ + setHitAreaCircle(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], x: number, y: number, radius: number, callback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Ellipse` shape, using + * the given coordinates and dimensions to control its position and size. + * @param gameObjects An array of Game Objects to set as having an ellipse hit area. + * @param x The center of the ellipse. + * @param y The center of the ellipse. + * @param width The width of the ellipse. + * @param height The height of the ellipse. + * @param callback The hit area callback. If undefined it uses Ellipse.Contains. + */ + setHitAreaEllipse(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], x: number, y: number, width: number, height: number, callback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Rectangle` shape, using + * the Game Objects texture frame to define the position and size of the hit area. + * @param gameObjects An array of Game Objects to set as having an ellipse hit area. + * @param callback The hit area callback. If undefined it uses Rectangle.Contains. + */ + setHitAreaFromTexture(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], callback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Rectangle` shape, using + * the given coordinates and dimensions to control its position and size. + * @param gameObjects An array of Game Objects to set as having a rectangular hit area. + * @param x The top-left of the rectangle. + * @param y The top-left of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + * @param callback The hit area callback. If undefined it uses Rectangle.Contains. + */ + setHitAreaRectangle(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], x: number, y: number, width: number, height: number, callback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Triangle` shape, using + * the given coordinates to control the position of its points. + * @param gameObjects An array of Game Objects to set as having a triangular hit area. + * @param x1 The x coordinate of the first point of the triangle. + * @param y1 The y coordinate of the first point of the triangle. + * @param x2 The x coordinate of the second point of the triangle. + * @param y2 The y coordinate of the second point of the triangle. + * @param x3 The x coordinate of the third point of the triangle. + * @param y3 The y coordinate of the third point of the triangle. + * @param callback The hit area callback. If undefined it uses Triangle.Contains. + */ + setHitAreaTriangle(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, callback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Creates an Input Debug Shape for the given Game Object. + * + * The Game Object must have _already_ been enabled for input prior to calling this method. + * + * This is intended to assist you during development and debugging. + * + * Debug Shapes can only be created for Game Objects that are using standard Phaser Geometry for input, + * including: Circle, Ellipse, Line, Polygon, Rectangle and Triangle. + * + * Game Objects that are using their automatic hit areas are using Rectangles by default, so will also work. + * + * The Debug Shape is created and added to the display list and is then kept in sync with the Game Object + * it is connected with. Should you need to modify it yourself, such as to hide it, you can access it via + * the Game Object property: `GameObject.input.hitAreaDebug`. + * + * Calling this method on a Game Object that already has a Debug Shape will first destroy the old shape, + * before creating a new one. If you wish to remove the Debug Shape entirely, you should call the + * method `InputPlugin.removeDebug`. + * + * Note that the debug shape will only show the outline of the input area. If the input test is using a + * pixel perfect check, for example, then this is not displayed. If you are using a custom shape, that + * doesn't extend one of the base Phaser Geometry objects, as your hit area, then this method will not + * work. + * @param gameObject The Game Object to create the input debug shape for. + * @param color The outline color of the debug shape. Default 0x00ff00. + */ + enableDebug(gameObject: Phaser.GameObjects.GameObject, color?: number): this; + + /** + * Removes an Input Debug Shape from the given Game Object. + * + * The shape is destroyed immediately and the `hitAreaDebug` property is set to `null`. + * @param gameObject The Game Object to remove the input debug shape from. + */ + removeDebug(gameObject: Phaser.GameObjects.GameObject): this; + + /** + * Sets the Pointers to always poll. + * + * When a pointer is polled it runs a hit test to see which Game Objects are currently below it, + * or being interacted with it, regardless if the Pointer has actually moved or not. + * + * You should enable this if you want objects in your game to fire over / out events, and the objects + * are constantly moving, but the pointer may not have. Polling every frame has additional computation + * costs, especially if there are a large number of interactive objects in your game. + */ + setPollAlways(): this; + + /** + * Sets the Pointers to only poll when they are moved or updated. + * + * When a pointer is polled it runs a hit test to see which Game Objects are currently below it, + * or being interacted with it. + */ + setPollOnMove(): this; + + /** + * Sets the poll rate value. This is the amount of time that should have elapsed before a pointer + * will be polled again. See the `setPollAlways` and `setPollOnMove` methods. + * @param value The amount of time, in ms, that should elapsed before re-polling the pointers. + */ + setPollRate(value: number): this; + + /** + * When set to `true` the global Input Manager will emulate DOM behavior by only emitting events from + * the top-most Scene in the Scene List. By default, if a Scene receives an input event it will then stop the event + * from flowing down to any Scenes below it in the Scene list. To disable this behavior call this method with `false`. + * @param value Set to `true` to stop processing input events on the Scene that receives it, or `false` to let the event continue down the Scene list. + */ + setGlobalTopOnly(value: boolean): this; + + /** + * When set to `true` this Input Plugin will emulate DOM behavior by only emitting events from + * the top-most Game Objects in the Display List. + * + * If set to `false` it will emit events from all Game Objects below a Pointer, not just the top one. + * @param value `true` to only include the top-most Game Object, or `false` to include all Game Objects in a hit test. + */ + setTopOnly(value: boolean): this; + + /** + * Given an array of Game Objects and a Pointer, sort the array and return it, + * so that the objects are in render order with the lowest at the bottom. + * @param gameObjects An array of Game Objects to be sorted. + * @param pointer The Pointer to check against the Game Objects. + */ + sortGameObjects(gameObjects: Phaser.GameObjects.GameObject[], pointer: Phaser.Input.Pointer): Phaser.GameObjects.GameObject[]; + + /** + * Given an array of Drop Zone Game Objects, sort the array and return it, + * so that the objects are in depth index order with the lowest at the bottom. + * @param gameObjects An array of Game Objects to be sorted. + */ + sortDropZones(gameObjects: Phaser.GameObjects.GameObject[]): Phaser.GameObjects.GameObject[]; + + /** + * This method should be called from within an input event handler, such as `pointerdown`. + * + * When called, it stops the Input Manager from allowing _this specific event_ to be processed by any other Scene + * not yet handled in the scene list. + */ + stopPropagation(): this; + + /** + * Adds new Pointer objects to the Input Manager. + * + * By default Phaser creates 2 pointer objects: `mousePointer` and `pointer1`. + * + * You can create more either by calling this method, or by setting the `input.activePointers` property + * in the Game Config, up to a maximum of 10 pointers. + * + * The first 10 pointers are available via the `InputPlugin.pointerX` properties, once they have been added + * via this method. + * @param quantity The number of new Pointers to create. A maximum of 10 is allowed in total. Default 1. + */ + addPointer(quantity?: number): Phaser.Input.Pointer[]; + + /** + * Tells the Input system to set a custom cursor. + * + * This cursor will be the default cursor used when interacting with the game canvas. + * + * If an Interactive Object also sets a custom cursor, this is the cursor that is reset after its use. + * + * Any valid CSS cursor value is allowed, including paths to image files, i.e.: + * + * ```javascript + * this.input.setDefaultCursor('url(assets/cursors/sword.cur), pointer'); + * ``` + * + * Please read about the differences between browsers when it comes to the file formats and sizes they support: + * + * https://developer.mozilla.org/en-US/docs/Web/CSS/cursor + * https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_User_Interface/Using_URL_values_for_the_cursor_property + * + * It's up to you to pick a suitable cursor format that works across the range of browsers you need to support. + * @param cursor The CSS to be used when setting the default cursor. + */ + setDefaultCursor(cursor: string): this; + + /** + * Loops through all of the Input Manager Pointer instances and calls `reset` on them. + * + * Use this function if you find that input has been stolen from Phaser via a 3rd + * party component, such as Vue, and you need to tell Phaser to reset the Pointer states. + */ + resetPointers(): void; + + /** + * The x coordinates of the ActivePointer based on the first camera in the camera list. + * This is only safe to use if your game has just 1 non-transformed camera and doesn't use multi-touch. + */ + readonly x: number; + + /** + * The y coordinates of the ActivePointer based on the first camera in the camera list. + * This is only safe to use if your game has just 1 non-transformed camera and doesn't use multi-touch. + */ + readonly y: number; + + /** + * Are any mouse or touch pointers currently over the game canvas? + */ + readonly isOver: boolean; + + /** + * The mouse has its own unique Pointer object, which you can reference directly if making a _desktop specific game_. + * If you are supporting both desktop and touch devices then do not use this property, instead use `activePointer` + * which will always map to the most recently interacted pointer. + */ + readonly mousePointer: Phaser.Input.Pointer; + + /** + * The current active input Pointer. + */ + readonly activePointer: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer1: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer2: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer3: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer4: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer5: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer6: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer7: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer8: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer9: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer10: Phaser.Input.Pointer; + + /** + * An instance of the Keyboard Plugin class, if enabled via the `input.keyboard` Scene or Game Config property. + * Use this to create Key objects and listen for keyboard specific events. + */ + keyboard: Phaser.Input.Keyboard.KeyboardPlugin | null; + + } + + namespace InputPluginCache { + /** + * Static method called directly by the Core internal Plugins. + * Key is a reference used to get the plugin from the plugins object (i.e. InputPlugin) + * Plugin is the object to instantiate to create the plugin + * Mapping is what the plugin is injected into the Scene.Systems as (i.e. input) + * @param key A reference used to get this plugin from the plugin cache. + * @param plugin The plugin to be stored. Should be the core object, not instantiated. + * @param mapping If this plugin is to be injected into the Input Plugin, this is the property key used. + * @param settingsKey The key in the Scene Settings to check to see if this plugin should install or not. + * @param configKey The key in the Game Config to check to see if this plugin should install or not. + */ + function register(key: string, plugin: Function, mapping: string, settingsKey: string, configKey: string): void; + + /** + * Returns the input plugin object from the cache based on the given key. + * @param key The key of the input plugin to get. + */ + function getPlugin(key: string): Phaser.Types.Input.InputPluginContainer; + + /** + * Installs all of the registered Input Plugins into the given target. + * @param target The target InputPlugin to install the plugins into. + */ + function install(target: Phaser.Input.InputPlugin): void; + + /** + * Removes an input plugin based on the given key. + * @param key The key of the input plugin to remove. + */ + function remove(key: string): void; + + } + + namespace Keyboard { + /** + * A KeyCombo will listen for a specific string of keys from the Keyboard, and when it receives them + * it will emit a `keycombomatch` event from the Keyboard Manager. + * + * The keys to be listened for can be defined as: + * + * A string (i.e. 'ATARI') + * An array of either integers (key codes) or strings, or a mixture of both + * An array of objects (such as Key objects) with a public 'keyCode' property + * + * For example, to listen for the Konami code (up, up, down, down, left, right, left, right, b, a, enter) + * you could pass the following array of key codes: + * + * ```javascript + * this.input.keyboard.createCombo([ 38, 38, 40, 40, 37, 39, 37, 39, 66, 65, 13 ], { resetOnMatch: true }); + * + * this.input.keyboard.on('keycombomatch', function (event) { + * console.log('Konami Code entered!'); + * }); + * ``` + * + * Or, to listen for the user entering the word PHASER: + * + * ```javascript + * this.input.keyboard.createCombo('PHASER'); + * ``` + */ + class KeyCombo { + /** + * + * @param keyboardPlugin A reference to the Keyboard Plugin. + * @param keys The keys that comprise this combo. + * @param config A Key Combo configuration object. + */ + constructor(keyboardPlugin: Phaser.Input.Keyboard.KeyboardPlugin, keys: string | number[] | object[], config?: Phaser.Types.Input.Keyboard.KeyComboConfig); + + /** + * A reference to the Keyboard Manager + */ + manager: Phaser.Input.Keyboard.KeyboardPlugin; + + /** + * A flag that controls if this Key Combo is actively processing keys or not. + */ + enabled: boolean; + + /** + * An array of the keycodes that comprise this combo. + */ + keyCodes: any[]; + + /** + * The current keyCode the combo is waiting for. + */ + current: number; + + /** + * The current index of the key being waited for in the 'keys' string. + */ + index: number; + + /** + * The length of this combo (in keycodes) + */ + size: number; + + /** + * The time the previous key in the combo was matched. + */ + timeLastMatched: number; + + /** + * Has this Key Combo been matched yet? + */ + matched: boolean; + + /** + * The time the entire combo was matched. + */ + timeMatched: number; + + /** + * If they press the wrong key do we reset the combo? + */ + resetOnWrongKey: boolean; + + /** + * The max delay in ms between each key press. Above this the combo is reset. 0 means disabled. + */ + maxKeyDelay: number; + + /** + * If previously matched and they press the first key of the combo again, will it reset? + */ + resetOnMatch: boolean; + + /** + * If the combo matches, will it delete itself? + */ + deleteOnMatch: boolean; + + /** + * How far complete is this combo? A value between 0 and 1. + */ + readonly progress: number; + + /** + * Destroys this Key Combo and all of its references. + */ + destroy(): void; + + } + + namespace Events { + /** + * The Global Key Down Event. + * + * This event is dispatched by the Keyboard Plugin when any key on the keyboard is pressed down. + * + * Listen to this event from within a Scene using: `this.input.keyboard.on('keydown', listener)`. + * + * You can also listen for a specific key being pressed. See [Keyboard.Events.KEY_DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:KEY_DOWN} for details. + * + * Finally, you can create Key objects, which you can also listen for events from. See [Keyboard.Events.DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:DOWN} for details. + * + * _Note_: Many keyboards are unable to process certain combinations of keys due to hardware limitations known as ghosting. + * Read [this article on ghosting]{@link http://www.html5gamedevs.com/topic/4876-impossible-to-use-more-than-2-keyboard-input-buttons-at-the-same-time/} for details. + * + * Also, please be aware that some browser extensions can disable or override Phaser keyboard handling. + * For example, the Chrome extension vimium is known to disable Phaser from using the D key, while EverNote disables the backtick key. + * There are others. So, please check your extensions if you find you have specific keys that don't work. + */ + const ANY_KEY_DOWN: string; + + /** + * The Global Key Up Event. + * + * This event is dispatched by the Keyboard Plugin when any key on the keyboard is released. + * + * Listen to this event from within a Scene using: `this.input.keyboard.on('keyup', listener)`. + * + * You can also listen for a specific key being released. See [Keyboard.Events.KEY_UP]{@linkcode Phaser.Input.Keyboard.Events#event:KEY_UP} for details. + * + * Finally, you can create Key objects, which you can also listen for events from. See [Keyboard.Events.UP]{@linkcode Phaser.Input.Keyboard.Events#event:UP} for details. + */ + const ANY_KEY_UP: string; + + /** + * The Key Combo Match Event. + * + * This event is dispatched by the Keyboard Plugin when a [Key Combo]{@link Phaser.Input.Keyboard.KeyCombo} is matched. + * + * Listen for this event from the Key Plugin after a combo has been created: + * + * ```javascript + * this.input.keyboard.createCombo([ 38, 38, 40, 40, 37, 39, 37, 39, 66, 65, 13 ], { resetOnMatch: true }); + * + * this.input.keyboard.on('keycombomatch', function (event) { + * console.log('Konami Code entered!'); + * }); + * ``` + */ + const COMBO_MATCH: string; + + /** + * The Key Down Event. + * + * This event is dispatched by a [Key]{@link Phaser.Input.Keyboard.Key} object when it is pressed. + * + * Listen for this event from the Key object instance directly: + * + * ```javascript + * var spaceBar = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE); + * + * spaceBar.on('down', listener) + * ``` + * + * You can also create a generic 'global' listener. See [Keyboard.Events.ANY_KEY_DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:ANY_KEY_DOWN} for details. + */ + const DOWN: string; + + /** + * The Key Down Event. + * + * This event is dispatched by the Keyboard Plugin when any key on the keyboard is pressed down. + * + * Unlike the `ANY_KEY_DOWN` event, this one has a special dynamic event name. For example, to listen for the `A` key being pressed + * use the following from within a Scene: `this.input.keyboard.on('keydown-A', listener)`. You can replace the `-A` part of the event + * name with any valid [Key Code string]{@link Phaser.Input.Keyboard.KeyCodes}. For example, this will listen for the space bar: + * `this.input.keyboard.on('keydown-SPACE', listener)`. + * + * You can also create a generic 'global' listener. See [Keyboard.Events.ANY_KEY_DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:ANY_KEY_DOWN} for details. + * + * Finally, you can create Key objects, which you can also listen for events from. See [Keyboard.Events.DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:DOWN} for details. + * + * _Note_: Many keyboards are unable to process certain combinations of keys due to hardware limitations known as ghosting. + * Read [this article on ghosting]{@link http://www.html5gamedevs.com/topic/4876-impossible-to-use-more-than-2-keyboard-input-buttons-at-the-same-time/} for details. + * + * Also, please be aware that some browser extensions can disable or override Phaser keyboard handling. + * For example, the Chrome extension vimium is known to disable Phaser from using the D key, while EverNote disables the backtick key. + * There are others. So, please check your extensions if you find you have specific keys that don't work. + */ + const KEY_DOWN: string; + + /** + * The Key Up Event. + * + * This event is dispatched by the Keyboard Plugin when any key on the keyboard is released. + * + * Unlike the `ANY_KEY_UP` event, this one has a special dynamic event name. For example, to listen for the `A` key being released + * use the following from within a Scene: `this.input.keyboard.on('keyup-A', listener)`. You can replace the `-A` part of the event + * name with any valid [Key Code string]{@link Phaser.Input.Keyboard.KeyCodes}. For example, this will listen for the space bar: + * `this.input.keyboard.on('keyup-SPACE', listener)`. + * + * You can also create a generic 'global' listener. See [Keyboard.Events.ANY_KEY_UP]{@linkcode Phaser.Input.Keyboard.Events#event:ANY_KEY_UP} for details. + * + * Finally, you can create Key objects, which you can also listen for events from. See [Keyboard.Events.UP]{@linkcode Phaser.Input.Keyboard.Events#event:UP} for details. + */ + const KEY_UP: string; + + /** + * The Key Up Event. + * + * This event is dispatched by a [Key]{@link Phaser.Input.Keyboard.Key} object when it is released. + * + * Listen for this event from the Key object instance directly: + * + * ```javascript + * var spaceBar = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE); + * + * spaceBar.on('up', listener) + * ``` + * + * You can also create a generic 'global' listener. See [Keyboard.Events.ANY_KEY_UP]{@linkcode Phaser.Input.Keyboard.Events#event:ANY_KEY_UP} for details. + */ + const UP: string; + + } + + /** + * The Keyboard Manager is a helper class that belongs to the global Input Manager. + * + * Its role is to listen for native DOM Keyboard Events and then store them for further processing by the Keyboard Plugin. + * + * You do not need to create this class directly, the Input Manager will create an instance of it automatically if keyboard + * input has been enabled in the Game Config. + */ + class KeyboardManager { + /** + * + * @param inputManager A reference to the Input Manager. + */ + constructor(inputManager: Phaser.Input.InputManager); + + /** + * A reference to the Input Manager. + */ + manager: Phaser.Input.InputManager; + + /** + * A flag that controls if the non-modified keys, matching those stored in the `captures` array, + * have `preventDefault` called on them or not. + * + * A non-modified key is one that doesn't have a modifier key held down with it. The modifier keys are + * shift, control, alt and the meta key (Command on a Mac, the Windows Key on Windows). + * Therefore, if the user presses shift + r, it won't prevent this combination, because of the modifier. + * However, if the user presses just the r key on its own, it will have its event prevented. + * + * If you wish to stop capturing the keys, for example switching out to a DOM based element, then + * you can toggle this property at run-time. + */ + preventDefault: boolean; + + /** + * An array of Key Code values that will automatically have `preventDefault` called on them, + * as long as the `KeyboardManager.preventDefault` boolean is set to `true`. + * + * By default the array is empty. + * + * The key must be non-modified when pressed in order to be captured. + * + * A non-modified key is one that doesn't have a modifier key held down with it. The modifier keys are + * shift, control, alt and the meta key (Command on a Mac, the Windows Key on Windows). + * Therefore, if the user presses shift + r, it won't prevent this combination, because of the modifier. + * However, if the user presses just the r key on its own, it will have its event prevented. + * + * If you wish to stop capturing the keys, for example switching out to a DOM based element, then + * you can toggle the `KeyboardManager.preventDefault` boolean at run-time. + * + * If you need more specific control, you can create Key objects and set the flag on each of those instead. + * + * This array can be populated via the Game Config by setting the `input.keyboard.capture` array, or you + * can call the `addCapture` method. See also `removeCapture` and `clearCaptures`. + */ + captures: number[]; + + /** + * A boolean that controls if the Keyboard Manager is enabled or not. + * Can be toggled on the fly. + */ + enabled: boolean; + + /** + * The Keyboard Event target, as defined in the Game Config. + * Typically the window in which the game is rendering, but can be any interactive DOM element. + */ + target: any; + + /** + * The Key Down Event handler. + * This function is sent the native DOM KeyEvent. + * Initially empty and bound in the `startListeners` method. + */ + onKeyDown: Function; + + /** + * The Key Up Event handler. + * This function is sent the native DOM KeyEvent. + * Initially empty and bound in the `startListeners` method. + */ + onKeyUp: Function; + + /** + * Starts the Keyboard Event listeners running. + * This is called automatically and does not need to be manually invoked. + */ + startListeners(): void; + + /** + * Stops the Key Event listeners. + * This is called automatically and does not need to be manually invoked. + */ + stopListeners(): void; + + /** + * By default when a key is pressed Phaser will not stop the event from propagating up to the browser. + * There are some keys this can be annoying for, like the arrow keys or space bar, which make the browser window scroll. + * + * This `addCapture` method enables consuming keyboard event for specific keys so it doesn't bubble up to the the browser + * and cause the default browser behavior. + * + * Please note that keyboard captures are global. This means that if you call this method from within a Scene, to say prevent + * the SPACE BAR from triggering a page scroll, then it will prevent it for any Scene in your game, not just the calling one. + * + * You can pass in a single key code value, or an array of key codes, or a string: + * + * ```javascript + * this.input.keyboard.addCapture(62); + * ``` + * + * An array of key codes: + * + * ```javascript + * this.input.keyboard.addCapture([ 62, 63, 64 ]); + * ``` + * + * Or a string: + * + * ```javascript + * this.input.keyboard.addCapture('W,S,A,D'); + * ``` + * + * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'. + * + * You can also provide an array mixing both strings and key code integers. + * + * If there are active captures after calling this method, the `preventDefault` property is set to `true`. + * @param keycode The Key Codes to enable capture for, preventing them reaching the browser. + */ + addCapture(keycode: string | number | number[] | any[]): void; + + /** + * Removes an existing key capture. + * + * Please note that keyboard captures are global. This means that if you call this method from within a Scene, to remove + * the capture of a key, then it will remove it for any Scene in your game, not just the calling one. + * + * You can pass in a single key code value, or an array of key codes, or a string: + * + * ```javascript + * this.input.keyboard.removeCapture(62); + * ``` + * + * An array of key codes: + * + * ```javascript + * this.input.keyboard.removeCapture([ 62, 63, 64 ]); + * ``` + * + * Or a string: + * + * ```javascript + * this.input.keyboard.removeCapture('W,S,A,D'); + * ``` + * + * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'. + * + * You can also provide an array mixing both strings and key code integers. + * + * If there are no captures left after calling this method, the `preventDefault` property is set to `false`. + * @param keycode The Key Codes to disable capture for, allowing them reaching the browser again. + */ + removeCapture(keycode: string | number | number[] | any[]): void; + + /** + * Removes all keyboard captures and sets the `preventDefault` property to `false`. + */ + clearCaptures(): void; + + /** + * Destroys this Keyboard Manager instance. + */ + destroy(): void; + + } + + /** + * The Keyboard Plugin is an input plugin that belongs to the Scene-owned Input system. + * + * Its role is to listen for native DOM Keyboard Events and then process them. + * + * You do not need to create this class directly, the Input system will create an instance of it automatically. + * + * You can access it from within a Scene using `this.input.keyboard`. For example, you can do: + * + * ```javascript + * this.input.keyboard.on('keydown', callback, context); + * ``` + * + * Or, to listen for a specific key: + * + * ```javascript + * this.input.keyboard.on('keydown-A', callback, context); + * ``` + * + * You can also create Key objects, which you can then poll in your game loop: + * + * ```javascript + * var spaceBar = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE); + * ``` + * + * If you have multiple parallel Scenes, each trying to get keyboard input, be sure to disable capture on them to stop them from + * stealing input from another Scene in the list. You can do this with `this.input.keyboard.enabled = false` within the + * Scene to stop all input, or `this.input.keyboard.preventDefault = false` to stop a Scene halting input on another Scene. + * + * _Note_: Many keyboards are unable to process certain combinations of keys due to hardware limitations known as ghosting. + * See http://www.html5gamedevs.com/topic/4876-impossible-to-use-more-than-2-keyboard-input-buttons-at-the-same-time/ for more details + * and use the site https://w3c.github.io/uievents/tools/key-event-viewer.html to test your n-key support in browser. + * + * Also please be aware that certain browser extensions can disable or override Phaser keyboard handling. + * For example the Chrome extension vimium is known to disable Phaser from using the D key, while EverNote disables the backtick key. + * And there are others. So, please check your extensions before opening Phaser issues about keys that don't work. + */ + class KeyboardPlugin extends Phaser.Events.EventEmitter { + /** + * + * @param sceneInputPlugin A reference to the Scene Input Plugin that the KeyboardPlugin belongs to. + */ + constructor(sceneInputPlugin: Phaser.Input.InputPlugin); + + /** + * A reference to the core game, so we can listen for visibility events. + */ + game: Phaser.Game; + + /** + * A reference to the Scene that this Input Plugin is responsible for. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene Systems Settings. + */ + settings: Phaser.Types.Scenes.SettingsObject; + + /** + * A reference to the Scene Input Plugin that created this Keyboard Plugin. + */ + sceneInputPlugin: Phaser.Input.InputPlugin; + + /** + * A reference to the global Keyboard Manager. + */ + manager: Phaser.Input.Keyboard.KeyboardManager; + + /** + * A boolean that controls if this Keyboard Plugin is enabled or not. + * Can be toggled on the fly. + */ + enabled: boolean; + + /** + * An array of Key objects to process. + */ + keys: Phaser.Input.Keyboard.Key[]; + + /** + * An array of KeyCombo objects to process. + */ + combos: Phaser.Input.Keyboard.KeyCombo[]; + + /** + * Checks to see if both this plugin and the Scene to which it belongs is active. + */ + isActive(): boolean; + + /** + * By default when a key is pressed Phaser will not stop the event from propagating up to the browser. + * There are some keys this can be annoying for, like the arrow keys or space bar, which make the browser window scroll. + * + * This `addCapture` method enables consuming keyboard events for specific keys, so they don't bubble up the browser + * and cause the default behaviors. + * + * Please note that keyboard captures are global. This means that if you call this method from within a Scene, to say prevent + * the SPACE BAR from triggering a page scroll, then it will prevent it for any Scene in your game, not just the calling one. + * + * You can pass a single key code value: + * + * ```javascript + * this.input.keyboard.addCapture(62); + * ``` + * + * An array of key codes: + * + * ```javascript + * this.input.keyboard.addCapture([ 62, 63, 64 ]); + * ``` + * + * Or, a comma-delimited string: + * + * ```javascript + * this.input.keyboard.addCapture('W,S,A,D'); + * ``` + * + * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'. + * + * You can also provide an array mixing both strings and key code integers. + * @param keycode The Key Codes to enable event capture for. + */ + addCapture(keycode: string | number | number[] | any[]): this; + + /** + * Removes an existing key capture. + * + * Please note that keyboard captures are global. This means that if you call this method from within a Scene, to remove + * the capture of a key, then it will remove it for any Scene in your game, not just the calling one. + * + * You can pass a single key code value: + * + * ```javascript + * this.input.keyboard.removeCapture(62); + * ``` + * + * An array of key codes: + * + * ```javascript + * this.input.keyboard.removeCapture([ 62, 63, 64 ]); + * ``` + * + * Or, a comma-delimited string: + * + * ```javascript + * this.input.keyboard.removeCapture('W,S,A,D'); + * ``` + * + * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'. + * + * You can also provide an array mixing both strings and key code integers. + * @param keycode The Key Codes to disable event capture for. + */ + removeCapture(keycode: string | number | number[] | any[]): this; + + /** + * Returns an array that contains all of the keyboard captures currently enabled. + */ + getCaptures(): number[]; + + /** + * Allows Phaser to prevent any key captures you may have defined from bubbling up the browser. + * You can use this to re-enable event capturing if you had paused it via `disableGlobalCapture`. + */ + enableGlobalCapture(): this; + + /** + * Disables Phaser from preventing any key captures you may have defined, without actually removing them. + * You can use this to temporarily disable event capturing if, for example, you swap to a DOM element. + */ + disableGlobalCapture(): this; + + /** + * Removes all keyboard captures. + * + * Note that this is a global change. It will clear all event captures across your game, not just for this specific Scene. + */ + clearCaptures(): this; + + /** + * Creates and returns an object containing 4 hotkeys for Up, Down, Left and Right, and also Space Bar and shift. + */ + createCursorKeys(): Phaser.Types.Input.Keyboard.CursorKeys; + + /** + * A practical way to create an object containing user selected hotkeys. + * + * For example: + * + * ```javascript + * this.input.keyboard.addKeys({ 'up': Phaser.Input.Keyboard.KeyCodes.W, 'down': Phaser.Input.Keyboard.KeyCodes.S }); + * ``` + * + * would return an object containing the properties (`up` and `down`) mapped to W and S {@link Phaser.Input.Keyboard.Key} objects. + * + * You can also pass in a comma-separated string: + * + * ```javascript + * this.input.keyboard.addKeys('W,S,A,D'); + * ``` + * + * Which will return an object with the properties W, S, A and D mapped to the relevant Key objects. + * + * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'. + * @param keys An object containing Key Codes, or a comma-separated string. + * @param enableCapture Automatically call `preventDefault` on the native DOM browser event for the key codes being added. Default true. + * @param emitOnRepeat Controls if the Key will continuously emit a 'down' event while being held down (true), or emit the event just once (false, the default). Default false. + */ + addKeys(keys: object | string, enableCapture?: boolean, emitOnRepeat?: boolean): object; + + /** + * Adds a Key object to this Keyboard Plugin. + * + * The given argument can be either an existing Key object, a string, such as `A` or `SPACE`, or a key code value. + * + * If a Key object is given, and one already exists matching the same key code, the existing one is replaced with the new one. + * @param key Either a Key object, a string, such as `A` or `SPACE`, or a key code value. + * @param enableCapture Automatically call `preventDefault` on the native DOM browser event for the key codes being added. Default true. + * @param emitOnRepeat Controls if the Key will continuously emit a 'down' event while being held down (true), or emit the event just once (false, the default). Default false. + */ + addKey(key: Phaser.Input.Keyboard.Key | string | number, enableCapture?: boolean, emitOnRepeat?: boolean): Phaser.Input.Keyboard.Key; + + /** + * Removes a Key object from this Keyboard Plugin. + * + * The given argument can be either a Key object, a string, such as `A` or `SPACE`, or a key code value. + * @param key Either a Key object, a string, such as `A` or `SPACE`, or a key code value. + * @param destroy Call `Key.destroy` on the removed Key object? Default false. + * @param removeCapture Remove this Key from being captured? Only applies if set to capture when created. Default false. + */ + removeKey(key: Phaser.Input.Keyboard.Key | string | number, destroy?: boolean, removeCapture?: boolean): this; + + /** + * Removes all Key objects created by _this_ Keyboard Plugin. + * @param destroy Call `Key.destroy` on each removed Key object? Default false. + * @param removeCapture Remove all key captures for Key objects owened by this plugin? Default false. + */ + removeAllKeys(destroy?: boolean, removeCapture?: boolean): this; + + /** + * Creates a new KeyCombo. + * + * A KeyCombo will listen for a specific string of keys from the Keyboard, and when it receives them + * it will emit a `keycombomatch` event from this Keyboard Plugin. + * + * The keys to be listened for can be defined as: + * + * A string (i.e. 'ATARI') + * An array of either integers (key codes) or strings, or a mixture of both + * An array of objects (such as Key objects) with a public 'keyCode' property + * + * For example, to listen for the Konami code (up, up, down, down, left, right, left, right, b, a, enter) + * you could pass the following array of key codes: + * + * ```javascript + * this.input.keyboard.createCombo([ 38, 38, 40, 40, 37, 39, 37, 39, 66, 65, 13 ], { resetOnMatch: true }); + * + * this.input.keyboard.on('keycombomatch', function (event) { + * console.log('Konami Code entered!'); + * }); + * ``` + * + * Or, to listen for the user entering the word PHASER: + * + * ```javascript + * this.input.keyboard.createCombo('PHASER'); + * ``` + * @param keys The keys that comprise this combo. + * @param config A Key Combo configuration object. + */ + createCombo(keys: string | number[] | object[], config?: Phaser.Types.Input.Keyboard.KeyComboConfig): Phaser.Input.Keyboard.KeyCombo; + + /** + * Checks if the given Key object is currently being held down. + * + * The difference between this method and checking the `Key.isDown` property directly is that you can provide + * a duration to this method. For example, if you wanted a key press to fire a bullet, but you only wanted + * it to be able to fire every 100ms, then you can call this method with a `duration` of 100 and it + * will only return `true` every 100ms. + * + * If the Keyboard Plugin has been disabled, this method will always return `false`. + * @param key A Key object. + * @param duration The duration which must have elapsed before this Key is considered as being down. Default 0. + */ + checkDown(key: Phaser.Input.Keyboard.Key, duration?: number): boolean; + + /** + * Resets all Key objects created by _this_ Keyboard Plugin back to their default un-pressed states. + * This can only reset keys created via the `addKey`, `addKeys` or `createCursorKeys` methods. + * If you have created a Key object directly you'll need to reset it yourself. + * + * This method is called automatically when the Keyboard Plugin shuts down, but can be + * invoked directly at any time you require. + */ + resetKeys(): this; + + } + + /** + * Returns `true` if the Key was pressed down within the `duration` value given, based on the current + * game clock time. Or `false` if it either isn't down, or was pressed down longer ago than the given duration. + * @param key The Key object to test. + * @param duration The duration, in ms, within which the key must have been pressed down. Default 50. + */ + function DownDuration(key: Phaser.Input.Keyboard.Key, duration?: number): boolean; + + /** + * The justDown value allows you to test if this Key has just been pressed down or not. + * + * When you check this value it will return `true` if the Key is down, otherwise `false`. + * + * You can only call justDown once per key press. It will only return `true` once, until the Key is released and pressed down again. + * This allows you to use it in situations where you want to check if this key is down without using an event, such as in a core game loop. + * @param key The Key to check to see if it's just down or not. + */ + function JustDown(key: Phaser.Input.Keyboard.Key): boolean; + + /** + * The justUp value allows you to test if this Key has just been released or not. + * + * When you check this value it will return `true` if the Key is up, otherwise `false`. + * + * You can only call JustUp once per key release. It will only return `true` once, until the Key is pressed down and released again. + * This allows you to use it in situations where you want to check if this key is up without using an event, such as in a core game loop. + * @param key The Key to check to see if it's just up or not. + */ + function JustUp(key: Phaser.Input.Keyboard.Key): boolean; + + /** + * A generic Key object which can be passed to the Process functions (and so on) + * keycode must be an integer + */ + class Key extends Phaser.Events.EventEmitter { + /** + * + * @param plugin The Keyboard Plugin instance that owns this Key object. + * @param keyCode The keycode of this key. + */ + constructor(plugin: Phaser.Input.Keyboard.KeyboardPlugin, keyCode: number); + + /** + * The Keyboard Plugin instance that owns this Key object. + */ + plugin: Phaser.Input.Keyboard.KeyboardPlugin; + + /** + * The keycode of this key. + */ + keyCode: number; + + /** + * The original DOM event. + */ + originalEvent: KeyboardEvent; + + /** + * Can this Key be processed? + */ + enabled: boolean; + + /** + * The "down" state of the key. This will remain `true` for as long as the keyboard thinks this key is held down. + */ + isDown: boolean; + + /** + * The "up" state of the key. This will remain `true` for as long as the keyboard thinks this key is up. + */ + isUp: boolean; + + /** + * The down state of the ALT key, if pressed at the same time as this key. + */ + altKey: boolean; + + /** + * The down state of the CTRL key, if pressed at the same time as this key. + */ + ctrlKey: boolean; + + /** + * The down state of the SHIFT key, if pressed at the same time as this key. + */ + shiftKey: boolean; + + /** + * The down state of the Meta key, if pressed at the same time as this key. + * On a Mac the Meta Key is the Command key. On Windows keyboards, it's the Windows key. + */ + metaKey: boolean; + + /** + * The location of the modifier key. 0 for standard (or unknown), 1 for left, 2 for right, 3 for numpad. + */ + location: number; + + /** + * The timestamp when the key was last pressed down. + */ + timeDown: number; + + /** + * The number of milliseconds this key was held down for in the previous down - up sequence. + * This value isn't updated every game step, only when the Key changes state. + * To get the current duration use the `getDuration` method. + */ + duration: number; + + /** + * The timestamp when the key was last released. + */ + timeUp: number; + + /** + * When a key is held down should it continuously fire the `down` event each time it repeats? + * + * By default it will emit the `down` event just once, but if you wish to receive the event + * for each repeat as well, enable this property. + */ + emitOnRepeat: boolean; + + /** + * If a key is held down this holds down the number of times the key has 'repeated'. + */ + repeats: number; + + /** + * Controls if this Key will continuously emit a `down` event while being held down (true), + * or emit the event just once, on first press, and then skip future events (false). + * @param value Emit `down` events on repeated key down actions, or just once? + */ + setEmitOnRepeat(value: boolean): this; + + /** + * Processes the Key Down action for this Key. + * Called automatically by the Keyboard Plugin. + * @param event The native DOM Keyboard event. + */ + onDown(event: KeyboardEvent): void; + + /** + * Processes the Key Up action for this Key. + * Called automatically by the Keyboard Plugin. + * @param event The native DOM Keyboard event. + */ + onUp(event: KeyboardEvent): void; + + /** + * Resets this Key object back to its default un-pressed state. + * + * As of version 3.60.0 it no longer resets the `enabled` or `preventDefault` flags. + */ + reset(): this; + + /** + * Returns the duration, in ms, that the Key has been held down for. + * + * If the key is not currently down it will return zero. + * + * To get the duration the Key was held down for in the previous up-down cycle, + * use the `Key.duration` property value instead. + */ + getDuration(): number; + + /** + * Removes any bound event handlers and removes local references. + */ + destroy(): void; + + } + + /** + * Keyboard Codes. + */ + namespace KeyCodes { + /** + * The BACKSPACE key. + */ + var BACKSPACE: number; + + /** + * The TAB key. + */ + var TAB: number; + + /** + * The ENTER key. + */ + var ENTER: number; + + /** + * The SHIFT key. + */ + var SHIFT: number; + + /** + * The CTRL key. + */ + var CTRL: number; + + /** + * The ALT key. + */ + var ALT: number; + + /** + * The PAUSE key. + */ + var PAUSE: number; + + /** + * The CAPS_LOCK key. + */ + var CAPS_LOCK: number; + + /** + * The ESC key. + */ + var ESC: number; + + /** + * The SPACE key. + */ + var SPACE: number; + + /** + * The PAGE_UP key. + */ + var PAGE_UP: number; + + /** + * The PAGE_DOWN key. + */ + var PAGE_DOWN: number; + + /** + * The END key. + */ + var END: number; + + /** + * The HOME key. + */ + var HOME: number; + + /** + * The LEFT key. + */ + var LEFT: number; + + /** + * The UP key. + */ + var UP: number; + + /** + * The RIGHT key. + */ + var RIGHT: number; + + /** + * The DOWN key. + */ + var DOWN: number; + + /** + * The PRINT_SCREEN key. + */ + var PRINT_SCREEN: number; + + /** + * The INSERT key. + */ + var INSERT: number; + + /** + * The DELETE key. + */ + var DELETE: number; + + /** + * The ZERO key. + */ + var ZERO: number; + + /** + * The ONE key. + */ + var ONE: number; + + /** + * The TWO key. + */ + var TWO: number; + + /** + * The THREE key. + */ + var THREE: number; + + /** + * The FOUR key. + */ + var FOUR: number; + + /** + * The FIVE key. + */ + var FIVE: number; + + /** + * The SIX key. + */ + var SIX: number; + + /** + * The SEVEN key. + */ + var SEVEN: number; + + /** + * The EIGHT key. + */ + var EIGHT: number; + + /** + * The NINE key. + */ + var NINE: number; + + /** + * The NUMPAD_ZERO key. + */ + var NUMPAD_ZERO: number; + + /** + * The NUMPAD_ONE key. + */ + var NUMPAD_ONE: number; + + /** + * The NUMPAD_TWO key. + */ + var NUMPAD_TWO: number; + + /** + * The NUMPAD_THREE key. + */ + var NUMPAD_THREE: number; + + /** + * The NUMPAD_FOUR key. + */ + var NUMPAD_FOUR: number; + + /** + * The NUMPAD_FIVE key. + */ + var NUMPAD_FIVE: number; + + /** + * The NUMPAD_SIX key. + */ + var NUMPAD_SIX: number; + + /** + * The NUMPAD_SEVEN key. + */ + var NUMPAD_SEVEN: number; + + /** + * The NUMPAD_EIGHT key. + */ + var NUMPAD_EIGHT: number; + + /** + * The NUMPAD_NINE key. + */ + var NUMPAD_NINE: number; + + /** + * The Numpad Addition (+) key. + */ + var NUMPAD_ADD: number; + + /** + * The Numpad Subtraction (-) key. + */ + var NUMPAD_SUBTRACT: number; + + /** + * The A key. + */ + var A: number; + + /** + * The B key. + */ + var B: number; + + /** + * The C key. + */ + var C: number; + + /** + * The D key. + */ + var D: number; + + /** + * The E key. + */ + var E: number; + + /** + * The F key. + */ + var F: number; + + /** + * The G key. + */ + var G: number; + + /** + * The H key. + */ + var H: number; + + /** + * The I key. + */ + var I: number; + + /** + * The J key. + */ + var J: number; + + /** + * The K key. + */ + var K: number; + + /** + * The L key. + */ + var L: number; + + /** + * The M key. + */ + var M: number; + + /** + * The N key. + */ + var N: number; + + /** + * The O key. + */ + var O: number; + + /** + * The P key. + */ + var P: number; + + /** + * The Q key. + */ + var Q: number; + + /** + * The R key. + */ + var R: number; + + /** + * The S key. + */ + var S: number; + + /** + * The T key. + */ + var T: number; + + /** + * The U key. + */ + var U: number; + + /** + * The V key. + */ + var V: number; + + /** + * The W key. + */ + var W: number; + + /** + * The X key. + */ + var X: number; + + /** + * The Y key. + */ + var Y: number; + + /** + * The Z key. + */ + var Z: number; + + /** + * The F1 key. + */ + var F1: number; + + /** + * The F2 key. + */ + var F2: number; + + /** + * The F3 key. + */ + var F3: number; + + /** + * The F4 key. + */ + var F4: number; + + /** + * The F5 key. + */ + var F5: number; + + /** + * The F6 key. + */ + var F6: number; + + /** + * The F7 key. + */ + var F7: number; + + /** + * The F8 key. + */ + var F8: number; + + /** + * The F9 key. + */ + var F9: number; + + /** + * The F10 key. + */ + var F10: number; + + /** + * The F11 key. + */ + var F11: number; + + /** + * The F12 key. + */ + var F12: number; + + /** + * The SEMICOLON key. + */ + var SEMICOLON: number; + + /** + * The PLUS key. + */ + var PLUS: number; + + /** + * The COMMA key. + */ + var COMMA: number; + + /** + * The MINUS key. + */ + var MINUS: number; + + /** + * The PERIOD key. + */ + var PERIOD: number; + + /** + * The FORWARD_SLASH key. + */ + var FORWARD_SLASH: number; + + /** + * The BACK_SLASH key. + */ + var BACK_SLASH: number; + + /** + * The QUOTES key. + */ + var QUOTES: number; + + /** + * The BACKTICK key. + */ + var BACKTICK: number; + + /** + * The OPEN_BRACKET key. + */ + var OPEN_BRACKET: number; + + /** + * The CLOSED_BRACKET key. + */ + var CLOSED_BRACKET: number; + + /** + * The SEMICOLON_FIREFOX key. + */ + var SEMICOLON_FIREFOX: number; + + /** + * The COLON key. + */ + var COLON: number; + + /** + * The COMMA_FIREFOX_WINDOWS key. + */ + var COMMA_FIREFOX_WINDOWS: number; + + /** + * The COMMA_FIREFOX key. + */ + var COMMA_FIREFOX: number; + + /** + * The BRACKET_RIGHT_FIREFOX key. + */ + var BRACKET_RIGHT_FIREFOX: number; + + /** + * The BRACKET_LEFT_FIREFOX key. + */ + var BRACKET_LEFT_FIREFOX: number; + + } + + /** + * Returns `true` if the Key was released within the `duration` value given, based on the current + * game clock time. Or returns `false` if it either isn't up, or was released longer ago than the given duration. + * @param key The Key object to test. + * @param duration The duration, in ms, within which the key must have been released. Default 50. + */ + function UpDuration(key: Phaser.Input.Keyboard.Key, duration?: number): boolean; + + } + + namespace Mouse { + /** + * The Mouse Manager is a helper class that belongs to the Input Manager. + * + * Its role is to listen for native DOM Mouse Events and then pass them onto the Input Manager for further processing. + * + * You do not need to create this class directly, the Input Manager will create an instance of it automatically. + */ + class MouseManager { + /** + * + * @param inputManager A reference to the Input Manager. + */ + constructor(inputManager: Phaser.Input.InputManager); + + /** + * A reference to the Input Manager. + */ + manager: Phaser.Input.InputManager; + + /** + * If `true` the DOM `mousedown` event will have `preventDefault` set. + */ + preventDefaultDown: boolean; + + /** + * If `true` the DOM `mouseup` event will have `preventDefault` set. + */ + preventDefaultUp: boolean; + + /** + * If `true` the DOM `mousemove` event will have `preventDefault` set. + */ + preventDefaultMove: boolean; + + /** + * If `true` the DOM `wheel` event will have `preventDefault` set. + */ + preventDefaultWheel: boolean; + + /** + * A boolean that controls if the Mouse Manager is enabled or not. + * Can be toggled on the fly. + */ + enabled: boolean; + + /** + * The Mouse target, as defined in the Game Config. + * Typically the canvas to which the game is rendering, but can be any interactive DOM element. + */ + target: any; + + /** + * If the mouse has been pointer locked successfully this will be set to true. + */ + locked: boolean; + + /** + * The Mouse Move Event handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseMove: Function; + + /** + * The Mouse Down Event handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseDown: Function; + + /** + * The Mouse Up Event handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseUp: Function; + + /** + * The Mouse Down Event handler specifically for events on the Window. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseDownWindow: Function; + + /** + * The Mouse Up Event handler specifically for events on the Window. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseUpWindow: Function; + + /** + * The Mouse Over Event handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseOver: Function; + + /** + * The Mouse Out Event handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseOut: Function; + + /** + * The Mouse Wheel Event handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseWheel: Function; + + /** + * Internal pointerLockChange handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + pointerLockChange: Function; + + /** + * Are the event listeners hooked into `window.top` or `window`? + * + * This is set during the `boot` sequence. If the browser does not have access to `window.top`, + * such as in cross-origin iframe environments, this property gets set to `false` and the events + * are hooked into `window` instead. + */ + readonly isTop: boolean; + + /** + * Attempts to disable the context menu from appearing if you right-click on the game canvas, or specified input target. + * + * Works by listening for the `contextmenu` event and prevent defaulting it. + * + * Use this if you need to enable right-button mouse support in your game, and the context + * menu keeps getting in the way. + */ + disableContextMenu(): this; + + /** + * If the browser supports it, you can request that the pointer be locked to the browser window. + * + * This is classically known as 'FPS controls', where the pointer can't leave the browser until + * the user presses an exit key. + * + * If the browser successfully enters a locked state, a `POINTER_LOCK_CHANGE_EVENT` will be dispatched, + * from the games Input Manager, with an `isPointerLocked` property. + * + * It is important to note that pointer lock can only be enabled after an 'engagement gesture', + * see: https://w3c.github.io/pointerlock/#dfn-engagement-gesture. + * + * Note for Firefox: There is a bug in certain Firefox releases that cause native DOM events like + * `mousemove` to fire continuously when in pointer lock mode. You can get around this by setting + * `this.preventDefaultMove` to `false` in this class. You may also need to do the same for + * `preventDefaultDown` and/or `preventDefaultUp`. Please test combinations of these if you encounter + * the error. + */ + requestPointerLock(): void; + + /** + * If the browser supports pointer lock, this will request that the pointer lock is released. If + * the browser successfully enters a locked state, a 'POINTER_LOCK_CHANGE_EVENT' will be + * dispatched - from the game's input manager - with an `isPointerLocked` property. + */ + releasePointerLock(): void; + + /** + * Starts the Mouse Event listeners running. + * This is called automatically and does not need to be manually invoked. + */ + startListeners(): void; + + /** + * Stops the Mouse Event listeners. + * This is called automatically and does not need to be manually invoked. + */ + stopListeners(): void; + + /** + * Destroys this Mouse Manager instance. + */ + destroy(): void; + + } + + } + + /** + * A Pointer object encapsulates both mouse and touch input within Phaser. + * + * By default, Phaser will create 2 pointers for your game to use. If you require more, i.e. for a multi-touch + * game, then use the `InputPlugin.addPointer` method to do so, rather than instantiating this class directly, + * otherwise it won't be managed by the input system. + * + * You can reference the current active pointer via `InputPlugin.activePointer`. You can also use the properties + * `InputPlugin.pointer1` through to `pointer10`, for each pointer you have enabled in your game. + * + * The properties of this object are set by the Input Plugin during processing. This object is then sent in all + * input related events that the Input Plugin emits, so you can reference properties from it directly in your + * callbacks. + */ + class Pointer { + /** + * + * @param manager A reference to the Input Manager. + * @param id The internal ID of this Pointer. + */ + constructor(manager: Phaser.Input.InputManager, id: number); + + /** + * A reference to the Input Manager. + */ + manager: Phaser.Input.InputManager; + + /** + * The internal ID of this Pointer. + */ + readonly id: number; + + /** + * The most recent native DOM Event this Pointer has processed. + */ + event: TouchEvent | MouseEvent | WheelEvent; + + /** + * The DOM element the Pointer was pressed down on, taken from the DOM event. + * In a default set-up this will be the Canvas that Phaser is rendering to, or the Window element. + */ + readonly downElement: any; + + /** + * The DOM element the Pointer was released on, taken from the DOM event. + * In a default set-up this will be the Canvas that Phaser is rendering to, or the Window element. + */ + readonly upElement: any; + + /** + * The camera the Pointer interacted with during its last update. + * + * A Pointer can only ever interact with one camera at once, which will be the top-most camera + * in the list should multiple cameras be positioned on-top of each other. + */ + camera: Phaser.Cameras.Scene2D.Camera; + + /** + * A read-only property that indicates which button was pressed, or released, on the pointer + * during the most recent event. It is only set during `up` and `down` events. + * + * On Touch devices the value is always 0. + * + * Users may change the configuration of buttons on their pointing device so that if an event's button property + * is zero, it may not have been caused by the button that is physically left–most on the pointing device; + * however, it should behave as if the left button was clicked in the standard button layout. + */ + readonly button: number; + + /** + * 0: No button or un-initialized + * 1: Left button + * 2: Right button + * 4: Wheel button or middle button + * 8: 4th button (typically the "Browser Back" button) + * 16: 5th button (typically the "Browser Forward" button) + * + * For a mouse configured for left-handed use, the button actions are reversed. + * In this case, the values are read from right to left. + */ + buttons: number; + + /** + * The position of the Pointer in screen space. + */ + readonly position: Phaser.Math.Vector2; + + /** + * The previous position of the Pointer in screen space. + * + * The old x and y values are stored in here during the InputManager.transformPointer call. + * + * Use the properties `velocity`, `angle` and `distance` to create your own gesture recognition. + */ + readonly prevPosition: Phaser.Math.Vector2; + + /** + * The current velocity of the Pointer, based on its current and previous positions. + * + * This value is smoothed out each frame, according to the `motionFactor` property. + * + * This property is updated whenever the Pointer moves, regardless of any button states. In other words, + * it changes based on movement alone - a button doesn't have to be pressed first. + */ + readonly velocity: Phaser.Math.Vector2; + + /** + * The current angle the Pointer is moving, in radians, based on its previous and current position. + * + * The angle is based on the old position facing to the current position. + * + * This property is updated whenever the Pointer moves, regardless of any button states. In other words, + * it changes based on movement alone - a button doesn't have to be pressed first. + */ + readonly angle: number; + + /** + * The distance the Pointer has moved, based on its previous and current position. + * + * This value is smoothed out each frame, according to the `motionFactor` property. + * + * This property is updated whenever the Pointer moves, regardless of any button states. In other words, + * it changes based on movement alone - a button doesn't have to be pressed first. + * + * If you need the total distance travelled since the primary buttons was pressed down, + * then use the `Pointer.getDistance` method. + */ + readonly distance: number; + + /** + * The smoothing factor to apply to the Pointer position. + * + * Due to their nature, pointer positions are inherently noisy. While this is fine for lots of games, if you need cleaner positions + * then you can set this value to apply an automatic smoothing to the positions as they are recorded. + * + * The default value of zero means 'no smoothing'. + * Set to a small value, such as 0.2, to apply an average level of smoothing between positions. You can do this by changing this + * value directly, or by setting the `input.smoothFactor` property in the Game Config. + * + * Positions are only smoothed when the pointer moves. If the primary button on this Pointer enters an Up or Down state, then the position + * is always precise, and not smoothed. + */ + smoothFactor: number; + + /** + * The factor applied to the motion smoothing each frame. + * + * This value is passed to the Smooth Step Interpolation that is used to calculate the velocity, + * angle and distance of the Pointer. It's applied every frame, until the midPoint reaches the current + * position of the Pointer. 0.2 provides a good average but can be increased if you need a + * quicker update and are working in a high performance environment. Never set this value to + * zero. + */ + motionFactor: number; + + /** + * The x position of this Pointer, translated into the coordinate space of the most recent Camera it interacted with. + * + * If you wish to use this value _outside_ of an input event handler then you should update it first by calling + * the `Pointer.updateWorldPoint` method. + */ + worldX: number; + + /** + * The y position of this Pointer, translated into the coordinate space of the most recent Camera it interacted with. + * + * If you wish to use this value _outside_ of an input event handler then you should update it first by calling + * the `Pointer.updateWorldPoint` method. + */ + worldY: number; + + /** + * Time when this Pointer was most recently moved (regardless of the state of its buttons, if any) + */ + moveTime: number; + + /** + * X coordinate of the Pointer when Button 1 (left button), or Touch, was pressed, used for dragging objects. + */ + downX: number; + + /** + * Y coordinate of the Pointer when Button 1 (left button), or Touch, was pressed, used for dragging objects. + */ + downY: number; + + /** + * The Event timestamp when the first button, or Touch input, was pressed. Used for dragging objects. + */ + downTime: number; + + /** + * X coordinate of the Pointer when Button 1 (left button), or Touch, was released, used for dragging objects. + */ + upX: number; + + /** + * Y coordinate of the Pointer when Button 1 (left button), or Touch, was released, used for dragging objects. + */ + upY: number; + + /** + * The Event timestamp when the final button, or Touch input, was released. Used for dragging objects. + */ + upTime: number; + + /** + * Is the primary button down? (usually button 0, the left mouse button) + */ + primaryDown: boolean; + + /** + * Is _any_ button on this pointer considered as being down? + */ + isDown: boolean; + + /** + * Did the previous input event come from a Touch input (true) or Mouse? (false) + */ + wasTouch: boolean; + + /** + * Did this Pointer get canceled by a touchcancel event? + * + * Note: "canceled" is the American-English spelling of "cancelled". Please don't submit PRs correcting it! + */ + wasCanceled: boolean; + + /** + * If the mouse is locked, the horizontal relative movement of the Pointer in pixels since last frame. + */ + movementX: number; + + /** + * If the mouse is locked, the vertical relative movement of the Pointer in pixels since last frame. + */ + movementY: number; + + /** + * The identifier property of the Pointer as set by the DOM event when this Pointer is started. + */ + identifier: number; + + /** + * The pointerId property of the Pointer as set by the DOM event when this Pointer is started. + * The browser can and will recycle this value. + */ + pointerId: number; + + /** + * An active Pointer is one that is currently pressed down on the display. + * A Mouse is always considered as active. + */ + active: boolean; + + /** + * Is this pointer Pointer Locked? + * + * Only a mouse pointer can be locked and it only becomes locked when requested via + * the browsers Pointer Lock API. + * + * You can request this by calling the `this.input.mouse.requestPointerLock()` method from + * a `pointerdown` or `pointerup` event handler. + */ + readonly locked: boolean; + + /** + * The horizontal scroll amount that occurred due to the user moving a mouse wheel or similar input device. + */ + deltaX: number; + + /** + * The vertical scroll amount that occurred due to the user moving a mouse wheel or similar input device. + * This value will typically be less than 0 if the user scrolls up and greater than zero if scrolling down. + */ + deltaY: number; + + /** + * The z-axis scroll amount that occurred due to the user moving a mouse wheel or similar input device. + */ + deltaZ: number; + + /** + * Takes a Camera and updates this Pointer's `worldX` and `worldY` values so they are + * the result of a translation through the given Camera. + * + * Note that the values will be automatically replaced the moment the Pointer is + * updated by an input event, such as a mouse move, so should be used immediately. + * @param camera The Camera which is being tested against. + */ + updateWorldPoint(camera: Phaser.Cameras.Scene2D.Camera): this; + + /** + * Takes a Camera and returns a Vector2 containing the translated position of this Pointer + * within that Camera. This can be used to convert this Pointers position into camera space. + * @param camera The Camera to use for the translation. + * @param output A Vector2-like object in which to store the translated position. + */ + positionToCamera(camera: Phaser.Cameras.Scene2D.Camera, output?: Phaser.Math.Vector2 | object): Phaser.Math.Vector2 | object; + + /** + * Checks to see if any buttons are being held down on this Pointer. + */ + noButtonDown(): boolean; + + /** + * Checks to see if the left button is being held down on this Pointer. + */ + leftButtonDown(): boolean; + + /** + * Checks to see if the right button is being held down on this Pointer. + */ + rightButtonDown(): boolean; + + /** + * Checks to see if the middle button is being held down on this Pointer. + */ + middleButtonDown(): boolean; + + /** + * Checks to see if the back button is being held down on this Pointer. + */ + backButtonDown(): boolean; + + /** + * Checks to see if the forward button is being held down on this Pointer. + */ + forwardButtonDown(): boolean; + + /** + * Checks to see if the left button was just released on this Pointer. + */ + leftButtonReleased(): boolean; + + /** + * Checks to see if the right button was just released on this Pointer. + */ + rightButtonReleased(): boolean; + + /** + * Checks to see if the middle button was just released on this Pointer. + */ + middleButtonReleased(): boolean; + + /** + * Checks to see if the back button was just released on this Pointer. + */ + backButtonReleased(): boolean; + + /** + * Checks to see if the forward button was just released on this Pointer. + */ + forwardButtonReleased(): boolean; + + /** + * If the Pointer has a button pressed down at the time this method is called, it will return the + * distance between the Pointer's `downX` and `downY` values and the current position. + * + * If no button is held down, it will return the last recorded distance, based on where + * the Pointer was when the button was released. + * + * If you wish to get the distance being travelled currently, based on the velocity of the Pointer, + * then see the `Pointer.distance` property. + */ + getDistance(): number; + + /** + * If the Pointer has a button pressed down at the time this method is called, it will return the + * horizontal distance between the Pointer's `downX` and `downY` values and the current position. + * + * If no button is held down, it will return the last recorded horizontal distance, based on where + * the Pointer was when the button was released. + */ + getDistanceX(): number; + + /** + * If the Pointer has a button pressed down at the time this method is called, it will return the + * vertical distance between the Pointer's `downX` and `downY` values and the current position. + * + * If no button is held down, it will return the last recorded vertical distance, based on where + * the Pointer was when the button was released. + */ + getDistanceY(): number; + + /** + * If the Pointer has a button pressed down at the time this method is called, it will return the + * duration since the button was pressed down. + * + * If no button is held down, it will return the last recorded duration, based on the time + * the last button on the Pointer was released. + */ + getDuration(): number; + + /** + * If the Pointer has a button pressed down at the time this method is called, it will return the + * angle between the Pointer's `downX` and `downY` values and the current position. + * + * If no button is held down, it will return the last recorded angle, based on where + * the Pointer was when the button was released. + * + * The angle is based on the old position facing to the current position. + * + * If you wish to get the current angle, based on the velocity of the Pointer, then + * see the `Pointer.angle` property. + */ + getAngle(): number; + + /** + * Takes the previous and current Pointer positions and then generates an array of interpolated values between + * the two. The array will be populated up to the size of the `steps` argument. + * + * ```javaScript + * var points = pointer.getInterpolatedPosition(4); + * + * // points[0] = { x: 0, y: 0 } + * // points[1] = { x: 2, y: 1 } + * // points[2] = { x: 3, y: 2 } + * // points[3] = { x: 6, y: 3 } + * ``` + * + * Use this if you need to get smoothed values between the previous and current pointer positions. DOM pointer + * events can often fire faster than the main browser loop, and this will help you avoid janky movement + * especially if you have an object following a Pointer. + * + * Note that if you provide an output array it will only be populated up to the number of steps provided. + * It will not clear any previous data that may have existed beyond the range of the steps count. + * + * Internally it uses the Smooth Step interpolation calculation. + * @param steps The number of interpolation steps to use. Default 10. + * @param out An array to store the results in. If not provided a new one will be created. + */ + getInterpolatedPosition(steps?: number, out?: any[]): any[]; + + /** + * Fully reset this Pointer back to its unitialized state. + */ + reset(): void; + + /** + * Destroys this Pointer instance and resets its external references. + */ + destroy(): void; + + /** + * The x position of this Pointer. + * The value is in screen space. + * See `worldX` to get a camera converted position. + */ + x: number; + + /** + * The y position of this Pointer. + * The value is in screen space. + * See `worldY` to get a camera converted position. + */ + y: number; + + /** + * Time when this Pointer was most recently updated by a DOM Event. + * This comes directly from the `event.timeStamp` property. + * If no event has yet taken place, it will return zero. + */ + readonly time: number; + + } + + namespace Touch { + /** + * The Touch Manager is a helper class that belongs to the Input Manager. + * + * Its role is to listen for native DOM Touch Events and then pass them onto the Input Manager for further processing. + * + * You do not need to create this class directly, the Input Manager will create an instance of it automatically. + */ + class TouchManager { + /** + * + * @param inputManager A reference to the Input Manager. + */ + constructor(inputManager: Phaser.Input.InputManager); + + /** + * A reference to the Input Manager. + */ + manager: Phaser.Input.InputManager; + + /** + * If true the DOM events will have event.preventDefault applied to them, if false they will propagate fully. + */ + capture: boolean; + + /** + * A boolean that controls if the Touch Manager is enabled or not. + * Can be toggled on the fly. + */ + enabled: boolean; + + /** + * The Touch Event target, as defined in the Game Config. + * Typically the canvas to which the game is rendering, but can be any interactive DOM element. + */ + target: any; + + /** + * The Touch Start event handler function. + * Initially empty and bound in the `startListeners` method. + */ + onTouchStart: Function; + + /** + * The Touch Start event handler function specifically for events on the Window. + * Initially empty and bound in the `startListeners` method. + */ + onTouchStartWindow: Function; + + /** + * The Touch Move event handler function. + * Initially empty and bound in the `startListeners` method. + */ + onTouchMove: Function; + + /** + * The Touch End event handler function. + * Initially empty and bound in the `startListeners` method. + */ + onTouchEnd: Function; + + /** + * The Touch End event handler function specifically for events on the Window. + * Initially empty and bound in the `startListeners` method. + */ + onTouchEndWindow: Function; + + /** + * The Touch Cancel event handler function. + * Initially empty and bound in the `startListeners` method. + */ + onTouchCancel: Function; + + /** + * The Touch Cancel event handler function specifically for events on the Window. + * Initially empty and bound in the `startListeners` method. + */ + onTouchCancelWindow: Function; + + /** + * Are the event listeners hooked into `window.top` or `window`? + * + * This is set during the `boot` sequence. If the browser does not have access to `window.top`, + * such as in cross-origin iframe environments, this property gets set to `false` and the events + * are hooked into `window` instead. + */ + readonly isTop: boolean; + + /** + * Attempts to disable the context menu from appearing if you touch-hold on the browser. + * + * Works by listening for the `contextmenu` event and prevent defaulting it. + * + * Use this if you need to disable the OS context menu on mobile. + */ + disableContextMenu(): this; + + /** + * Starts the Touch Event listeners running as long as an input target is set. + * + * This method is called automatically if Touch Input is enabled in the game config, + * which it is by default. However, you can call it manually should you need to + * delay input capturing until later in the game. + */ + startListeners(): void; + + /** + * Stops the Touch Event listeners. + * This is called automatically and does not need to be manually invoked. + */ + stopListeners(): void; + + /** + * Destroys this Touch Manager instance. + */ + destroy(): void; + + } + + } + + } + + namespace Loader { + /** + * The Loader is idle. + */ + var LOADER_IDLE: number; + + /** + * The Loader is actively loading. + */ + var LOADER_LOADING: number; + + /** + * The Loader is processing files is has loaded. + */ + var LOADER_PROCESSING: number; + + /** + * The Loader has completed loading and processing. + */ + var LOADER_COMPLETE: number; + + /** + * The Loader is shutting down. + */ + var LOADER_SHUTDOWN: number; + + /** + * The Loader has been destroyed. + */ + var LOADER_DESTROYED: number; + + /** + * File is in the load queue but not yet started. + */ + var FILE_PENDING: number; + + /** + * File has been started to load by the loader (onLoad called) + */ + var FILE_LOADING: number; + + /** + * File has loaded successfully, awaiting processing. + */ + var FILE_LOADED: number; + + /** + * File failed to load. + */ + var FILE_FAILED: number; + + /** + * File is being processed (onProcess callback) + */ + var FILE_PROCESSING: number; + + /** + * The File has errored somehow during processing. + */ + var FILE_ERRORED: number; + + /** + * File has finished processing. + */ + var FILE_COMPLETE: number; + + /** + * File has been destroyed. + */ + var FILE_DESTROYED: number; + + /** + * File was populated from local data and doesn't need an HTTP request. + */ + var FILE_POPULATED: number; + + /** + * File is pending being destroyed. + */ + var FILE_PENDING_DESTROY: number; + + namespace Events { + /** + * The Loader Plugin Add File Event. + * + * This event is dispatched when a new file is successfully added to the Loader and placed into the load queue. + * + * Listen to it from a Scene using: `this.load.on('addfile', listener)`. + * + * If you add lots of files to a Loader from a `preload` method, it will dispatch this event for each one of them. + */ + const ADD: string; + + /** + * The Loader Plugin Complete Event. + * + * This event is dispatched when the Loader has fully processed everything in the load queue. + * By this point every loaded file will now be in its associated cache and ready for use. + * + * Listen to it from a Scene using: `this.load.on('complete', listener)`. + */ + const COMPLETE: string; + + /** + * The File Load Complete Event. + * + * This event is dispatched by the Loader Plugin when _any_ file in the queue finishes loading. + * + * Listen to it from a Scene using: `this.load.on('filecomplete', listener)`. + * + * Make sure you remove this listener when you have finished, or it will continue to fire if the Scene reloads. + * + * You can also listen for the completion of a specific file. See the [FILE_KEY_COMPLETE]{@linkcode Phaser.Loader.Events#event:FILE_KEY_COMPLETE} event. + */ + const FILE_COMPLETE: string; + + /** + * The File Load Complete Event. + * + * This event is dispatched by the Loader Plugin when any file in the queue finishes loading. + * + * It uses a special dynamic event name constructed from the key and type of the file. + * + * For example, if you have loaded an `image` with a key of `monster`, you can listen for it + * using the following: + * + * ```javascript + * this.load.on('filecomplete-image-monster', function (key, type, data) { + * // Your handler code + * }); + * ``` + * + * Or, if you have loaded a texture `atlas` with a key of `Level1`: + * + * ```javascript + * this.load.on('filecomplete-atlasjson-Level1', function (key, type, data) { + * // Your handler code + * }); + * ``` + * + * Or, if you have loaded a sprite sheet with a key of `Explosion` and a prefix of `GAMEOVER`: + * + * ```javascript + * this.load.on('filecomplete-spritesheet-GAMEOVERExplosion', function (key, type, data) { + * // Your handler code + * }); + * ``` + * + * Make sure you remove your listeners when you have finished, or they will continue to fire if the Scene reloads. + * + * You can also listen for the generic completion of files. See the [FILE_COMPLETE]{@linkcode Phaser.Loader.Events#event:FILE_COMPLETE} event. + */ + const FILE_KEY_COMPLETE: string; + + /** + * The File Load Error Event. + * + * This event is dispatched by the Loader Plugin when a file fails to load. + * + * Listen to it from a Scene using: `this.load.on('loaderror', listener)`. + */ + const FILE_LOAD_ERROR: string; + + /** + * The File Load Event. + * + * This event is dispatched by the Loader Plugin when a file finishes loading, + * but _before_ it is processed and added to the internal Phaser caches. + * + * Listen to it from a Scene using: `this.load.on('load', listener)`. + */ + const FILE_LOAD: string; + + /** + * The File Load Progress Event. + * + * This event is dispatched by the Loader Plugin during the load of a file, if the browser receives a DOM ProgressEvent and + * the `lengthComputable` event property is true. Depending on the size of the file and browser in use, this may, or may not happen. + * + * Listen to it from a Scene using: `this.load.on('fileprogress', listener)`. + */ + const FILE_PROGRESS: string; + + /** + * The Loader Plugin Post Process Event. + * + * This event is dispatched by the Loader Plugin when the Loader has finished loading everything in the load queue. + * It is dispatched before the internal lists are cleared and each File is destroyed. + * + * Use this hook to perform any last minute processing of files that can only happen once the + * Loader has completed, but prior to it emitting the `complete` event. + * + * Listen to it from a Scene using: `this.load.on('postprocess', listener)`. + */ + const POST_PROCESS: string; + + /** + * The Loader Plugin Progress Event. + * + * This event is dispatched when the Loader updates its load progress, typically as a result of a file having completed loading. + * + * Listen to it from a Scene using: `this.load.on('progress', listener)`. + */ + const PROGRESS: string; + + /** + * The Loader Plugin Start Event. + * + * This event is dispatched when the Loader starts running. At this point load progress is zero. + * + * This event is dispatched even if there aren't any files in the load queue. + * + * Listen to it from a Scene using: `this.load.on('start', listener)`. + */ + const START: string; + + } + + /** + * The base File class used by all File Types that the Loader can support. + * You shouldn't create an instance of a File directly, but should extend it with your own class, setting a custom type and processing methods. + */ + class File { + /** + * + * @param loader The Loader that is going to load this File. + * @param fileConfig The file configuration object, as created by the file type. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, fileConfig: Phaser.Types.Loader.FileConfig); + + /** + * A reference to the Loader that is going to load this file. + */ + loader: Phaser.Loader.LoaderPlugin; + + /** + * A reference to the Cache, or Texture Manager, that is going to store this file if it loads. + */ + cache: Phaser.Cache.BaseCache | Phaser.Textures.TextureManager; + + /** + * The file type string (image, json, etc) for sorting within the Loader. + */ + type: string; + + /** + * Unique cache key (unique within its file type) + */ + key: string; + + /** + * The URL of the file, not including baseURL. + * + * Automatically has Loader.path prepended to it if a string. + * + * Can also be a JavaScript Object, such as the results of parsing JSON data. + */ + url: object | string; + + /** + * The final URL this file will load from, including baseURL and path. + * Set automatically when the Loader calls 'load' on this file. + */ + src: string; + + /** + * The merged XHRSettings for this file. + */ + xhrSettings: Phaser.Types.Loader.XHRSettingsObject; + + /** + * The XMLHttpRequest instance (as created by XHR Loader) that is loading this File. + */ + xhrLoader: XMLHttpRequest | null; + + /** + * The current state of the file. One of the FILE_CONST values. + */ + state: number; + + /** + * The total size of this file. + * Set by onProgress and only if loading via XHR. + */ + bytesTotal: number; + + /** + * Updated as the file loads. + * Only set if loading via XHR. + */ + bytesLoaded: number; + + /** + * A percentage value between 0 and 1 indicating how much of this file has loaded. + * Only set if loading via XHR. + */ + percentComplete: number; + + /** + * For CORs based loading. + * If this is undefined then the File will check BaseLoader.crossOrigin and use that (if set) + */ + crossOrigin: string | undefined; + + /** + * The processed file data, stored here after the file has loaded. + */ + data: any; + + /** + * A config object that can be used by file types to store transitional data. + */ + config: any; + + /** + * If this is a multipart file, i.e. an atlas and its json together, then this is a reference + * to the parent MultiFile. Set and used internally by the Loader or specific file types. + */ + multiFile: Phaser.Loader.MultiFile | null; + + /** + * Does this file have an associated linked file? Such as an image and a normal map. + * Atlases and Bitmap Fonts use the multiFile, because those files need loading together but aren't + * actually bound by data, where-as a linkFile is. + */ + linkFile: Phaser.Loader.File | null; + + /** + * Does this File contain a data URI? + */ + base64: boolean; + + /** + * Links this File with another, so they depend upon each other for loading and processing. + * @param fileB The file to link to this one. + */ + setLink(fileB: Phaser.Loader.File): void; + + /** + * Resets the XHRLoader instance this file is using. + */ + resetXHR(): void; + + /** + * Called by the Loader, starts the actual file downloading. + * During the load the methods onLoad, onError and onProgress are called, based on the XHR events. + * You shouldn't normally call this method directly, it's meant to be invoked by the Loader. + */ + load(): void; + + /** + * Called when the file finishes loading, is sent a DOM ProgressEvent. + * @param xhr The XMLHttpRequest that caused this onload event. + * @param event The DOM ProgressEvent that resulted from this load. + */ + onLoad(xhr: XMLHttpRequest, event: ProgressEvent): void; + + /** + * Called by the XHRLoader if it was given a File with base64 data to load. + * @param xhr The FakeXHR object containing the decoded base64 data. + */ + onBase64Load(xhr: XMLHttpRequest): void; + + /** + * Called if the file errors while loading, is sent a DOM ProgressEvent. + * @param xhr The XMLHttpRequest that caused this onload event. + * @param event The DOM ProgressEvent that resulted from this error. + */ + onError(xhr: XMLHttpRequest, event: ProgressEvent): void; + + /** + * Called during the file load progress. Is sent a DOM ProgressEvent. + * @param event The DOM ProgressEvent. + */ + onProgress(event: ProgressEvent): void; + + /** + * Usually overridden by the FileTypes and is called by Loader.nextFile. + * This method controls what extra work this File does with its loaded data, for example a JSON file will parse itself during this stage. + */ + onProcess(): void; + + /** + * Called when the File has completed processing. + * Checks on the state of its multifile, if set. + */ + onProcessComplete(): void; + + /** + * Called when the File has completed processing but it generated an error. + * Checks on the state of its multifile, if set. + */ + onProcessError(): void; + + /** + * Checks if a key matching the one used by this file exists in the target Cache or not. + * This is called automatically by the LoaderPlugin to decide if the file can be safely + * loaded or will conflict. + */ + hasCacheConflict(): boolean; + + /** + * Adds this file to its target cache upon successful loading and processing. + * This method is often overridden by specific file types. + */ + addToCache(): void; + + /** + * Called once the file has been added to its cache and is now ready for deletion from the Loader. + * It will emit a `filecomplete` event from the LoaderPlugin. + */ + pendingDestroy(): void; + + /** + * Destroy this File and any references it holds. + */ + destroy(): void; + + /** + * Static method for creating object URL using URL API and setting it as image 'src' attribute. + * If URL API is not supported (usually on old browsers) it falls back to creating Base64 encoded url using FileReader. + * @param image Image object which 'src' attribute should be set to object URL. + * @param blob A Blob object to create an object URL for. + * @param defaultType Default mime type used if blob type is not available. + */ + static createObjectURL(image: HTMLImageElement, blob: Blob, defaultType: string): void; + + /** + * Static method for releasing an existing object URL which was previously created + * by calling {@link File#createObjectURL} method. + * @param image Image object which 'src' attribute should be revoked. + */ + static revokeObjectURL(image: HTMLImageElement): void; + + } + + namespace FileTypes { + /** + * A single Animation JSON File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#animation method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#animation. + */ + class AnimationJSONFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param xhrSettings Extra XHR Settings specifically for this file. + * @param dataKey When the JSON file loads only this property will be stored in the Cache. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.JSONFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject, dataKey?: string); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Called at the end of the load process, after the Loader has finished all files in its queue. + */ + onLoadComplete(): void; + + } + + /** + * A single JSON based Texture Atlas File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#atlas method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#atlas. + * + * https://www.codeandweb.com/texturepacker/tutorials/how-to-create-sprite-sheets-for-phaser3?source=photonstorm + */ + class AsepriteFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas json data file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, a well formed JSON object. + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.AsepriteFileConfig, textureURL?: string | string[], atlasURL?: object | string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single JSON based Texture Atlas File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#atlas method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#atlas. + * + * https://www.codeandweb.com/texturepacker/tutorials/how-to-create-sprite-sheets-for-phaser3?source=photonstorm + */ + class AtlasJSONFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas json data file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, a well formed JSON object. + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.AtlasJSONFileConfig, textureURL?: string | string[], atlasURL?: object | string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single XML based Texture Atlas File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#atlasXML method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#atlasXML. + */ + class AtlasXMLFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas xml data file from. If undefined or `null` it will be set to `.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml". + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas xml file. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.AtlasXMLFileConfig, textureURL?: string | string[], atlasURL?: string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Audio File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#audio method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#audio. + */ + class AudioFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param urlConfig The absolute or relative URL to load this file from in a config object. + * @param xhrSettings Extra XHR Settings specifically for this file. + * @param audioContext The AudioContext this file will use to process itself. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.AudioFileConfig, urlConfig?: Phaser.Types.Loader.FileTypes.AudioFileURLConfig, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject, audioContext?: AudioContext); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * An Audio Sprite File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#audioSprite method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#audioSprite. + */ + class AudioSpriteFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param jsonURL The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead. + * @param audioURL The absolute or relative URL to load the audio file from. If empty it will be obtained by parsing the JSON file. + * @param audioConfig The audio configuration options. + * @param audioXhrSettings An XHR Settings configuration object for the audio file. Used in replacement of the Loaders default XHR Settings. + * @param jsonXhrSettings An XHR Settings configuration object for the json file. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.AudioSpriteFileConfig, jsonURL: string, audioURL?: Object, audioConfig?: any, audioXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, jsonXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called by each File when it finishes loading. + * @param file The File that has completed processing. + */ + onFileComplete(file: Phaser.Loader.File): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Binary File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#binary method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#binary. + */ + class BinaryFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.bin`, i.e. if `key` was "alien" then the URL will be "alien.bin". + * @param xhrSettings Extra XHR Settings specifically for this file. + * @param dataType Optional type to cast the binary file to once loaded. For example, `Uint8Array`. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.BinaryFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject, dataType?: any); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single Bitmap Font based File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#bitmapFont method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#bitmapFont. + */ + class BitmapFontFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param textureURL The absolute or relative URL to load the font image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param fontDataURL The absolute or relative URL to load the font xml data file from. If undefined or `null` it will be set to `.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml". + * @param textureXhrSettings An XHR Settings configuration object for the font image file. Used in replacement of the Loaders default XHR Settings. + * @param fontDataXhrSettings An XHR Settings configuration object for the font data xml file. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.BitmapFontFileConfig, textureURL?: string | string[], fontDataURL?: string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, fontDataXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A Compressed Texture File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#texture method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#texture. + */ + class CompressedTextureFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file. + * @param entry The compressed texture file entry to load. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string, entry: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called by each File when it finishes loading. + * @param file The File that has completed processing. + */ + onFileComplete(file: Phaser.Loader.File): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + /** + * Adds all of the multi-file entties to their target caches upon successful loading and processing. + */ + addMultiToCache(): void; + + } + + /** + * A single CSS File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#css method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#css. + */ + class CSSFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.CSSFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single GLSL File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#glsl method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#glsl. + */ + class GLSLFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt". + * @param shaderType The type of shader. Either `fragment` for a fragment shader, or `vertex` for a vertex shader. This is ignored if you load a shader bundle. Default 'fragment'. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.GLSLFileConfig, url?: string, shaderType?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + /** + * Returns the name of the shader from the header block. + * @param headerSource The header data. + */ + getShaderName(headerSource: string[]): string; + + /** + * Returns the type of the shader from the header block. + * @param headerSource The header data. + */ + getShaderType(headerSource: string[]): string; + + /** + * Returns the shader uniforms from the header block. + * @param headerSource The header data. + */ + getShaderUniforms(headerSource: string[]): any; + + } + + /** + * A single Audio File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#audio method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#audio. + */ + class HTML5AudioFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param urlConfig The absolute or relative URL to load this file from. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.AudioFileConfig, urlConfig?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called when the file finishes loading. + */ + onLoad(): void; + + /** + * Called if the file errors while loading. + */ + onError(): void; + + /** + * Called during the file load progress. Is sent a DOM ProgressEvent. + */ + onProgress(): void; + + /** + * Called by the Loader, starts the actual file downloading. + * During the load the methods onLoad, onError and onProgress are called, based on the XHR events. + * You shouldn't normally call this method directly, it's meant to be invoked by the Loader. + */ + load(): void; + + } + + /** + * A single HTML File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#html method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#html. + */ + class HTMLFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.html`, i.e. if `key` was "alien" then the URL will be "alien.html". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.HTMLFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single HTML File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#htmlTexture method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#htmlTexture. + */ + class HTMLTextureFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param width The width of the texture the HTML will be rendered to. + * @param height The height of the texture the HTML will be rendered to. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.HTMLTextureFileConfig, url?: string, width?: number, height?: number, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Image File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#image method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#image. + */ + class ImageFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param xhrSettings Extra XHR Settings specifically for this file. + * @param frameConfig The frame configuration object. Only provided for, and used by, Sprite Sheets. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.ImageFileConfig, url?: string | string[], xhrSettings?: Phaser.Types.Loader.XHRSettingsObject, frameConfig?: Phaser.Types.Loader.FileTypes.ImageFrameConfig); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single JSON File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#json method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#json. + */ + class JSONFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, can be a fully formed JSON Object. + * @param xhrSettings Extra XHR Settings specifically for this file. + * @param dataKey When the JSON file loads only this property will be stored in the Cache. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.JSONFileConfig, url?: object | string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject, dataKey?: string); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single Multi Texture Atlas File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#multiatlas method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#multiatlas. + */ + class MultiAtlasFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key of the file. Must be unique within both the Loader and the Texture Manager. Or a config object. + * @param atlasURL The absolute or relative URL to load the multi atlas json file from. + * @param path Optional path to use when loading the textures defined in the atlas data. + * @param baseURL Optional Base URL to use when loading the textures defined in the atlas data. + * @param atlasXhrSettings Extra XHR Settings specifically for the atlas json file. + * @param textureXhrSettings Extra XHR Settings specifically for the texture files. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.MultiAtlasFileConfig, atlasURL?: string, path?: string, baseURL?: string, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called by each File when it finishes loading. + * @param file The File that has completed processing. + */ + onFileComplete(file: Phaser.Loader.File): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A Multi Script File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#scripts method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#scripts. + */ + class MultiScriptFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url An array of absolute or relative URLs to load the script files from. They are processed in the order given in the array. + * @param xhrSettings An XHR Settings configuration object for the script files. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.MultiScriptFileConfig, url?: string[], xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Wavefront OBJ File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#obj method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#obj. + */ + class OBJFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param objURL The absolute or relative URL to load the obj file from. If undefined or `null` it will be set to `.obj`, i.e. if `key` was "alien" then the URL will be "alien.obj". + * @param matURL The absolute or relative URL to load the material file from. If undefined or `null` it will be set to `.mat`, i.e. if `key` was "alien" then the URL will be "alien.mat". + * @param flipUV Flip the UV coordinates stored in the model data? + * @param xhrSettings Extra XHR Settings specifically for these files. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.OBJFileConfig, objURL?: string, matURL?: string, flipUV?: boolean, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single JSON Pack File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#pack method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#pack. + */ + class PackFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from or a ready formed JSON object. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param xhrSettings Extra XHR Settings specifically for this file. + * @param dataKey When the JSON file loads only this property will be stored in the Cache. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.PackFileConfig, url?: string | any, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject, dataKey?: string); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single Plugin Script File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#plugin method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#plugin. + */ + class PluginFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param start Automatically start the plugin after loading? Default false. + * @param mapping If this plugin is to be injected into the Scene, this is the property key used. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.PluginFileConfig, url?: string, start?: boolean, mapping?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * An external Scene JavaScript File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#sceneFile method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#sceneFile. + */ + class SceneFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.SceneFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Scene Plugin Script File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#scenePlugin method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#scenePlugin. + */ + class ScenePluginFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param systemKey If this plugin is to be added to Scene.Systems, this is the property key for it. + * @param sceneKey If this plugin is to be added to the Scene, this is the property key for it. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.ScenePluginFileConfig, url?: string, systemKey?: string, sceneKey?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single Script File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#script method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#script. + */ + class ScriptFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param type The script type. Should be either 'script' for classic JavaScript, or 'module' if the file contains an exported module. Default 'script'. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.ScriptFileConfig, url?: string, type?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single Sprite Sheet Image File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#spritesheet method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#spritesheet. + */ + class SpriteSheetFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param frameConfig The frame configuration object. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.SpriteSheetFileConfig, url?: string | string[], frameConfig?: Phaser.Types.Loader.FileTypes.ImageFrameConfig, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single SVG File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#svg method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#svg. + */ + class SVGFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.svg`, i.e. if `key` was "alien" then the URL will be "alien.svg". + * @param svgConfig The svg size configuration object. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.SVGFileConfig, url?: string, svgConfig?: Phaser.Types.Loader.FileTypes.SVGSizeConfig, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Text File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#text method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#text. + */ + class TextFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.TextFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single Tilemap CSV File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#tilemapCSV method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#tilemapCSV. + */ + class TilemapCSVFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.csv`, i.e. if `key` was "alien" then the URL will be "alien.csv". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.TilemapCSVFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Impact.js Tilemap JSON File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#tilemapImpact method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#tilemapImpact. + */ + class TilemapImpactFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.TilemapImpactFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Tiled Tilemap JSON File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#tilemapTiledJSON method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#tilemapTiledJSON. + */ + class TilemapJSONFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, a well formed JSON object. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.TilemapJSONFileConfig, url?: object | string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single text file based Unity Texture Atlas File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#unityAtlas method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#unityAtlas. + */ + class UnityAtlasFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas data file from. If undefined or `null` it will be set to `.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt". + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas data file. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.UnityAtlasFileConfig, textureURL?: string | string[], atlasURL?: string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Video File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#video method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#video. + */ + class VideoFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param urls The absolute or relative URL to load the video files from. + * @param noAudio Does the video have an audio track? If not you can enable auto-playing on it. Default false. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.VideoFileConfig, urls?: string | string[] | Phaser.Types.Loader.FileTypes.VideoFileURLConfig | Phaser.Types.Loader.FileTypes.VideoFileURLConfig[], noAudio?: boolean); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Called by the Loader, starts the actual file downloading. + * During the load the methods onLoad, onError and onProgress are called, based on the XHR events. + * You shouldn't normally call this method directly, it's meant to be invoked by the Loader. + */ + load(): void; + + } + + /** + * A single XML File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#xml method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#xml. + */ + class XMLFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.XMLFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + } + + namespace FileTypesManager { + /** + * Static method called when a LoaderPlugin is created. + * + * Loops through the local types object and injects all of them as + * properties into the LoaderPlugin instance. + * @param loader The LoaderPlugin to install the types into. + */ + function install(loader: Phaser.Loader.LoaderPlugin): void; + + /** + * Static method called directly by the File Types. + * + * The key is a reference to the function used to load the files via the Loader, i.e. `image`. + * @param key The key that will be used as the method name in the LoaderPlugin. + * @param factoryFunction The function that will be called when LoaderPlugin.key is invoked. + */ + function register(key: string, factoryFunction: Function): void; + + /** + * Removed all associated file types. + */ + function destroy(): void; + + } + + /** + * Given a File and a baseURL value this returns the URL the File will use to download from. + * @param file The File object. + * @param baseURL A default base URL. + */ + function GetURL(file: Phaser.Loader.File, baseURL: string): string; + + /** + * The Loader handles loading all external content such as Images, Sounds, Texture Atlases and data files. + * You typically interact with it via `this.load` in your Scene. Scenes can have a `preload` method, which is always + * called before the Scenes `create` method, allowing you to preload assets that the Scene may need. + * + * If you call any `this.load` methods from outside of `Scene.preload` then you need to start the Loader going + * yourself by calling `Loader.start()`. It's only automatically started during the Scene preload. + * + * The Loader uses a combination of tag loading (eg. Audio elements) and XHR and provides progress and completion events. + * Files are loaded in parallel by default. The amount of concurrent connections can be controlled in your Game Configuration. + * + * Once the Loader has started loading you are still able to add files to it. These can be injected as a result of a loader + * event, the type of file being loaded (such as a pack file) or other external events. As long as the Loader hasn't finished + * simply adding a new file to it, while running, will ensure it's added into the current queue. + * + * Every Scene has its own instance of the Loader and they are bound to the Scene in which they are created. However, + * assets loaded by the Loader are placed into global game-level caches. For example, loading an XML file will place that + * file inside `Game.cache.xml`, which is accessible from every Scene in your game, no matter who was responsible + * for loading it. The same is true of Textures. A texture loaded in one Scene is instantly available to all other Scenes + * in your game. + * + * The Loader works by using custom File Types. These are stored in the FileTypesManager, which injects them into the Loader + * when it's instantiated. You can create your own custom file types by extending either the File or MultiFile classes. + * See those files for more details. + */ + class LoaderPlugin extends Phaser.Events.EventEmitter { + /** + * + * @param scene The Scene which owns this Loader instance. + */ + constructor(scene: Phaser.Scene); + + /** + * Adds an Animation JSON Data file, or array of Animation JSON files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.animation('baddieAnims', 'files/BaddieAnims.json'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * The key must be a unique String. It is used to add the file to the global JSON Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the JSON Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the JSON Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.animation({ + * key: 'baddieAnims', + * url: 'files/BaddieAnims.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.JSONFileConfig` for more details. + * + * Once the file has finished loading it will automatically be passed to the global Animation Managers `fromJSON` method. + * This will parse all of the JSON data and create animation data from it. This process happens at the very end + * of the Loader, once every other file in the load queue has finished. The reason for this is to allow you to load + * both animation data and the images it relies upon in the same load call. + * + * Once the animation data has been parsed you will be able to play animations using that data. + * Please see the Animation Manager `fromJSON` method for more details about the format and playback. + * + * You can also access the raw animation data from its Cache using its key: + * + * ```javascript + * this.load.animation('baddieAnims', 'files/BaddieAnims.json'); + * // and later in your game ... + * var data = this.cache.json.get('baddieAnims'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and + * this is what you would use to retrieve the text from the JSON Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "data" + * and no URL is given then the Loader will set the URL to be "data.json". It will always add `.json` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * You can also optionally provide a `dataKey` to use. This allows you to extract only a part of the JSON and store it in the Cache, + * rather than the whole file. For example, if your JSON data had a structure like this: + * + * ```json + * { + * "level1": { + * "baddies": { + * "aliens": {}, + * "boss": {} + * } + * }, + * "level2": {}, + * "level3": {} + * } + * ``` + * + * And if you only wanted to create animations from the `boss` data, then you could pass `level1.baddies.boss`as the `dataKey`. + * + * Note: The ability to load this type of file will only be available if the JSON File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param dataKey When the Animation JSON file loads only this property will be stored in the Cache and used to create animation data. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + animation(key: string | Phaser.Types.Loader.FileTypes.JSONFileConfig | Phaser.Types.Loader.FileTypes.JSONFileConfig[], url?: string, dataKey?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Aseprite is a powerful animated sprite editor and pixel art tool. + * + * You can find more details at https://www.aseprite.org/ + * + * Adds a JSON based Aseprite Animation, or array of animations, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.aseprite('gladiator', 'images/Gladiator.png', 'images/Gladiator.json'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * To export a compatible JSON file in Aseprite, please do the following: + * + * 1. Go to "File - Export Sprite Sheet" + * + * 2. On the **Layout** tab: + * 2a. Set the "Sheet type" to "Packed" + * 2b. Set the "Constraints" to "None" + * 2c. Check the "Merge Duplicates" checkbox + * + * 3. On the **Sprite** tab: + * 3a. Set "Layers" to "Visible layers" + * 3b. Set "Frames" to "All frames", unless you only wish to export a sub-set of tags + * + * 4. On the **Borders** tab: + * 4a. Check the "Trim Sprite" and "Trim Cells" options + * 4b. Ensure "Border Padding", "Spacing" and "Inner Padding" are all > 0 (1 is usually enough) + * + * 5. On the **Output** tab: + * 5a. Check "Output File", give your image a name and make sure you choose "png files" as the file type + * 5b. Check "JSON Data" and give your json file a name + * 5c. The JSON Data type can be either a Hash or Array, Phaser doesn't mind. + * 5d. Make sure "Tags" is checked in the Meta options + * 5e. In the "Item Filename" input box, make sure it says just "{frame}" and nothing more. + * + * 6. Click export + * + * This was tested with Aseprite 1.2.25. + * + * This will export a png and json file which you can load using the Aseprite Loader, i.e.: + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.aseprite({ + * key: 'gladiator', + * textureURL: 'images/Gladiator.png', + * atlasURL: 'images/Gladiator.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.AsepriteFileConfig` for more details. + * + * Instead of passing a URL for the JSON data you can also pass in a well formed JSON object instead. + * + * Once loaded, you can call this method from within a Scene with the 'atlas' key: + * + * ```javascript + * this.anims.createFromAseprite('paladin'); + * ``` + * + * Any animations defined in the JSON will now be available to use in Phaser and you play them + * via their Tag name. For example, if you have an animation called 'War Cry' on your Aseprite timeline, + * you can play it in Phaser using that Tag name: + * + * ```javascript + * this.add.sprite(400, 300).play('War Cry'); + * ``` + * + * When calling this method you can optionally provide an array of tag names, and only those animations + * will be created. For example: + * + * ```javascript + * this.anims.createFromAseprite('paladin', [ 'step', 'War Cry', 'Magnum Break' ]); + * ``` + * + * This will only create the 3 animations defined. Note that the tag names are case-sensitive. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Aseprite File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas json data file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, a well formed JSON object. + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings. + */ + aseprite(key: string | Phaser.Types.Loader.FileTypes.AsepriteFileConfig | Phaser.Types.Loader.FileTypes.AsepriteFileConfig[], textureURL?: string | string[], atlasURL?: object | string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a JSON based Texture Atlas, or array of atlases, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.atlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.json'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * Phaser expects the atlas data to be provided in a JSON file, using either the JSON Hash or JSON Array format. + * + * These files are created by software such as: + * + * * [Texture Packer](https://www.codeandweb.com/texturepacker/tutorials/how-to-create-sprite-sheets-for-phaser3?source=photonstorm) + * * [Shoebox](https://renderhjs.net/shoebox/) + * * [Gamma Texture Packer](https://gammafp.com/tool/atlas-packer/) + * * [Adobe Flash / Animate](https://www.adobe.com/uk/products/animate.html) + * * [Free Texture Packer](http://free-tex-packer.com/) + * * [Leshy SpriteSheet Tool](https://www.leshylabs.com/apps/sstool/) + * + * If you are using Texture Packer and have enabled multi-atlas support, then please use the Phaser Multi Atlas loader + * instead of this one. + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.atlas({ + * key: 'mainmenu', + * textureURL: 'images/MainMenu.png', + * atlasURL: 'images/MainMenu.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.AtlasJSONFileConfig` for more details. + * + * Instead of passing a URL for the atlas JSON data you can also pass in a well formed JSON object instead. + * + * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key: + * + * ```javascript + * this.load.atlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.json'); + * // and later in your game ... + * this.add.image(x, y, 'mainmenu', 'background'); + * ``` + * + * To get a list of all available frames within an atlas please consult your Texture Atlas software. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image, + * then you can specify it by providing an array as the `url` where the second element is the normal map: + * + * ```javascript + * this.load.atlas('mainmenu', [ 'images/MainMenu.png', 'images/MainMenu-n.png' ], 'images/MainMenu.json'); + * ``` + * + * Or, if you are using a config object use the `normalMap` property: + * + * ```javascript + * this.load.atlas({ + * key: 'mainmenu', + * textureURL: 'images/MainMenu.png', + * normalMap: 'images/MainMenu-n.png', + * atlasURL: 'images/MainMenu.json' + * }); + * ``` + * + * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings. + * Normal maps are a WebGL only feature. + * + * Note: The ability to load this type of file will only be available if the Atlas JSON File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas json data file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, a well formed JSON object. + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings. + */ + atlas(key: string | Phaser.Types.Loader.FileTypes.AtlasJSONFileConfig | Phaser.Types.Loader.FileTypes.AtlasJSONFileConfig[], textureURL?: string | string[], atlasURL?: object | string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an XML based Texture Atlas, or array of atlases, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.atlasXML('mainmenu', 'images/MainMenu.png', 'images/MainMenu.xml'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * Phaser expects the atlas data to be provided in an XML file format. + * These files are created by software such as Shoebox and Adobe Flash / Animate. + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.atlasXML({ + * key: 'mainmenu', + * textureURL: 'images/MainMenu.png', + * atlasURL: 'images/MainMenu.xml' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.AtlasXMLFileConfig` for more details. + * + * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key: + * + * ```javascript + * this.load.atlasXML('mainmenu', 'images/MainMenu.png', 'images/MainMenu.xml'); + * // and later in your game ... + * this.add.image(x, y, 'mainmenu', 'background'); + * ``` + * + * To get a list of all available frames within an atlas please consult your Texture Atlas software. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image, + * then you can specify it by providing an array as the `url` where the second element is the normal map: + * + * ```javascript + * this.load.atlasXML('mainmenu', [ 'images/MainMenu.png', 'images/MainMenu-n.png' ], 'images/MainMenu.xml'); + * ``` + * + * Or, if you are using a config object use the `normalMap` property: + * + * ```javascript + * this.load.atlasXML({ + * key: 'mainmenu', + * textureURL: 'images/MainMenu.png', + * normalMap: 'images/MainMenu-n.png', + * atlasURL: 'images/MainMenu.xml' + * }); + * ``` + * + * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings. + * Normal maps are a WebGL only feature. + * + * Note: The ability to load this type of file will only be available if the Atlas XML File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas xml data file from. If undefined or `null` it will be set to `.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml". + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas xml file. Used in replacement of the Loaders default XHR Settings. + */ + atlasXML(key: string | Phaser.Types.Loader.FileTypes.AtlasXMLFileConfig | Phaser.Types.Loader.FileTypes.AtlasXMLFileConfig[], textureURL?: string | string[], atlasURL?: string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an Audio or HTML5Audio file, or array of audio files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.audio('title', [ 'music/Title.ogg', 'music/Title.mp3', 'music/Title.m4a' ]); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Audio Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Audio Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Audio Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.audio({ + * key: 'title', + * url: [ 'music/Title.ogg', 'music/Title.mp3', 'music/Title.m4a' ] + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.AudioFileConfig` for more details. + * + * The URLs can be relative or absolute. If the URLs are relative the `Loader.baseURL` and `Loader.path` values will be prepended to them. + * + * Due to different browsers supporting different audio file types you should usually provide your audio files in a variety of formats. + * ogg, mp3 and m4a are the most common. If you provide an array of URLs then the Loader will determine which _one_ file to load based on + * browser support. + * + * If audio has been disabled in your game, either via the game config, or lack of support from the device, then no audio will be loaded. + * + * Note: The ability to load this type of file will only be available if the Audio File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param urls The absolute or relative URL to load the audio files from. + * @param config An object containing an `instances` property for HTML5Audio. Defaults to 1. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + audio(key: string | Phaser.Types.Loader.FileTypes.AudioFileConfig | Phaser.Types.Loader.FileTypes.AudioFileConfig[], urls?: string | string[] | Phaser.Types.Loader.FileTypes.AudioFileURLConfig | Phaser.Types.Loader.FileTypes.AudioFileURLConfig[], config?: any, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a JSON based Audio Sprite, or array of audio sprites, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.audioSprite('kyobi', 'kyobi.json', [ + * 'kyobi.ogg', + * 'kyobi.mp3', + * 'kyobi.m4a' + * ]); + * } + * ``` + * + * Audio Sprites are a combination of audio files and a JSON configuration. + * The JSON follows the format of that created by https://github.com/tonistiigi/audiosprite + * + * If the JSON file includes a 'resource' object then you can let Phaser parse it and load the audio + * files automatically based on its content. To do this exclude the audio URLs from the load: + * + * ```javascript + * function preload () + * { + * this.load.audioSprite('kyobi', 'kyobi.json'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * The key must be a unique String. It is used to add the file to the global Audio Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Audio Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Audio Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.audioSprite({ + * key: 'kyobi', + * jsonURL: 'audio/Kyobi.json', + * audioURL: [ + * 'audio/Kyobi.ogg', + * 'audio/Kyobi.mp3', + * 'audio/Kyobi.m4a' + * ] + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.AudioSpriteFileConfig` for more details. + * + * Instead of passing a URL for the audio JSON data you can also pass in a well formed JSON object instead. + * + * Once the audio has finished loading you can use it create an Audio Sprite by referencing its key: + * + * ```javascript + * this.load.audioSprite('kyobi', 'kyobi.json'); + * // and later in your game ... + * var music = this.sound.addAudioSprite('kyobi'); + * music.play('title'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * Due to different browsers supporting different audio file types you should usually provide your audio files in a variety of formats. + * ogg, mp3 and m4a are the most common. If you provide an array of URLs then the Loader will determine which _one_ file to load based on + * browser support. + * + * If audio has been disabled in your game, either via the game config, or lack of support from the device, then no audio will be loaded. + * + * Note: The ability to load this type of file will only be available if the Audio Sprite File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or an array of objects. + * @param jsonURL The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead. + * @param audioURL The absolute or relative URL to load the audio file from. If empty it will be obtained by parsing the JSON file. + * @param audioConfig The audio configuration options. + * @param audioXhrSettings An XHR Settings configuration object for the audio file. Used in replacement of the Loaders default XHR Settings. + * @param jsonXhrSettings An XHR Settings configuration object for the json file. Used in replacement of the Loaders default XHR Settings. + */ + audioSprite(key: string | Phaser.Types.Loader.FileTypes.AudioSpriteFileConfig | Phaser.Types.Loader.FileTypes.AudioSpriteFileConfig[], jsonURL: string, audioURL?: string | string[], audioConfig?: any, audioXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, jsonXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Binary file, or array of Binary files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.binary('doom', 'files/Doom.wad'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Binary Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Binary Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Binary Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.binary({ + * key: 'doom', + * url: 'files/Doom.wad', + * dataType: Uint8Array + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.BinaryFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.binary('doom', 'files/Doom.wad'); + * // and later in your game ... + * var data = this.cache.binary.get('doom'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Data` the final key will be `LEVEL1.Data` and + * this is what you would use to retrieve the text from the Binary Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "doom" + * and no URL is given then the Loader will set the URL to be "doom.bin". It will always add `.bin` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Binary File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.bin`, i.e. if `key` was "alien" then the URL will be "alien.bin". + * @param dataType Optional type to cast the binary file to once loaded. For example, `Uint8Array`. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + binary(key: string | Phaser.Types.Loader.FileTypes.BinaryFileConfig | Phaser.Types.Loader.FileTypes.BinaryFileConfig[], url?: string, dataType?: any, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an XML based Bitmap Font, or array of fonts, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * ```javascript + * function preload () + * { + * this.load.bitmapFont('goldenFont', 'images/GoldFont.png', 'images/GoldFont.xml'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * Phaser expects the font data to be provided in an XML file format. + * These files are created by software such as the [Angelcode Bitmap Font Generator](http://www.angelcode.com/products/bmfont/), + * [Littera](http://kvazars.com/littera/) or [Glyph Designer](https://71squared.com/glyphdesigner) + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.bitmapFont({ + * key: 'goldenFont', + * textureURL: 'images/GoldFont.png', + * fontDataURL: 'images/GoldFont.xml' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.BitmapFontFileConfig` for more details. + * + * Once the atlas has finished loading you can use key of it when creating a Bitmap Text Game Object: + * + * ```javascript + * this.load.bitmapFont('goldenFont', 'images/GoldFont.png', 'images/GoldFont.xml'); + * // and later in your game ... + * this.add.bitmapText(x, y, 'goldenFont', 'Hello World'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use when creating a Bitmap Text object. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image, + * then you can specify it by providing an array as the `url` where the second element is the normal map: + * + * ```javascript + * this.load.bitmapFont('goldenFont', [ 'images/GoldFont.png', 'images/GoldFont-n.png' ], 'images/GoldFont.xml'); + * ``` + * + * Or, if you are using a config object use the `normalMap` property: + * + * ```javascript + * this.load.bitmapFont({ + * key: 'goldenFont', + * textureURL: 'images/GoldFont.png', + * normalMap: 'images/GoldFont-n.png', + * fontDataURL: 'images/GoldFont.xml' + * }); + * ``` + * + * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings. + * Normal maps are a WebGL only feature. + * + * Note: The ability to load this type of file will only be available if the Bitmap Font File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param textureURL The absolute or relative URL to load the font image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param fontDataURL The absolute or relative URL to load the font xml data file from. If undefined or `null` it will be set to `.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml". + * @param textureXhrSettings An XHR Settings configuration object for the font image file. Used in replacement of the Loaders default XHR Settings. + * @param fontDataXhrSettings An XHR Settings configuration object for the font data xml file. Used in replacement of the Loaders default XHR Settings. + */ + bitmapFont(key: string | Phaser.Types.Loader.FileTypes.BitmapFontFileConfig | Phaser.Types.Loader.FileTypes.BitmapFontFileConfig[], textureURL?: string | string[], fontDataURL?: string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, fontDataXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Compressed Texture file to the current load queue. This feature is WebGL only. + * + * This method takes a key and a configuration object, which lists the different formats + * and files associated with them. + * + * The texture format object should be ordered in GPU priority order, with IMG as the last entry. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * preload () + * { + * this.load.texture('yourPic', { + * ASTC: { type: 'PVR', textureURL: 'pic-astc-4x4.pvr' }, + * PVRTC: { type: 'PVR', textureURL: 'pic-pvrtc-4bpp-rgba.pvr' }, + * S3TC: { type: 'PVR', textureURL: 'pic-dxt5.pvr' }, + * IMG: { textureURL: 'pic.png' } + * }); + * ``` + * + * If you wish to load a texture atlas, provide the `atlasURL` property: + * + * ```javascript + * preload () + * { + * const path = 'assets/compressed'; + * + * this.load.texture('yourAtlas', { + * 'ASTC': { type: 'PVR', textureURL: `${path}/textures-astc-4x4.pvr`, atlasURL: `${path}/textures.json` }, + * 'PVRTC': { type: 'PVR', textureURL: `${path}/textures-pvrtc-4bpp-rgba.pvr`, atlasURL: `${path}/textures-pvrtc-4bpp-rgba.json` }, + * 'S3TC': { type: 'PVR', textureURL: `${path}/textures-dxt5.pvr`, atlasURL: `${path}/textures-dxt5.json` }, + * 'IMG': { textureURL: `${path}/textures.png`, atlasURL: `${path}/textures.json` } + * }); + * } + * ``` + * + * If you wish to load a Multi Atlas, as exported from Texture Packer Pro, use the `multiAtlasURL` property instead: + * + * ```javascript + * preload () + * { + * const path = 'assets/compressed'; + * + * this.load.texture('yourAtlas', { + * 'ASTC': { type: 'PVR', atlasURL: `${path}/textures.json` }, + * 'PVRTC': { type: 'PVR', atlasURL: `${path}/textures-pvrtc-4bpp-rgba.json` }, + * 'S3TC': { type: 'PVR', atlasURL: `${path}/textures-dxt5.json` }, + * 'IMG': { atlasURL: `${path}/textures.json` } + * }); + * } + * ``` + * + * When loading a Multi Atlas you do not need to specify the `textureURL` property as it will be read from the JSON file. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.texture({ + * key: 'yourPic', + * url: { + * ASTC: { type: 'PVR', textureURL: 'pic-astc-4x4.pvr' }, + * PVRTC: { type: 'PVR', textureURL: 'pic-pvrtc-4bpp-rgba.pvr' }, + * S3TC: { type: 'PVR', textureURL: 'pic-dxt5.pvr' }, + * IMG: { textureURL: 'pic.png' } + * } + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.CompressedTextureFileConfig` for more details. + * + * The number of formats you provide to this function is up to you, but you should ensure you + * cover the primary platforms where appropriate. + * + * The 'IMG' entry is a fallback to a JPG or PNG, should the browser be unable to load any of the other + * formats presented to this function. You should really always include this, although it is optional. + * + * Phaser supports loading both the PVR and KTX container formats. Within those, it can parse + * the following texture compression formats: + * + * ETC + * ETC1 + * ATC + * ASTC + * BPTC + * RGTC + * PVRTC + * S3TC + * S3TCSRGB + * + * For more information about the benefits of compressed textures please see the + * following articles: + * + * Texture Compression in 2020 (https://aras-p.info/blog/2020/12/08/Texture-Compression-in-2020/) + * Compressed GPU Texture Formats (https://themaister.net/blog/2020/08/12/compressed-gpu-texture-formats-a-review-and-compute-shader-decoders-part-1/) + * + * To create compressed texture files use a 3rd party application such as: + * + * Texture Packer (https://www.codeandweb.com/texturepacker/tutorials/how-to-create-sprite-sheets-for-phaser3?utm_source=ad&utm_medium=banner&utm_campaign=phaser-2018-10-16) + * PVRTexTool (https://developer.imaginationtech.com/pvrtextool/) - available for Windows, macOS and Linux. + * Mali Texture Compression Tool (https://developer.arm.com/tools-and-software/graphics-and-gaming/mali-texture-compression-tool) + * ASTC Encoder (https://github.com/ARM-software/astc-encoder) + * + * ASTCs must have a Channel Type of Unsigned Normalized Bytes (UNorm). + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Data` the final key will be `LEVEL1.Data` and + * this is what you would use to retrieve the text from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * Unlike other file loaders in Phaser, the URLs must include the file extension. + * + * Note: The ability to load this type of file will only be available if the Compressed Texture File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The compressed texture configuration object. Not required if passing a config object as the `key` parameter. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + texture(key: string | Phaser.Types.Loader.FileTypes.CompressedTextureFileConfig | Phaser.Types.Loader.FileTypes.CompressedTextureFileConfig[], url?: Phaser.Types.Loader.FileTypes.CompressedTextureFileConfig, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a CSS file, or array of CSS files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.css('headers', 'styles/headers.css'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String and not already in-use by another file in the Loader. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.css({ + * key: 'headers', + * url: 'styles/headers.css' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.CSSFileConfig` for more details. + * + * Once the file has finished loading it will automatically be converted into a style DOM element + * via `document.createElement('style')`. It will have its `defer` property set to false and then the + * resulting element will be appended to `document.head`. The CSS styles are then applied to the current document. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.css". It will always add `.css` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the CSS File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.css`, i.e. if `key` was "alien" then the URL will be "alien.css". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + css(key: string | Phaser.Types.Loader.FileTypes.CSSFileConfig | Phaser.Types.Loader.FileTypes.CSSFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a GLSL file, or array of GLSL files, to the current load queue. + * In Phaser 3 GLSL files are just plain Text files at the current moment in time. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.glsl('plasma', 'shaders/Plasma.glsl'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Shader Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Shader Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Shader Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.glsl({ + * key: 'plasma', + * shaderType: 'fragment', + * url: 'shaders/Plasma.glsl' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.GLSLFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.glsl('plasma', 'shaders/Plasma.glsl'); + * // and later in your game ... + * var data = this.cache.shader.get('plasma'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `FX.` and the key was `Plasma` the final key will be `FX.Plasma` and + * this is what you would use to retrieve the text from the Shader Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "plasma" + * and no URL is given then the Loader will set the URL to be "plasma.glsl". It will always add `.glsl` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the GLSL File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.glsl`, i.e. if `key` was "alien" then the URL will be "alien.glsl". + * @param shaderType The type of shader. Either `fragment` for a fragment shader, or `vertex` for a vertex shader. This is ignored if you load a shader bundle. Default 'fragment'. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + glsl(key: string | Phaser.Types.Loader.FileTypes.GLSLFileConfig | Phaser.Types.Loader.FileTypes.GLSLFileConfig[], url?: string, shaderType?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an HTML file, or array of HTML files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.html('story', 'files/LoginForm.html'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global HTML Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the HTML Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the HTML Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.html({ + * key: 'login', + * url: 'files/LoginForm.html' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.HTMLFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.html('login', 'files/LoginForm.html'); + * // and later in your game ... + * var data = this.cache.html.get('login'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and + * this is what you would use to retrieve the html from the HTML Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "story" + * and no URL is given then the Loader will set the URL to be "story.html". It will always add `.html` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the HTML File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.html`, i.e. if `key` was "alien" then the URL will be "alien.html". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + html(key: string | Phaser.Types.Loader.FileTypes.HTMLFileConfig | Phaser.Types.Loader.FileTypes.HTMLFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an HTML File, or array of HTML Files, to the current load queue. When the files are loaded they + * will be rendered to textures and stored in the Texture Manager. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.htmlTexture('instructions', 'content/intro.html', 256, 512); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.htmlTexture({ + * key: 'instructions', + * url: 'content/intro.html', + * width: 256, + * height: 512 + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.HTMLTextureFileConfig` for more details. + * + * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key: + * + * ```javascript + * this.load.htmlTexture('instructions', 'content/intro.html', 256, 512); + * // and later in your game ... + * this.add.image(x, y, 'instructions'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.html". It will always add `.html` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * The width and height are the size of the texture to which the HTML will be rendered. It's not possible to determine these + * automatically, so you will need to provide them, either as arguments or in the file config object. + * When the HTML file has loaded a new SVG element is created with a size and viewbox set to the width and height given. + * The SVG file has a body tag added to it, with the HTML file contents included. It then calls `window.Blob` on the SVG, + * and if successful is added to the Texture Manager, otherwise it fails processing. The overall quality of the rendered + * HTML depends on your browser, and some of them may not even support the svg / blob process used. Be aware that there are + * limitations on what HTML can be inside an SVG. You can find out more details in this + * [Mozilla MDN entry](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Drawing_DOM_objects_into_a_canvas). + * + * Note: The ability to load this type of file will only be available if the HTMLTextureFile File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.html`, i.e. if `key` was "alien" then the URL will be "alien.html". + * @param width The width of the texture the HTML will be rendered to. Default 512. + * @param height The height of the texture the HTML will be rendered to. Default 512. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + htmlTexture(key: string | Phaser.Types.Loader.FileTypes.HTMLTextureFileConfig | Phaser.Types.Loader.FileTypes.HTMLTextureFileConfig[], url?: string, width?: number, height?: number, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an Image, or array of Images, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.image('logo', 'images/phaserLogo.png'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * If you try to load an animated gif only the first frame will be rendered. Browsers do not natively support playback + * of animated gifs to Canvas elements. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.image({ + * key: 'logo', + * url: 'images/AtariLogo.png' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.ImageFileConfig` for more details. + * + * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key: + * + * ```javascript + * this.load.image('logo', 'images/AtariLogo.png'); + * // and later in your game ... + * this.add.image(x, y, 'logo'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image, + * then you can specify it by providing an array as the `url` where the second element is the normal map: + * + * ```javascript + * this.load.image('logo', [ 'images/AtariLogo.png', 'images/AtariLogo-n.png' ]); + * ``` + * + * Or, if you are using a config object use the `normalMap` property: + * + * ```javascript + * this.load.image({ + * key: 'logo', + * url: 'images/AtariLogo.png', + * normalMap: 'images/AtariLogo-n.png' + * }); + * ``` + * + * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings. + * Normal maps are a WebGL only feature. + * + * In Phaser 3.60 a new property was added that allows you to control how images are loaded. By default, images are loaded via XHR as Blobs. + * However, you can set `loader.imageLoadType: "HTMLImageElement"` in the Game Configuration and instead, the Loader will load all images + * via the Image tag instead. + * + * Note: The ability to load this type of file will only be available if the Image File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + image(key: string | Phaser.Types.Loader.FileTypes.ImageFileConfig | Phaser.Types.Loader.FileTypes.ImageFileConfig[], url?: string | string[], xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a JSON file, or array of JSON files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.json('wavedata', 'files/AlienWaveData.json'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global JSON Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the JSON Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the JSON Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.json({ + * key: 'wavedata', + * url: 'files/AlienWaveData.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.JSONFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.json('wavedata', 'files/AlienWaveData.json'); + * // and later in your game ... + * var data = this.cache.json.get('wavedata'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and + * this is what you would use to retrieve the text from the JSON Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "data" + * and no URL is given then the Loader will set the URL to be "data.json". It will always add `.json` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * You can also optionally provide a `dataKey` to use. This allows you to extract only a part of the JSON and store it in the Cache, + * rather than the whole file. For example, if your JSON data had a structure like this: + * + * ```json + * { + * "level1": { + * "baddies": { + * "aliens": {}, + * "boss": {} + * } + * }, + * "level2": {}, + * "level3": {} + * } + * ``` + * + * And you only wanted to store the `boss` data in the Cache, then you could pass `level1.baddies.boss`as the `dataKey`. + * + * Note: The ability to load this type of file will only be available if the JSON File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, can be a fully formed JSON Object. + * @param dataKey When the JSON file loads only this property will be stored in the Cache. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + json(key: string | Phaser.Types.Loader.FileTypes.JSONFileConfig | Phaser.Types.Loader.FileTypes.JSONFileConfig[], url?: object | string, dataKey?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Multi Texture Atlas, or array of multi atlases, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.multiatlas('level1', 'images/Level1.json'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * Phaser expects the atlas data to be provided in a JSON file as exported from the application Texture Packer, + * version 4.6.3 or above, where you have made sure to use the Phaser 3 Export option. + * + * The way it works internally is that you provide a URL to the JSON file. Phaser then loads this JSON, parses it and + * extracts which texture files it also needs to load to complete the process. If the JSON also defines normal maps, + * Phaser will load those as well. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.multiatlas({ + * key: 'level1', + * atlasURL: 'images/Level1.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.MultiAtlasFileConfig` for more details. + * + * Instead of passing a URL for the atlas JSON data you can also pass in a well formed JSON object instead. + * + * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key: + * + * ```javascript + * this.load.multiatlas('level1', 'images/Level1.json'); + * // and later in your game ... + * this.add.image(x, y, 'level1', 'background'); + * ``` + * + * To get a list of all available frames within an atlas please consult your Texture Atlas software. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Multi Atlas File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param atlasURL The absolute or relative URL to load the texture atlas json data file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param path Optional path to use when loading the textures defined in the atlas data. + * @param baseURL Optional Base URL to use when loading the textures defined in the atlas data. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings. + */ + multiatlas(key: string | Phaser.Types.Loader.FileTypes.MultiAtlasFileConfig | Phaser.Types.Loader.FileTypes.MultiAtlasFileConfig[], atlasURL?: string, path?: string, baseURL?: string, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an array of Script files to the current load queue. + * + * The difference between this and the `ScriptFile` file type is that you give an array of scripts to this method, + * and the scripts are then processed _exactly_ in that order. This allows you to load a bunch of scripts that + * may have dependencies on each other without worrying about the async nature of traditional script loading. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.scripts('PostProcess', [ + * 'libs/shaders/CopyShader.js', + * 'libs/postprocessing/EffectComposer.js', + * 'libs/postprocessing/RenderPass.js', + * 'libs/postprocessing/MaskPass.js', + * 'libs/postprocessing/ShaderPass.js', + * 'libs/postprocessing/AfterimagePass.js' + * ]); + * } + * ``` + * + * In the code above the script files will all be loaded in parallel but only processed (i.e. invoked) in the exact + * order given in the array. + * + * The files are **not** loaded right away. They are added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the files are queued + * it means you cannot use the files immediately after calling this method, but must wait for the files to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String and not already in-use by another file in the Loader. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.scripts({ + * key: 'PostProcess', + * url: [ + * 'libs/shaders/CopyShader.js', + * 'libs/postprocessing/EffectComposer.js', + * 'libs/postprocessing/RenderPass.js', + * 'libs/postprocessing/MaskPass.js', + * 'libs/postprocessing/ShaderPass.js', + * 'libs/postprocessing/AfterimagePass.js' + * ] + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.MultiScriptFileConfig` for more details. + * + * Once all the files have finished loading they will automatically be converted into a script element + * via `document.createElement('script')`. They will have their language set to JavaScript, `defer` set to + * false and then the resulting element will be appended to `document.head`. Any code then in the + * script will be executed. This is done in the exact order the files are specified in the url array. + * + * The URLs can be relative or absolute. If the URLs are relative the `Loader.baseURL` and `Loader.path` values will be prepended to them. + * + * Note: The ability to load this type of file will only be available if the MultiScript File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url An array of absolute or relative URLs to load the script files from. They are processed in the order given in the array. + * @param extension The default file extension to use if no url is provided. Default 'js'. + * @param xhrSettings Extra XHR Settings specifically for these files. + */ + scripts(key: string | Phaser.Types.Loader.FileTypes.MultiScriptFileConfig | Phaser.Types.Loader.FileTypes.MultiScriptFileConfig[], url?: string[], extension?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Wavefront OBJ file, or array of OBJ files, to the current load queue. + * + * Note: You should ensure your 3D package has triangulated the OBJ file prior to export. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.obj('ufo', 'files/spaceship.obj'); + * } + * ``` + * + * You can optionally also load a Wavefront Material file as well, by providing the 3rd parameter: + * + * ```javascript + * function preload () + * { + * this.load.obj('ufo', 'files/spaceship.obj', 'files/spaceship.mtl'); + * } + * ``` + * + * If given, the material will be parsed and stored along with the obj data in the cache. + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global OBJ Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the OBJ Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the OBJ Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.obj({ + * key: 'ufo', + * url: 'files/spaceship.obj', + * matURL: 'files/spaceship.mtl', + * flipUV: true + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.OBJFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.obj('ufo', 'files/spaceship.obj'); + * // and later in your game ... + * var data = this.cache.obj.get('ufo'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and + * this is what you would use to retrieve the obj from the OBJ Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "story" + * and no URL is given then the Loader will set the URL to be "story.obj". It will always add `.obj` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the OBJ File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param objURL The absolute or relative URL to load the obj file from. If undefined or `null` it will be set to `.obj`, i.e. if `key` was "alien" then the URL will be "alien.obj". + * @param matURL Optional absolute or relative URL to load the obj material file from. + * @param flipUV Flip the UV coordinates stored in the model data? + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + obj(key: string | Phaser.Types.Loader.FileTypes.OBJFileConfig | Phaser.Types.Loader.FileTypes.OBJFileConfig[], objURL?: string, matURL?: string, flipUV?: boolean, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a JSON File Pack, or array of packs, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.pack('level1', 'data/Level1Files.json'); + * } + * ``` + * + * A File Pack is a JSON file (or object) that contains details about other files that should be added into the Loader. + * Here is a small example: + * + * ```json + * { + * "test1": { + * "files": [ + * { + * "type": "image", + * "key": "taikodrummaster", + * "url": "assets/pics/taikodrummaster.jpg" + * }, + * { + * "type": "image", + * "key": "sukasuka-chtholly", + * "url": "assets/pics/sukasuka-chtholly.png" + * } + * ] + * }, + * "meta": { + * "generated": "1401380327373", + * "app": "Phaser 3 Asset Packer", + * "url": "https://phaser.io", + * "version": "1.0", + * "copyright": "Photon Storm Ltd. 2018" + * } + * } + * ``` + * + * The pack can be split into sections. In the example above you'll see a section called `test1`. You can tell + * the `load.pack` method to parse only a particular section of a pack. The pack is stored in the JSON Cache, + * so you can pass it to the Loader to process additional sections as needed in your game, or you can just load + * them all at once without specifying anything. + * + * The pack file can contain an entry for any type of file that Phaser can load. The object structures exactly + * match that of the file type configs, and all properties available within the file type configs can be used + * in the pack file too. An entry's `type` is the name of the Loader method that will load it, e.g., 'image'. + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * The key must be a unique String. It is used to add the file to the global JSON Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the JSON Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the JSON Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.pack({ + * key: 'level1', + * url: 'data/Level1Files.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.PackFileConfig` for more details. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and + * this is what you would use to retrieve the text from the JSON Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "data" + * and no URL is given then the Loader will set the URL to be "data.json". It will always add `.json` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * You can also optionally provide a `dataKey` to use. This allows you to extract only a part of the JSON and store it in the Cache, + * rather than the whole file. For example, if your JSON data had a structure like this: + * + * ```json + * { + * "level1": { + * "baddies": { + * "aliens": {}, + * "boss": {} + * } + * }, + * "level2": {}, + * "level3": {} + * } + * ``` + * + * And you only wanted to store the `boss` data in the Cache, then you could pass `level1.baddies.boss`as the `dataKey`. + * + * Note: The ability to load this type of file will only be available if the Pack File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param dataKey When the JSON file loads only this property will be stored in the Cache. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + pack(key: string | Phaser.Types.Loader.FileTypes.PackFileConfig | Phaser.Types.Loader.FileTypes.PackFileConfig[], url?: string, dataKey?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Plugin Script file, or array of plugin files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.plugin('modplayer', 'plugins/ModPlayer.js'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String and not already in-use by another file in the Loader. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.plugin({ + * key: 'modplayer', + * url: 'plugins/ModPlayer.js' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.PluginFileConfig` for more details. + * + * Once the file has finished loading it will automatically be converted into a script element + * via `document.createElement('script')`. It will have its language set to JavaScript, `defer` set to + * false and then the resulting element will be appended to `document.head`. Any code then in the + * script will be executed. It will then be passed to the Phaser PluginCache.register method. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.js". It will always add `.js` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Plugin File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". Or, a plugin function. + * @param start Automatically start the plugin after loading? + * @param mapping If this plugin is to be injected into the Scene, this is the property key used. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + plugin(key: string | Phaser.Types.Loader.FileTypes.PluginFileConfig | Phaser.Types.Loader.FileTypes.PluginFileConfig[], url?: string | Function, start?: boolean, mapping?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an external Scene file, or array of Scene files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.sceneFile('Level1', 'src/Level1.js'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Scene Manager upon a successful load. + * + * For a Scene File it's vitally important that the key matches the class name in the JavaScript file. + * + * For example here is the source file: + * + * ```javascript + * class ExternalScene extends Phaser.Scene { + * + * constructor () + * { + * super('myScene'); + * } + * + * } + * ``` + * + * Because the class is called `ExternalScene` that is the exact same key you must use when loading it: + * + * ```javascript + * function preload () + * { + * this.load.sceneFile('ExternalScene', 'src/yourScene.js'); + * } + * ``` + * + * The key that is used within the Scene Manager can either be set to the same, or you can override it in the Scene + * constructor, as we've done in the example above, where the Scene key was changed to `myScene`. + * + * The key should be unique both in terms of files being loaded and Scenes already present in the Scene Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Scene Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.sceneFile({ + * key: 'Level1', + * url: 'src/Level1.js' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.SceneFileConfig` for more details. + * + * Once the file has finished loading it will be added to the Scene Manager. + * + * ```javascript + * this.load.sceneFile('Level1', 'src/Level1.js'); + * // and later in your game ... + * this.scene.start('Level1'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `WORLD1.` and the key was `Story` the final key will be `WORLD1.Story` and + * this is what you would use to retrieve the text from the Scene Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "story" + * and no URL is given then the Loader will set the URL to be "story.js". It will always add `.js` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Scene File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + sceneFile(key: string | Phaser.Types.Loader.FileTypes.SceneFileConfig | Phaser.Types.Loader.FileTypes.SceneFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Scene Plugin Script file, or array of plugin files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.scenePlugin('ModPlayer', 'plugins/ModPlayer.js', 'modPlayer', 'mods'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String and not already in-use by another file in the Loader. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.scenePlugin({ + * key: 'modplayer', + * url: 'plugins/ModPlayer.js' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.ScenePluginFileConfig` for more details. + * + * Once the file has finished loading it will automatically be converted into a script element + * via `document.createElement('script')`. It will have its language set to JavaScript, `defer` set to + * false and then the resulting element will be appended to `document.head`. Any code then in the + * script will be executed. It will then be passed to the Phaser PluginCache.register method. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.js". It will always add `.js` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Script File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". Or, set to a plugin function. + * @param systemKey If this plugin is to be added to Scene.Systems, this is the property key for it. + * @param sceneKey If this plugin is to be added to the Scene, this is the property key for it. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + scenePlugin(key: string | Phaser.Types.Loader.FileTypes.ScenePluginFileConfig | Phaser.Types.Loader.FileTypes.ScenePluginFileConfig[], url?: string | Function, systemKey?: string, sceneKey?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Script file, or array of Script files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.script('aliens', 'lib/aliens.js'); + * } + * ``` + * + * If the script file contains a module, then you should specify that using the 'type' parameter: + * + * ```javascript + * function preload () + * { + * this.load.script('aliens', 'lib/aliens.js', 'module'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String and not already in-use by another file in the Loader. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.script({ + * key: 'aliens', + * url: 'lib/aliens.js', + * type: 'script' // or 'module' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.ScriptFileConfig` for more details. + * + * Once the file has finished loading it will automatically be converted into a script element + * via `document.createElement('script')`. It will have its language set to JavaScript, `defer` set to + * false and then the resulting element will be appended to `document.head`. Any code then in the + * script will be executed. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.js". It will always add `.js` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Script File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param type The script type. Should be either 'script' for classic JavaScript, or 'module' if the file contains an exported module. Default 'script'. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + script(key: string | Phaser.Types.Loader.FileTypes.ScriptFileConfig | Phaser.Types.Loader.FileTypes.ScriptFileConfig[], url?: string, type?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Sprite Sheet Image, or array of Sprite Sheet Images, to the current load queue. + * + * The term 'Sprite Sheet' in Phaser means a fixed-size sheet. Where every frame in the sheet is the exact same size, + * and you reference those frames using numbers, not frame names. This is not the same thing as a Texture Atlas, where + * the frames are packed in a way where they take up the least amount of space, and are referenced by their names, + * not numbers. Some articles and software use the term 'Sprite Sheet' to mean Texture Atlas, so please be aware of + * what sort of file you're actually trying to load. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.spritesheet('bot', 'images/robot.png', { frameWidth: 32, frameHeight: 38 }); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * If you try to load an animated gif only the first frame will be rendered. Browsers do not natively support playback + * of animated gifs to Canvas elements. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.spritesheet({ + * key: 'bot', + * url: 'images/robot.png', + * frameConfig: { + * frameWidth: 32, + * frameHeight: 38, + * startFrame: 0, + * endFrame: 8 + * } + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.SpriteSheetFileConfig` for more details. + * + * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key: + * + * ```javascript + * this.load.spritesheet('bot', 'images/robot.png', { frameWidth: 32, frameHeight: 38 }); + * // and later in your game ... + * this.add.image(x, y, 'bot', 0); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `PLAYER.` and the key was `Running` the final key will be `PLAYER.Running` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image, + * then you can specify it by providing an array as the `url` where the second element is the normal map: + * + * ```javascript + * this.load.spritesheet('logo', [ 'images/AtariLogo.png', 'images/AtariLogo-n.png' ], { frameWidth: 256, frameHeight: 80 }); + * ``` + * + * Or, if you are using a config object use the `normalMap` property: + * + * ```javascript + * this.load.spritesheet({ + * key: 'logo', + * url: 'images/AtariLogo.png', + * normalMap: 'images/AtariLogo-n.png', + * frameConfig: { + * frameWidth: 256, + * frameHeight: 80 + * } + * }); + * ``` + * + * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings. + * Normal maps are a WebGL only feature. + * + * Note: The ability to load this type of file will only be available if the Sprite Sheet File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param frameConfig The frame configuration object. At a minimum it should have a `frameWidth` property. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + spritesheet(key: string | Phaser.Types.Loader.FileTypes.SpriteSheetFileConfig | Phaser.Types.Loader.FileTypes.SpriteSheetFileConfig[], url?: string, frameConfig?: Phaser.Types.Loader.FileTypes.ImageFrameConfig, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an SVG File, or array of SVG Files, to the current load queue. When the files are loaded they + * will be rendered to bitmap textures and stored in the Texture Manager. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.svg('morty', 'images/Morty.svg'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.svg({ + * key: 'morty', + * url: 'images/Morty.svg' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.SVGFileConfig` for more details. + * + * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key: + * + * ```javascript + * this.load.svg('morty', 'images/Morty.svg'); + * // and later in your game ... + * this.add.image(x, y, 'morty'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.html". It will always add `.html` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * You can optionally pass an SVG Resize Configuration object when you load an SVG file. By default the SVG will be rendered to a texture + * at the same size defined in the SVG file attributes. However, this isn't always desirable. You may wish to resize the SVG (either down + * or up) to improve texture clarity, or reduce texture memory consumption. You can either specify an exact width and height to resize + * the SVG to: + * + * ```javascript + * function preload () + * { + * this.load.svg('morty', 'images/Morty.svg', { width: 300, height: 600 }); + * } + * ``` + * + * Or when using a configuration object: + * + * ```javascript + * this.load.svg({ + * key: 'morty', + * url: 'images/Morty.svg', + * svgConfig: { + * width: 300, + * height: 600 + * } + * }); + * ``` + * + * Alternatively, you can just provide a scale factor instead: + * + * ```javascript + * function preload () + * { + * this.load.svg('morty', 'images/Morty.svg', { scale: 2.5 }); + * } + * ``` + * + * Or when using a configuration object: + * + * ```javascript + * this.load.svg({ + * key: 'morty', + * url: 'images/Morty.svg', + * svgConfig: { + * scale: 2.5 + * } + * }); + * ``` + * + * If scale, width and height values are all given, the scale has priority and the width and height values are ignored. + * + * Note: The ability to load this type of file will only be available if the SVG File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.svg`, i.e. if `key` was "alien" then the URL will be "alien.svg". + * @param svgConfig The svg size configuration object. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + svg(key: string | Phaser.Types.Loader.FileTypes.SVGFileConfig | Phaser.Types.Loader.FileTypes.SVGFileConfig[], url?: string, svgConfig?: Phaser.Types.Loader.FileTypes.SVGSizeConfig, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Text file, or array of Text files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.text('story', 'files/IntroStory.txt'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Text Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Text Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Text Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.text({ + * key: 'story', + * url: 'files/IntroStory.txt' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.TextFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.text('story', 'files/IntroStory.txt'); + * // and later in your game ... + * var data = this.cache.text.get('story'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and + * this is what you would use to retrieve the text from the Text Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "story" + * and no URL is given then the Loader will set the URL to be "story.txt". It will always add `.txt` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Text File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + text(key: string | Phaser.Types.Loader.FileTypes.TextFileConfig | Phaser.Types.Loader.FileTypes.TextFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a CSV Tilemap file, or array of CSV files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.tilemapCSV('level1', 'maps/Level1.csv'); + * } + * ``` + * + * Tilemap CSV data can be created in a text editor, or a 3rd party app that exports as CSV. + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Tilemap Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Tilemap Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Text Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.tilemapCSV({ + * key: 'level1', + * url: 'maps/Level1.csv' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.TilemapCSVFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.tilemapCSV('level1', 'maps/Level1.csv'); + * // and later in your game ... + * var map = this.make.tilemap({ key: 'level1' }); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and + * this is what you would use to retrieve the text from the Tilemap Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "level" + * and no URL is given then the Loader will set the URL to be "level.csv". It will always add `.csv` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Tilemap CSV File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.csv`, i.e. if `key` was "alien" then the URL will be "alien.csv". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + tilemapCSV(key: string | Phaser.Types.Loader.FileTypes.TilemapCSVFileConfig | Phaser.Types.Loader.FileTypes.TilemapCSVFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an Impact.js Tilemap file, or array of map files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.tilemapImpact('level1', 'maps/Level1.json'); + * } + * ``` + * + * Impact Tilemap data is created the Impact.js Map Editor called Weltmeister. + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Tilemap Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Tilemap Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Text Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.tilemapImpact({ + * key: 'level1', + * url: 'maps/Level1.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.TilemapImpactFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.tilemapImpact('level1', 'maps/Level1.json'); + * // and later in your game ... + * var map = this.make.tilemap({ key: 'level1' }); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and + * this is what you would use to retrieve the text from the Tilemap Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "level" + * and no URL is given then the Loader will set the URL to be "level.json". It will always add `.json` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Tilemap Impact File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + tilemapImpact(key: string | Phaser.Types.Loader.FileTypes.TilemapImpactFileConfig | Phaser.Types.Loader.FileTypes.TilemapImpactFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Tiled JSON Tilemap file, or array of map files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.tilemapTiledJSON('level1', 'maps/Level1.json'); + * } + * ``` + * + * The Tilemap data is created using the Tiled Map Editor and selecting JSON as the export format. + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Tilemap Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Tilemap Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Text Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.tilemapTiledJSON({ + * key: 'level1', + * url: 'maps/Level1.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.TilemapJSONFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.tilemapTiledJSON('level1', 'maps/Level1.json'); + * // and later in your game ... + * var map = this.make.tilemap({ key: 'level1' }); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and + * this is what you would use to retrieve the text from the Tilemap Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "level" + * and no URL is given then the Loader will set the URL to be "level.json". It will always add `.json` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Tilemap JSON File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, a well formed JSON object. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + tilemapTiledJSON(key: string | Phaser.Types.Loader.FileTypes.TilemapJSONFileConfig | Phaser.Types.Loader.FileTypes.TilemapJSONFileConfig[], url?: object | string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Unity YAML based Texture Atlas, or array of atlases, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.unityAtlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.txt'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * Phaser expects the atlas data to be provided in a YAML formatted text file as exported from Unity. + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.unityAtlas({ + * key: 'mainmenu', + * textureURL: 'images/MainMenu.png', + * atlasURL: 'images/MainMenu.txt' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.UnityAtlasFileConfig` for more details. + * + * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key: + * + * ```javascript + * this.load.unityAtlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.json'); + * // and later in your game ... + * this.add.image(x, y, 'mainmenu', 'background'); + * ``` + * + * To get a list of all available frames within an atlas please consult your Texture Atlas software. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image, + * then you can specify it by providing an array as the `url` where the second element is the normal map: + * + * ```javascript + * this.load.unityAtlas('mainmenu', [ 'images/MainMenu.png', 'images/MainMenu-n.png' ], 'images/MainMenu.txt'); + * ``` + * + * Or, if you are using a config object use the `normalMap` property: + * + * ```javascript + * this.load.unityAtlas({ + * key: 'mainmenu', + * textureURL: 'images/MainMenu.png', + * normalMap: 'images/MainMenu-n.png', + * atlasURL: 'images/MainMenu.txt' + * }); + * ``` + * + * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings. + * Normal maps are a WebGL only feature. + * + * Note: The ability to load this type of file will only be available if the Unity Atlas File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas data file from. If undefined or `null` it will be set to `.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt". + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas data file. Used in replacement of the Loaders default XHR Settings. + */ + unityAtlas(key: string | Phaser.Types.Loader.FileTypes.UnityAtlasFileConfig | Phaser.Types.Loader.FileTypes.UnityAtlasFileConfig[], textureURL?: string | string[], atlasURL?: string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Video file, or array of video files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.video('intro', [ 'video/level1.mp4', 'video/level1.webm', 'video/level1.mov' ]); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Video Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Video Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Video Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.video({ + * key: 'intro', + * url: [ 'video/level1.mp4', 'video/level1.webm', 'video/level1.mov' ], + * noAudio: true + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.VideoFileConfig` for more details. + * + * The URLs can be relative or absolute. If the URLs are relative the `Loader.baseURL` and `Loader.path` values will be prepended to them. + * + * Due to different browsers supporting different video file types you should usually provide your video files in a variety of formats. + * mp4, mov and webm are the most common. If you provide an array of URLs then the Loader will determine which _one_ file to load based on + * browser support, starting with the first in the array and progressing to the end. + * + * Unlike most asset-types, videos do not _need_ to be preloaded. You can create a Video Game Object and then call its `loadURL` method, + * to load a video at run-time, rather than in advance. + * + * Note: The ability to load this type of file will only be available if the Video File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param urls The absolute or relative URL to load the video files from. + * @param noAudio Does the video have an audio track? If not you can enable auto-playing on it. Default false. + */ + video(key: string | Phaser.Types.Loader.FileTypes.VideoFileConfig | Phaser.Types.Loader.FileTypes.VideoFileConfig[], urls?: string | string[] | Phaser.Types.Loader.FileTypes.VideoFileURLConfig | Phaser.Types.Loader.FileTypes.VideoFileURLConfig[], noAudio?: boolean): this; + + /** + * Adds an XML file, or array of XML files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.xml('wavedata', 'files/AlienWaveData.xml'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global XML Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the XML Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the XML Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.xml({ + * key: 'wavedata', + * url: 'files/AlienWaveData.xml' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.XMLFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.xml('wavedata', 'files/AlienWaveData.xml'); + * // and later in your game ... + * var data = this.cache.xml.get('wavedata'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and + * this is what you would use to retrieve the text from the XML Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "data" + * and no URL is given then the Loader will set the URL to be "data.xml". It will always add `.xml` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the XML File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + xml(key: string | Phaser.Types.Loader.FileTypes.XMLFileConfig | Phaser.Types.Loader.FileTypes.XMLFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * The Scene which owns this Loader instance. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * A reference to the global Cache Manager. + */ + cacheManager: Phaser.Cache.CacheManager; + + /** + * A reference to the global Texture Manager. + */ + textureManager: Phaser.Textures.TextureManager; + + /** + * A reference to the global Scene Manager. + */ + protected sceneManager: Phaser.Scenes.SceneManager; + + /** + * An optional prefix that is automatically prepended to the start of every file key. + * If prefix was `MENU.` and you load an image with the key 'Background' the resulting key would be `MENU.Background`. + * You can set this directly, or call `Loader.setPrefix()`. It will then affect every file added to the Loader + * from that point on. It does _not_ change any file already in the load queue. + */ + prefix: string; + + /** + * The value of `path`, if set, is placed before any _relative_ file path given. For example: + * + * ```javascript + * this.load.path = "images/sprites/"; + * this.load.image("ball", "ball.png"); + * this.load.image("tree", "level1/oaktree.png"); + * this.load.image("boom", "http://server.com/explode.png"); + * ``` + * + * Would load the `ball` file from `images/sprites/ball.png` and the tree from + * `images/sprites/level1/oaktree.png` but the file `boom` would load from the URL + * given as it's an absolute URL. + * + * Please note that the path is added before the filename but *after* the baseURL (if set.) + * + * If you set this property directly then it _must_ end with a "/". Alternatively, call `setPath()` and it'll do it for you. + */ + path: string; + + /** + * If you want to append a URL before the path of any asset you can set this here. + * + * Useful if allowing the asset base url to be configured outside of the game code. + * + * If you set this property directly then it _must_ end with a "/". Alternatively, call `setBaseURL()` and it'll do it for you. + */ + baseURL: string; + + /** + * The number of concurrent / parallel resources to try and fetch at once. + * + * Old browsers limit 6 requests per domain; modern ones, especially those with HTTP/2 don't limit it at all. + * + * The default is 32 but you can change this in your Game Config, or by changing this property before the Loader starts. + */ + maxParallelDownloads: number; + + /** + * xhr specific global settings (can be overridden on a per-file basis) + */ + xhr: Phaser.Types.Loader.XHRSettingsObject; + + /** + * The crossOrigin value applied to loaded images. Very often this needs to be set to 'anonymous'. + */ + crossOrigin: string; + + /** + * Optional load type for image files. `XHR` is the default. Set to `HTMLImageElement` to load images using the Image tag instead. + */ + imageLoadType: string; + + /** + * An array of all schemes that the Loader considers as being 'local'. + * + * This is populated by the `Phaser.Core.Config#loaderLocalScheme` game configuration setting and defaults to + * `[ 'file://', 'capacitor://' ]`. Additional local schemes can be added to this array as needed. + */ + localSchemes: string[]; + + /** + * The total number of files to load. It may not always be accurate because you may add to the Loader during the process + * of loading, especially if you load a Pack File. Therefore this value can change, but in most cases remains static. + */ + totalToLoad: number; + + /** + * The progress of the current load queue, as a float value between 0 and 1. + * This is updated automatically as files complete loading. + * Note that it is possible for this value to go down again if you add content to the current load queue during a load. + */ + progress: number; + + /** + * Files are placed in this Set when they're added to the Loader via `addFile`. + * + * They are moved to the `inflight` Set when they start loading, and assuming a successful + * load, to the `queue` Set for further processing. + * + * By the end of the load process this Set will be empty. + */ + list: Phaser.Structs.Set; + + /** + * Files are stored in this Set while they're in the process of being loaded. + * + * Upon a successful load they are moved to the `queue` Set. + * + * By the end of the load process this Set will be empty. + */ + inflight: Phaser.Structs.Set; + + /** + * Files are stored in this Set while they're being processed. + * + * If the process is successful they are moved to their final destination, which could be + * a Cache or the Texture Manager. + * + * At the end of the load process this Set will be empty. + */ + queue: Phaser.Structs.Set; + + /** + * The total number of files that failed to load during the most recent load. + * This value is reset when you call `Loader.start`. + */ + totalFailed: number; + + /** + * The total number of files that successfully loaded during the most recent load. + * This value is reset when you call `Loader.start`. + */ + totalComplete: number; + + /** + * The current state of the Loader. + */ + readonly state: number; + + /** + * If you want to append a URL before the path of any asset you can set this here. + * + * Useful if allowing the asset base url to be configured outside of the game code. + * + * Once a base URL is set it will affect every file loaded by the Loader from that point on. It does _not_ change any + * file _already_ being loaded. To reset it, call this method with no arguments. + * @param url The URL to use. Leave empty to reset. + */ + setBaseURL(url?: string): this; + + /** + * The value of `path`, if set, is placed before any _relative_ file path given. For example: + * + * ```javascript + * this.load.setPath("images/sprites/"); + * this.load.image("ball", "ball.png"); + * this.load.image("tree", "level1/oaktree.png"); + * this.load.image("boom", "http://server.com/explode.png"); + * ``` + * + * Would load the `ball` file from `images/sprites/ball.png` and the tree from + * `images/sprites/level1/oaktree.png` but the file `boom` would load from the URL + * given as it's an absolute URL. + * + * Please note that the path is added before the filename but *after* the baseURL (if set.) + * + * Once a path is set it will then affect every file added to the Loader from that point on. It does _not_ change any + * file _already_ in the load queue. To reset it, call this method with no arguments. + * @param path The path to use. Leave empty to reset. + */ + setPath(path?: string): this; + + /** + * An optional prefix that is automatically prepended to the start of every file key. + * + * If prefix was `MENU.` and you load an image with the key 'Background' the resulting key would be `MENU.Background`. + * + * Once a prefix is set it will then affect every file added to the Loader from that point on. It does _not_ change any + * file _already_ in the load queue. To reset it, call this method with no arguments. + * @param prefix The prefix to use. Leave empty to reset. + */ + setPrefix(prefix?: string): this; + + /** + * Sets the Cross Origin Resource Sharing value used when loading files. + * + * Files can override this value on a per-file basis by specifying an alternative `crossOrigin` value in their file config. + * + * Once CORs is set it will then affect every file loaded by the Loader from that point on, as long as they don't have + * their own CORs setting. To reset it, call this method with no arguments. + * + * For more details about CORs see https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS + * @param crossOrigin The value to use for the `crossOrigin` property in the load request. + */ + setCORS(crossOrigin?: string): this; + + /** + * Adds a file, or array of files, into the load queue. + * + * The file must be an instance of `Phaser.Loader.File`, or a class that extends it. The Loader will check that the key + * used by the file won't conflict with any other key either in the loader, the inflight queue or the target cache. + * If allowed it will then add the file into the pending list, read for the load to start. Or, if the load has already + * started, ready for the next batch of files to be pulled from the list to the inflight queue. + * + * You should not normally call this method directly, but rather use one of the Loader methods like `image` or `atlas`, + * however you can call this as long as the file given to it is well formed. + * @param file The file, or array of files, to be added to the load queue. + */ + addFile(file: Phaser.Loader.File | Phaser.Loader.File[]): void; + + /** + * Checks the key and type of the given file to see if it will conflict with anything already + * in a Cache, the Texture Manager, or the list or inflight queues. + * @param file The file to check the key of. + */ + keyExists(file: Phaser.Loader.File): boolean; + + /** + * Takes a well formed, fully parsed pack file object and adds its entries into the load queue. Usually you do not call + * this method directly, but instead use `Loader.pack` and supply a path to a JSON file that holds the + * pack data. However, if you've got the data prepared you can pass it to this method. + * + * You can also provide an optional key. If you do then it will only add the entries from that part of the pack into + * to the load queue. If not specified it will add all entries it finds. For more details about the pack file format + * see the `LoaderPlugin.pack` method. + * @param pack The Pack File data to be parsed and each entry of it to added to the load queue. + * @param packKey An optional key to use from the pack file data. + */ + addPack(pack: any, packKey?: string): boolean; + + /** + * Is the Loader actively loading, or processing loaded files? + */ + isLoading(): boolean; + + /** + * Is the Loader ready to start a new load? + */ + isReady(): boolean; + + /** + * Starts the Loader running. This will reset the progress and totals and then emit a `start` event. + * If there is nothing in the queue the Loader will immediately complete, otherwise it will start + * loading the first batch of files. + * + * The Loader is started automatically if the queue is populated within your Scenes `preload` method. + * + * However, outside of this, you need to call this method to start it. + * + * If the Loader is already running this method will simply return. + */ + start(): void; + + /** + * Called automatically during the load process. + * It updates the `progress` value and then emits a progress event, which you can use to + * display a loading bar in your game. + */ + updateProgress(): void; + + /** + * Called automatically during the load process. + */ + update(): void; + + /** + * An internal method called automatically by the XHRLoader belong to a File. + * + * This method will remove the given file from the inflight Set and update the load progress. + * If the file was successful its `onProcess` method is called, otherwise it is added to the delete queue. + * @param file The File that just finished loading, or errored during load. + * @param success `true` if the file loaded successfully, otherwise `false`. + */ + nextFile(file: Phaser.Loader.File, success: boolean): void; + + /** + * An internal method that is called automatically by the File when it has finished processing. + * + * If the process was successful, and the File isn't part of a MultiFile, its `addToCache` method is called. + * + * It this then removed from the queue. If there are no more files to load `loadComplete` is called. + * @param file The file that has finished processing. + */ + fileProcessComplete(file: Phaser.Loader.File): void; + + /** + * Called at the end when the load queue is exhausted and all files have either loaded or errored. + * By this point every loaded file will now be in its associated cache and ready for use. + * + * Also clears down the Sets, puts progress to 1 and clears the deletion queue. + */ + loadComplete(): void; + + /** + * Adds a File into the pending-deletion queue. + * @param file The File to be queued for deletion when the Loader completes. + */ + flagForRemoval(file: Phaser.Loader.File): void; + + /** + * Converts the given JSON data into a file that the browser then prompts you to download so you can save it locally. + * + * The data must be well formed JSON and ready-parsed, not a JavaScript object. + * @param data The JSON data, ready parsed. + * @param filename The name to save the JSON file as. Default file.json. + */ + saveJSON(data: any, filename?: string): this; + + /** + * Causes the browser to save the given data as a file to its default Downloads folder. + * + * Creates a DOM level anchor link, assigns it as being a `download` anchor, sets the href + * to be an ObjectURL based on the given data, and then invokes a click event. + * @param data The data to be saved. Will be passed through URL.createObjectURL. + * @param filename The filename to save the file as. Default file.json. + * @param filetype The file type to use when saving the file. Defaults to JSON. Default application/json. + */ + save(data: any, filename?: string, filetype?: string): this; + + /** + * Resets the Loader. + * + * This will clear all lists and reset the base URL, path and prefix. + * + * Warning: If the Loader is currently downloading files, or has files in its queue, they will be aborted. + */ + reset(): void; + + } + + /** + * Takes two XHRSettings Objects and creates a new XHRSettings object from them. + * + * The new object is seeded by the values given in the global settings, but any setting in + * the local object overrides the global ones. + * @param global The global XHRSettings object. + * @param local The local XHRSettings object. + */ + function MergeXHRSettings(global: Phaser.Types.Loader.XHRSettingsObject, local: Phaser.Types.Loader.XHRSettingsObject): Phaser.Types.Loader.XHRSettingsObject; + + /** + * A MultiFile is a special kind of parent that contains two, or more, Files as children and looks after + * the loading and processing of them all. It is commonly extended and used as a base class for file types such as AtlasJSON or BitmapFont. + * + * You shouldn't create an instance of a MultiFile directly, but should extend it with your own class, setting a custom type and processing methods. + */ + class MultiFile { + /** + * + * @param loader The Loader that is going to load this File. + * @param type The file type string for sorting within the Loader. + * @param key The key of the file within the loader. + * @param files An array of Files that make-up this MultiFile. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, type: string, key: string, files: Phaser.Loader.File[]); + + /** + * A reference to the Loader that is going to load this file. + */ + loader: Phaser.Loader.LoaderPlugin; + + /** + * The file type string for sorting within the Loader. + */ + type: string; + + /** + * Unique cache key (unique within its file type) + */ + key: string; + + /** + * Array of files that make up this MultiFile. + */ + files: Phaser.Loader.File[]; + + /** + * The current state of the file. One of the FILE_CONST values. + */ + state: number; + + /** + * The completion status of this MultiFile. + */ + complete: boolean; + + /** + * The number of files to load. + */ + pending: number; + + /** + * The number of files that failed to load. + */ + failed: number; + + /** + * A storage container for transient data that the loading files need. + */ + config: any; + + /** + * A reference to the Loaders baseURL at the time this MultiFile was created. + * Used to populate child-files. + */ + baseURL: string; + + /** + * A reference to the Loaders path at the time this MultiFile was created. + * Used to populate child-files. + */ + path: string; + + /** + * A reference to the Loaders prefix at the time this MultiFile was created. + * Used to populate child-files. + */ + prefix: string; + + /** + * Checks if this MultiFile is ready to process its children or not. + */ + isReadyToProcess(): boolean; + + /** + * Adds another child to this MultiFile, increases the pending count and resets the completion status. + * @param files The File to add to this MultiFile. + */ + addToMultiFile(files: Phaser.Loader.File): Phaser.Loader.MultiFile; + + /** + * Called by each File when it finishes loading. + * @param file The File that has completed processing. + */ + onFileComplete(file: Phaser.Loader.File): void; + + /** + * Called by each File that fails to load. + * @param file The File that has failed to load. + */ + onFileFailed(file: Phaser.Loader.File): void; + + /** + * Called once all children of this multi file have been added to their caches and is now + * ready for deletion from the Loader. + * + * It will emit a `filecomplete` event from the LoaderPlugin. + */ + pendingDestroy(): void; + + /** + * Destroy this Multi File and any references it holds. + */ + destroy(): void; + + } + + /** + * Creates a new XMLHttpRequest (xhr) object based on the given File and XHRSettings + * and starts the download of it. It uses the Files own XHRSettings and merges them + * with the global XHRSettings object to set the xhr values before download. + * @param file The File to download. + * @param globalXHRSettings The global XHRSettings object. + */ + function XHRLoader(file: Phaser.Loader.File, globalXHRSettings: Phaser.Types.Loader.XHRSettingsObject): XMLHttpRequest; + + /** + * Creates an XHRSettings Object with default values. + * @param responseType The responseType, such as 'text'. Default ''. + * @param async Should the XHR request use async or not? Default true. + * @param user Optional username for the XHR request. Default ''. + * @param password Optional password for the XHR request. Default ''. + * @param timeout Optional XHR timeout value. Default 0. + * @param withCredentials Optional XHR withCredentials value. Default false. + */ + function XHRSettings(responseType?: XMLHttpRequestResponseType, async?: boolean, user?: string, password?: string, timeout?: number, withCredentials?: boolean): Phaser.Types.Loader.XHRSettingsObject; + + } + + namespace Math { + namespace Angle { + /** + * Find the angle of a segment from (x1, y1) -> (x2, y2). + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + */ + function Between(x1: number, y1: number, x2: number, y2: number): number; + + /** + * Find the angle of a segment from (point1.x, point1.y) -> (point2.x, point2.y). + * + * Calculates the angle of the vector from the first point to the second point. + * @param point1 The first point. + * @param point2 The second point. + */ + function BetweenPoints(point1: Phaser.Types.Math.Vector2Like, point2: Phaser.Types.Math.Vector2Like): number; + + /** + * Find the angle of a segment from (point1.x, point1.y) -> (point2.x, point2.y). + * + * The difference between this method and {@link Phaser.Math.Angle.BetweenPoints} is that this assumes the y coordinate + * travels down the screen. + * @param point1 The first point. + * @param point2 The second point. + */ + function BetweenPointsY(point1: Phaser.Types.Math.Vector2Like, point2: Phaser.Types.Math.Vector2Like): number; + + /** + * Find the angle of a segment from (x1, y1) -> (x2, y2). + * + * The difference between this method and {@link Phaser.Math.Angle.Between} is that this assumes the y coordinate + * travels down the screen. + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + */ + function BetweenY(x1: number, y1: number, x2: number, y2: number): number; + + /** + * Takes an angle in Phasers default clockwise format and converts it so that + * 0 is North, 90 is West, 180 is South and 270 is East, + * therefore running counter-clockwise instead of clockwise. + * + * You can pass in the angle from a Game Object using: + * + * ```javascript + * var converted = CounterClockwise(gameobject.rotation); + * ``` + * + * All values for this function are in radians. + * @param angle The angle to convert, in radians. + */ + function CounterClockwise(angle: number): number; + + /** + * Normalize an angle to the [0, 2pi] range. + * @param angle The angle to normalize, in radians. + */ + function Normalize(angle: number): number; + + /** + * Returns a random angle in the range [-pi, pi]. + */ + function Random(): number; + + /** + * Returns a random angle in the range [-180, 180]. + */ + function RandomDegrees(): number; + + /** + * Reverse the given angle. + * @param angle The angle to reverse, in radians. + */ + function Reverse(angle: number): number; + + /** + * Rotates `currentAngle` towards `targetAngle`, taking the shortest rotation distance. The `lerp` argument is the amount to rotate by in this call. + * @param currentAngle The current angle, in radians. + * @param targetAngle The target angle to rotate to, in radians. + * @param lerp The lerp value to add to the current angle. Default 0.05. + */ + function RotateTo(currentAngle: number, targetAngle: number, lerp?: number): number; + + /** + * Gets the shortest angle between `angle1` and `angle2`. + * + * Both angles must be in the range -180 to 180, which is the same clamped + * range that `sprite.angle` uses, so you can pass in two sprite angles to + * this method and get the shortest angle back between the two of them. + * + * The angle returned will be in the same range. If the returned angle is + * greater than 0 then it's a counter-clockwise rotation, if < 0 then it's + * a clockwise rotation. + * @param angle1 The first angle in the range -180 to 180. + * @param angle2 The second angle in the range -180 to 180. + */ + function ShortestBetween(angle1: number, angle2: number): number; + + /** + * Wrap an angle. + * + * Wraps the angle to a value in the range of -PI to PI. + * @param angle The angle to wrap, in radians. + */ + function Wrap(angle: number): number; + + /** + * Wrap an angle in degrees. + * + * Wraps the angle to a value in the range of -180 to 180. + * @param angle The angle to wrap, in degrees. + */ + function WrapDegrees(angle: number): number; + + } + + /** + * Calculate the mean average of the given values. + * @param values The values to average. + */ + function Average(values: number[]): number; + + /** + * Calculates the Bernstein basis from the three factorial coefficients. + * @param n The first value. + * @param i The second value. + */ + function Bernstein(n: number, i: number): number; + + /** + * Compute a random integer between the `min` and `max` values, inclusive. + * @param min The minimum value. + * @param max The maximum value. + */ + function Between(min: number, max: number): number; + + /** + * Calculates a Catmull-Rom value from the given points, based on an alpha of 0.5. + * @param t The amount to interpolate by. + * @param p0 The first control point. + * @param p1 The second control point. + * @param p2 The third control point. + * @param p3 The fourth control point. + */ + function CatmullRom(t: number, p0: number, p1: number, p2: number, p3: number): number; + + /** + * Ceils to some place comparative to a `base`, default is 10 for decimal place. + * + * The `place` is represented by the power applied to `base` to get that place. + * @param value The value to round. + * @param place The place to round to. Default 0. + * @param base The base to round in. Default is 10 for decimal. Default 10. + */ + function CeilTo(value: number, place?: number, base?: number): number; + + /** + * Force a value within the boundaries by clamping it to the range `min`, `max`. + * @param value The value to be clamped. + * @param min The minimum bounds. + * @param max The maximum bounds. + */ + function Clamp(value: number, min: number, max: number): number; + + /** + * The value of PI * 2. + */ + var PI2: number; + + /** + * The value of PI * 0.5. + * + * Yes, we understand that this should actually be PI * 2, but + * it has been like this for so long we can't change it now. + * If you need PI * 2, use the PI2 constant instead. + */ + var TAU: number; + + /** + * An epsilon value (1.0e-6) + */ + var EPSILON: number; + + /** + * For converting degrees to radians (PI / 180) + */ + var DEG_TO_RAD: number; + + /** + * For converting radians to degrees (180 / PI) + */ + var RAD_TO_DEG: number; + + /** + * An instance of the Random Number Generator. + * This is not set until the Game boots. + */ + var RND: Phaser.Math.RandomDataGenerator; + + /** + * The minimum safe integer this browser supports. + * We use a const for backward compatibility with Internet Explorer. + */ + var MIN_SAFE_INTEGER: number; + + /** + * The maximum safe integer this browser supports. + * We use a const for backward compatibility with Internet Explorer. + */ + var MAX_SAFE_INTEGER: number; + + /** + * Convert the given angle from degrees, to the equivalent angle in radians. + * @param degrees The angle (in degrees) to convert to radians. + */ + function DegToRad(degrees: number): number; + + /** + * Calculates the positive difference of two given numbers. + * @param a The first number in the calculation. + * @param b The second number in the calculation. + */ + function Difference(a: number, b: number): number; + + namespace Distance { + /** + * Calculate the distance between two sets of coordinates (points). + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + */ + function Between(x1: number, y1: number, x2: number, y2: number): number; + + /** + * Calculate the distance between two points. + * @param a The first point. + * @param b The second point. + */ + function BetweenPoints(a: Phaser.Types.Math.Vector2Like, b: Phaser.Types.Math.Vector2Like): number; + + /** + * Calculate the squared distance between two points. + * @param a The first point. + * @param b The second point. + */ + function BetweenPointsSquared(a: Phaser.Types.Math.Vector2Like, b: Phaser.Types.Math.Vector2Like): number; + + /** + * Calculate the Chebyshev distance between two sets of coordinates (points). + * + * Chebyshev distance (or chessboard distance) is the maximum of the horizontal and vertical distances. + * It's the effective distance when movement can be horizontal, vertical, or diagonal. + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + */ + function Chebyshev(x1: number, y1: number, x2: number, y2: number): number; + + /** + * Calculate the distance between two sets of coordinates (points) to the power of `pow`. + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + * @param pow The exponent. + */ + function Power(x1: number, y1: number, x2: number, y2: number, pow: number): number; + + /** + * Calculate the snake distance between two sets of coordinates (points). + * + * Snake distance (rectilinear distance, Manhattan distance) is the sum of the horizontal and vertical distances. + * It's the effective distance when movement is allowed only horizontally or vertically (but not both). + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + */ + function Snake(x1: number, y1: number, x2: number, y2: number): number; + + /** + * Calculate the distance between two sets of coordinates (points), squared. + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + */ + function Squared(x1: number, y1: number, x2: number, y2: number): number; + + } + + namespace Easing { + namespace Back { + /** + * Back ease-in. + * @param v The value to be tweened. + * @param overshoot The overshoot amount. Default 1.70158. + */ + function In(v: number, overshoot?: number): number; + + /** + * Back ease-in/out. + * @param v The value to be tweened. + * @param overshoot The overshoot amount. Default 1.70158. + */ + function InOut(v: number, overshoot?: number): number; + + /** + * Back ease-out. + * @param v The value to be tweened. + * @param overshoot The overshoot amount. Default 1.70158. + */ + function Out(v: number, overshoot?: number): number; + + } + + namespace Bounce { + /** + * Bounce ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Bounce ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Bounce ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Circular { + /** + * Circular ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Circular ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Circular ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Cubic { + /** + * Cubic ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Cubic ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Cubic ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Elastic { + /** + * Elastic ease-in. + * @param v The value to be tweened. + * @param amplitude The amplitude of the elastic ease. Default 0.1. + * @param period Sets how tight the sine-wave is, where smaller values are tighter waves, which result in more cycles. Default 0.1. + */ + function In(v: number, amplitude?: number, period?: number): number; + + /** + * Elastic ease-in/out. + * @param v The value to be tweened. + * @param amplitude The amplitude of the elastic ease. Default 0.1. + * @param period Sets how tight the sine-wave is, where smaller values are tighter waves, which result in more cycles. Default 0.1. + */ + function InOut(v: number, amplitude?: number, period?: number): number; + + /** + * Elastic ease-out. + * @param v The value to be tweened. + * @param amplitude The amplitude of the elastic ease. Default 0.1. + * @param period Sets how tight the sine-wave is, where smaller values are tighter waves, which result in more cycles. Default 0.1. + */ + function Out(v: number, amplitude?: number, period?: number): number; + + } + + namespace Expo { + /** + * Exponential ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Exponential ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Exponential ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + /** + * Linear easing (no variation). + * @param v The value to be tweened. + */ + function Linear(v: number): number; + + namespace Quadratic { + /** + * Quadratic ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Quadratic ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Quadratic ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Quartic { + /** + * Quartic ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Quartic ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Quartic ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Quintic { + /** + * Quintic ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Quintic ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Quintic ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Sine { + /** + * Sinusoidal ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Sinusoidal ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Sinusoidal ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Stepped { + } + + /** + * Stepped easing. + * @param v The value to be tweened. + * @param steps The number of steps in the ease. Default 1. + */ + function Stepped(v: number, steps?: number): number; + + } + + class Euler { + /** + * + * @param x The x component. + * @param y The y component. + * @param z The z component. + */ + constructor(x?: number, y?: number, z?: number); + + } + + /** + * Calculates the factorial of a given number for integer values greater than 0. + * @param value A positive integer to calculate the factorial of. + */ + function Factorial(value: number): number; + + /** + * Generate a random floating point number between the two given bounds, minimum inclusive, maximum exclusive. + * @param min The lower bound for the float, inclusive. + * @param max The upper bound for the float exclusive. + */ + function FloatBetween(min: number, max: number): number; + + /** + * Floors to some place comparative to a `base`, default is 10 for decimal place. + * + * The `place` is represented by the power applied to `base` to get that place. + * @param value The value to round. + * @param place The place to round to. Default 0. + * @param base The base to round in. Default is 10 for decimal. Default 10. + */ + function FloorTo(value: number, place?: number, base?: number): number; + + /** + * Return a value based on the range between `min` and `max` and the percentage given. + * @param percent A value between 0 and 1 representing the percentage. + * @param min The minimum value. + * @param max The maximum value. + */ + function FromPercent(percent: number, min: number, max?: number): number; + + namespace Fuzzy { + /** + * Calculate the fuzzy ceiling of the given value. + * @param value The value. + * @param epsilon The epsilon. Default 0.0001. + */ + function Ceil(value: number, epsilon?: number): number; + + /** + * Check whether the given values are fuzzily equal. + * + * Two numbers are fuzzily equal if their difference is less than `epsilon`. + * @param a The first value. + * @param b The second value. + * @param epsilon The epsilon. Default 0.0001. + */ + function Equal(a: number, b: number, epsilon?: number): boolean; + + /** + * Calculate the fuzzy floor of the given value. + * @param value The value. + * @param epsilon The epsilon. Default 0.0001. + */ + function Floor(value: number, epsilon?: number): number; + + /** + * Check whether `a` is fuzzily greater than `b`. + * + * `a` is fuzzily greater than `b` if it is more than `b - epsilon`. + * @param a The first value. + * @param b The second value. + * @param epsilon The epsilon. Default 0.0001. + */ + function GreaterThan(a: number, b: number, epsilon?: number): boolean; + + /** + * Check whether `a` is fuzzily less than `b`. + * + * `a` is fuzzily less than `b` if it is less than `b + epsilon`. + * @param a The first value. + * @param b The second value. + * @param epsilon The epsilon. Default 0.0001. + */ + function LessThan(a: number, b: number, epsilon?: number): boolean; + + } + + /** + * Calculate a per-ms speed from a distance and time (given in seconds). + * @param distance The distance. + * @param time The time, in seconds. + */ + function GetSpeed(distance: number, time: number): number; + + namespace Interpolation { + /** + * A bezier interpolation method. + * @param v The input array of values to interpolate between. + * @param k The percentage of interpolation, between 0 and 1. + */ + function Bezier(v: number[], k: number): number; + + /** + * A Catmull-Rom interpolation method. + * @param v The input array of values to interpolate between. + * @param k The percentage of interpolation, between 0 and 1. + */ + function CatmullRom(v: number[], k: number): number; + + /** + * A cubic bezier interpolation method. + * + * https://medium.com/@adrian_cooney/bezier-interpolation-13b68563313a + * @param t The percentage of interpolation, between 0 and 1. + * @param p0 The start point. + * @param p1 The first control point. + * @param p2 The second control point. + * @param p3 The end point. + */ + function CubicBezier(t: number, p0: number, p1: number, p2: number, p3: number): number; + + /** + * A linear interpolation method. + * @param v The input array of values to interpolate between. + * @param k The percentage of interpolation, between 0 and 1. + */ + function Linear(v: number[], k: number): number; + + /** + * A quadratic bezier interpolation method. + * @param t The percentage of interpolation, between 0 and 1. + * @param p0 The start point. + * @param p1 The control point. + * @param p2 The end point. + */ + function QuadraticBezier(t: number, p0: number, p1: number, p2: number): number; + + /** + * A Smoother Step interpolation method. + * @param t The percentage of interpolation, between 0 and 1. + * @param min The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'. + * @param max The maximum value, also known as the 'right edge', assumed greater than the 'left edge'. + */ + function SmootherStep(t: number, min: number, max: number): number; + + /** + * A Smooth Step interpolation method. + * @param t The percentage of interpolation, between 0 and 1. + * @param min The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'. + * @param max The maximum value, also known as the 'right edge', assumed greater than the 'left edge'. + */ + function SmoothStep(t: number, min: number, max: number): number; + + } + + /** + * Check if a given value is an even number. + * @param value The number to perform the check with. + */ + function IsEven(value: number): boolean; + + /** + * Check if a given value is an even number using a strict type check. + * @param value The number to perform the check with. + */ + function IsEvenStrict(value: number): boolean; + + /** + * Calculates a linear (interpolation) value over t. + * @param p0 The first point. + * @param p1 The second point. + * @param t The percentage between p0 and p1 to return, represented as a number between 0 and 1. + */ + function Linear(p0: number, p1: number, t: number): number; + + /** + * Interpolates two given Vectors and returns a new Vector between them. + * + * Does not modify either of the passed Vectors. + * @param vector1 Starting vector + * @param vector2 Ending vector + * @param t The percentage between vector1 and vector2 to return, represented as a number between 0 and 1. Default 0. + */ + function LinearXY(vector1: Phaser.Math.Vector2, vector2: Phaser.Math.Vector2, t?: number): Phaser.Math.Vector2; + + /** + * A three-dimensional matrix. + * + * Defaults to the identity matrix when instantiated. + */ + class Matrix3 { + /** + * + * @param m Optional Matrix3 to copy values from. + */ + constructor(m?: Phaser.Math.Matrix3); + + /** + * The matrix values. + */ + val: Float32Array; + + /** + * Make a clone of this Matrix3. + */ + clone(): Phaser.Math.Matrix3; + + /** + * This method is an alias for `Matrix3.copy`. + * @param src The Matrix to set the values of this Matrix's from. + */ + set(src: Phaser.Math.Matrix3): Phaser.Math.Matrix3; + + /** + * Copy the values of a given Matrix into this Matrix. + * @param src The Matrix to copy the values from. + */ + copy(src: Phaser.Math.Matrix3): Phaser.Math.Matrix3; + + /** + * Copy the values of a given Matrix4 into this Matrix3. + * @param m The Matrix4 to copy the values from. + */ + fromMat4(m: Phaser.Math.Matrix4): Phaser.Math.Matrix3; + + /** + * Set the values of this Matrix from the given array. + * @param a The array to copy the values from. + */ + fromArray(a: any[]): Phaser.Math.Matrix3; + + /** + * Reset this Matrix to an identity (default) matrix. + */ + identity(): Phaser.Math.Matrix3; + + /** + * Transpose this Matrix. + */ + transpose(): Phaser.Math.Matrix3; + + /** + * Invert this Matrix. + */ + invert(): Phaser.Math.Matrix3; + + /** + * Calculate the adjoint, or adjugate, of this Matrix. + */ + adjoint(): Phaser.Math.Matrix3; + + /** + * Calculate the determinant of this Matrix. + */ + determinant(): number; + + /** + * Multiply this Matrix by the given Matrix. + * @param src The Matrix to multiply this Matrix by. + */ + multiply(src: Phaser.Math.Matrix3): Phaser.Math.Matrix3; + + /** + * Translate this Matrix using the given Vector. + * @param v The Vector to translate this Matrix with. + */ + translate(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): Phaser.Math.Matrix3; + + /** + * Apply a rotation transformation to this Matrix. + * @param rad The angle in radians to rotate by. + */ + rotate(rad: number): Phaser.Math.Matrix3; + + /** + * Apply a scale transformation to this Matrix. + * + * Uses the `x` and `y` components of the given Vector to scale the Matrix. + * @param v The Vector to scale this Matrix with. + */ + scale(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): Phaser.Math.Matrix3; + + /** + * Set the values of this Matrix from the given Quaternion. + * @param q The Quaternion to set the values of this Matrix from. + */ + fromQuat(q: Phaser.Math.Quaternion): Phaser.Math.Matrix3; + + /** + * Set the values of this Matrix3 to be normalized from the given Matrix4. + * @param m The Matrix4 to normalize the values from. + */ + normalFromMat4(m: Phaser.Math.Matrix4): Phaser.Math.Matrix3; + + } + + /** + * A four-dimensional matrix. + * + * Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji + * and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl + */ + class Matrix4 { + /** + * + * @param m Optional Matrix4 to copy values from. + */ + constructor(m?: Phaser.Math.Matrix4); + + /** + * The matrix values. + */ + val: Float32Array; + + /** + * Make a clone of this Matrix4. + */ + clone(): Phaser.Math.Matrix4; + + /** + * This method is an alias for `Matrix4.copy`. + * @param src The Matrix to set the values of this Matrix's from. + */ + set(src: Phaser.Math.Matrix4): this; + + /** + * Sets all values of this Matrix4. + * @param m00 The m00 value. + * @param m01 The m01 value. + * @param m02 The m02 value. + * @param m03 The m03 value. + * @param m10 The m10 value. + * @param m11 The m11 value. + * @param m12 The m12 value. + * @param m13 The m13 value. + * @param m20 The m20 value. + * @param m21 The m21 value. + * @param m22 The m22 value. + * @param m23 The m23 value. + * @param m30 The m30 value. + * @param m31 The m31 value. + * @param m32 The m32 value. + * @param m33 The m33 value. + */ + setValues(m00: number, m01: number, m02: number, m03: number, m10: number, m11: number, m12: number, m13: number, m20: number, m21: number, m22: number, m23: number, m30: number, m31: number, m32: number, m33: number): this; + + /** + * Copy the values of a given Matrix into this Matrix. + * @param src The Matrix to copy the values from. + */ + copy(src: Phaser.Math.Matrix4): this; + + /** + * Set the values of this Matrix from the given array. + * @param a The array to copy the values from. Must have at least 16 elements. + */ + fromArray(a: number[]): this; + + /** + * Reset this Matrix. + * + * Sets all values to `0`. + */ + zero(): Phaser.Math.Matrix4; + + /** + * Generates a transform matrix based on the given position, scale and rotation. + * @param position The position vector. + * @param scale The scale vector. + * @param rotation The rotation quaternion. + */ + transform(position: Phaser.Math.Vector3, scale: Phaser.Math.Vector3, rotation: Phaser.Math.Quaternion): this; + + /** + * Set the `x`, `y` and `z` values of this Matrix. + * @param x The x value. + * @param y The y value. + * @param z The z value. + */ + xyz(x: number, y: number, z: number): this; + + /** + * Set the scaling values of this Matrix. + * @param x The x scaling value. + * @param y The y scaling value. + * @param z The z scaling value. + */ + scaling(x: number, y: number, z: number): this; + + /** + * Reset this Matrix to an identity (default) matrix. + */ + identity(): this; + + /** + * Transpose this Matrix. + */ + transpose(): this; + + /** + * Copies the given Matrix4 into this Matrix and then inverses it. + * @param m The Matrix4 to invert into this Matrix4. + */ + getInverse(m: Phaser.Math.Matrix4): this; + + /** + * Invert this Matrix. + */ + invert(): this; + + /** + * Calculate the adjoint, or adjugate, of this Matrix. + */ + adjoint(): this; + + /** + * Calculate the determinant of this Matrix. + */ + determinant(): number; + + /** + * Multiply this Matrix by the given Matrix. + * @param src The Matrix to multiply this Matrix by. + */ + multiply(src: Phaser.Math.Matrix4): this; + + /** + * Multiply the values of this Matrix4 by those given in the `src` argument. + * @param src The source Matrix4 that this Matrix4 is multiplied by. + */ + multiplyLocal(src: Phaser.Math.Matrix4): this; + + /** + * Multiplies the given Matrix4 object with this Matrix. + * + * This is the same as calling `multiplyMatrices(m, this)`. + * @param m The Matrix4 to multiply with this one. + */ + premultiply(m: Phaser.Math.Matrix4): this; + + /** + * Multiplies the two given Matrix4 objects and stores the results in this Matrix. + * @param a The first Matrix4 to multiply. + * @param b The second Matrix4 to multiply. + */ + multiplyMatrices(a: Phaser.Math.Matrix4, b: Phaser.Math.Matrix4): this; + + /** + * Translate this Matrix using the given Vector. + * @param v The Vector to translate this Matrix with. + */ + translate(v: Phaser.Math.Vector3 | Phaser.Math.Vector4): this; + + /** + * Translate this Matrix using the given values. + * @param x The x component. + * @param y The y component. + * @param z The z component. + */ + translateXYZ(x: number, y: number, z: number): this; + + /** + * Apply a scale transformation to this Matrix. + * + * Uses the `x`, `y` and `z` components of the given Vector to scale the Matrix. + * @param v The Vector to scale this Matrix with. + */ + scale(v: Phaser.Math.Vector3 | Phaser.Math.Vector4): this; + + /** + * Apply a scale transformation to this Matrix. + * @param x The x component. + * @param y The y component. + * @param z The z component. + */ + scaleXYZ(x: number, y: number, z: number): this; + + /** + * Derive a rotation matrix around the given axis. + * @param axis The rotation axis. + * @param angle The rotation angle in radians. + */ + makeRotationAxis(axis: Phaser.Math.Vector3 | Phaser.Math.Vector4, angle: number): this; + + /** + * Apply a rotation transformation to this Matrix. + * @param rad The angle in radians to rotate by. + * @param axis The axis to rotate upon. + */ + rotate(rad: number, axis: Phaser.Math.Vector3): this; + + /** + * Rotate this matrix on its X axis. + * @param rad The angle in radians to rotate by. + */ + rotateX(rad: number): this; + + /** + * Rotate this matrix on its Y axis. + * @param rad The angle to rotate by, in radians. + */ + rotateY(rad: number): this; + + /** + * Rotate this matrix on its Z axis. + * @param rad The angle to rotate by, in radians. + */ + rotateZ(rad: number): this; + + /** + * Set the values of this Matrix from the given rotation Quaternion and translation Vector. + * @param q The Quaternion to set rotation from. + * @param v The Vector to set translation from. + */ + fromRotationTranslation(q: Phaser.Math.Quaternion, v: Phaser.Math.Vector3): this; + + /** + * Set the values of this Matrix from the given Quaternion. + * @param q The Quaternion to set the values of this Matrix from. + */ + fromQuat(q: Phaser.Math.Quaternion): this; + + /** + * Generate a frustum matrix with the given bounds. + * @param left The left bound of the frustum. + * @param right The right bound of the frustum. + * @param bottom The bottom bound of the frustum. + * @param top The top bound of the frustum. + * @param near The near bound of the frustum. + * @param far The far bound of the frustum. + */ + frustum(left: number, right: number, bottom: number, top: number, near: number, far: number): this; + + /** + * Generate a perspective projection matrix with the given bounds. + * @param fovy Vertical field of view in radians + * @param aspect Aspect ratio. Typically viewport width /height. + * @param near Near bound of the frustum. + * @param far Far bound of the frustum. + */ + perspective(fovy: number, aspect: number, near: number, far: number): this; + + /** + * Generate a perspective projection matrix with the given bounds. + * @param width The width of the frustum. + * @param height The height of the frustum. + * @param near Near bound of the frustum. + * @param far Far bound of the frustum. + */ + perspectiveLH(width: number, height: number, near: number, far: number): this; + + /** + * Generate an orthogonal projection matrix with the given bounds. + * @param left The left bound of the frustum. + * @param right The right bound of the frustum. + * @param bottom The bottom bound of the frustum. + * @param top The top bound of the frustum. + * @param near The near bound of the frustum. + * @param far The far bound of the frustum. + */ + ortho(left: number, right: number, bottom: number, top: number, near: number, far: number): this; + + /** + * Generate a right-handed look-at matrix with the given eye position, target and up axis. + * @param eye Position of the viewer. + * @param target Point the viewer is looking at. + * @param up vec3 pointing up. + */ + lookAtRH(eye: Phaser.Math.Vector3, target: Phaser.Math.Vector3, up: Phaser.Math.Vector3): this; + + /** + * Generate a look-at matrix with the given eye position, focal point, and up axis. + * @param eye Position of the viewer + * @param center Point the viewer is looking at + * @param up vec3 pointing up. + */ + lookAt(eye: Phaser.Math.Vector3, center: Phaser.Math.Vector3, up: Phaser.Math.Vector3): this; + + /** + * Set the values of this matrix from the given `yaw`, `pitch` and `roll` values. + * @param yaw The yaw value. + * @param pitch The pitch value. + * @param roll The roll value. + */ + yawPitchRoll(yaw: number, pitch: number, roll: number): this; + + /** + * Generate a world matrix from the given rotation, position, scale, view matrix and projection matrix. + * @param rotation The rotation of the world matrix. + * @param position The position of the world matrix. + * @param scale The scale of the world matrix. + * @param viewMatrix The view matrix. + * @param projectionMatrix The projection matrix. + */ + setWorldMatrix(rotation: Phaser.Math.Vector3, position: Phaser.Math.Vector3, scale: Phaser.Math.Vector3, viewMatrix?: Phaser.Math.Matrix4, projectionMatrix?: Phaser.Math.Matrix4): this; + + /** + * Multiplies this Matrix4 by the given `src` Matrix4 and stores the results in the `out` Matrix4. + * @param src The Matrix4 to multiply with this one. + * @param out The receiving Matrix. + */ + multiplyToMat4(src: Phaser.Math.Matrix4, out: Phaser.Math.Matrix4): Phaser.Math.Matrix4; + + /** + * Takes the rotation and position vectors and builds this Matrix4 from them. + * @param rotation The rotation vector. + * @param position The position vector. + * @param translateFirst Should the operation translate then rotate (`true`), or rotate then translate? (`false`) + */ + fromRotationXYTranslation(rotation: Phaser.Math.Vector3, position: Phaser.Math.Vector3, translateFirst: boolean): this; + + /** + * Returns the maximum axis scale from this Matrix4. + */ + getMaxScaleOnAxis(): number; + + } + + /** + * Add an `amount` to a `value`, limiting the maximum result to `max`. + * @param value The value to add to. + * @param amount The amount to add. + * @param max The maximum value to return. + */ + function MaxAdd(value: number, amount: number, max: number): number; + + /** + * Calculate the median of the given values. The values are sorted and the middle value is returned. + * In case of an even number of values, the average of the two middle values is returned. + * @param values The values to average. + */ + function Median(values: number[]): number; + + /** + * Subtract an `amount` from `value`, limiting the minimum result to `min`. + * @param value The value to subtract from. + * @param amount The amount to subtract. + * @param min The minimum value to return. + */ + function MinSub(value: number, amount: number, min: number): number; + + /** + * Work out what percentage `value` is of the range between `min` and `max`. + * If `max` isn't given then it will return the percentage of `value` to `min`. + * + * You can optionally specify an `upperMax` value, which is a mid-way point in the range that represents 100%, after which the % starts to go down to zero again. + * @param value The value to determine the percentage of. + * @param min The minimum value. + * @param max The maximum value. + * @param upperMax The mid-way point in the range that represents 100%. + */ + function Percent(value: number, min: number, max?: number, upperMax?: number): number; + + namespace Pow2 { + /** + * Returns the nearest power of 2 to the given `value`. + * @param value The value. + */ + function GetNext(value: number): number; + + /** + * Checks if the given `width` and `height` are a power of two. + * Useful for checking texture dimensions. + * @param width The width. + * @param height The height. + */ + function IsSize(width: number, height: number): boolean; + + /** + * Tests the value and returns `true` if it is a power of two. + * @param value The value to check if it's a power of two. + */ + function IsValue(value: number): boolean; + + } + + /** + * A quaternion. + */ + class Quaternion { + /** + * + * @param x The x component. Default 0. + * @param y The y component. Default 0. + * @param z The z component. Default 0. + * @param w The w component. Default 1. + */ + constructor(x?: number, y?: number, z?: number, w?: number); + + /** + * This callback is invoked, if set, each time a value in this quaternion is changed. + * The callback is passed one argument, a reference to this quaternion. + */ + onChangeCallback: Function; + + /** + * The x component of this Quaternion. + */ + x: number; + + /** + * The y component of this Quaternion. + */ + y: number; + + /** + * The z component of this Quaternion. + */ + z: number; + + /** + * The w component of this Quaternion. + */ + w: number; + + /** + * Copy the components of a given Quaternion or Vector into this Quaternion. + * @param src The Quaternion or Vector to copy the components from. + */ + copy(src: Phaser.Math.Quaternion | Phaser.Math.Vector4): Phaser.Math.Quaternion; + + /** + * Set the components of this Quaternion and optionally call the `onChangeCallback`. + * @param x The x component, or an object containing x, y, z, and w components. Default 0. + * @param y The y component. Default 0. + * @param z The z component. Default 0. + * @param w The w component. Default 0. + * @param update Call the `onChangeCallback`? Default true. + */ + set(x?: number | object, y?: number, z?: number, w?: number, update?: boolean): Phaser.Math.Quaternion; + + /** + * Add a given Quaternion or Vector to this Quaternion. Addition is component-wise. + * @param v The Quaternion or Vector to add to this Quaternion. + */ + add(v: Phaser.Math.Quaternion | Phaser.Math.Vector4): Phaser.Math.Quaternion; + + /** + * Subtract a given Quaternion or Vector from this Quaternion. Subtraction is component-wise. + * @param v The Quaternion or Vector to subtract from this Quaternion. + */ + subtract(v: Phaser.Math.Quaternion | Phaser.Math.Vector4): Phaser.Math.Quaternion; + + /** + * Scale this Quaternion by the given value. + * @param scale The value to scale this Quaternion by. + */ + scale(scale: number): Phaser.Math.Quaternion; + + /** + * Calculate the length of this Quaternion. + */ + length(): number; + + /** + * Calculate the length of this Quaternion squared. + */ + lengthSq(): number; + + /** + * Normalize this Quaternion. + */ + normalize(): Phaser.Math.Quaternion; + + /** + * Calculate the dot product of this Quaternion and the given Quaternion or Vector. + * @param v The Quaternion or Vector to dot product with this Quaternion. + */ + dot(v: Phaser.Math.Quaternion | Phaser.Math.Vector4): number; + + /** + * Linearly interpolate this Quaternion towards the given Quaternion or Vector. + * @param v The Quaternion or Vector to interpolate towards. + * @param t The percentage of interpolation. Default 0. + */ + lerp(v: Phaser.Math.Quaternion | Phaser.Math.Vector4, t?: number): Phaser.Math.Quaternion; + + /** + * Rotates this Quaternion based on the two given vectors. + * @param a The transform rotation vector. + * @param b The target rotation vector. + */ + rotationTo(a: Phaser.Math.Vector3, b: Phaser.Math.Vector3): Phaser.Math.Quaternion; + + /** + * Set the axes of this Quaternion. + * @param view The view axis. + * @param right The right axis. + * @param up The upwards axis. + */ + setAxes(view: Phaser.Math.Vector3, right: Phaser.Math.Vector3, up: Phaser.Math.Vector3): Phaser.Math.Quaternion; + + /** + * Reset this Matrix to an identity (default) Quaternion. + */ + identity(): Phaser.Math.Quaternion; + + /** + * Set the axis angle of this Quaternion. + * @param axis The axis. + * @param rad The angle in radians. + */ + setAxisAngle(axis: Phaser.Math.Vector3, rad: number): Phaser.Math.Quaternion; + + /** + * Multiply this Quaternion by the given Quaternion or Vector. + * @param b The Quaternion or Vector to multiply this Quaternion by. + */ + multiply(b: Phaser.Math.Quaternion | Phaser.Math.Vector4): Phaser.Math.Quaternion; + + /** + * Smoothly linearly interpolate this Quaternion towards the given Quaternion or Vector. + * @param b The Quaternion or Vector to interpolate towards. + * @param t The percentage of interpolation. + */ + slerp(b: Phaser.Math.Quaternion | Phaser.Math.Vector4, t: number): Phaser.Math.Quaternion; + + /** + * Invert this Quaternion. + */ + invert(): Phaser.Math.Quaternion; + + /** + * Convert this Quaternion into its conjugate. + * + * Sets the x, y and z components. + */ + conjugate(): Phaser.Math.Quaternion; + + /** + * Rotate this Quaternion on the X axis. + * @param rad The rotation angle in radians. + */ + rotateX(rad: number): Phaser.Math.Quaternion; + + /** + * Rotate this Quaternion on the Y axis. + * @param rad The rotation angle in radians. + */ + rotateY(rad: number): Phaser.Math.Quaternion; + + /** + * Rotate this Quaternion on the Z axis. + * @param rad The rotation angle in radians. + */ + rotateZ(rad: number): Phaser.Math.Quaternion; + + /** + * Create a unit (or rotation) Quaternion from its x, y, and z components. + * + * Sets the w component. + */ + calculateW(): Phaser.Math.Quaternion; + + /** + * Set this Quaternion from the given Euler, based on Euler order. + * @param euler The Euler to convert from. + * @param update Run the `onChangeCallback`? Default true. + */ + setFromEuler(euler: Phaser.Math.Euler, update?: boolean): Phaser.Math.Quaternion; + + /** + * Sets the rotation of this Quaternion from the given Matrix4. + * @param mat4 The Matrix4 to set the rotation from. + */ + setFromRotationMatrix(mat4: Phaser.Math.Matrix4): Phaser.Math.Quaternion; + + /** + * Convert the given Matrix into this Quaternion. + * @param mat The Matrix to convert from. + */ + fromMat3(mat: Phaser.Math.Matrix3): Phaser.Math.Quaternion; + + } + + /** + * Convert the given angle in radians, to the equivalent angle in degrees. + * @param radians The angle in radians to convert ot degrees. + */ + function RadToDeg(radians: number): number; + + /** + * A seeded Random Data Generator. + * + * Access via `Phaser.Math.RND` which is an instance of this class pre-defined + * by Phaser. Or, create your own instance to use as you require. + * + * The `Math.RND` generator is seeded by the Game Config property value `seed`. + * If no such config property exists, a random number is used. + * + * If you create your own instance of this class you should provide a seed for it. + * If no seed is given it will use a 'random' one based on Date.now. + */ + class RandomDataGenerator { + /** + * + * @param seeds The seeds to use for the random number generator. + */ + constructor(seeds?: string | string[]); + + /** + * Signs to choose from. + */ + signs: number[]; + + /** + * Initialize the state of the random data generator. + * @param seeds The seeds to initialize the random data generator with. + */ + init(seeds: string | string[]): void; + + /** + * Reset the seed of the random data generator. + * + * _Note_: the seed array is only processed up to the first `undefined` (or `null`) value, should such be present. + * @param seeds The array of seeds: the `toString()` of each value is used. + */ + sow(seeds: string[]): void; + + /** + * Returns a random integer between 0 and 2^32. + */ + integer(): number; + + /** + * Returns a random real number between 0 and 1. + */ + frac(): number; + + /** + * Returns a random real number between 0 and 2^32. + */ + real(): number; + + /** + * Returns a random integer between and including min and max. + * @param min The minimum value in the range. + * @param max The maximum value in the range. + */ + integerInRange(min: number, max: number): number; + + /** + * Returns a random integer between and including min and max. + * This method is an alias for RandomDataGenerator.integerInRange. + * @param min The minimum value in the range. + * @param max The maximum value in the range. + */ + between(min: number, max: number): number; + + /** + * Returns a random real number between min and max. + * @param min The minimum value in the range. + * @param max The maximum value in the range. + */ + realInRange(min: number, max: number): number; + + /** + * Returns a random real number between -1 and 1. + */ + normal(): number; + + /** + * Returns a valid RFC4122 version4 ID hex string from https://gist.github.com/1308368 + */ + uuid(): string; + + /** + * Returns a random element from within the given array. + * @param array The array to pick a random element from. + */ + pick(array: T[]): T; + + /** + * Returns a sign to be used with multiplication operator. + */ + sign(): number; + + /** + * Returns a random element from within the given array, favoring the earlier entries. + * @param array The array to pick a random element from. + */ + weightedPick(array: T[]): T; + + /** + * Returns a random timestamp between min and max, or between the beginning of 2000 and the end of 2020 if min and max aren't specified. + * @param min The minimum value in the range. + * @param max The maximum value in the range. + */ + timestamp(min: number, max: number): number; + + /** + * Returns a random angle between -180 and 180. + */ + angle(): number; + + /** + * Returns a random rotation in radians, between -3.141 and 3.141 + */ + rotation(): number; + + /** + * Gets or Sets the state of the generator. This allows you to retain the values + * that the generator is using between games, i.e. in a game save file. + * + * To seed this generator with a previously saved state you can pass it as the + * `seed` value in your game config, or call this method directly after Phaser has booted. + * + * Call this method with no parameters to return the current state. + * + * If providing a state it should match the same format that this method + * returns, which is a string with a header `!rnd` followed by the `c`, + * `s0`, `s1` and `s2` values respectively, each comma-delimited. + * @param state Generator state to be set. + */ + state(state?: string): string; + + /** + * Shuffles the given array, using the current seed. + * @param array The array to be shuffled. + */ + shuffle(array?: T[]): T[]; + + } + + /** + * Compute a random unit vector. + * + * Computes random values for the given vector between -1 and 1 that can be used to represent a direction. + * + * Optionally accepts a scale value to scale the resulting vector by. + * @param vector The Vector to compute random values for. + * @param scale The scale of the random values. Default 1. + */ + function RandomXY(vector: Phaser.Math.Vector2, scale?: number): Phaser.Math.Vector2; + + /** + * Compute a random position vector in a spherical area, optionally defined by the given radius. + * @param vec3 The Vector to compute random values for. + * @param radius The radius. Default 1. + */ + function RandomXYZ(vec3: Phaser.Math.Vector3, radius?: number): Phaser.Math.Vector3; + + /** + * Compute a random four-dimensional vector. + * @param vec4 The Vector to compute random values for. + * @param scale The scale of the random values. Default 1. + */ + function RandomXYZW(vec4: Phaser.Math.Vector4, scale?: number): Phaser.Math.Vector4; + + /** + * Rotate a given point by a given angle around the origin (0, 0), in an anti-clockwise direction. + * @param point The point to be rotated. + * @param angle The angle to be rotated by in an anticlockwise direction. + */ + function Rotate(point: Phaser.Geom.Point | object, angle: number): Phaser.Geom.Point; + + /** + * Rotate a `point` around `x` and `y` to the given `angle`, at the same distance. + * + * In polar notation, this maps a point from (r, t) to (r, angle), vs. the origin (x, y). + * @param point The point to be rotated. + * @param x The horizontal coordinate to rotate around. + * @param y The vertical coordinate to rotate around. + * @param angle The angle of rotation in radians. + */ + function RotateAround(point: T, x: number, y: number, angle: number): T; + + /** + * Rotate a `point` around `x` and `y` by the given `angle` and `distance`. + * + * In polar notation, this maps a point from (r, t) to (distance, t + angle), vs. the origin (x, y). + * @param point The point to be rotated. + * @param x The horizontal coordinate to rotate around. + * @param y The vertical coordinate to rotate around. + * @param angle The angle of rotation in radians. + * @param distance The distance from (x, y) to place the point at. + */ + function RotateAroundDistance(point: T, x: number, y: number, angle: number, distance: number): T; + + /** + * Position a `point` at the given `angle` and `distance` to (`x`, `y`). + * @param point The point to be positioned. + * @param x The horizontal coordinate to position from. + * @param y The vertical coordinate to position from. + * @param angle The angle of rotation in radians. + * @param distance The distance from (x, y) to place the point at. + */ + function RotateTo(point: T, x: number, y: number, angle: number, distance: number): T; + + /** + * Rotates a vector in place by axis angle. + * + * This is the same as transforming a point by an + * axis-angle quaternion, but it has higher precision. + * @param vec The vector to be rotated. + * @param axis The axis to rotate around. + * @param radians The angle of rotation in radians. + */ + function RotateVec3(vec: Phaser.Math.Vector3, axis: Phaser.Math.Vector3, radians: number): Phaser.Math.Vector3; + + /** + * Round a given number so it is further away from zero. That is, positive numbers are rounded up, and negative numbers are rounded down. + * @param value The number to round. + */ + function RoundAwayFromZero(value: number): number; + + /** + * Round a value to the given precision. + * + * For example: + * + * ```javascript + * RoundTo(123.456, 0) = 123 + * RoundTo(123.456, 1) = 120 + * RoundTo(123.456, 2) = 100 + * ``` + * + * To round the decimal, i.e. to round to precision, pass in a negative `place`: + * + * ```javascript + * RoundTo(123.456789, 0) = 123 + * RoundTo(123.456789, -1) = 123.5 + * RoundTo(123.456789, -2) = 123.46 + * RoundTo(123.456789, -3) = 123.457 + * ``` + * @param value The value to round. + * @param place The place to round to. Positive to round the units, negative to round the decimal. Default 0. + * @param base The base to round in. Default is 10 for decimal. Default 10. + */ + function RoundTo(value: number, place?: number, base?: number): number; + + /** + * Generate a series of sine and cosine values. + * @param length The number of values to generate. + * @param sinAmp The sine value amplitude. Default 1. + * @param cosAmp The cosine value amplitude. Default 1. + * @param frequency The frequency of the values. Default 1. + */ + function SinCosTableGenerator(length: number, sinAmp?: number, cosAmp?: number, frequency?: number): Phaser.Types.Math.SinCosTable; + + /** + * Calculate a smoother interpolation percentage of `x` between `min` and `max`. + * + * The function receives the number `x` as an argument and returns 0 if `x` is less than or equal to the left edge, + * 1 if `x` is greater than or equal to the right edge, and smoothly interpolates, using a Hermite polynomial, + * between 0 and 1 otherwise. + * + * Produces an even smoother interpolation than {@link Phaser.Math.SmoothStep}. + * @param x The input value. + * @param min The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'. + * @param max The maximum value, also known as the 'right edge', assumed greater than the 'left edge'. + */ + function SmootherStep(x: number, min: number, max: number): number; + + /** + * Calculate a smooth interpolation percentage of `x` between `min` and `max`. + * + * The function receives the number `x` as an argument and returns 0 if `x` is less than or equal to the left edge, + * 1 if `x` is greater than or equal to the right edge, and smoothly interpolates, using a Hermite polynomial, + * between 0 and 1 otherwise. + * @param x The input value. + * @param min The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'. + * @param max The maximum value, also known as the 'right edge', assumed greater than the 'left edge'. + */ + function SmoothStep(x: number, min: number, max: number): number; + + namespace Snap { + /** + * Snap a value to nearest grid slice, using ceil. + * + * Example: if you have an interval gap of `5` and a position of `12`... you will snap to `15`. + * As will `14` snap to `15`... but `16` will snap to `20`. + * @param value The value to snap. + * @param gap The interval gap of the grid. + * @param start Optional starting offset for gap. Default 0. + * @param divide If `true` it will divide the snapped value by the gap before returning. Default false. + */ + function Ceil(value: number, gap: number, start?: number, divide?: boolean): number; + + /** + * Snap a value to nearest grid slice, using floor. + * + * Example: if you have an interval gap of `5` and a position of `12`... you will snap to `10`. + * As will `14` snap to `10`... but `16` will snap to `15`. + * @param value The value to snap. + * @param gap The interval gap of the grid. + * @param start Optional starting offset for gap. Default 0. + * @param divide If `true` it will divide the snapped value by the gap before returning. Default false. + */ + function Floor(value: number, gap: number, start?: number, divide?: boolean): number; + + /** + * Snap a value to nearest grid slice, using rounding. + * + * Example: if you have an interval gap of `5` and a position of `12`... you will snap to `10` whereas `14` will snap to `15`. + * @param value The value to snap. + * @param gap The interval gap of the grid. + * @param start Optional starting offset for gap. Default 0. + * @param divide If `true` it will divide the snapped value by the gap before returning. Default false. + */ + function To(value: number, gap: number, start?: number, divide?: boolean): number; + + } + + /** + * Returns a Vector2 containing the x and y position of the given index in a `width` x `height` sized grid. + * + * For example, in a 6 x 4 grid, index 16 would equal x: 4 y: 2. + * + * If the given index is out of range an empty Vector2 is returned. + * @param index The position within the grid to get the x/y value for. + * @param width The width of the grid. + * @param height The height of the grid. + * @param out An optional Vector2 to store the result in. If not given, a new Vector2 instance will be created. + */ + function ToXY(index: number, width: number, height: number, out?: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Takes the `x` and `y` coordinates and transforms them into the same space as + * defined by the position, rotation and scale values. + * @param x The x coordinate to be transformed. + * @param y The y coordinate to be transformed. + * @param positionX Horizontal position of the transform point. + * @param positionY Vertical position of the transform point. + * @param rotation Rotation of the transform point, in radians. + * @param scaleX Horizontal scale of the transform point. + * @param scaleY Vertical scale of the transform point. + * @param output The output vector, point or object for the translated coordinates. + */ + function TransformXY(x: number, y: number, positionX: number, positionY: number, rotation: number, scaleX: number, scaleY: number, output?: Phaser.Math.Vector2 | Phaser.Geom.Point | object): Phaser.Math.Vector2 | Phaser.Geom.Point | object; + + /** + * A representation of a vector in 2D space. + * + * A two-component vector. + */ + class Vector2 { + /** + * + * @param x The x component, or an object with `x` and `y` properties. Default 0. + * @param y The y component. Default x. + */ + constructor(x?: number | Phaser.Types.Math.Vector2Like, y?: number); + + /** + * The x component of this Vector. + */ + x: number; + + /** + * The y component of this Vector. + */ + y: number; + + /** + * Make a clone of this Vector2. + */ + clone(): Phaser.Math.Vector2; + + /** + * Copy the components of a given Vector into this Vector. + * @param src The Vector to copy the components from. + */ + copy(src: Phaser.Types.Math.Vector2Like): Phaser.Math.Vector2; + + /** + * Set the component values of this Vector from a given Vector2Like object. + * @param obj The object containing the component values to set for this Vector. + */ + setFromObject(obj: Phaser.Types.Math.Vector2Like): Phaser.Math.Vector2; + + /** + * Set the `x` and `y` components of the this Vector to the given `x` and `y` values. + * @param x The x value to set for this Vector. + * @param y The y value to set for this Vector. Default x. + */ + set(x: number, y?: number): Phaser.Math.Vector2; + + /** + * This method is an alias for `Vector2.set`. + * @param x The x value to set for this Vector. + * @param y The y value to set for this Vector. Default x. + */ + setTo(x: number, y?: number): Phaser.Math.Vector2; + + /** + * Sets the `x` and `y` values of this object from a given polar coordinate. + * @param azimuth The angular coordinate, in radians. + * @param radius The radial coordinate (length). Default 1. + */ + setToPolar(azimuth: number, radius?: number): Phaser.Math.Vector2; + + /** + * Check whether this Vector is equal to a given Vector. + * + * Performs a strict equality check against each Vector's components. + * @param v The vector to compare with this Vector. + */ + equals(v: Phaser.Types.Math.Vector2Like): boolean; + + /** + * Check whether this Vector is approximately equal to a given Vector. + * @param v The vector to compare with this Vector. + * @param epsilon The tolerance value. Default 0.0001. + */ + fuzzyEquals(v: Phaser.Types.Math.Vector2Like, epsilon?: number): boolean; + + /** + * Calculate the angle between this Vector and the positive x-axis, in radians. + */ + angle(): number; + + /** + * Set the angle of this Vector. + * @param angle The angle, in radians. + */ + setAngle(angle: number): Phaser.Math.Vector2; + + /** + * Add a given Vector to this Vector. Addition is component-wise. + * @param src The Vector to add to this Vector. + */ + add(src: Phaser.Types.Math.Vector2Like): Phaser.Math.Vector2; + + /** + * Subtract the given Vector from this Vector. Subtraction is component-wise. + * @param src The Vector to subtract from this Vector. + */ + subtract(src: Phaser.Types.Math.Vector2Like): Phaser.Math.Vector2; + + /** + * Perform a component-wise multiplication between this Vector and the given Vector. + * + * Multiplies this Vector by the given Vector. + * @param src The Vector to multiply this Vector by. + */ + multiply(src: Phaser.Types.Math.Vector2Like): Phaser.Math.Vector2; + + /** + * Scale this Vector by the given value. + * @param value The value to scale this Vector by. + */ + scale(value: number): Phaser.Math.Vector2; + + /** + * Perform a component-wise division between this Vector and the given Vector. + * + * Divides this Vector by the given Vector. + * @param src The Vector to divide this Vector by. + */ + divide(src: Phaser.Types.Math.Vector2Like): Phaser.Math.Vector2; + + /** + * Negate the `x` and `y` components of this Vector. + */ + negate(): Phaser.Math.Vector2; + + /** + * Calculate the distance between this Vector and the given Vector. + * @param src The Vector to calculate the distance to. + */ + distance(src: Phaser.Types.Math.Vector2Like): number; + + /** + * Calculate the distance between this Vector and the given Vector, squared. + * @param src The Vector to calculate the distance to. + */ + distanceSq(src: Phaser.Types.Math.Vector2Like): number; + + /** + * Calculate the length (or magnitude) of this Vector. + */ + length(): number; + + /** + * Set the length (or magnitude) of this Vector. + */ + setLength(length: number): Phaser.Math.Vector2; + + /** + * Calculate the length of this Vector squared. + */ + lengthSq(): number; + + /** + * Normalize this Vector. + * + * Makes the vector a unit length vector (magnitude of 1) in the same direction. + */ + normalize(): Phaser.Math.Vector2; + + /** + * Rotate this Vector to its perpendicular, in the positive direction. + */ + normalizeRightHand(): Phaser.Math.Vector2; + + /** + * Rotate this Vector to its perpendicular, in the negative direction. + */ + normalizeLeftHand(): Phaser.Math.Vector2; + + /** + * Calculate the dot product of this Vector and the given Vector. + * @param src The Vector2 to dot product with this Vector2. + */ + dot(src: Phaser.Types.Math.Vector2Like): number; + + /** + * Calculate the cross product of this Vector and the given Vector. + * @param src The Vector2 to cross with this Vector2. + */ + cross(src: Phaser.Types.Math.Vector2Like): number; + + /** + * Linearly interpolate between this Vector and the given Vector. + * + * Interpolates this Vector towards the given Vector. + * @param src The Vector2 to interpolate towards. + * @param t The interpolation percentage, between 0 and 1. Default 0. + */ + lerp(src: Phaser.Types.Math.Vector2Like, t?: number): Phaser.Math.Vector2; + + /** + * Transform this Vector with the given Matrix. + * @param mat The Matrix3 to transform this Vector2 with. + */ + transformMat3(mat: Phaser.Math.Matrix3): Phaser.Math.Vector2; + + /** + * Transform this Vector with the given Matrix. + * @param mat The Matrix4 to transform this Vector2 with. + */ + transformMat4(mat: Phaser.Math.Matrix4): Phaser.Math.Vector2; + + /** + * Make this Vector the zero vector (0, 0). + */ + reset(): Phaser.Math.Vector2; + + /** + * Limit the length (or magnitude) of this Vector. + * @param max The maximum length. + */ + limit(max: number): Phaser.Math.Vector2; + + /** + * Reflect this Vector off a line defined by a normal. + * @param normal A vector perpendicular to the line. + */ + reflect(normal: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Reflect this Vector across another. + * @param axis A vector to reflect across. + */ + mirror(axis: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Rotate this Vector by an angle amount. + * @param delta The angle to rotate by, in radians. + */ + rotate(delta: number): Phaser.Math.Vector2; + + /** + * Project this Vector onto another. + * @param src The vector to project onto. + */ + project(src: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * A static zero Vector2 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly ZERO: Phaser.Math.Vector2; + + /** + * A static right Vector2 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly RIGHT: Phaser.Math.Vector2; + + /** + * A static left Vector2 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly LEFT: Phaser.Math.Vector2; + + /** + * A static up Vector2 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly UP: Phaser.Math.Vector2; + + /** + * A static down Vector2 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly DOWN: Phaser.Math.Vector2; + + /** + * A static one Vector2 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly ONE: Phaser.Math.Vector2; + + } + + /** + * A representation of a vector in 3D space. + * + * A three-component vector. + */ + class Vector3 { + /** + * + * @param x The x component. + * @param y The y component. + * @param z The z component. + */ + constructor(x?: number, y?: number, z?: number); + + /** + * The x component of this Vector. + */ + x: number; + + /** + * The y component of this Vector. + */ + y: number; + + /** + * The z component of this Vector. + */ + z: number; + + /** + * Set this Vector to point up. + * + * Sets the y component of the vector to 1, and the others to 0. + */ + up(): Phaser.Math.Vector3; + + /** + * Sets the components of this Vector to be the `Math.min` result from the given vector. + * @param v The Vector3 to check the minimum values against. + */ + min(v: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Sets the components of this Vector to be the `Math.max` result from the given vector. + * @param v The Vector3 to check the maximum values against. + */ + max(v: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Make a clone of this Vector3. + */ + clone(): Phaser.Math.Vector3; + + /** + * Adds the two given Vector3s and sets the results into this Vector3. + * @param a The first Vector to add. + * @param b The second Vector to add. + */ + addVectors(a: Phaser.Math.Vector3, b: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Calculate the cross (vector) product of two given Vectors. + * @param a The first Vector to multiply. + * @param b The second Vector to multiply. + */ + crossVectors(a: Phaser.Math.Vector3, b: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Check whether this Vector is equal to a given Vector. + * + * Performs a strict equality check against each Vector's components. + * @param v The Vector3 to compare against. + */ + equals(v: Phaser.Math.Vector3): boolean; + + /** + * Copy the components of a given Vector into this Vector. + * @param src The Vector to copy the components from. + */ + copy(src: Phaser.Math.Vector2 | Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Set the `x`, `y`, and `z` components of this Vector to the given `x`, `y`, and `z` values. + * @param x The x value to set for this Vector, or an object containing x, y and z components. + * @param y The y value to set for this Vector. + * @param z The z value to set for this Vector. + */ + set(x: number | object, y?: number, z?: number): Phaser.Math.Vector3; + + /** + * Sets the components of this Vector3 from the position of the given Matrix4. + * @param mat4 The Matrix4 to get the position from. + */ + setFromMatrixPosition(mat4: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Sets the components of this Vector3 from the Matrix4 column specified. + * @param mat4 The Matrix4 to get the column from. + * @param index The column index. + */ + setFromMatrixColumn(mat4: Phaser.Math.Matrix4, index: number): Phaser.Math.Vector3; + + /** + * Sets the components of this Vector3 from the given array, based on the offset. + * + * Vector3.x = array[offset] + * Vector3.y = array[offset + 1] + * Vector3.z = array[offset + 2] + * @param array The array of values to get this Vector from. + * @param offset The offset index into the array. Default 0. + */ + fromArray(array: number[], offset?: number): Phaser.Math.Vector3; + + /** + * Add a given Vector to this Vector. Addition is component-wise. + * @param v The Vector to add to this Vector. + */ + add(v: Phaser.Math.Vector2 | Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Add the given value to each component of this Vector. + * @param s The amount to add to this Vector. + */ + addScalar(s: number): Phaser.Math.Vector3; + + /** + * Add and scale a given Vector to this Vector. Addition is component-wise. + * @param v The Vector to add to this Vector. + * @param scale The amount to scale `v` by. + */ + addScale(v: Phaser.Math.Vector2 | Phaser.Math.Vector3, scale: number): Phaser.Math.Vector3; + + /** + * Subtract the given Vector from this Vector. Subtraction is component-wise. + * @param v The Vector to subtract from this Vector. + */ + subtract(v: Phaser.Math.Vector2 | Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Perform a component-wise multiplication between this Vector and the given Vector. + * + * Multiplies this Vector by the given Vector. + * @param v The Vector to multiply this Vector by. + */ + multiply(v: Phaser.Math.Vector2 | Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Scale this Vector by the given value. + * @param scale The value to scale this Vector by. + */ + scale(scale: number): Phaser.Math.Vector3; + + /** + * Perform a component-wise division between this Vector and the given Vector. + * + * Divides this Vector by the given Vector. + * @param v The Vector to divide this Vector by. + */ + divide(v: Phaser.Math.Vector2 | Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Negate the `x`, `y` and `z` components of this Vector. + */ + negate(): Phaser.Math.Vector3; + + /** + * Calculate the distance between this Vector and the given Vector. + * @param v The Vector to calculate the distance to. + */ + distance(v: Phaser.Math.Vector2 | Phaser.Math.Vector3): number; + + /** + * Calculate the distance between this Vector and the given Vector, squared. + * @param v The Vector to calculate the distance to. + */ + distanceSq(v: Phaser.Math.Vector2 | Phaser.Math.Vector3): number; + + /** + * Calculate the length (or magnitude) of this Vector. + */ + length(): number; + + /** + * Calculate the length of this Vector squared. + */ + lengthSq(): number; + + /** + * Normalize this Vector. + * + * Makes the vector a unit length vector (magnitude of 1) in the same direction. + */ + normalize(): Phaser.Math.Vector3; + + /** + * Calculate the dot product of this Vector and the given Vector. + * @param v The Vector3 to dot product with this Vector3. + */ + dot(v: Phaser.Math.Vector3): number; + + /** + * Calculate the cross (vector) product of this Vector (which will be modified) and the given Vector. + * @param v The Vector to cross product with. + */ + cross(v: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Linearly interpolate between this Vector and the given Vector. + * + * Interpolates this Vector towards the given Vector. + * @param v The Vector3 to interpolate towards. + * @param t The interpolation percentage, between 0 and 1. Default 0. + */ + lerp(v: Phaser.Math.Vector3, t?: number): Phaser.Math.Vector3; + + /** + * Takes a Matrix3 and applies it to this Vector3. + * @param mat3 The Matrix3 to apply to this Vector3. + */ + applyMatrix3(mat3: Phaser.Math.Matrix3): Phaser.Math.Vector3; + + /** + * Takes a Matrix4 and applies it to this Vector3. + * @param mat4 The Matrix4 to apply to this Vector3. + */ + applyMatrix4(mat4: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Transform this Vector with the given Matrix. + * @param mat The Matrix3 to transform this Vector3 with. + */ + transformMat3(mat: Phaser.Math.Matrix3): Phaser.Math.Vector3; + + /** + * Transform this Vector with the given Matrix4. + * @param mat The Matrix4 to transform this Vector3 with. + */ + transformMat4(mat: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Transforms the coordinates of this Vector3 with the given Matrix4. + * @param mat The Matrix4 to transform this Vector3 with. + */ + transformCoordinates(mat: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Transform this Vector with the given Quaternion. + * @param q The Quaternion to transform this Vector with. + */ + transformQuat(q: Phaser.Math.Quaternion): Phaser.Math.Vector3; + + /** + * Multiplies this Vector3 by the specified matrix, applying a W divide. This is useful for projection, + * e.g. unprojecting a 2D point into 3D space. + * @param mat The Matrix4 to multiply this Vector3 with. + */ + project(mat: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Multiplies this Vector3 by the given view and projection matrices. + * @param viewMatrix A View Matrix. + * @param projectionMatrix A Projection Matrix. + */ + projectViewMatrix(viewMatrix: Phaser.Math.Matrix4, projectionMatrix: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Multiplies this Vector3 by the given inversed projection matrix and world matrix. + * @param projectionMatrix An inversed Projection Matrix. + * @param worldMatrix A World View Matrix. + */ + unprojectViewMatrix(projectionMatrix: Phaser.Math.Matrix4, worldMatrix: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Unproject this point from 2D space to 3D space. + * The point should have its x and y properties set to + * 2D screen space, and the z either at 0 (near plane) + * or 1 (far plane). The provided matrix is assumed to already + * be combined, i.e. projection * view * model. + * + * After this operation, this vector's (x, y, z) components will + * represent the unprojected 3D coordinate. + * @param viewport Screen x, y, width and height in pixels. + * @param invProjectionView Combined projection and view matrix. + */ + unproject(viewport: Phaser.Math.Vector4, invProjectionView: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Make this Vector the zero vector (0, 0, 0). + */ + reset(): Phaser.Math.Vector3; + + /** + * A static zero Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly ZERO: Phaser.Math.Vector3; + + /** + * A static right Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly RIGHT: Phaser.Math.Vector3; + + /** + * A static left Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly LEFT: Phaser.Math.Vector3; + + /** + * A static up Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly UP: Phaser.Math.Vector3; + + /** + * A static down Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly DOWN: Phaser.Math.Vector3; + + /** + * A static forward Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly FORWARD: Phaser.Math.Vector3; + + /** + * A static back Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly BACK: Phaser.Math.Vector3; + + /** + * A static one Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly ONE: Phaser.Math.Vector3; + + } + + /** + * A representation of a vector in 4D space. + * + * A four-component vector. + */ + class Vector4 { + /** + * + * @param x The x component. + * @param y The y component. + * @param z The z component. + * @param w The w component. + */ + constructor(x?: number, y?: number, z?: number, w?: number); + + /** + * The x component of this Vector. + */ + x: number; + + /** + * The y component of this Vector. + */ + y: number; + + /** + * The z component of this Vector. + */ + z: number; + + /** + * The w component of this Vector. + */ + w: number; + + /** + * Make a clone of this Vector4. + */ + clone(): Phaser.Math.Vector4; + + /** + * Copy the components of a given Vector into this Vector. + * @param src The Vector to copy the components from. + */ + copy(src: Phaser.Math.Vector4): Phaser.Math.Vector4; + + /** + * Check whether this Vector is equal to a given Vector. + * + * Performs a strict quality check against each Vector's components. + * @param v The vector to check equality with. + */ + equals(v: Phaser.Math.Vector4): boolean; + + /** + * Set the `x`, `y`, `z` and `w` components of the this Vector to the given `x`, `y`, `z` and `w` values. + * @param x The x value to set for this Vector, or an object containing x, y, z and w components. + * @param y The y value to set for this Vector. + * @param z The z value to set for this Vector. + * @param w The z value to set for this Vector. + */ + set(x: number | object, y: number, z: number, w: number): Phaser.Math.Vector4; + + /** + * Add a given Vector to this Vector. Addition is component-wise. + * @param v The Vector to add to this Vector. + */ + add(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): Phaser.Math.Vector4; + + /** + * Subtract the given Vector from this Vector. Subtraction is component-wise. + * @param v The Vector to subtract from this Vector. + */ + subtract(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): Phaser.Math.Vector4; + + /** + * Scale this Vector by the given value. + * @param scale The value to scale this Vector by. + */ + scale(scale: number): Phaser.Math.Vector4; + + /** + * Calculate the length (or magnitude) of this Vector. + */ + length(): number; + + /** + * Calculate the length of this Vector squared. + */ + lengthSq(): number; + + /** + * Normalize this Vector. + * + * Makes the vector a unit length vector (magnitude of 1) in the same direction. + */ + normalize(): Phaser.Math.Vector4; + + /** + * Calculate the dot product of this Vector and the given Vector. + * @param v The Vector4 to dot product with this Vector4. + */ + dot(v: Phaser.Math.Vector4): number; + + /** + * Linearly interpolate between this Vector and the given Vector. + * + * Interpolates this Vector towards the given Vector. + * @param v The Vector4 to interpolate towards. + * @param t The interpolation percentage, between 0 and 1. Default 0. + */ + lerp(v: Phaser.Math.Vector4, t?: number): Phaser.Math.Vector4; + + /** + * Perform a component-wise multiplication between this Vector and the given Vector. + * + * Multiplies this Vector by the given Vector. + * @param v The Vector to multiply this Vector by. + */ + multiply(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): Phaser.Math.Vector4; + + /** + * Perform a component-wise division between this Vector and the given Vector. + * + * Divides this Vector by the given Vector. + * @param v The Vector to divide this Vector by. + */ + divide(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): Phaser.Math.Vector4; + + /** + * Calculate the distance between this Vector and the given Vector. + * @param v The Vector to calculate the distance to. + */ + distance(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): number; + + /** + * Calculate the distance between this Vector and the given Vector, squared. + * @param v The Vector to calculate the distance to. + */ + distanceSq(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): number; + + /** + * Negate the `x`, `y`, `z` and `w` components of this Vector. + */ + negate(): Phaser.Math.Vector4; + + /** + * Transform this Vector with the given Matrix. + * @param mat The Matrix4 to transform this Vector4 with. + */ + transformMat4(mat: Phaser.Math.Matrix4): Phaser.Math.Vector4; + + /** + * Transform this Vector with the given Quaternion. + * @param q The Quaternion to transform this Vector with. + */ + transformQuat(q: Phaser.Math.Quaternion): Phaser.Math.Vector4; + + /** + * Make this Vector the zero vector (0, 0, 0, 0). + */ + reset(): Phaser.Math.Vector4; + + } + + /** + * Checks if the two values are within the given `tolerance` of each other. + * @param a The first value to use in the calculation. + * @param b The second value to use in the calculation. + * @param tolerance The tolerance. Anything equal to or less than this value is considered as being within range. + */ + function Within(a: number, b: number, tolerance: number): boolean; + + /** + * Wrap the given `value` between `min` and `max`. + * @param value The value to wrap. + * @param min The minimum value. + * @param max The maximum value. + */ + function Wrap(value: number, min: number, max: number): number; + + } + + /** + * The root types namespace. + */ + namespace Types { + namespace Actions { + type CallCallback = (item: Phaser.GameObjects.GameObject)=>void; + + type GridAlignConfig = { + /** + * The width of the grid in items (not pixels). -1 means lay all items out horizontally, regardless of quantity. + * If both this value and height are set to -1 then this value overrides it and the `height` value is ignored. + */ + width?: number; + /** + * The height of the grid in items (not pixels). -1 means lay all items out vertically, regardless of quantity. + * If both this value and `width` are set to -1 then `width` overrides it and this value is ignored. + */ + height?: number; + /** + * The width of the cell, in pixels, in which the item is positioned. + */ + cellWidth?: number; + /** + * The height of the cell, in pixels, in which the item is positioned. + */ + cellHeight?: number; + /** + * The alignment position. One of the Phaser.Display.Align consts such as `TOP_LEFT` or `RIGHT_CENTER`. + */ + position?: number; + /** + * Optionally place the top-left of the final grid at this coordinate. + */ + x?: number; + /** + * Optionally place the top-left of the final grid at this coordinate. + */ + y?: number; + }; + + } + + namespace Animations { + type Animation = { + /** + * The key that the animation will be associated with. i.e. sprite.animations.play(key) + */ + key?: string; + /** + * Either a string, in which case it will use all frames from a texture with the matching key, or an array of Animation Frame configuration objects. + */ + frames?: string | Phaser.Types.Animations.AnimationFrame[]; + /** + * If you provide a string for `frames` you can optionally have the frame names numerically sorted. + */ + sortFrames?: boolean; + /** + * The key of the texture all frames of the animation will use. Can be overridden on a per frame basis. + */ + defaultTextureKey?: string; + /** + * The frame rate of playback in frames per second (default 24 if duration is null) + */ + frameRate?: number; + /** + * How long the animation should play for in milliseconds. If not given its derived from frameRate. + */ + duration?: number; + /** + * Skip frames if the time lags, or always advanced anyway? + */ + skipMissedFrames?: boolean; + /** + * Delay before starting playback. Value given in milliseconds. + */ + delay?: number; + /** + * Number of times to repeat the animation (-1 for infinity) + */ + repeat?: number; + /** + * Delay before the animation repeats. Value given in milliseconds. + */ + repeatDelay?: number; + /** + * Should the animation yoyo? (reverse back down to the start) before repeating? + */ + yoyo?: boolean; + /** + * If this animation has a delay, should it show the first frame immediately (true), or only after the delay (false) + */ + showBeforeDelay?: boolean; + /** + * Should sprite.visible = true when the animation starts to play? This happens _after_ any delay, if set. + */ + showOnStart?: boolean; + /** + * Should sprite.visible = false when the animation finishes? + */ + hideOnComplete?: boolean; + /** + * Start playback of this animation from a randomly selected frame? + */ + randomFrame?: boolean; + }; + + type AnimationFrame = { + /** + * The key of the texture within the Texture Manager to use for this Animation Frame. + */ + key?: string; + /** + * The key, or index number, of the frame within the texture to use for this Animation Frame. + */ + frame?: string | number; + /** + * The duration, in ms, of this frame of the animation. + */ + duration?: number; + /** + * Should the parent Game Object be visible during this frame of the animation? + */ + visible?: boolean; + }; + + type GenerateFrameNames = { + /** + * The string to append to every resulting frame name if using a range or an array of `frames`. + */ + prefix?: string; + /** + * If `frames` is not provided, the number of the first frame to return. + */ + start?: number; + /** + * If `frames` is not provided, the number of the last frame to return. + */ + end?: number; + /** + * The string to append to every resulting frame name if using a range or an array of `frames`. + */ + suffix?: string; + /** + * The minimum expected lengths of each resulting frame's number. Numbers will be left-padded with zeroes until they are this long, then prepended and appended to create the resulting frame name. + */ + zeroPad?: number; + /** + * The array to append the created configuration objects to. + */ + outputArray?: Phaser.Types.Animations.AnimationFrame[]; + /** + * If provided as an array, the range defined by `start` and `end` will be ignored and these frame numbers will be used. + */ + frames?: boolean | number[]; + }; + + type GenerateFrameNumbers = { + /** + * The starting frame of the animation. + */ + start?: number; + /** + * The ending frame of the animation. + */ + end?: number; + /** + * A frame to put at the beginning of the animation, before `start` or `outputArray` or `frames`. + */ + first?: boolean | number; + /** + * An array to concatenate the output onto. + */ + outputArray?: Phaser.Types.Animations.AnimationFrame[]; + /** + * A custom sequence of frames. + */ + frames?: boolean | number[]; + }; + + type JSONAnimation = { + /** + * The key that the animation will be associated with. i.e. sprite.animations.play(key) + */ + key: string; + /** + * A frame based animation (as opposed to a bone based animation) + */ + type: string; + /** + * An array of the AnimationFrame objects inside this Animation. + */ + frames: Phaser.Types.Animations.JSONAnimationFrame[]; + /** + * The frame rate of playback in frames per second (default 24 if duration is null) + */ + frameRate: number; + /** + * How long the animation should play for in milliseconds. If not given its derived from frameRate. + */ + duration: number; + /** + * Skip frames if the time lags, or always advanced anyway? + */ + skipMissedFrames: boolean; + /** + * Delay before starting playback. Value given in milliseconds. + */ + delay: number; + /** + * Number of times to repeat the animation (-1 for infinity) + */ + repeat: number; + /** + * Delay before the animation repeats. Value given in milliseconds. + */ + repeatDelay: number; + /** + * Should the animation yoyo? (reverse back down to the start) before repeating? + */ + yoyo: boolean; + /** + * If this animation has a delay, should it show the first frame immediately (true), or only after the delay (false) + */ + showBeforeDelay: boolean; + /** + * Should sprite.visible = true when the animation starts to play? + */ + showOnStart: boolean; + /** + * Should sprite.visible = false when the animation finishes? + */ + hideOnComplete: boolean; + /** + * Start playback of this animation from a randomly selected frame? + */ + randomFrame?: boolean; + }; + + type JSONAnimationFrame = { + /** + * The key of the Texture this AnimationFrame uses. + */ + key: string; + /** + * The key of the Frame within the Texture that this AnimationFrame uses. + */ + frame: string | number; + /** + * Additional time (in ms) that this frame should appear for during playback. + */ + duration: number; + }; + + type JSONAnimations = { + /** + * An array of all Animations added to the Animation Manager. + */ + anims: Phaser.Types.Animations.JSONAnimation[]; + /** + * The global time scale of the Animation Manager. + */ + globalTimeScale: number; + }; + + type PlayAnimationConfig = { + /** + * The string-based key of the animation to play, or an Animation instance. + */ + key: string | Phaser.Animations.Animation; + /** + * The frame rate of playback in frames per second (default 24 if duration is null) + */ + frameRate?: number; + /** + * How long the animation should play for in milliseconds. If not given its derived from frameRate. + */ + duration?: number; + /** + * Delay before starting playback. Value given in milliseconds. + */ + delay?: number; + /** + * Number of times to repeat the animation (-1 for infinity) + */ + repeat?: number; + /** + * Delay before the animation repeats. Value given in milliseconds. + */ + repeatDelay?: number; + /** + * Should the animation yoyo? (reverse back down to the start) before repeating? + */ + yoyo?: boolean; + /** + * If this animation has a delay, should it show the first frame immediately (true), or only after the delay (false) + */ + showBeforeDelay?: boolean; + /** + * Should sprite.visible = true when the animation starts to play? + */ + showOnStart?: boolean; + /** + * Should sprite.visible = false when the animation finishes? + */ + hideOnComplete?: boolean; + /** + * Skip frames if the time lags, or always advanced anyway? + */ + skipMissedFrames?: boolean; + /** + * The frame of the animation to start playback from. + */ + startFrame?: number; + /** + * The time scale to be applied to playback of this animation. + */ + timeScale?: number; + /** + * Start playback of this animation from a randomly selected frame? + */ + randomFrame?: boolean; + }; + + } + + namespace Cameras { + namespace Scene2D { + type CameraConfig = { + /** + * The name of the Camera. + */ + name?: string; + /** + * The horizontal position of the Camera viewport. + */ + x?: number; + /** + * The vertical position of the Camera viewport. + */ + y?: number; + /** + * The width of the Camera viewport. + */ + width?: number; + /** + * The height of the Camera viewport. + */ + height?: number; + /** + * The default zoom level of the Camera. + */ + zoom?: number; + /** + * The rotation of the Camera, in radians. + */ + rotation?: number; + /** + * Should the Camera round pixels before rendering? + */ + roundPixels?: boolean; + /** + * The horizontal scroll position of the Camera. + */ + scrollX?: number; + /** + * The vertical scroll position of the Camera. + */ + scrollY?: number; + /** + * A CSS color string controlling the Camera background color. + */ + backgroundColor?: false | string; + /** + * Defines the Camera bounds. + */ + bounds?: object | null; + /** + * The top-left extent of the Camera bounds. + */ + "bounds.x"?: number; + /** + * The top-left extent of the Camera bounds. + */ + "bounds.y"?: number; + /** + * The width of the Camera bounds. + */ + "bounds.width"?: number; + /** + * The height of the Camera bounds. + */ + "bounds.height"?: number; + }; + + type CameraFadeCallback = (camera: Phaser.Cameras.Scene2D.Camera, progress: number)=>void; + + type CameraFlashCallback = (camera: Phaser.Cameras.Scene2D.Camera, progress: number)=>void; + + type CameraPanCallback = (camera: Phaser.Cameras.Scene2D.Camera, progress: number, x: number, y: number)=>void; + + type CameraShakeCallback = (camera: Phaser.Cameras.Scene2D.Camera, progress: number)=>void; + + type CameraZoomCallback = (camera: Phaser.Cameras.Scene2D.Camera, progress: number, zoom: number)=>void; + + type JSONCamera = { + /** + * The name of the camera + */ + name: string; + /** + * The horizontal position of camera + */ + x: number; + /** + * The vertical position of camera + */ + y: number; + /** + * The width size of camera + */ + width: number; + /** + * The height size of camera + */ + height: number; + /** + * The zoom of camera + */ + zoom: number; + /** + * The rotation of camera + */ + rotation: number; + /** + * The round pixels st status of camera + */ + roundPixels: boolean; + /** + * The horizontal scroll of camera + */ + scrollX: number; + /** + * The vertical scroll of camera + */ + scrollY: number; + /** + * The background color of camera + */ + backgroundColor: string; + /** + * The bounds of camera + */ + bounds?: Phaser.Types.Cameras.Scene2D.JSONCameraBounds | undefined; + }; + + type JSONCameraBounds = { + /** + * The horizontal position of camera + */ + x: number; + /** + * The vertical position of camera + */ + y: number; + /** + * The width size of camera + */ + width: number; + /** + * The height size of camera + */ + height: number; + }; + + } + + namespace Controls { + type FixedKeyControlConfig = { + /** + * The Camera that this Control will update. + */ + camera?: Phaser.Cameras.Scene2D.Camera; + /** + * The Key to be pressed that will move the Camera left. + */ + left?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will move the Camera right. + */ + right?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will move the Camera up. + */ + up?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will move the Camera down. + */ + down?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will zoom the Camera in. + */ + zoomIn?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will zoom the Camera out. + */ + zoomOut?: Phaser.Input.Keyboard.Key; + /** + * The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed. + */ + zoomSpeed?: number; + /** + * The horizontal and vertical speed the camera will move. + */ + speed?: number | Object; + /** + * The smallest zoom value the camera will reach when zoomed out. + */ + minZoom?: number; + /** + * The largest zoom value the camera will reach when zoomed in. + */ + maxZoom?: number; + }; + + type SmoothedKeyControlConfig = { + /** + * The Camera that this Control will update. + */ + camera?: Phaser.Cameras.Scene2D.Camera; + /** + * The Key to be pressed that will move the Camera left. + */ + left?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will move the Camera right. + */ + right?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will move the Camera up. + */ + up?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will move the Camera down. + */ + down?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will zoom the Camera in. + */ + zoomIn?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will zoom the Camera out. + */ + zoomOut?: Phaser.Input.Keyboard.Key; + /** + * The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed. + */ + zoomSpeed?: number; + /** + * The horizontal and vertical acceleration the camera will move. + */ + acceleration?: number | Object; + /** + * The horizontal and vertical drag applied to the camera when it is moving. + */ + drag?: number | Object; + /** + * The maximum horizontal and vertical speed the camera will move. + */ + maxSpeed?: number | Object; + /** + * The smallest zoom value the camera will reach when zoomed out. + */ + minZoom?: number; + /** + * The largest zoom value the camera will reach when zoomed in. + */ + maxZoom?: number; + }; + + } + + } + + namespace Core { + /** + * Config object containing various sound settings. + */ + type AudioConfig = { + /** + * Use HTML5 Audio instead of Web Audio. + */ + disableWebAudio?: boolean; + /** + * An existing Web Audio context. + */ + context?: AudioContext; + /** + * Disable all audio output. + */ + noAudio?: boolean; + }; + + type BannerConfig = { + /** + * Omit Phaser's name and version from the banner. + */ + hidePhaser?: boolean; + /** + * The color of the banner text. + */ + text?: string; + /** + * The background colors of the banner. + */ + background?: string[]; + }; + + type BootCallback = (game: Phaser.Game)=>void; + + type CallbacksConfig = { + /** + * A function to run at the start of the boot sequence. + */ + preBoot?: Phaser.Types.Core.BootCallback; + /** + * A function to run at the end of the boot sequence. At this point, all the game systems have started and plugins have been loaded. + */ + postBoot?: Phaser.Types.Core.BootCallback; + }; + + type DOMContainerConfig = { + /** + * Should the game create a div element to act as a DOM Container? Only enable if you're using DOM Element objects. You must provide a parent object if you use this feature. + */ + createContainer?: boolean; + /** + * Should the DOM Container that is created (if `dom.createContainer` is true) be positioned behind (true) or over the top (false, the default) of the game canvas? + */ + behindCanvas?: boolean; + /** + * The default `pointerEvents` attribute set on the DOM Container. + */ + pointerEvents?: string; + }; + + type FPSConfig = { + /** + * The minimum acceptable rendering rate, in frames per second. + */ + min?: number; + /** + * The optimum rendering rate, in frames per second. This does not enforce the fps rate, it merely tells Phaser what rate is considered optimal for this game. + */ + target?: number; + /** + * Enforces an fps rate limit that the game step will run at, regardless of browser frequency. 0 means 'no limit'. Never set this higher than RAF can handle. + */ + limit?: number; + /** + * Use setTimeout instead of requestAnimationFrame to run the game loop. + */ + forceSetTimeOut?: boolean; + /** + * Calculate the average frame delta from this many consecutive frame intervals. + */ + deltaHistory?: number; + /** + * The amount of frames the time step counts before we trust the delta values again. + */ + panicMax?: number; + /** + * Apply delta smoothing during the game update to help avoid spikes? + */ + smoothStep?: boolean; + }; + + type GameConfig = { + /** + * The width of the game, in game pixels. + */ + width?: number | string; + /** + * The height of the game, in game pixels. + */ + height?: number | string; + /** + * Simple scale applied to the game canvas. 2 is double size, 0.5 is half size, etc. + */ + zoom?: number; + /** + * Which renderer to use. Phaser.AUTO, Phaser.CANVAS, Phaser.HEADLESS, or Phaser.WEBGL. AUTO picks WEBGL if available, otherwise CANVAS. + */ + type?: number; + /** + * `true` or `1` = Use the built-in StableSort (needed for older browsers), `false` or `0` = Rely on ES2019 Array.sort being stable (modern browsers only), or `-1` = Try and determine this automatically based on browser inspection (not guaranteed to work, errs on side of caution). + */ + stableSort?: number | boolean; + /** + * The DOM element that will contain the game canvas, or its `id`. If undefined, or if the named element doesn't exist, the game canvas is appended to the document body. If `null` no parent will be used and you are responsible for adding the canvas to the dom. + */ + parent?: HTMLElement | string; + /** + * Provide your own Canvas element for Phaser to use instead of creating one. + */ + canvas?: HTMLCanvasElement; + /** + * CSS styles to apply to the game canvas instead of Phasers default styles. + */ + canvasStyle?: string; + /** + * Is Phaser running under a custom (non-native web) environment? If so, set this to `true` to skip internal Feature detection. If `true` the `renderType` cannot be left as `AUTO`. + */ + customEnvironment?: boolean; + /** + * Provide your own Canvas Context for Phaser to use, instead of creating one. + */ + context?: CanvasRenderingContext2D; + /** + * A scene or scenes to add to the game. If several are given, the first is started; the remainder are started only if they have `{ active: true }`. See the `sceneConfig` argument in `Phaser.Scenes.SceneManager#add`. + */ + scene?: Phaser.Types.Scenes.SceneType | Phaser.Types.Scenes.SceneType[]; + /** + * Seed for the random number generator. + */ + seed?: string[]; + /** + * The title of the game. Shown in the browser console. + */ + title?: string; + /** + * The URL of the game. Shown in the browser console. + */ + url?: string; + /** + * The version of the game. Shown in the browser console. + */ + version?: string; + /** + * Automatically call window.focus() when the game boots. Usually necessary to capture input events if the game is in a separate frame. + */ + autoFocus?: boolean; + /** + * Input configuration, or `false` to disable all game input. + */ + input?: boolean | Phaser.Types.Core.InputConfig; + /** + * Disable the browser's default 'contextmenu' event (usually triggered by a right-button mouse click). + */ + disableContextMenu?: boolean; + /** + * Configuration for the banner printed in the browser console when the game starts. + */ + banner?: boolean | Phaser.Types.Core.BannerConfig; + /** + * The DOM Container configuration object. + */ + dom?: Phaser.Types.Core.DOMContainerConfig; + /** + * Game loop configuration. + */ + fps?: Phaser.Types.Core.FPSConfig; + /** + * Game renderer configuration. + */ + render?: Phaser.Types.Core.RenderConfig; + /** + * Optional callbacks to run before or after game boot. + */ + callbacks?: Phaser.Types.Core.CallbacksConfig; + /** + * Loader configuration. + */ + loader?: Phaser.Types.Core.LoaderConfig; + /** + * Images configuration. + */ + images?: Phaser.Types.Core.ImagesConfig; + /** + * Physics configuration. + */ + physics?: Phaser.Types.Core.PhysicsConfig; + /** + * Plugins to install. + */ + plugins?: Phaser.Types.Core.PluginObject | Phaser.Types.Core.PluginObjectItem[]; + /** + * The Scale Manager configuration. + */ + scale?: Phaser.Types.Core.ScaleConfig; + /** + * The Audio Configuration object. + */ + audio?: Phaser.Types.Core.AudioConfig; + /** + * A WebGL Pipeline configuration object. Can also be part of the `RenderConfig`. + */ + pipeline?: Phaser.Types.Core.PipelineConfig; + /** + * The background color of the game canvas. The default is black. + */ + backgroundColor?: string | number; + /** + * When set to `true`, WebGL uses linear interpolation to draw scaled or rotated textures, giving a smooth appearance. When set to `false`, WebGL uses nearest-neighbor interpolation, giving a crisper appearance. `false` also disables antialiasing of the game canvas itself, if the browser supports it, when the game canvas is scaled. + */ + antialias?: boolean; + /** + * Sets the `antialias` property when the WebGL context is created. Setting this value does not impact any subsequent textures that are created, or the canvas style attributes. + */ + antialiasGL?: boolean; + /** + * When set to `true` it will create a desynchronized context for both 2D and WebGL. See https://developers.google.com/web/updates/2019/05/desynchronized for details. + */ + desynchronized?: boolean; + /** + * Sets `antialias` to false and `roundPixels` to true. This is the best setting for pixel-art games. + */ + pixelArt?: boolean; + /** + * Draw texture-based Game Objects at only whole-integer positions. Game Objects without textures, like Graphics, ignore this property. + */ + roundPixels?: boolean; + /** + * Whether the game canvas will be transparent. Boolean that indicates if the canvas contains an alpha channel. If set to false, the browser now knows that the backdrop is always opaque, which can speed up drawing of transparent content and images. + */ + transparent?: boolean; + /** + * Whether the game canvas will be cleared between each rendering frame. + */ + clearBeforeRender?: boolean; + /** + * If the value is true the WebGL buffers will not be cleared and will preserve their values until cleared or overwritten by the author. + */ + preserveDrawingBuffer?: boolean; + /** + * In WebGL mode, the drawing buffer contains colors with pre-multiplied alpha. + */ + premultipliedAlpha?: boolean; + /** + * Let the browser abort creating a WebGL context if it judges performance would be unacceptable. + */ + failIfMajorPerformanceCaveat?: boolean; + /** + * "high-performance", "low-power" or "default". A hint to the browser on how much device power the game might use. + */ + powerPreference?: string; + /** + * The default WebGL batch size. Represents the number of _quads_ that can be added to a single batch. + */ + batchSize?: number; + /** + * The maximum number of lights allowed to be visible within range of a single Camera in the LightManager. + */ + maxLights?: number; + /** + * When in WebGL mode, this sets the maximum number of GPU Textures to use. The default, -1, will use all available units. The WebGL1 spec says all browsers should provide a minimum of 8. + */ + maxTextures?: number; + /** + * The mipmap magFilter to be used when creating WebGL textures. + */ + mipmapFilter?: string; + /** + * Automatically enable the Mobile Pipeline if iOS or Android detected? + */ + autoMobilePipeline?: boolean; + /** + * The WebGL Pipeline that Game Objects will use by default. Set to 'MultiPipeline' as standard. + */ + defaultPipeline?: string; + /** + * Is the Scale Manager allowed to adjust the CSS height property of the parent and/or document body to be 100%? + */ + expandParent?: boolean; + /** + * The scale mode. + */ + mode?: Phaser.Scale.ScaleModeType; + /** + * The minimum width and height the canvas can be scaled down to. + */ + min?: WidthHeight; + /** + * The maximum width the canvas can be scaled up to. + */ + max?: WidthHeight; + /** + * Automatically round the display and style sizes of the canvas. This can help with performance in lower-powered devices. + */ + autoRound?: boolean; + /** + * Automatically center the canvas within the parent? + */ + autoCenter?: Phaser.Scale.CenterType; + /** + * How many ms should elapse before checking if the browser size has changed? + */ + resizeInterval?: number; + /** + * The DOM element that will be sent into full screen mode, or its `id`. If undefined Phaser will create its own div and insert the canvas into it when entering fullscreen mode. + */ + fullscreenTarget?: HTMLElement | string | null; + /** + * Disables the automatic creation of the Pre FX Pipelines. If disabled, you cannot use the built-in Pre FX on Game Objects. + */ + disablePreFX?: boolean; + /** + * Disables the automatic creation of the Post FX Pipelines. If disabled, you cannot use the built-in Post FX on Game Objects. + */ + disablePostFX?: boolean; + }; + + type GamepadInputConfig = { + /** + * Where the Gamepad Manager listens for gamepad input events. + */ + target?: any; + }; + + type ImagesConfig = { + /** + * A base64 encoded image file to use as the 'default' texture. + */ + default?: string; + /** + * A base64 encoded image file to use as the 'missing' texture. + */ + missing?: string; + /** + * A base64 encoded image file to use as the 'white' texture. + */ + white?: string; + }; + + type InputConfig = { + /** + * Keyboard input configuration. `true` uses the default configuration and `false` disables keyboard input. + */ + keyboard?: boolean | Phaser.Types.Core.KeyboardInputConfig; + /** + * Mouse input configuration. `true` uses the default configuration and `false` disables mouse input. + */ + mouse?: boolean | Phaser.Types.Core.MouseInputConfig; + /** + * Touch input configuration. `true` uses the default configuration and `false` disables touch input. + */ + touch?: boolean | Phaser.Types.Core.TouchInputConfig; + /** + * Gamepad input configuration. `true` enables gamepad input. + */ + gamepad?: boolean | Phaser.Types.Core.GamepadInputConfig; + /** + * The maximum number of touch pointers. See {@link Phaser.Input.InputManager#pointers}. + */ + activePointers?: number; + /** + * The smoothing factor to apply during Pointer movement. See {@link Phaser.Input.Pointer#smoothFactor}. + */ + smoothFactor?: number; + /** + * Should Phaser listen for input events on the Window? If you disable this, events like 'POINTER_UP_OUTSIDE' will no longer fire. + */ + windowEvents?: boolean; + }; + + type KeyboardInputConfig = { + /** + * Where the Keyboard Manager listens for keyboard input events. + */ + target?: any; + /** + * `preventDefault` will be called on every non-modified key which has a key code in this array. By default it is empty. + */ + capture?: number[] | null; + }; + + type LoaderConfig = { + /** + * A URL used to resolve paths given to the loader. Example: 'http://labs.phaser.io/assets/'. + */ + baseURL?: string; + /** + * A URL path used to resolve relative paths given to the loader. Example: 'images/sprites/'. + */ + path?: string; + /** + * The maximum number of resources the loader will start loading at once. + */ + maxParallelDownloads?: number; + /** + * 'anonymous', 'use-credentials', or `undefined`. If you're not making cross-origin requests, leave this as `undefined`. See {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes}. + */ + crossOrigin?: string | undefined; + /** + * The response type of the XHR request, e.g. `blob`, `text`, etc. + */ + responseType?: string; + /** + * Should the XHR request use async or not? + */ + async?: boolean; + /** + * Optional username for all XHR requests. + */ + user?: string; + /** + * Optional password for all XHR requests. + */ + password?: string; + /** + * Optional XHR timeout value, in ms. + */ + timeout?: number; + /** + * An optional array of schemes that the Loader considers as being 'local' files. Defaults to: `[ 'file://', 'capacitor://' ]` if not specified. + */ + localScheme?: string[]; + }; + + type MouseInputConfig = { + /** + * Where the Mouse Manager listens for mouse input events. The default is the game canvas. + */ + target?: any; + /** + * If `true` the DOM `mousedown` event will have `preventDefault` set. + */ + preventDefaultDown?: boolean; + /** + * If `true` the DOM `mouseup` event will have `preventDefault` set. + */ + preventDefaultUp?: boolean; + /** + * If `true` the DOM `mousemove` event will have `preventDefault` set. + */ + preventDefaultMove?: boolean; + /** + * If `true` the DOM `wheel` event will have `preventDefault` set. + */ + preventDefaultWheel?: boolean; + }; + + /** + * This callback type is completely empty, a no-operation. + */ + type NOOP = ()=>void; + + type PhysicsConfig = { + /** + * The default physics system. It will be started for each scene. Phaser provides 'arcade', 'impact', and 'matter'. + */ + default?: string; + /** + * Arcade Physics configuration. + */ + arcade?: Phaser.Types.Physics.Arcade.ArcadeWorldConfig; + /** + * Matter Physics configuration. + */ + matter?: Phaser.Types.Physics.Matter.MatterWorldConfig; + }; + + type PipelineConfig = { + /** + * The name of the pipeline. Must be unique within the Pipeline Manager. + */ + name: string; + /** + * The pipeline class. This should be a constructable object, **not** an instance of a class. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + /** + * Sets the `PipelineManager.frameInc` value to control the dimension increase in the Render Targets. + */ + frameInc?: number; + }; + + type PluginObject = { + /** + * Global plugins to install. + */ + global?: Phaser.Types.Core.PluginObjectItem[] | null; + /** + * Scene plugins to install. + */ + scene?: Phaser.Types.Core.PluginObjectItem[] | null; + /** + * The default set of scene plugins (names). + */ + default?: string[]; + /** + * Plugins to *add* to the default set of scene plugins. + */ + defaultMerge?: string[]; + }; + + type PluginObjectItem = { + /** + * A key to identify the plugin in the Plugin Manager. + */ + key?: string; + /** + * The plugin itself. Usually a class/constructor. + */ + plugin?: any; + /** + * Whether the plugin should be started automatically. + */ + start?: boolean; + /** + * For a scene plugin, add the plugin to the scene's systems object under this key (`this.sys.KEY`, from the scene). + */ + systemKey?: string; + /** + * For a scene plugin, add the plugin to the scene object under this key (`this.KEY`, from the scene). + */ + sceneKey?: string; + /** + * If this plugin is to be injected into the Scene Systems, this is the property key map used. + */ + mapping?: string; + /** + * Arbitrary data passed to the plugin's init() method. + */ + data?: any; + }; + + type RenderConfig = { + /** + * When set to `true`, WebGL uses linear interpolation to draw scaled or rotated textures, giving a smooth appearance. When set to `false`, WebGL uses nearest-neighbor interpolation, giving a crisper appearance. `false` also disables antialiasing of the game canvas itself, if the browser supports it, when the game canvas is scaled. + */ + antialias?: boolean; + /** + * Sets the `antialias` property when the WebGL context is created. Setting this value does not impact any subsequent textures that are created, or the canvas style attributes. + */ + antialiasGL?: boolean; + /** + * When set to `true` it will create a desynchronized context for both 2D and WebGL. See https://developers.google.com/web/updates/2019/05/desynchronized for details. + */ + desynchronized?: boolean; + /** + * Sets `antialias` to false and `roundPixels` to true. This is the best setting for pixel-art games. + */ + pixelArt?: boolean; + /** + * Draw texture-based Game Objects at only whole-integer positions. Game Objects without textures, like Graphics, ignore this property. + */ + roundPixels?: boolean; + /** + * Whether the game canvas will be transparent. Boolean that indicates if the canvas contains an alpha channel. If set to false, the browser now knows that the backdrop is always opaque, which can speed up drawing of transparent content and images. + */ + transparent?: boolean; + /** + * Whether the game canvas will be cleared between each rendering frame. + */ + clearBeforeRender?: boolean; + /** + * If the value is true the WebGL buffers will not be cleared and will preserve their values until cleared or overwritten by the author. + */ + preserveDrawingBuffer?: boolean; + /** + * In WebGL mode, the drawing buffer contains colors with pre-multiplied alpha. + */ + premultipliedAlpha?: boolean; + /** + * Let the browser abort creating a WebGL context if it judges performance would be unacceptable. + */ + failIfMajorPerformanceCaveat?: boolean; + /** + * "high-performance", "low-power" or "default". A hint to the browser on how much device power the game might use. + */ + powerPreference?: string; + /** + * The default WebGL batch size. Represents the number of _quads_ that can be added to a single batch. + */ + batchSize?: number; + /** + * The maximum number of lights allowed to be visible within range of a single Camera in the LightManager. + */ + maxLights?: number; + /** + * When in WebGL mode, this sets the maximum number of GPU Textures to use. The default, -1, will use all available units. The WebGL1 spec says all browsers should provide a minimum of 8. + */ + maxTextures?: number; + /** + * The mipmap magFilter to be used when creating WebGL textures. Don't set unless you wish to create mipmaps. Set to one of the following: 'NEAREST', 'LINEAR', 'NEAREST_MIPMAP_NEAREST', 'LINEAR_MIPMAP_NEAREST', 'NEAREST_MIPMAP_LINEAR' or 'LINEAR_MIPMAP_LINEAR'. + */ + mipmapFilter?: string; + /** + * The WebGL Pipeline configuration object. + */ + pipeline?: Phaser.Types.Core.PipelineConfig | Phaser.Renderer.WebGL.WebGLPipeline[]; + /** + * Automatically enable the Mobile Pipeline if iOS or Android detected? + */ + autoMobilePipeline?: boolean; + /** + * The WebGL Pipeline that Game Objects will use by default. Set to 'MultiPipeline' as standard. + */ + defaultPipeline?: string; + }; + + type ScaleConfig = { + /** + * The base width of your game. Can be an integer or a string: '100%'. If a string it will only work if you have set a parent element that has a size. + */ + width?: number | string; + /** + * The base height of your game. Can be an integer or a string: '100%'. If a string it will only work if you have set a parent element that has a size. + */ + height?: number | string; + /** + * The zoom value of the game canvas. + */ + zoom?: Phaser.Scale.ZoomType | number; + /** + * The DOM element that will contain the game canvas, or its `id`. If undefined, or if the named element doesn't exist, the game canvas is inserted directly into the document body. If `null` no parent will be used and you are responsible for adding the canvas to your environment. + */ + parent?: HTMLElement | string | null; + /** + * Is the Scale Manager allowed to adjust the CSS height property of the parent and/or document body to be 100%? + */ + expandParent?: boolean; + /** + * The scale mode. + */ + mode?: Phaser.Scale.ScaleModeType; + /** + * The minimum width and height the canvas can be scaled down to. + */ + min?: WidthHeight; + /** + * The maximum width the canvas can be scaled up to. + */ + max?: WidthHeight; + /** + * Set the snapping values used by the Scale Manager when resizing the canvas. See `ScaleManager.setSnap` for details. + */ + snap?: WidthHeight; + /** + * Automatically round the display and style sizes of the canvas. This can help with performance in lower-powered devices. + */ + autoRound?: boolean; + /** + * Automatically center the canvas within the parent? + */ + autoCenter?: Phaser.Scale.CenterType; + /** + * How many ms should elapse before checking if the browser size has changed? + */ + resizeInterval?: number; + /** + * The DOM element that will be sent into full screen mode, or its `id`. If undefined Phaser will create its own div and insert the canvas into it when entering fullscreen mode. + */ + fullscreenTarget?: HTMLElement | string | null; + }; + + type TimeStepCallback = (time: number, average: number)=>void; + + type TouchInputConfig = { + /** + * Where the Touch Manager listens for touch input events. The default is the game canvas. + */ + target?: any; + /** + * Whether touch input events have preventDefault() called on them. + */ + capture?: boolean; + }; + + type WidthHeight = { + /** + * The width. + */ + width?: number; + /** + * The height. + */ + height?: number; + }; + + } + + namespace Create { + type GenerateTextureCallback = (canvas: HTMLCanvasElement, context: CanvasRenderingContext2D)=>void; + + type GenerateTextureConfig = { + /** + * An array of data, where each row is a string of single values 0-9A-F, or the period character. + */ + data?: any[]; + /** + * The HTML Canvas to draw the texture to. + */ + canvas?: HTMLCanvasElement; + /** + * The indexed palette that the data cell values map to. + */ + palette?: Phaser.Types.Create.Palette; + /** + * The width of each 'pixel' in the generated texture. + */ + pixelWidth?: number; + /** + * The height of each 'pixel' in the generated texture. + */ + pixelHeight?: number; + /** + * Should the canvas be resized before the texture is drawn? + */ + resizeCanvas?: boolean; + /** + * Should the canvas be cleared before the texture is drawn? + */ + clearCanvas?: boolean; + /** + * A callback to send the canvas to prior to the texture being drawn. + */ + preRender?: Phaser.Types.Create.GenerateTextureCallback; + /** + * A callback to send the canvas to after the texture has been drawn. + */ + postRender?: Phaser.Types.Create.GenerateTextureCallback; + }; + + type Palette = { + /** + * Color value 1. + */ + "0": string; + /** + * Color value 2. + */ + "1": string; + /** + * Color value 3. + */ + "2": string; + /** + * Color value 4. + */ + "3": string; + /** + * Color value 5. + */ + "4": string; + /** + * Color value 6. + */ + "5": string; + /** + * Color value 7. + */ + "6": string; + /** + * Color value 8. + */ + "7": string; + /** + * Color value 9. + */ + "8": string; + /** + * Color value 10. + */ + "9": string; + /** + * Color value 11. + */ + A: string; + /** + * Color value 12. + */ + B: string; + /** + * Color value 13. + */ + C: string; + /** + * Color value 14. + */ + D: string; + /** + * Color value 15. + */ + E: string; + /** + * Color value 16. + */ + F: string; + }; + + } + + namespace Curves { + type EllipseCurveConfig = { + /** + * The x coordinate of the ellipse. + */ + x?: number; + /** + * The y coordinate of the ellipse. + */ + y?: number; + /** + * The horizontal radius of the ellipse. + */ + xRadius?: number; + /** + * The vertical radius of the ellipse. + */ + yRadius?: number; + /** + * The start angle of the ellipse, in degrees. + */ + startAngle?: number; + /** + * The end angle of the ellipse, in degrees. + */ + endAngle?: number; + /** + * Sets if the the ellipse rotation is clockwise (true) or anti-clockwise (false) + */ + clockwise?: boolean; + /** + * The rotation of the ellipse, in degrees. + */ + rotation?: number; + }; + + type JSONCurve = { + /** + * The of the curve + */ + type: string; + /** + * The arrays of points like `[x1, y1, x2, y2]` + */ + points: number[]; + }; + + type JSONEllipseCurve = { + /** + * The of the curve. + */ + type: string; + /** + * The x coordinate of the ellipse. + */ + x: number; + /** + * The y coordinate of the ellipse. + */ + y: number; + /** + * The horizontal radius of ellipse. + */ + xRadius: number; + /** + * The vertical radius of ellipse. + */ + yRadius: number; + /** + * The start angle of the ellipse, in degrees. + */ + startAngle: number; + /** + * The end angle of the ellipse, in degrees. + */ + endAngle: number; + /** + * Sets if the the ellipse rotation is clockwise (true) or anti-clockwise (false) + */ + clockwise: boolean; + /** + * The rotation of ellipse, in degrees. + */ + rotation: number; + }; + + type JSONPath = { + /** + * The of the curve. + */ + type: string; + /** + * The X coordinate of the curve's starting point. + */ + x: number; + /** + * The Y coordinate of the path's starting point. + */ + y: number; + /** + * The path is auto closed. + */ + autoClose: boolean; + /** + * The list of the curves + */ + curves: Phaser.Types.Curves.JSONCurve[]; + }; + + } + + namespace Display { + type ColorObject = { + /** + * The red color value in the range 0 to 255. + */ + r: number; + /** + * The green color value in the range 0 to 255. + */ + g: number; + /** + * The blue color value in the range 0 to 255. + */ + b: number; + /** + * The alpha color value in the range 0 to 255. + */ + a: number; + /** + * The combined color value. + */ + color: number; + }; + + type HSVColorObject = { + /** + * The hue color value. A number between 0 and 1 + */ + h: number; + /** + * The saturation color value. A number between 0 and 1 + */ + s: number; + /** + * The lightness color value. A number between 0 and 1 + */ + v: number; + }; + + type InputColorObject = { + /** + * The red color value in the range 0 to 255. + */ + r?: number; + /** + * The green color value in the range 0 to 255. + */ + g?: number; + /** + * The blue color value in the range 0 to 255. + */ + b?: number; + /** + * The alpha color value in the range 0 to 255. + */ + a?: number; + }; + + } + + namespace GameObjects { + namespace BitmapText { + /** + * The font data for an individual character of a Bitmap Font. + * + * Describes the character's position, size, offset and kerning. + * + * As of version 3.50 it also includes the WebGL texture uv data. + */ + type BitmapFontCharacterData = { + /** + * The x position of the character. + */ + x: number; + /** + * The y position of the character. + */ + y: number; + /** + * The width of the character. + */ + width: number; + /** + * The height of the character. + */ + height: number; + /** + * The center x position of the character. + */ + centerX: number; + /** + * The center y position of the character. + */ + centerY: number; + /** + * The x offset of the character. + */ + xOffset: number; + /** + * The y offset of the character. + */ + yOffset: number; + /** + * WebGL texture u0. + */ + u0: number; + /** + * WebGL texture v0. + */ + v0: number; + /** + * WebGL texture u1. + */ + u1: number; + /** + * WebGL texture v1. + */ + v1: number; + /** + * Extra data for the character. + */ + data: object; + /** + * Kerning values, keyed by character code. + */ + kerning: {[key: string]: number}; + }; + + /** + * Bitmap Font data that can be used by a BitmapText Game Object. + */ + type BitmapFontData = { + /** + * The name of the font. + */ + font: string; + /** + * The size of the font. + */ + size: number; + /** + * The line height of the font. + */ + lineHeight: number; + /** + * Whether this font is a retro font (monospace). + */ + retroFont: boolean; + /** + * The character data of the font, keyed by character code. Each character datum includes a position, size, offset and more. + */ + chars: {[key: number]: Phaser.Types.GameObjects.BitmapText.BitmapFontCharacterData}; + }; + + /** + * A single entry from the `BitmapTextSize` characters array. + * + * The position and dimensions take the font size into account, + * but are not translated into the local space of the Game Object itself. + */ + type BitmapTextCharacter = { + /** + * The index of this character within the BitmapText wrapped text string. + */ + i: number; + /** + * The index of this character within the BitmapText text string. + */ + idx: number; + /** + * The character. + */ + char: string; + /** + * The character code of the character. + */ + code: number; + /** + * The x position of the character in the BitmapText. + */ + x: number; + /** + * The y position of the character in the BitmapText. + */ + y: number; + /** + * The width of the character. + */ + w: number; + /** + * The height of the character. + */ + h: number; + /** + * The top of the line this character is on. + */ + t: number; + /** + * The right-most point of this character, including xAdvance. + */ + r: number; + /** + * The bottom of the line this character is on. + */ + b: number; + /** + * The line number the character appears on. + */ + line: number; + /** + * Reference to the glyph object this character is using. + */ + glyph: Phaser.Types.GameObjects.BitmapText.BitmapFontCharacterData; + }; + + type BitmapTextConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key of the font to use from the BitmapFont cache. + */ + font?: string; + /** + * The string, or array of strings, to be set as the content of this Bitmap Text. + */ + text?: string; + /** + * The font size to set. + */ + size?: number | false; + }; + + /** + * Details about the line data in the `BitmapTextSize` object. + */ + type BitmapTextLines = { + /** + * The width of the shortest line of text. + */ + shortest: number; + /** + * The width of the longest line of text. + */ + longest: number; + /** + * The height of a line of text. + */ + height: number; + /** + * An array where each entry contains the length of that line of text. + */ + lengths: number[]; + }; + + type BitmapTextSize = { + /** + * The position and size of the BitmapText, taking into account the position and scale of the Game Object. + */ + global: Phaser.Types.GameObjects.BitmapText.GlobalBitmapTextSize; + /** + * The position and size of the BitmapText, taking just the font size into account. + */ + local: Phaser.Types.GameObjects.BitmapText.LocalBitmapTextSize; + /** + * Data about the lines of text within the BitmapText. + */ + lines: Phaser.Types.GameObjects.BitmapText.BitmapTextLines; + /** + * An array containing per-character data. Only populated if `includeChars` is `true` in the `getTextBounds` call. + */ + characters: Phaser.Types.GameObjects.BitmapText.BitmapTextCharacter[]; + /** + * An array containing the word data from the BitmapText. + */ + words: Phaser.Types.GameObjects.BitmapText.BitmapTextWord[]; + /** + * The scale of the BitmapText font being rendered vs. font size in the text data. + */ + scale: number; + /** + * The scale X value of the BitmapText. + */ + scaleX: number; + /** + * The scale Y value of the BitmapText. + */ + scaleY: number; + /** + * The wrapped text, if wrapping enabled and required. + */ + wrappedText: string; + }; + + /** + * Details about a single world entry in the `BitmapTextSize` object words array. + */ + type BitmapTextWord = { + /** + * The x position of the word in the BitmapText. + */ + x: number; + /** + * The y position of the word in the BitmapText. + */ + y: number; + /** + * The width of the word. + */ + w: number; + /** + * The height of the word. + */ + h: number; + /** + * The index of the first character of this word within the entire string. Note: this index factors in spaces, quotes, carriage-returns, etc. + */ + i: number; + /** + * The word. + */ + word: string; + }; + + type DisplayCallbackConfig = { + /** + * The Dynamic Bitmap Text object that owns this character being rendered. + */ + parent: Phaser.GameObjects.DynamicBitmapText; + /** + * The tint of the character being rendered. Always zero in Canvas. + */ + tint: Phaser.Types.GameObjects.BitmapText.TintConfig; + /** + * The index of the character being rendered. + */ + index: number; + /** + * The character code of the character being rendered. + */ + charCode: number; + /** + * The x position of the character being rendered. + */ + x: number; + /** + * The y position of the character being rendered. + */ + y: number; + /** + * The scale of the character being rendered. + */ + scale: number; + /** + * The rotation of the character being rendered. + */ + rotation: number; + /** + * Custom data stored with the character being rendered. + */ + data: any; + }; + + type DisplayCallback = (display: Phaser.Types.GameObjects.BitmapText.DisplayCallbackConfig)=>Phaser.Types.GameObjects.BitmapText.DisplayCallbackConfig; + + /** + * The position and size of the Bitmap Text in global space, taking into account the Game Object's scale and world position. + */ + type GlobalBitmapTextSize = { + /** + * The x position of the BitmapText, taking into account the x position and scale of the Game Object. + */ + x: number; + /** + * The y position of the BitmapText, taking into account the y position and scale of the Game Object. + */ + y: number; + /** + * The width of the BitmapText, taking into account the x scale of the Game Object. + */ + width: number; + /** + * The height of the BitmapText, taking into account the y scale of the Game Object. + */ + height: number; + }; + + type JSONBitmapText = Phaser.Types.GameObjects.JSONGameObject & { + /** + * The name of the font. + */ + font: string; + /** + * The text that this Bitmap Text displays. + */ + text: string; + /** + * The size of the font. + */ + fontSize: number; + /** + * Adds / Removes spacing between characters. + */ + letterSpacing: number; + /** + * Adds / Removes spacing between lines in multi-line text. + */ + lineSpacing: number; + /** + * The alignment of the text in a multi-line BitmapText object. + */ + align: number; + }; + + /** + * The position and size of the Bitmap Text in local space, taking just the font size into account. + */ + type LocalBitmapTextSize = { + /** + * The x position of the BitmapText. + */ + x: number; + /** + * The y position of the BitmapText. + */ + y: number; + /** + * The width of the BitmapText. + */ + width: number; + /** + * The height of the BitmapText. + */ + height: number; + }; + + type RetroFontConfig = { + /** + * The key of the image containing the font. + */ + image: string; + /** + * If the font set doesn't start at the top left of the given image, specify the X coordinate offset here. + */ + "offset.x": number; + /** + * If the font set doesn't start at the top left of the given image, specify the Y coordinate offset here. + */ + "offset.y": number; + /** + * The width of each character in the font set. + */ + width: number; + /** + * The height of each character in the font set. + */ + height: number; + /** + * The characters used in the font set, in display order. You can use the TEXT_SET consts for common font set arrangements. + */ + chars: string; + /** + * The number of characters per row in the font set. If not given charsPerRow will be the image width / characterWidth. + */ + charsPerRow: number; + /** + * If the characters in the font set have horizontal spacing between them set the required amount here. + */ + "spacing.x": number; + /** + * If the characters in the font set have vertical spacing between them set the required amount here. + */ + "spacing.y": number; + /** + * The amount of vertical space to add to the line height of the font. + */ + lineSpacing: number; + }; + + type TintConfig = { + /** + * The top left tint value. Always zero in canvas. + */ + topLeft: number; + /** + * The top right tint value. Always zero in canvas. + */ + topRight: number; + /** + * The bottom left tint value. Always zero in canvas. + */ + bottomLeft: number; + /** + * The bottom right tint value. Always zero in canvas. + */ + bottomRight: number; + }; + + } + + namespace Container { + type ContainerConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * An optional array of Game Objects to add to the Container. + */ + children?: Phaser.GameObjects.GameObject[]; + }; + + } + + namespace Graphics { + /** + * Graphics fill style settings. + */ + type FillStyle = { + /** + * The fill color. + */ + color?: number; + /** + * The fill alpha. + */ + alpha?: number; + }; + + /** + * Graphics line style (or stroke style) settings. + */ + type LineStyle = { + /** + * The stroke width. + */ + width?: number; + /** + * The stroke color. + */ + color?: number; + /** + * The stroke alpha. + */ + alpha?: number; + }; + + /** + * Options for the Graphics Game Object. + */ + type Options = Phaser.Types.GameObjects.Graphics.Styles & { + /** + * The x coordinate of the Graphics. + */ + x?: number; + /** + * The y coordinate of the Graphics. + */ + y?: number; + }; + + type RoundedRectRadius = { + /** + * Top left corner radius. Draw concave arc if this radius is negative. + */ + tl?: number; + /** + * Top right corner radius. Draw concave arc if this radius is negative. + */ + tr?: number; + /** + * Bottom right corner radius. Draw concave arc if this radius is negative. + */ + br?: number; + /** + * Bottom left corner radius. Draw concave arc if this radius is negative. + */ + bl?: number; + }; + + /** + * Graphics style settings. + */ + type Styles = { + /** + * The style applied to shape outlines. + */ + lineStyle?: Phaser.Types.GameObjects.Graphics.LineStyle; + /** + * The style applied to shape areas. + */ + fillStyle?: Phaser.Types.GameObjects.Graphics.FillStyle; + }; + + } + + namespace Group { + type GroupCallback = (item: Phaser.GameObjects.GameObject)=>void; + + type GroupClassTypeConstructor = (scene: Phaser.Scene, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number)=>void; + + type GroupConfig = { + /** + * Sets {@link Phaser.GameObjects.Group#classType}. + */ + classType?: Function | null; + /** + * Sets {@link Phaser.GameObjects.Group#name}. + */ + name?: string | null; + /** + * Sets {@link Phaser.GameObjects.Group#active}. + */ + active?: boolean | null; + /** + * Sets {@link Phaser.GameObjects.Group#maxSize}. + */ + maxSize?: number | null; + /** + * Sets {@link Phaser.GameObjects.Group#defaultKey}. + */ + defaultKey?: string | null; + /** + * Sets {@link Phaser.GameObjects.Group#defaultFrame}. + */ + defaultFrame?: string | number | null; + /** + * Sets {@link Phaser.GameObjects.Group#runChildUpdate}. + */ + runChildUpdate?: boolean | null; + /** + * Sets {@link Phaser.GameObjects.Group#createCallback}. + */ + createCallback?: Phaser.Types.GameObjects.Group.GroupCallback | null; + /** + * Sets {@link Phaser.GameObjects.Group#removeCallback}. + */ + removeCallback?: Phaser.Types.GameObjects.Group.GroupCallback | null; + /** + * Sets {@link Phaser.GameObjects.Group#createMultipleCallback}. + */ + createMultipleCallback?: Phaser.Types.GameObjects.Group.GroupMultipleCreateCallback | null; + }; + + /** + * The total number of objects created will be + * + * key.length * frame.length * frameQuantity * (yoyo ? 2 : 1) * (1 + repeat) + * + * If `max` is nonzero, then the total created will not exceed `max`. + * + * `key` is required. {@link Phaser.GameObjects.Group#defaultKey} is not used. + */ + type GroupCreateConfig = { + /** + * The texture key of each new Game Object. Must be provided or not objects will be created. + */ + key: string | string[]; + /** + * The class of each new Game Object. + */ + classType?: Function | null; + /** + * The texture frame of each new Game Object. + */ + frame?: string | string[] | number | number[] | null; + /** + * The number of Game Objects to create. If set, this overrides the `frameQuantity` value. Use `frameQuantity` for more advanced control. + */ + quantity?: number | null; + /** + * The visible state of each new Game Object. + */ + visible?: boolean | null; + /** + * The active state of each new Game Object. + */ + active?: boolean | null; + /** + * The number of times each `key` × `frame` combination will be *repeated* (after the first combination). + */ + repeat?: number | null; + /** + * Select a `key` at random. + */ + randomKey?: boolean | null; + /** + * Select a `frame` at random. + */ + randomFrame?: boolean | null; + /** + * Select keys and frames by moving forward then backward through `key` and `frame`. + */ + yoyo?: boolean | null; + /** + * The number of times each `frame` should be combined with one `key`. + */ + frameQuantity?: number | null; + /** + * The maximum number of new Game Objects to create. 0 is no maximum. + */ + max?: number | null; + setXY?: object | null; + /** + * The horizontal position of each new Game Object. + */ + "setXY.x"?: number | null; + /** + * The vertical position of each new Game Object. + */ + "setXY.y"?: number | null; + /** + * Increment each Game Object's horizontal position from the previous by this amount, starting from `setXY.x`. + */ + "setXY.stepX"?: number | null; + /** + * Increment each Game Object's vertical position from the previous by this amount, starting from `setXY.y`. + */ + "setXY.stepY"?: number | null; + setRotation?: object | null; + /** + * Rotation of each new Game Object. + */ + "setRotation.value"?: number | null; + /** + * Increment each Game Object's rotation from the previous by this amount, starting at `setRotation.value`. + */ + "setRotation.step"?: number | null; + setScale?: object | null; + /** + * The horizontal scale of each new Game Object. + */ + "setScale.x"?: number | null; + /** + * The vertical scale of each new Game Object. + */ + "setScale.y"?: number | null; + /** + * Increment each Game Object's horizontal scale from the previous by this amount, starting from `setScale.x`. + */ + "setScale.stepX"?: number | null; + /** + * Increment each Game object's vertical scale from the previous by this amount, starting from `setScale.y`. + */ + "setScale.stepY"?: number | null; + setOrigin?: object | null; + /** + * The horizontal origin of each new Game Object. + */ + "setOrigin.x"?: number | null; + /** + * The vertical origin of each new Game Object. + */ + "setOrigin.y"?: number | null; + /** + * Increment each Game Object's horizontal origin from the previous by this amount, starting from `setOrigin.x`. + */ + "setOrigin.stepX"?: number | null; + /** + * Increment each Game object's vertical origin from the previous by this amount, starting from `setOrigin.y`. + */ + "setOrigin.stepY"?: number | null; + setAlpha?: object | null; + /** + * The alpha value of each new Game Object. + */ + "setAlpha.value"?: number | null; + /** + * Increment each Game Object's alpha from the previous by this amount, starting from `setAlpha.value`. + */ + "setAlpha.step"?: number | null; + setDepth?: object | null; + /** + * The depth value of each new Game Object. + */ + "setDepth.value"?: number | null; + /** + * Increment each Game Object's depth from the previous by this amount, starting from `setDepth.value`. + */ + "setDepth.step"?: number | null; + setScrollFactor?: object | null; + /** + * The horizontal scroll factor of each new Game Object. + */ + "setScrollFactor.x"?: number | null; + /** + * The vertical scroll factor of each new Game Object. + */ + "setScrollFactor.y"?: number | null; + /** + * Increment each Game Object's horizontal scroll factor from the previous by this amount, starting from `setScrollFactor.x`. + */ + "setScrollFactor.stepX"?: number | null; + /** + * Increment each Game object's vertical scroll factor from the previous by this amount, starting from `setScrollFactor.y`. + */ + "setScrollFactor.stepY"?: number | null; + /** + * A geometric shape that defines the hit area for the Game Object. + */ + hitArea?: any | null; + /** + * A callback to be invoked when the Game Object is interacted with. + */ + hitAreaCallback?: Phaser.Types.Input.HitAreaCallback | null; + /** + * Align the new Game Objects in a grid using these settings. + */ + gridAlign?: false | Phaser.Types.Actions.GridAlignConfig | null; + }; + + type GroupMultipleCreateCallback = (items: Phaser.GameObjects.GameObject[])=>void; + + } + + namespace Mesh { + type MeshConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + */ + key?: string | Phaser.Textures.Texture; + /** + * An optional frame from the Texture this Game Object is rendering with. + */ + frame?: string | number; + /** + * The vertices array. Either `xy` pairs, or `xyz` if the `containsZ` parameter is `true`. + */ + vertices?: number[]; + /** + * The UVs pairs array. + */ + uvs?: number[]; + /** + * Optional vertex indicies array. If you don't have one, pass `null` or an empty array. + */ + indicies?: number[]; + /** + * Does the vertices data include a `z` component? + */ + containsZ?: boolean; + /** + * Optional vertex normals array. If you don't have one, pass `null` or an empty array. + */ + normals?: number[]; + /** + * An array of colors, one per vertex, or a single color value applied to all vertices. + */ + colors?: number | number[]; + /** + * An array of alpha values, one per vertex, or a single alpha value applied to all vertices. + */ + alphas?: number | number[]; + }; + + } + + namespace NineSlice { + type NineSliceConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + */ + key?: string | Phaser.Textures.Texture; + /** + * An optional frame from the Texture this Game Object is rendering with. + */ + frame?: string | number; + /** + * The width of the Nine Slice Game Object. You can adjust the width post-creation. + */ + width?: number; + /** + * The height of the Nine Slice Game Object. If this is a 3 slice object the height will be fixed to the height of the texture and cannot be changed. + */ + height?: number; + /** + * The size of the left vertical column (A). + */ + leftWidth?: number; + /** + * The size of the right vertical column (B). + */ + rightWidth?: number; + /** + * The size of the top horiztonal row (C). Set to zero or undefined to create a 3 slice object. + */ + topHeight?: number; + /** + * The size of the bottom horiztonal row (D). Set to zero or undefined to create a 3 slice object. + */ + bottomHeight?: number; + }; + + } + + namespace Particles { + type DeathZoneObject = Phaser.GameObjects.Particles.Zones.DeathZone | Phaser.Types.GameObjects.Particles.ParticleEmitterDeathZoneConfig | Phaser.Types.GameObjects.Particles.DeathZoneSource; + + type DeathZoneSource = { + contains: Phaser.Types.GameObjects.Particles.DeathZoneSourceCallback; + }; + + type DeathZoneSourceCallback = (x: number, y: number)=>boolean; + + type EdgeZoneSource = { + /** + * A function placing points on the sources edge or edges. + */ + getPoints: Phaser.Types.GameObjects.Particles.EdgeZoneSourceCallback; + }; + + type EdgeZoneSourceCallback = (quantity: number, stepRate?: number)=>Phaser.Types.Math.Vector2Like[]; + + type EmitterOpCustomEmitConfig = { + /** + * A callback that is invoked each time the emitter emits a particle. + */ + onEmit: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitCallback; + }; + + type EmitterOpCustomUpdateConfig = { + /** + * A callback that is invoked each time the emitter emits a particle. + */ + onEmit?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitCallback; + /** + * A callback that is invoked each time the emitter updates. + */ + onUpdate: Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateCallback; + }; + + /** + * Defines an operation yielding a value incremented continuously across a range. + */ + type EmitterOpEaseConfig = { + /** + * The starting value. + */ + start: number; + /** + * The ending value. + */ + end: number; + /** + * If true, the particle starts with a minimum random value between the start and end values. + */ + random?: boolean; + /** + * The ease to find. This can be either a string from the EaseMap, or a custom function. + */ + ease?: string | Function; + /** + * An optional array of ease parameters to go with the ease. + */ + easeParams?: number[]; + }; + + /** + * Defines an operation yielding a value incremented continuously across an interpolated data set. + */ + type EmitterOpInterpolationConfig = { + /** + * The array of number values to interpolate through. + */ + values: number[]; + /** + * The interpolation function to use. Typically one of `linear`, `bezier` or `catmull` or a custom function. + */ + interpolation?: string | Function; + /** + * An optional ease function to use. This can be either a string from the EaseMap, or a custom function. + */ + ease?: string | Function; + /** + * An optional array of ease parameters to go with the ease. + */ + easeParams?: number[]; + }; + + /** + * The returned value sets what the property will be at the START of the particle's life, on emit. + */ + type EmitterOpOnEmitCallback = (particle?: Phaser.GameObjects.Particles.Particle, key?: string, value?: number)=>number; + + type EmitterOpOnEmitType = number | number[] | Phaser.Types.GameObjects.Particles.EmitterOpOnEmitCallback | Phaser.Types.GameObjects.Particles.EmitterOpRandomConfig | Phaser.Types.GameObjects.Particles.EmitterOpRandomMinMaxConfig | Phaser.Types.GameObjects.Particles.EmitterOpSteppedConfig | Phaser.Types.GameObjects.Particles.EmitterOpCustomEmitConfig; + + /** + * The returned value updates the property for the duration of the particle's life. + */ + type EmitterOpOnUpdateCallback = (particle: Phaser.GameObjects.Particles.Particle, key: string, t: number, value: number)=>number; + + type EmitterOpOnUpdateType = Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateCallback | Phaser.Types.GameObjects.Particles.EmitterOpEaseConfig | Phaser.Types.GameObjects.Particles.EmitterOpCustomUpdateConfig | Phaser.Types.GameObjects.Particles.EmitterOpInterpolationConfig; + + /** + * Defines an operation yielding a random value within a range. + */ + type EmitterOpRandomConfig = { + /** + * The minimum and maximum values, as [min, max]. + */ + random: number[]; + }; + + /** + * Defines an operation yielding a random value within a range. + */ + type EmitterOpRandomMinMaxConfig = { + /** + * The minimum value. + */ + min: number; + /** + * The maximum value. + */ + max: number; + /** + * If true, only integers are selected from the range. + */ + int?: boolean; + }; + + /** + * Defines an operation yielding a value incremented by steps across a range. + */ + type EmitterOpSteppedConfig = { + /** + * The starting value. + */ + start: number; + /** + * The ending value. + */ + end: number; + /** + * The number of steps between start and end. + */ + steps: number; + }; + + type EmitZoneData = Phaser.Types.GameObjects.Particles.ParticleEmitterEdgeZoneConfig | Phaser.Types.GameObjects.Particles.ParticleEmitterRandomZoneConfig | Phaser.GameObjects.Particles.Zones.EdgeZone | Phaser.GameObjects.Particles.Zones.RandomZone; + + type EmitZoneObject = Phaser.GameObjects.Particles.Zones.EdgeZone | Phaser.GameObjects.Particles.Zones.RandomZone; + + type GravityWellConfig = { + /** + * The x coordinate of the Gravity Well, in world space. + */ + x?: number; + /** + * The y coordinate of the Gravity Well, in world space. + */ + y?: number; + /** + * The strength of the gravity force - larger numbers produce a stronger force. + */ + power?: number; + /** + * The minimum distance for which the gravity force is calculated. + */ + epsilon?: number; + /** + * The gravitational force of this Gravity Well. + */ + gravity?: number; + }; + + type ParticleClassConstructor = (emitter: Phaser.GameObjects.Particles.ParticleEmitter)=>void; + + type ParticleData = { + tint?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + alpha?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + rotate?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + scaleX?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + scaleY?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + x?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + y?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + accelerationX?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + accelerationY?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + maxVelocityX?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + maxVelocityY?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + moveToX?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + moveToY?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + bounce?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + }; + + type ParticleDataValue = { + /** + * The minimum value. + */ + min: number; + /** + * The maximum value. + */ + max: number; + }; + + type ParticleDeathCallback = (particle: Phaser.GameObjects.Particles.Particle)=>void; + + type ParticleEmitterAnimConfig = { + /** + * One or more animations names, or Play Animation Config objects. + */ + anims?: string | string[] | Phaser.Types.Animations.PlayAnimationConfig | Phaser.Types.Animations.PlayAnimationConfig[]; + /** + * Whether animations will be assigned consecutively (true) or at random (false). + */ + cycle?: boolean; + /** + * The number of consecutive particles receiving each animation, when `cycle` is true. + */ + quantity?: number; + }; + + type ParticleEmitterBounds = { + /** + * The left edge of the rectangle. + */ + x: number; + /** + * The top edge of the rectangle. + */ + y: number; + /** + * The width of the rectangle. + */ + width: number; + /** + * The height of the rectangle. + */ + height: number; + }; + + type ParticleEmitterBoundsAlt = { + /** + * The left edge of the rectangle. + */ + x: number; + /** + * The top edge of the rectangle. + */ + y: number; + /** + * The width of the rectangle. + */ + w: number; + /** + * The height of the rectangle. + */ + h: number; + }; + + type ParticleEmitterCallback = (particle: Phaser.GameObjects.Particles.Particle, emitter: Phaser.GameObjects.Particles.ParticleEmitter)=>void; + + type ParticleEmitterConfig = { + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#active}. Setting this to false will stop the emitter from running at all. If you just wish to stop particles from emitting, set `emitting` property instead. + */ + active?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#blendMode}. + */ + blendMode?: Phaser.BlendModes | string; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallbackScope} and {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallbackScope}. + */ + callbackScope?: any; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideBottom}. + */ + collideBottom?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideLeft}. + */ + collideLeft?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideRight}. + */ + collideRight?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideTop}. + */ + collideTop?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallback}. + */ + deathCallback?: Function; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallbackScope}. + */ + deathCallbackScope?: any; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallback}. + */ + emitCallback?: Function; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallbackScope}. + */ + emitCallbackScope?: any; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#follow}. + */ + follow?: Phaser.Types.Math.Vector2Like; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#frequency}. + */ + frequency?: number; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#gravityX}. + */ + gravityX?: number; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#gravityY}. + */ + gravityY?: number; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxParticles}. + */ + maxParticles?: number; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxAliveParticles}. + */ + maxAliveParticles?: number; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#name}. + */ + name?: string; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#emitting}. + */ + emitting?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleBringToTop}. + */ + particleBringToTop?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleClass}. + */ + particleClass?: Function; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#radial}. + */ + radial?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#timeScale}. + */ + timeScale?: number; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#trackVisible}. + */ + trackVisible?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#visible}. + */ + visible?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#accelerationX}. + */ + accelerationX?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#accelerationY}. + */ + accelerationY?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleAlpha}. + */ + alpha?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleAngle} (emit only). + */ + angle?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#bounce}. + */ + bounce?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#delay} (emit only). + */ + delay?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#hold} (emit only). + */ + hold?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#lifespan} (emit only). + */ + lifespan?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxVelocityX}. + */ + maxVelocityX?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxVelocityY}. + */ + maxVelocityY?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#moveToX}. If set, overrides `angle` and `speed` properties. + */ + moveToX?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#moveToY}. If set, overrides `angle` and `speed` properties. + */ + moveToY?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#quantity} (emit only). + */ + quantity?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleRotate}. + */ + rotate?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * As {@link Phaser.GameObjects.Particles.ParticleEmitter#setScale}. + */ + scale?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleScaleX}. + */ + scaleX?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleScaleY}. + */ + scaleY?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * As {@link Phaser.GameObjects.Particles.ParticleEmitter#setSpeed} (emit only). + */ + speed?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#speedX} (emit only). + */ + speedX?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#speedY} (emit only). + */ + speedY?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleTint}. + */ + tint?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * An array of color values that the Particles interpolate through during their life. If set, overrides any `tint` property. + */ + color?: number[]; + /** + * The string-based name of the Easing function to use if you have enabled Particle color interpolation via the `color` property, otherwise has no effect. + */ + colorEase?: string; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleX}. + */ + x?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleY}. + */ + y?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * As {@link Phaser.GameObjects.Particles.ParticleEmitter#setEmitZone}. + */ + emitZone?: Phaser.Types.GameObjects.Particles.EmitZoneData | Phaser.Types.GameObjects.Particles.EmitZoneData[]; + /** + * As {@link Phaser.GameObjects.Particles.ParticleEmitter#setDeathZone}. + */ + deathZone?: Phaser.Types.GameObjects.Particles.DeathZoneObject | Phaser.Types.GameObjects.Particles.DeathZoneObject[]; + /** + * As {@link Phaser.GameObjects.Particles.ParticleEmitter#setBounds}. + */ + bounds?: Phaser.Types.GameObjects.Particles.ParticleEmitterBounds | Phaser.Types.GameObjects.Particles.ParticleEmitterBoundsAlt; + /** + * Offset coordinates that assigns to {@link Phaser.GameObjects.Particles.ParticleEmitter#followOffset}. + */ + followOffset?: Phaser.Types.Math.Vector2Like; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#anims}. + */ + anim?: string | string[] | Phaser.Types.GameObjects.Particles.ParticleEmitterAnimConfig; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#frames}. + */ + frame?: number | number[] | string | string[] | Phaser.Textures.Frame | Phaser.Textures.Frame[] | Phaser.Types.GameObjects.Particles.ParticleEmitterFrameConfig; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#texture}. Overrides any texture already set on the Emitter. + */ + texture?: string | Phaser.Textures.Texture; + /** + * Creates specified number of inactive particles and adds them to this emitter's pool. {@link Phaser.GameObjects.Particles.ParticleEmitter#reserve} + */ + reserve?: number; + /** + * If you wish to 'fast forward' the emitter in time, set this value to a number representing the amount of ms the emitter should advance. Doing so implicitly sets `emitting` to `true`. + */ + advance?: number; + /** + * Limit the emitter to emit particles for a maximum of `duration` ms. Default to zero, meaning 'forever'. + */ + duration?: number; + /** + * Limit the emitter to emit this exact number of particles and then stop. Default to zero, meaning no limit. + */ + stopAfter?: number; + /** + * A custom callback that sorts particles prior to rendering. Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#sortCallback}. + */ + sortCallback?: Phaser.Types.GameObjects.Particles.ParticleSortCallback; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#sortOrderAsc}. + */ + sortOrderAsc?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#sortProperty}. + */ + sortProperty?: string; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#tintFill}. + */ + tintFill?: boolean; + }; + + type ParticleEmitterCreatorConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key of the Texture this Emitter will use to render particles, as stored in the Texture Manager. + */ + key?: string; + /** + * The Particle Emitter configuration object. + */ + config?: Phaser.Types.GameObjects.Particles.ParticleEmitterConfig; + }; + + type ParticleEmitterDeathZoneConfig = { + /** + * A shape representing the zone. See {@link Phaser.GameObjects.Particles.Zones.DeathZone#source}. + */ + source: Phaser.Types.GameObjects.Particles.DeathZoneSource; + /** + * 'onEnter' or 'onLeave'. + */ + type?: string; + }; + + type ParticleEmitterEdgeZoneConfig = { + /** + * A shape representing the zone. See {@link Phaser.GameObjects.Particles.Zones.EdgeZone#source}. + */ + source: Phaser.Types.GameObjects.Particles.EdgeZoneSource; + /** + * 'edge'. + */ + type: string; + /** + * The number of particles to place on the source edge. Set to 0 to use `stepRate` instead. + */ + quantity: number; + /** + * The distance between each particle. When set, `quantity` is implied and should be set to 0. + */ + stepRate?: number; + /** + * Whether particles are placed from start to end and then end to start. + */ + yoyo?: boolean; + /** + * Whether one endpoint will be removed if it's identical to the other. + */ + seamless?: boolean; + /** + * The total number of particles this zone will emit before passing over to the next emission zone in the Emitter. + */ + total?: number; + }; + + type ParticleEmitterFrameConfig = { + /** + * Array of texture frames. + */ + frames?: number[] | string[] | Phaser.Textures.Frame[]; + /** + * Whether texture frames will be assigned consecutively (true) or at random (false). + */ + cycle?: boolean; + /** + * The number of consecutive particles receiving each texture frame, when `cycle` is true. + */ + quantity?: number; + }; + + type ParticleEmitterOps = { + /** + * The accelerationX EmitterOp instance. This is an onEmit and onUpdate operator. + */ + accelerationX: Phaser.GameObjects.Particles.EmitterOp; + /** + * The accelerationY EmitterOp instance. This is an onEmit and onUpdate operator. + */ + accelerationY: Phaser.GameObjects.Particles.EmitterOp; + /** + * The alpha EmitterOp instance. This is an onEmit and onUpdate operator. + */ + alpha: Phaser.GameObjects.Particles.EmitterOp; + /** + * The angle EmitterOp instance. This is an onEmit operator only. + */ + angle: Phaser.GameObjects.Particles.EmitterOp; + /** + * The bounce EmitterOp instance. This is an onEmit and onUpdate operator. + */ + bounce: Phaser.GameObjects.Particles.EmitterOp; + /** + * The color EmitterColorOp instance. This is an onEmit and onUpdate operator. + */ + color: Phaser.GameObjects.Particles.EmitterColorOp; + /** + * The delay EmitterOp instance. This is an onEmit operator only. + */ + delay: Phaser.GameObjects.Particles.EmitterOp; + /** + * The hold EmitterOp instance. This is an onEmit operator only. + */ + hold: Phaser.GameObjects.Particles.EmitterOp; + /** + * The lifespan EmitterOp instance. This is an onEmit operator only. + */ + lifespan: Phaser.GameObjects.Particles.EmitterOp; + /** + * The maxVelocityX EmitterOp instance. This is an onEmit and onUpdate operator. + */ + maxVelocityX: Phaser.GameObjects.Particles.EmitterOp; + /** + * The maxVelocityY EmitterOp instance. This is an onEmit and onUpdate operator. + */ + maxVelocityY: Phaser.GameObjects.Particles.EmitterOp; + /** + * The moveToX EmitterOp instance. This is an onEmit and onUpdate operator. + */ + moveToX: Phaser.GameObjects.Particles.EmitterOp; + /** + * The moveToY EmitterOp instance. This is an onEmit and onUpdate operator. + */ + moveToY: Phaser.GameObjects.Particles.EmitterOp; + /** + * The quantity EmitterOp instance. This is an onEmit operator only. + */ + quantity: Phaser.GameObjects.Particles.EmitterOp; + /** + * The rotate EmitterOp instance. This is an onEmit and onUpdate operator. + */ + rotate: Phaser.GameObjects.Particles.EmitterOp; + /** + * The scaleX EmitterOp instance. This is an onEmit and onUpdate operator. + */ + scaleX: Phaser.GameObjects.Particles.EmitterOp; + /** + * The scaleY EmitterOp instance. This is an onEmit and onUpdate operator. + */ + scaleY: Phaser.GameObjects.Particles.EmitterOp; + /** + * The speedX EmitterOp instance. This is an onEmit operator only. + */ + speedX: Phaser.GameObjects.Particles.EmitterOp; + /** + * The speedY EmitterOp instance. This is an onEmit operator only. + */ + speedY: Phaser.GameObjects.Particles.EmitterOp; + /** + * The tint EmitterOp instance. This is an onEmit and onUpdate operator. + */ + tint: Phaser.GameObjects.Particles.EmitterOp; + /** + * The x EmitterOp instance. This is an onEmit and onUpdate operator. + */ + x: Phaser.GameObjects.Particles.EmitterOp; + /** + * The y EmitterOp instance. This is an onEmit and onUpdate operator. + */ + y: Phaser.GameObjects.Particles.EmitterOp; + }; + + type ParticleEmitterRandomZoneConfig = { + /** + * A shape representing the zone. See {@link Phaser.GameObjects.Particles.Zones.RandomZone#source}. + */ + source: Phaser.Types.GameObjects.Particles.RandomZoneSource; + /** + * 'random'. + */ + type?: string; + }; + + type ParticleSortCallback = (a: Phaser.GameObjects.Particles.Particle, b: Phaser.GameObjects.Particles.Particle)=>void; + + type RandomZoneSource = { + /** + * A function modifying its point argument. + */ + getRandomPoint: Phaser.Types.GameObjects.Particles.RandomZoneSourceCallback; + }; + + type RandomZoneSourceCallback = (point: Phaser.Types.Math.Vector2Like)=>void; + + } + + namespace PathFollower { + /** + * Settings for a PathFollower. + */ + type PathConfig = { + /** + * The duration of the path follow in ms. Must be `> 0`. + */ + duration?: number; + /** + * The start position of the path follow, between 0 and 1. Must be less than `to`. + */ + from?: number; + /** + * The end position of the path follow, between 0 and 1. Must be more than `from`. + */ + to?: number; + /** + * Whether to position the PathFollower on the Path using its path offset. + */ + positionOnPath?: boolean; + /** + * Should the PathFollower automatically rotate to point in the direction of the Path? + */ + rotateToPath?: boolean; + /** + * If the PathFollower is rotating to match the Path, this value is added to the rotation value. This allows you to rotate objects to a path but control the angle of the rotation as well. + */ + rotationOffset?: number; + /** + * Current start position of the path follow, must be between `from` and `to`. + */ + startAt?: number; + }; + + } + + namespace Plane { + type PlaneCheckerboardConfig = { + /** + * The odd cell color, specified as a hex value. + */ + color1?: number; + /** + * The even cell color, specified as a hex value. + */ + color2?: number; + /** + * The odd cell alpha value, specified as a number between 0 and 255. + */ + alpha1?: number; + /** + * The even cell alpha value, specified as a number between 0 and 255. + */ + alpha2?: number; + /** + * The view height of the Plane after creation, in pixels. + */ + height?: number; + }; + + type PlaneConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + */ + key?: string | Phaser.Textures.Texture; + /** + * An optional frame from the Texture this Game Object is rendering with. + */ + frame?: string | number; + /** + * The width of this Plane, in cells, not pixels. + */ + width?: number; + /** + * The height of this Plane, in cells, not pixels. + */ + height?: number; + /** + * Is the texture tiled? I.e. repeated across each cell. + */ + tile?: boolean; + /** + * Plane checkerboard configuration object. + */ + checkerboard?: Phaser.Types.GameObjects.Plane.PlaneCheckerboardConfig; + }; + + } + + namespace RenderTexture { + type RenderTextureConfig = { + /** + * The x coordinate of the RenderTextures position. + */ + x?: number; + /** + * The y coordinate of the RenderTextures position. + */ + y?: number; + /** + * The width of the RenderTexture. + */ + width?: number; + /** + * The height of the RenderTexture. + */ + height?: number; + }; + + } + + namespace Rope { + type RopeConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. If not given, `__DEFAULT` is used. + */ + key?: string; + /** + * An optional frame from the Texture this Game Object is rendering with. + */ + frame?: string | integer | null; + /** + * An array containing the vertices data for this Rope, or a number that indicates how many segments to split the texture frame into. If none is provided a simple quad is created. See `setPoints` to set this post-creation. + */ + points?: integer | Phaser.Types.Math.Vector2Like[]; + /** + * Should the vertices of this Rope be aligned horizontally (`true`), or vertically (`false`)? + */ + horizontal?: boolean; + /** + * An optional array containing the color data for this Rope. You should provide one color value per pair of vertices. + */ + colors?: number[]; + /** + * An optional array containing the alpha data for this Rope. You should provide one alpha value per pair of vertices. + */ + alphas?: number[]; + }; + + } + + namespace Shader { + type ShaderConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key of the shader to use from the shader cache, or a BaseShader instance. + */ + key: string | Phaser.Display.BaseShader; + /** + * The width of the Game Object. + */ + width?: number; + /** + * The height of the Game Object. + */ + height?: number; + }; + + } + + namespace Sprite { + type SpriteConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + */ + key?: string | Phaser.Textures.Texture; + /** + * An optional frame from the Texture this Game Object is rendering with. + */ + frame?: string | number; + /** + * The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + */ + anims?: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig; + }; + + } + + namespace Text { + /** + * Results object from a call to GetTextSize. + */ + type GetTextSizeObject = { + /** + * The width of the longest line in the Text object. + */ + width: number; + /** + * The height of the Text object. + */ + height: number; + /** + * The number of lines in the Text object. + */ + lines: number; + /** + * An array of the lines for each line in the Text object. + */ + lineWidths: number[]; + /** + * The line spacing of the Text object. + */ + lineSpacing: number; + /** + * The height of a line factoring in font and stroke. + */ + lineHeight: number; + }; + + type TextConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The text this Text object will display. + */ + text?: string | string[]; + /** + * The Text style configuration object. + */ + style?: Phaser.Types.GameObjects.Text.TextStyle; + /** + * A Text Padding object. + */ + padding?: Phaser.Types.GameObjects.Text.TextPadding; + }; + + /** + * Font metrics for a Text Style object. + */ + type TextMetrics = { + /** + * The ascent of the font. + */ + ascent: number; + /** + * The descent of the font. + */ + descent: number; + /** + * The size of the font. + */ + fontSize: number; + }; + + /** + * A Text Padding configuration object as used by the Text Style. + */ + type TextPadding = { + /** + * If set this value is used for both the left and right padding. + */ + x?: number; + /** + * If set this value is used for both the top and bottom padding. + */ + y?: number; + /** + * The amount of padding added to the left of the Text object. + */ + left?: number; + /** + * The amount of padding added to the right of the Text object. + */ + right?: number; + /** + * The amount of padding added to the top of the Text object. + */ + top?: number; + /** + * The amount of padding added to the bottom of the Text object. + */ + bottom?: number; + }; + + /** + * A Text Shadow configuration object as used by the Text Style. + */ + type TextShadow = { + /** + * The horizontal offset of the shadow. + */ + offsetX?: number; + /** + * The vertical offset of the shadow. + */ + offsetY?: number; + /** + * The color of the shadow, given as a CSS string value. + */ + color?: string; + /** + * The amount of blur applied to the shadow. Leave as zero for a hard shadow. + */ + blur?: number; + /** + * Apply the shadow to the stroke effect on the Text object? + */ + stroke?: boolean; + /** + * Apply the shadow to the fill effect on the Text object? + */ + fill?: boolean; + }; + + /** + * A Text Style configuration object as used by the Text Game Object. + */ + type TextStyle = { + /** + * The font the Text object will render with. This is a Canvas style font string. + */ + fontFamily?: string; + /** + * The font size, as a CSS size string. + */ + fontSize?: number | string; + /** + * Any addition font styles, such as 'strong'. + */ + fontStyle?: string; + /** + * The font family or font settings to set. Overrides the other font settings. + */ + font?: string; + /** + * A solid fill color that is rendered behind the Text object. Given as a CSS string color such as `#ff0`. + */ + backgroundColor?: string; + /** + * The color the Text is drawn in. Given as a CSS string color such as `#fff` or `rgb()`. + */ + color?: string | CanvasGradient | CanvasPattern; + /** + * The color used to stroke the Text if the `strokeThickness` property is greater than zero. + */ + stroke?: string | CanvasGradient | CanvasPattern; + /** + * The thickness of the stroke around the Text. Set to zero for no stroke. + */ + strokeThickness?: number; + /** + * The Text shadow configuration object. + */ + shadow?: Phaser.Types.GameObjects.Text.TextShadow; + /** + * A Text Padding object. + */ + padding?: Phaser.Types.GameObjects.Text.TextPadding; + /** + * The alignment of the Text. This only impacts multi-line text. Either `left`, `right`, `center` or `justify`. + */ + align?: string; + /** + * The maximum number of lines to display within the Text object. + */ + maxLines?: number; + /** + * Force the Text object to have the exact width specified in this property. Leave as zero for it to change accordingly to content. + */ + fixedWidth?: number; + /** + * Force the Text object to have the exact height specified in this property. Leave as zero for it to change accordingly to content. + */ + fixedHeight?: number; + /** + * Sets the resolution (DPI setting) of the Text object. Leave at zero for it to use the game resolution. + */ + resolution?: number; + /** + * Set to `true` if this Text object should render from right-to-left. + */ + rtl?: boolean; + /** + * This is the string used to aid Canvas in calculating the height of the font. + */ + testString?: string; + /** + * The amount of horizontal padding added to the width of the text when calculating the font metrics. + */ + baselineX?: number; + /** + * The amount of vertical padding added to the height of the text when calculating the font metrics. + */ + baselineY?: number; + /** + * The Text Word wrap configuration object. + */ + wordWrap?: Phaser.Types.GameObjects.Text.TextWordWrap; + /** + * A Text Metrics object. Use this to avoid expensive font size calculations in text heavy games. + */ + metrics?: Phaser.Types.GameObjects.Text.TextMetrics; + /** + * The amount to add to the font height to achieve the overall line height. + */ + lineSpacing?: number; + }; + + /** + * A Text Word Wrap configuration object as used by the Text Style configuration. + */ + type TextWordWrap = { + /** + * The width at which text should be considered for word-wrapping. + */ + width?: number; + /** + * Provide a custom callback when word wrapping is enabled. + */ + callback?: TextStyleWordWrapCallback; + /** + * The context in which the word wrap callback is invoked. + */ + callbackScope?: any; + /** + * Use basic or advanced word wrapping? + */ + useAdvancedWrap?: boolean; + }; + + } + + namespace TileSprite { + type TileSpriteConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The x coordinate of the Tile Sprite. + */ + x?: number; + /** + * The y coordinate of the Tile Sprite. + */ + y?: number; + /** + * The width of the Tile Sprite. If zero it will use the size of the texture frame. + */ + width?: number; + /** + * The height of the Tile Sprite. If zero it will use the size of the texture frame. + */ + height?: number; + /** + * The key of the Texture this Tile Sprite will use to render with, as stored in the Texture Manager. + */ + key?: string; + /** + * An optional frame from the Texture this Tile Sprite is rendering with. + */ + frame?: number | string | Phaser.Textures.Frame; + }; + + } + + type DecomposeMatrixResults = { + /** + * The translated x value. + */ + translateX: number; + /** + * The translated y value. + */ + translateY: number; + /** + * The rotation value. + */ + rotation: number; + /** + * The scale x value. + */ + scaleX: number; + /** + * The scale y value. + */ + scaleY: number; + }; + + type Face = { + /** + * The first face vertex. + */ + vertex1: Phaser.Types.GameObjects.Vertex; + /** + * The second face vertex. + */ + vertex2: Phaser.Types.GameObjects.Vertex; + /** + * The third face vertex. + */ + vertex3: Phaser.Types.GameObjects.Vertex; + /** + * Are the vertices counter-clockwise? + */ + isCounterClockwise: boolean; + }; + + type GameObjectConfig = { + /** + * The x position of the Game Object. + */ + x?: number | object; + /** + * The y position of the Game Object. + */ + y?: number | object; + /** + * The depth of the GameObject. + */ + depth?: number; + /** + * The horizontally flipped state of the Game Object. + */ + flipX?: boolean; + /** + * The vertically flipped state of the Game Object. + */ + flipY?: boolean; + /** + * The scale of the GameObject. + */ + scale?: number | object | null; + /** + * The scroll factor of the GameObject. + */ + scrollFactor?: number | object | null; + /** + * The rotation angle of the Game Object, in radians. + */ + rotation?: number | object; + /** + * The rotation angle of the Game Object, in degrees. + */ + angle?: number | object | null; + /** + * The alpha (opacity) of the Game Object. + */ + alpha?: number | object; + /** + * The origin of the Game Object. + */ + origin?: number | object | null; + /** + * The scale mode of the GameObject. + */ + scaleMode?: number; + /** + * The blend mode of the GameObject. + */ + blendMode?: number; + /** + * The visible state of the Game Object. + */ + visible?: boolean; + /** + * Add the GameObject to the scene. + */ + add?: boolean; + }; + + type GetCalcMatrixResults = { + /** + * The calculated Camera matrix. + */ + camera: Phaser.GameObjects.Components.TransformMatrix; + /** + * The calculated Sprite (Game Object) matrix. + */ + sprite: Phaser.GameObjects.Components.TransformMatrix; + /** + * The calculated results matrix, factoring all others in. + */ + calc: Phaser.GameObjects.Components.TransformMatrix; + }; + + type JSONGameObject = { + /** + * The name of this Game Object. + */ + name: string; + /** + * A textual representation of this Game Object, i.e. `sprite`. + */ + type: string; + /** + * The x position of this Game Object. + */ + x: number; + /** + * The y position of this Game Object. + */ + y: number; + /** + * The scale of this Game Object + */ + scale: object; + /** + * The horizontal scale of this Game Object. + */ + "scale.x": number; + /** + * The vertical scale of this Game Object. + */ + "scale.y": number; + /** + * The origin of this Game Object. + */ + origin: object; + /** + * The horizontal origin of this Game Object. + */ + "origin.x": number; + /** + * The vertical origin of this Game Object. + */ + "origin.y": number; + /** + * The horizontally flipped state of the Game Object. + */ + flipX: boolean; + /** + * The vertically flipped state of the Game Object. + */ + flipY: boolean; + /** + * The angle of this Game Object in radians. + */ + rotation: number; + /** + * The alpha value of the Game Object. + */ + alpha: number; + /** + * The visible state of the Game Object. + */ + visible: boolean; + /** + * The Scale Mode being used by this Game Object. + */ + scaleMode: number; + /** + * Sets the Blend Mode being used by this Game Object. + */ + blendMode: number | string; + /** + * The texture key of this Game Object. + */ + textureKey: string; + /** + * The frame key of this Game Object. + */ + frameKey: string; + /** + * The data of this Game Object. + */ + data: object; + }; + + type Vertex = { + /** + * The x coordinate of the vertex. + */ + x: number; + /** + * The y coordinate of the vertex. + */ + y: number; + /** + * The z coordinate of the vertex. + */ + z: number; + /** + * The x normal of the vertex. + */ + normalX: number; + /** + * The y normal of the vertex. + */ + normalY: number; + /** + * The z normal of the vertex. + */ + normalZ: number; + /** + * UV u texture coordinate of the vertex. + */ + u: number; + /** + * UV v texture coordinate of the vertex. + */ + v: number; + /** + * The alpha value of the vertex. + */ + alpha: number; + }; + + namespace Video { + type VideoConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * Optional key of the Video this Game Object will play, as stored in the Video Cache. + */ + key?: string; + }; + + } + + namespace Zone { + type ZoneConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The width of the Game Object. + */ + width?: number; + /** + * The height of the Game Object. + */ + height?: number; + }; + + } + + } + + namespace Geom { + namespace Mesh { + type GenerateGridConfig = { + /** + * The texture to be used for this Grid. Must be a Texture instance. Can also be a string but only if the `mesh` property is set. + */ + texture: string | Phaser.Textures.Texture; + /** + * The name or index of the frame within the Texture. + */ + frame?: string | number; + /** + * If specified, the vertices of the generated grid will be added to this Mesh Game Object. + */ + mesh?: Phaser.GameObjects.Mesh; + /** + * The width of the grid in 3D units. If you wish to get a pixel accurate grid based on a texture, you can use an Ortho Mesh or the `isOrtho` parameter. + */ + width?: number; + /** + * The height of the grid in 3D units. + */ + height?: number; + /** + * The number of segments to split the grid horizontally in to. + */ + widthSegments?: number; + /** + * The number of segments to split the grid vertically in to. + */ + heightSegments?: number; + /** + * Offset the grid x position by this amount. + */ + x?: number; + /** + * Offset the grid y position by this amount. + */ + y?: number; + /** + * An array of colors, one per vertex, or a single color value applied to all vertices. + */ + colors?: number | number[]; + /** + * An array of alpha values, one per vertex, or a single alpha value applied to all vertices. + */ + alphas?: number | number[]; + /** + * Should the texture tile (repeat) across the grid segments, or display as a single texture? + */ + tile?: boolean; + /** + * If set and using a texture with an ortho Mesh, the `width` and `height` parameters will be calculated based on the frame size for you. + */ + isOrtho?: boolean; + /** + * If set and using a texture, vertically flipping render result. + */ + flipY?: boolean; + }; + + type GenerateGridVertsResult = { + /** + * An array of vertex values in x, y pairs. + */ + verts: number[]; + /** + * An array of vertex indexes. This array will be empty if the `tile` parameter was `true`. + */ + indices: number[]; + /** + * An array of UV values, two per vertex. + */ + uvs: number[]; + /** + * An array of colors, one per vertex, or a single color value applied to all vertices. + */ + colors?: number | number[]; + /** + * An array of alpha values, one per vertex, or a single alpha value applied to all vertices. + */ + alphas?: number | number[]; + }; + + type GenerateVertsResult = { + /** + * An array of Face objects generated from the OBJ Data. + */ + faces: Phaser.Geom.Mesh.Face[]; + /** + * An array of Vertex objects generated from the OBJ Data. + */ + vertices: Phaser.Geom.Mesh.Vertex[]; + }; + + type OBJData = { + /** + * An array of material library filenames found in the OBJ file. + */ + materialLibraries: string[]; + /** + * If the obj was loaded with an mtl file, the parsed material names are stored in this object. + */ + materials: object; + /** + * An array of parsed models extracted from the OBJ file. + */ + models: Phaser.Types.Geom.Mesh.OBJModel[]; + }; + + type OBJFace = { + /** + * The name of the Group this Face is in. + */ + group: string; + /** + * The name of the material this Face uses. + */ + material: string; + /** + * An array of vertices in this Face. + */ + vertices: Phaser.Types.Geom.Mesh.OBJFaceVertice[]; + }; + + type OBJFaceVertice = { + /** + * The index in the `textureCoords` array that this vertex uses. + */ + textureCoordsIndex: number; + /** + * The index in the `vertices` array that this vertex uses. + */ + vertexIndex: number; + /** + * The index in the `vertexNormals` array that this vertex uses. + */ + vertexNormalIndex: number; + }; + + type OBJModel = { + /** + * An array of Faces. + */ + faces: Phaser.Types.Geom.Mesh.OBJFace[]; + /** + * The name of the model. + */ + name: string; + /** + * An array of texture coordinates. + */ + textureCoords: Phaser.Types.Geom.Mesh.UV[]; + /** + * An array of vertex normals. + */ + vertexNormals: Phaser.Types.Math.Vector3Like[]; + /** + * An array of vertices in the model. + */ + vertices: Phaser.Types.Math.Vector3Like[]; + }; + + type UV = { + /** + * The u component. + */ + u: number; + /** + * The v component. + */ + v: number; + /** + * The w component. + */ + w: number; + }; + + } + + } + + namespace Input { + namespace Gamepad { + /** + * The Gamepad object, as extracted from GamepadEvent. + */ + type Pad = { + /** + * The ID of the Gamepad. + */ + id: string; + /** + * The index of the Gamepad. + */ + index: number; + }; + + } + + namespace Keyboard { + type CursorKeys = { + /** + * A Key object mapping to the UP arrow key. + */ + up: Phaser.Input.Keyboard.Key; + /** + * A Key object mapping to the DOWN arrow key. + */ + down: Phaser.Input.Keyboard.Key; + /** + * A Key object mapping to the LEFT arrow key. + */ + left: Phaser.Input.Keyboard.Key; + /** + * A Key object mapping to the RIGHT arrow key. + */ + right: Phaser.Input.Keyboard.Key; + /** + * A Key object mapping to the SPACE BAR key. + */ + space: Phaser.Input.Keyboard.Key; + /** + * A Key object mapping to the SHIFT key. + */ + shift: Phaser.Input.Keyboard.Key; + }; + + type KeyboardKeydownCallback = (event: KeyboardEvent)=>void; + + type KeyComboConfig = { + /** + * If they press the wrong key do we reset the combo? + */ + resetOnWrongKey?: boolean; + /** + * The max delay in ms between each key press. Above this the combo is reset. 0 means disabled. + */ + maxKeyDelay?: number; + /** + * If previously matched and they press the first key of the combo again, will it reset? + */ + resetOnMatch?: boolean; + /** + * If the combo matches, will it delete itself? + */ + deleteOnMatch?: boolean; + }; + + } + + /** + * A Phaser Input Event Data object. + * + * This object is passed to the registered event listeners and allows you to stop any further propagation. + */ + type EventData = { + /** + * The cancelled state of this Event. + */ + cancelled?: boolean; + /** + * Call this method to stop this event from passing any further down the event chain. + */ + stopPropagation: Function; + }; + + type HitAreaCallback = (hitArea: any, x: number, y: number, gameObject: Phaser.GameObjects.GameObject)=>boolean; + + type InputConfiguration = { + /** + * The object / shape to use as the Hit Area. If not given it will try to create a Rectangle based on the texture frame. + */ + hitArea?: any; + /** + * The callback that determines if the pointer is within the Hit Area shape or not. + */ + hitAreaCallback?: Phaser.Types.Input.HitAreaCallback; + /** + * If `true` the Interactive Object will be set to be draggable and emit drag events. + */ + draggable?: boolean; + /** + * If `true` the Interactive Object will be set to be a drop zone for draggable objects. + */ + dropZone?: boolean; + /** + * If `true` the Interactive Object will set the `pointer` hand cursor when a pointer is over it. This is a short-cut for setting `cursor: 'pointer'`. + */ + useHandCursor?: boolean; + /** + * The CSS string to be used when the cursor is over this Interactive Object. + */ + cursor?: string; + /** + * If `true` the a pixel perfect function will be set for the hit area callback. Only works with image texture based Game Objects, not Render Textures. + */ + pixelPerfect?: boolean; + /** + * If `pixelPerfect` is set, this is the alpha tolerance threshold value used in the callback. A value of 255 will match only fully opaque pixels. + */ + alphaTolerance?: number; + }; + + type InputPluginContainer = { + /** + * The unique name of this plugin in the input plugin cache. + */ + key: string; + /** + * The plugin to be stored. Should be the source object, not instantiated. + */ + plugin: Function; + /** + * If this plugin is to be injected into the Input Plugin, this is the property key map used. + */ + mapping?: string; + }; + + type InteractiveObject = { + /** + * The Game Object to which this Interactive Object is bound. + */ + gameObject: Phaser.GameObjects.GameObject; + /** + * Is this Interactive Object currently enabled for input events? + */ + enabled: boolean; + /** + * Is this Interactive Object draggable? Enable with `InputPlugin.setDraggable`. + */ + draggable: boolean; + /** + * Is this Interactive Object a drag-targets drop zone? Set when the object is created. + */ + dropZone: boolean; + /** + * Should this Interactive Object change the cursor (via css) when over? (desktop only) + */ + cursor: boolean | string; + /** + * An optional drop target for a draggable Interactive Object. + */ + target: Phaser.GameObjects.GameObject | null; + /** + * The most recent Camera to be tested against this Interactive Object. + */ + camera: Phaser.Cameras.Scene2D.Camera; + /** + * The hit area for this Interactive Object. Typically a geometry shape, like a Rectangle or Circle. + */ + hitArea: any; + /** + * The 'contains' check callback that the hit area shape will use for all hit tests. + */ + hitAreaCallback: Phaser.Types.Input.HitAreaCallback; + /** + * If this Interactive Object has been enabled for debug, via `InputPlugin.enableDebug` then this property holds its debug shape. + */ + hitAreaDebug: Phaser.GameObjects.Shape; + /** + * Was the hitArea for this Interactive Object created based on texture size (false), or a custom shape? (true) + */ + customHitArea: boolean; + /** + * The x coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position. + */ + localX: number; + /** + * The y coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position. + */ + localY: number; + /** + * The current drag state of this Interactive Object. 0 = Not being dragged, 1 = being checked for drag, or 2 = being actively dragged. + */ + dragState: 0 | 1 | 2; + /** + * The x coordinate of the Game Object that owns this Interactive Object when the drag started. + */ + dragStartX: number; + /** + * The y coordinate of the Game Object that owns this Interactive Object when the drag started. + */ + dragStartY: number; + /** + * The x coordinate that the Pointer started dragging this Interactive Object from. + */ + dragStartXGlobal: number; + /** + * The y coordinate that the Pointer started dragging this Interactive Object from. + */ + dragStartYGlobal: number; + /** + * The x coordinate that this Interactive Object is currently being dragged to. + */ + dragX: number; + /** + * The y coordinate that this Interactive Object is currently being dragged to. + */ + dragY: number; + }; + + } + + namespace Loader { + namespace FileTypes { + type AsepriteFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the texture image file from. + */ + textureURL?: string; + /** + * The default file extension to use for the image texture if no url is provided. + */ + textureExtension?: string; + /** + * Extra XHR Settings specifically for the texture image file. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The absolute or relative URL to load the atlas json file from. Or, a well formed JSON object to use instead. + */ + atlasURL?: object | string; + /** + * The default file extension to use for the atlas json if no url is provided. + */ + atlasExtension?: string; + /** + * Extra XHR Settings specifically for the atlas json file. + */ + atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type AtlasJSONFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the texture image file from. + */ + textureURL?: string; + /** + * The default file extension to use for the image texture if no url is provided. + */ + textureExtension?: string; + /** + * Extra XHR Settings specifically for the texture image file. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The filename of an associated normal map. It uses the same path and url to load as the texture image. + */ + normalMap?: string; + /** + * The absolute or relative URL to load the atlas json file from. Or, a well formed JSON object to use instead. + */ + atlasURL?: object | string; + /** + * The default file extension to use for the atlas json if no url is provided. + */ + atlasExtension?: string; + /** + * Extra XHR Settings specifically for the atlas json file. + */ + atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type AtlasXMLFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the texture image file from. + */ + textureURL?: string; + /** + * The default file extension to use for the image texture if no url is provided. + */ + textureExtension?: string; + /** + * Extra XHR Settings specifically for the texture image file. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The filename of an associated normal map. It uses the same path and url to load as the texture image. + */ + normalMap?: string; + /** + * The absolute or relative URL to load the atlas xml file from. + */ + atlasURL?: string; + /** + * The default file extension to use for the atlas xml if no url is provided. + */ + atlasExtension?: string; + /** + * Extra XHR Settings specifically for the atlas xml file. + */ + atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type AudioFileConfig = { + /** + * The key of the file. Must be unique within the Loader and Audio Cache. + */ + key: string; + /** + * The absolute or relative URLs to load the audio files from. + */ + url?: string | string[] | Phaser.Types.Loader.FileTypes.AudioFileURLConfig | Phaser.Types.Loader.FileTypes.AudioFileURLConfig[]; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The optional AudioContext this file will use to process itself. + */ + context?: AudioContext; + }; + + type AudioFileURLConfig = { + /** + * The audio file format. See property names in {@link Phaser.Device.Audio}. + */ + type: string; + /** + * The absolute or relative URL of the audio file. + */ + url: string; + }; + + type AudioSpriteFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Audio Cache. + */ + key: string; + /** + * The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead. + */ + jsonURL: string; + /** + * Extra XHR Settings specifically for the json file. + */ + jsonXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The absolute or relative URL to load the audio file from. + */ + audioURL?: Object; + /** + * The audio configuration options. + */ + audioConfig?: any; + /** + * Extra XHR Settings specifically for the audio file. + */ + audioXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type BinaryFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Binary Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * Optional type to cast the binary file to once loaded. For example, `Uint8Array`. + */ + dataType?: any; + }; + + type BitmapFontFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the texture image file from. + */ + textureURL?: string; + /** + * The default file extension to use for the image texture if no url is provided. + */ + textureExtension?: string; + /** + * Extra XHR Settings specifically for the texture image file. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The filename of an associated normal map. It uses the same path and url to load as the texture image. + */ + normalMap?: string; + /** + * The absolute or relative URL to load the font data xml file from. + */ + fontDataURL?: string; + /** + * The default file extension to use for the font data xml if no url is provided. + */ + fontDataExtension?: string; + /** + * Extra XHR Settings specifically for the font data xml file. + */ + fontDataXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type CompressedTextureFileEntry = { + /** + * The texture compression base format that the browser must support in order to load this file. Can be any of: 'ETC', 'ETC1', 'ATC', 'ASTC', 'BPTC', 'RGTC', 'PVRTC', 'S3TC', 'S3TCSRGB' or the fallback format of 'IMG'. + */ + format?: string; + /** + * The container format, either PVR or KTX. If not given it will try to extract it from the textureURL extension. + */ + type?: string; + /** + * The URL of the compressed texture file to load. + */ + textureURL?: string; + /** + * Optional URL of a texture atlas JSON data file. If not given, the texture will be loaded as a single image. + */ + atlasURL?: string; + /** + * Optional URL of a multi-texture atlas JSON data file as created by Texture Packer Pro. + */ + multiAtlasURL?: string; + /** + * Optional path to use when loading the textures defined in the multi atlas data. + */ + multiPath?: string; + /** + * Optional Base URL to use when loading the textures defined in the multi atlas data. + */ + multiBaseURL?: string; + }; + + type CompressedTextureFileConfig = { + /** + * The string, or file entry object, for an ETC format texture. + */ + ETC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an ETC1 format texture. + */ + ETC1?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an ATC format texture. + */ + ATC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an ASTC format texture. + */ + ASTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an BPTC format texture. + */ + BPTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an RGTC format texture. + */ + RGTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an PVRTC format texture. + */ + PVRTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an S3TC format texture. + */ + S3TC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an S3TCSRGB format texture. + */ + S3TCSRGB?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for the fallback image file. + */ + IMG?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + }; + + type CSSFileConfig = { + /** + * The key of the file. Must be unique within the Loader. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type GLSLFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Text Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The type of shader. Either `fragment` for a fragment shader, or `vertex` for a vertex shader. This is ignored if you load a shader bundle. + */ + shaderType?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type HTMLFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Text Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type HTMLTextureFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The width of the texture the HTML will be rendered to. + */ + width?: number; + /** + * The height of the texture the HTML will be rendered to. + */ + height?: number; + }; + + type ImageFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * The filename of an associated normal map. It uses the same path and url to load as the image. + */ + normalMap?: string; + /** + * The frame configuration object. Only provided for, and used by, Sprite Sheets. + */ + frameConfig?: Phaser.Types.Loader.FileTypes.ImageFrameConfig; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type ImageFrameConfig = { + /** + * The width of the frame in pixels. + */ + frameWidth: number; + /** + * The height of the frame in pixels. Uses the `frameWidth` value if not provided. + */ + frameHeight?: number; + /** + * The first frame to start parsing from. + */ + startFrame?: number; + /** + * The frame to stop parsing at. If not provided it will calculate the value based on the image and frame dimensions. + */ + endFrame?: number; + /** + * The margin in the image. This is the space around the edge of the frames. + */ + margin?: number; + /** + * The spacing between each frame in the image. + */ + spacing?: number; + }; + + type JSONFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the JSON Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. Or can be a ready formed JSON object, in which case it will be directly added to the Cache. + */ + url?: string | any; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * If specified instead of the whole JSON file being parsed and added to the Cache, only the section corresponding to this property key will be added. If the property you want to extract is nested, use periods to divide it. + */ + dataKey?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type MultiAtlasFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the multi atlas json file from. Or, a well formed JSON object. + */ + atlasURL?: string; + /** + * An alias for 'atlasURL'. If given, it overrides anything set in 'atlasURL'. + */ + url?: string; + /** + * The default file extension to use for the atlas json if no url is provided. + */ + atlasExtension?: string; + /** + * Extra XHR Settings specifically for the atlas json file. + */ + atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * Optional path to use when loading the textures defined in the atlas data. + */ + path?: string; + /** + * Optional Base URL to use when loading the textures defined in the atlas data. + */ + baseURL?: string; + /** + * Extra XHR Settings specifically for the texture files. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type MultiScriptFileConfig = { + /** + * The key of the file. Must be unique within the Loader. + */ + key: string; + /** + * An array of absolute or relative URLs to load the script files from. They are processed in the order given in the array. + */ + url?: string[]; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for these files. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type OBJFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the OBJ Cache. + */ + key: string; + /** + * The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.obj`, i.e. if `key` was "alien" then the URL will be "alien.obj". + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Flip the UV coordinates stored in the model data? + */ + flipUV?: boolean; + /** + * An optional absolute or relative URL to the object material file from. If undefined or `null`, no material file will be loaded. + */ + matURL?: string; + /** + * The default material file extension to use if no url is provided. + */ + matExtension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type PackFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the JSON Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. Or can be a ready formed JSON object, in which case it will be directly processed. + */ + url?: string | any; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * If specified instead of the whole JSON file being parsed, only the section corresponding to this property key will be added. If the property you want to extract is nested, use periods to divide it. + */ + dataKey?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type PackFileSection = { + /** + * The files to load. See {@link Phaser.Types.Loader.FileTypes}. + */ + files: Phaser.Types.Loader.FileConfig[]; + /** + * A URL used to resolve paths in `files`. Example: 'http://labs.phaser.io/assets/'. + */ + baseURL?: string; + /** + * The default {@link Phaser.Types.Loader.FileConfig} `type`. + */ + defaultType?: string; + /** + * A URL path used to resolve relative paths in `files`. Example: 'images/sprites/'. + */ + path?: string; + /** + * An optional prefix that is automatically prepended to each file key. + */ + prefix?: string; + }; + + type PluginFileConfig = { + /** + * The key of the file. Must be unique within the Loader. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Automatically start the plugin after loading? + */ + start?: boolean; + /** + * If this plugin is to be injected into the Scene, this is the property key used. + */ + mapping?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type SceneFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Text Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type ScenePluginFileConfig = { + /** + * The key of the file. Must be unique within the Loader. + */ + key: string; + /** + * The absolute or relative URL to load the file from. Or, a Scene Plugin. + */ + url?: string | Function; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * If this plugin is to be added to Scene.Systems, this is the property key for it. + */ + systemKey?: string; + /** + * If this plugin is to be added to the Scene, this is the property key for it. + */ + sceneKey?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type ScriptFileConfig = { + /** + * The key of the file. Must be unique within the Loader. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * The script type. Should be either 'script' for classic JavaScript, or 'module' if the file contains an exported module. + */ + type?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type SpriteSheetFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * The filename of an associated normal map. It uses the same path and url to load as the image. + */ + normalMap?: string; + /** + * The frame configuration object. + */ + frameConfig?: Phaser.Types.Loader.FileTypes.ImageFrameConfig; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type SVGFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The svg size configuration object. + */ + svgConfig?: Phaser.Types.Loader.FileTypes.SVGSizeConfig; + }; + + type SVGSizeConfig = { + /** + * An optional width. The SVG will be resized to this size before being rendered to a texture. + */ + width?: number; + /** + * An optional height. The SVG will be resized to this size before being rendered to a texture. + */ + height?: number; + /** + * An optional scale. If given it overrides the width / height properties. The SVG is scaled by the scale factor before being rendered to a texture. + */ + scale?: number; + }; + + type TextFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Text Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type TilemapCSVFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Tilemap Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type TilemapImpactFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Tilemap Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type TilemapJSONFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Tilemap Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. Or, a well formed JSON object. + */ + url?: object | string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type UnityAtlasFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the texture image file from. + */ + textureURL?: string; + /** + * The default file extension to use for the image texture if no url is provided. + */ + textureExtension?: string; + /** + * Extra XHR Settings specifically for the texture image file. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The filename of an associated normal map. It uses the same path and url to load as the texture image. + */ + normalMap?: string; + /** + * The absolute or relative URL to load the atlas data file from. + */ + atlasURL?: string; + /** + * The default file extension to use for the atlas data if no url is provided. + */ + atlasExtension?: string; + /** + * Extra XHR Settings specifically for the atlas data file. + */ + atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type VideoFileConfig = { + /** + * The key to use for this file, or a file configuration object. + */ + key: string | Phaser.Types.Loader.FileTypes.VideoFileConfig; + /** + * The absolute or relative URLs to load the video files from. + */ + url?: string | string[] | Phaser.Types.Loader.FileTypes.VideoFileURLConfig | Phaser.Types.Loader.FileTypes.VideoFileURLConfig[]; + /** + * Does the video have an audio track? If not you can enable auto-playing on it. + */ + noAudio?: boolean; + }; + + type VideoFileURLConfig = { + /** + * The video file format. See property names in {@link Phaser.Device.Video}. + */ + type: string; + /** + * The absolute or relative URL of the video file. + */ + url: string; + }; + + type XMLFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Text Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + } + + type FileConfig = { + /** + * The name of the Loader method that loads this file, e.g., 'image', 'json', 'spritesheet'. + */ + type: string; + /** + * Unique cache key (unique within its file type) + */ + key: string; + /** + * The URL of the file, not including baseURL. + */ + url?: object | string; + /** + * The path of the file, not including the baseURL. + */ + path?: string; + /** + * The default extension this file uses. + */ + extension?: string; + /** + * The responseType to be used by the XHR request. + */ + responseType?: XMLHttpRequestResponseType; + /** + * Custom XHR Settings specific to this file and merged with the Loader defaults. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject | false; + /** + * A config object that can be used by file types to store transitional data. + */ + config?: any; + /** + * The absolute or relative URL to load the texture image file from. + */ + textureURL?: string; + /** + * The default file extension to use for the image texture if no url is provided. + */ + textureExtension?: string; + /** + * Extra XHR Settings specifically for the texture image file. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The absolute or relative URL to load the atlas json file from. Or, a well formed JSON object to use instead. + */ + atlasURL?: object | string; + /** + * The default file extension to use for the atlas json if no url is provided. + */ + atlasExtension?: string; + /** + * Extra XHR Settings specifically for the atlas json file. + */ + atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The filename of an associated normal map. It uses the same path and url to load as the texture image. + */ + normalMap?: string; + /** + * The optional AudioContext this file will use to process itself (only used by Sound objects). + */ + context?: AudioContext; + /** + * The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead. + */ + jsonURL?: string; + /** + * Extra XHR Settings specifically for the json file. + */ + jsonXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The absolute or relative URL to load the audio file from. + */ + audioURL?: Object; + /** + * The audio configuration options. + */ + audioConfig?: any; + /** + * Extra XHR Settings specifically for the audio file. + */ + audioXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * Optional type to cast the binary file to once loaded. For example, `Uint8Array`. + */ + dataType?: any; + /** + * The absolute or relative URL to load the font data xml file from. + */ + fontDataURL?: string; + /** + * The default file extension to use for the font data xml if no url is provided. + */ + fontDataExtension?: string; + /** + * Extra XHR Settings specifically for the font data xml file. + */ + fontDataXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The string, or file entry object, for an ETC format texture. + */ + ETC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an ETC1 format texture. + */ + ETC1?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an ATC format texture. + */ + ATC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an ASTC format texture. + */ + ASTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an BPTC format texture. + */ + BPTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an RGTC format texture. + */ + RGTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an PVRTC format texture. + */ + PVRTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an S3TC format texture. + */ + S3TC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an S3TCSRGB format texture. + */ + S3TCSRGB?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for the fallback image file. + */ + IMG?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The type of shader. Either `fragment` for a fragment shader, or `vertex` for a vertex shader. This is ignored if you load a shader bundle. + */ + shaderType?: string; + /** + * The width of the texture the HTML will be rendered to. + */ + width?: number; + /** + * The height of the texture the HTML will be rendered to. + */ + height?: number; + /** + * The frame configuration object. Only provided for, and used by, Sprite Sheets. + */ + frameConfig?: Phaser.Types.Loader.FileTypes.ImageFrameConfig; + /** + * If specified instead of the whole JSON file being parsed and added to the Cache, only the section corresponding to this property key will be added. If the property you want to extract is nested, use periods to divide it. + */ + dataKey?: string; + /** + * Optional Base URL to use when loading the textures defined in the atlas data. + */ + baseURL?: string; + /** + * Flip the UV coordinates stored in the model data? + */ + flipUV?: boolean; + /** + * An optional absolute or relative URL to the object material file from. If undefined or `null`, no material file will be loaded. + */ + matURL?: string; + /** + * The default material file extension to use if no url is provided. + */ + matExtension?: string; + /** + * Automatically start the plugin after loading? + */ + start?: boolean; + /** + * If this plugin is to be injected into the Scene, this is the property key used. + */ + mapping?: string; + /** + * If this plugin is to be added to Scene.Systems, this is the property key for it. + */ + systemKey?: string; + /** + * If this plugin is to be added to the Scene, this is the property key for it. + */ + sceneKey?: string; + /** + * The svg size configuration object. + */ + svgConfig?: Phaser.Types.Loader.FileTypes.SVGSizeConfig; + }; + + type XHRSettingsObject = { + /** + * The response type of the XHR request, i.e. `blob`, `text`, etc. + */ + responseType: XMLHttpRequestResponseType; + /** + * Should the XHR request use async or not? + */ + async?: boolean; + /** + * Optional username for the XHR request. + */ + user?: string; + /** + * Optional password for the XHR request. + */ + password?: string; + /** + * Optional XHR timeout value. + */ + timeout?: number; + /** + * This value is used to populate the XHR `setRequestHeader` and is undefined by default. + */ + headers?: object | undefined; + /** + * This value is used to populate the XHR `setRequestHeader` and is undefined by default. + */ + header?: string | undefined; + /** + * This value is used to populate the XHR `setRequestHeader` and is undefined by default. + */ + headerValue?: string | undefined; + /** + * This value is used to populate the XHR `setRequestHeader` and is undefined by default. + */ + requestedWith?: string | undefined; + /** + * Provide a custom mime-type to use instead of the default. + */ + overrideMimeType?: string | undefined; + /** + * The withCredentials property indicates whether or not cross-site Access-Control requests should be made using credentials such as cookies, authorization headers or TLS client certificates. Setting withCredentials has no effect on same-site requests. + */ + withCredentials?: boolean; + }; + + } + + namespace Math { + type RectangleLike = { + /** + * The x component. + */ + x: number; + /** + * The y component. + */ + y: number; + /** + * The width component. + */ + width: number; + /** + * The height component. + */ + height: number; + }; + + type SinCosTable = { + /** + * The sine value. + */ + sin: number; + /** + * The cosine value. + */ + cos: number; + /** + * The length. + */ + length: number; + }; + + type Vector2Like = { + /** + * The x component. + */ + x: number; + /** + * The y component. + */ + y: number; + }; + + type Vector3Like = { + /** + * The x component. + */ + x?: number; + /** + * The y component. + */ + y?: number; + /** + * The z component. + */ + z?: number; + }; + + type Vector4Like = { + /** + * The x component. + */ + x?: number; + /** + * The y component. + */ + y?: number; + /** + * The z component. + */ + z?: number; + /** + * The w component. + */ + w?: number; + }; + + } + + namespace Physics { + namespace Arcade { + type ArcadeBodyBounds = { + /** + * The left edge. + */ + x: number; + /** + * The upper edge. + */ + y: number; + /** + * The right edge. + */ + right: number; + /** + * The lower edge. + */ + bottom: number; + }; + + type ArcadeBodyCollision = { + /** + * True if the Body is not colliding. + */ + none: boolean; + /** + * True if the Body is colliding on its upper edge. + */ + up: boolean; + /** + * True if the Body is colliding on its lower edge. + */ + down: boolean; + /** + * True if the Body is colliding on its left edge. + */ + left: boolean; + /** + * True if the Body is colliding on its right edge. + */ + right: boolean; + }; + + /** + * An Arcade Physics Collider Type. + */ + type ArcadeCollider = Phaser.Physics.Arcade.Sprite | Phaser.Physics.Arcade.Image | Phaser.Physics.Arcade.StaticGroup | Phaser.Physics.Arcade.Group | Phaser.Tilemaps.TilemapLayer; + + /** + * An Arcade Physics Collider Type. + */ + type ArcadeColliderType = Phaser.GameObjects.GameObject | Phaser.GameObjects.Group | Phaser.Physics.Arcade.Sprite | Phaser.Physics.Arcade.Image | Phaser.Physics.Arcade.StaticGroup | Phaser.Physics.Arcade.Group | Phaser.Tilemaps.TilemapLayer | Phaser.GameObjects.GameObject[] | Phaser.Physics.Arcade.Sprite[] | Phaser.Physics.Arcade.Image[] | Phaser.Physics.Arcade.StaticGroup[] | Phaser.Physics.Arcade.Group[] | Phaser.Tilemaps.TilemapLayer[]; + + type ArcadePhysicsCallback = (object1: Phaser.Types.Physics.Arcade.GameObjectWithBody | Phaser.Tilemaps.Tile, object2: Phaser.Types.Physics.Arcade.GameObjectWithBody | Phaser.Tilemaps.Tile)=>void; + + type ArcadeWorldConfig = { + /** + * Sets {@link Phaser.Physics.Arcade.World#fps}. + */ + fps?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#fixedStep}. + */ + fixedStep?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#timeScale}. + */ + timeScale?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#gravity}. + */ + gravity?: Phaser.Types.Math.Vector2Like; + /** + * Sets {@link Phaser.Physics.Arcade.World#bounds bounds.x}. + */ + x?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#bounds bounds.y}. + */ + y?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#bounds bounds.width}. + */ + width?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#bounds bounds.height}. + */ + height?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#checkCollision}. + */ + checkCollision?: Phaser.Types.Physics.Arcade.CheckCollisionObject; + /** + * Sets {@link Phaser.Physics.Arcade.World#OVERLAP_BIAS}. + */ + overlapBias?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#TILE_BIAS}. + */ + tileBias?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#forceX}. + */ + forceX?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#isPaused}. + */ + isPaused?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#debug}. + */ + debug?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#defaults debugShowBody}. + */ + debugShowBody?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#defaults debugShowStaticBody}. + */ + debugShowStaticBody?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#defaults debugShowStaticBody}. + */ + debugShowVelocity?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#defaults bodyDebugColor}. + */ + debugBodyColor?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#defaults staticBodyDebugColor}. + */ + debugStaticBodyColor?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#defaults velocityDebugColor}. + */ + debugVelocityColor?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#maxEntries}. + */ + maxEntries?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#useTree}. + */ + useTree?: boolean; + /** + * If enabled, you need to call `World.update` yourself. + */ + customUpdate?: boolean; + }; + + type ArcadeWorldDefaults = { + /** + * Set to `true` to render dynamic body outlines to the debug display. + */ + debugShowBody: boolean; + /** + * Set to `true` to render static body outlines to the debug display. + */ + debugShowStaticBody: boolean; + /** + * Set to `true` to render body velocity markers to the debug display. + */ + debugShowVelocity: boolean; + /** + * The color of dynamic body outlines when rendered to the debug display. + */ + bodyDebugColor: number; + /** + * The color of static body outlines when rendered to the debug display. + */ + staticBodyDebugColor: number; + /** + * The color of the velocity markers when rendered to the debug display. + */ + velocityDebugColor: number; + }; + + type ArcadeWorldTreeMinMax = { + /** + * The minimum x value used in RTree searches. + */ + minX: number; + /** + * The minimum y value used in RTree searches. + */ + minY: number; + /** + * The maximum x value used in RTree searches. + */ + maxX: number; + /** + * The maximum y value used in RTree searches. + */ + maxY: number; + }; + + type CheckCollisionObject = { + /** + * Will bodies collide with the top side of the world bounds? + */ + up: boolean; + /** + * Will bodies collide with the bottom side of the world bounds? + */ + down: boolean; + /** + * Will bodies collide with the left side of the world bounds? + */ + left: boolean; + /** + * Will bodies collide with the right side of the world bounds? + */ + right: boolean; + }; + + type GameObjectWithBody = Phaser.GameObjects.GameObject & { + body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody; + }; + + type GameObjectWithDynamicBody = Phaser.GameObjects.GameObject & { + body: Phaser.Physics.Arcade.Body; + }; + + type GameObjectWithStaticBody = Phaser.GameObjects.GameObject & { + body: Phaser.Physics.Arcade.StaticBody; + }; + + type ImageWithDynamicBody = Phaser.Physics.Arcade.Image & { + body: Phaser.Physics.Arcade.Body; + }; + + type ImageWithStaticBody = Phaser.Physics.Arcade.Image & { + body: Phaser.Physics.Arcade.StaticBody; + }; + + type PhysicsGroupConfig = Phaser.Types.GameObjects.Group.GroupConfig & { + /** + * Sets {@link Phaser.Physics.Arcade.Body#collideWorldBounds}. + */ + collideWorldBounds?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.Body#setBoundsRectangle setBoundsRectangle}. + */ + customBoundsRectangle?: Phaser.Geom.Rectangle; + /** + * Sets {@link Phaser.Physics.Arcade.Body#acceleration acceleration.x}. + */ + accelerationX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#acceleration acceleration.y}. + */ + accelerationY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#allowDrag}. + */ + allowDrag?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.Body#allowGravity}. + */ + allowGravity?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.Body#allowRotation}. + */ + allowRotation?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.Body#useDamping useDamping}. + */ + useDamping?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.Body#bounce bounce.x}. + */ + bounceX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#bounce bounce.y}. + */ + bounceY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#drag drag.x}. + */ + dragX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#drag drag.y}. + */ + dragY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#enable enable}. + */ + enable?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.Body#gravity gravity.x}. + */ + gravityX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#gravity gravity.y}. + */ + gravityY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#friction friction.x}. + */ + frictionX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#friction friction.y}. + */ + frictionY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#maxSpeed maxSpeed}. + */ + maxSpeed?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#maxVelocity maxVelocity.x}. + */ + maxVelocityX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#maxVelocity maxVelocity.y}. + */ + maxVelocityY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#velocity velocity.x}. + */ + velocityX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#velocity velocity.y}. + */ + velocityY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#angularVelocity}. + */ + angularVelocity?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#angularAcceleration}. + */ + angularAcceleration?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#angularDrag}. + */ + angularDrag?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#mass}. + */ + mass?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#immovable}. + */ + immovable?: boolean; + }; + + type PhysicsGroupDefaults = { + /** + * As {@link Phaser.Physics.Arcade.Body#setCollideWorldBounds}. + */ + setCollideWorldBounds: boolean; + /** + * As {@link Phaser.Physics.Arcade.Body#setBoundsRectangle}. + */ + setBoundsRectangle: Phaser.Geom.Rectangle; + /** + * As {@link Phaser.Physics.Arcade.Body#setAccelerationX}. + */ + setAccelerationX: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setAccelerationY}. + */ + setAccelerationY: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setAllowDrag}. + */ + setAllowDrag: boolean; + /** + * As {@link Phaser.Physics.Arcade.Body#setAllowGravity}. + */ + setAllowGravity: boolean; + /** + * As {@link Phaser.Physics.Arcade.Body#setAllowRotation}. + */ + setAllowRotation: boolean; + /** + * As {@link Phaser.Physics.Arcade.Body#setDamping}. + */ + setDamping: boolean; + /** + * As {@link Phaser.Physics.Arcade.Body#setBounceX}. + */ + setBounceX: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setBounceY}. + */ + setBounceY: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setDragX}. + */ + setDragX: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setDragY}. + */ + setDragY: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setEnable}. + */ + setEnable: boolean; + /** + * As {@link Phaser.Physics.Arcade.Body#setGravityX}. + */ + setGravityX: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setGravityY}. + */ + setGravityY: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setFrictionX}. + */ + setFrictionX: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setFrictionY}. + */ + setFrictionY: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setMaxSpeed}. + */ + setMaxSpeed: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setVelocityX}. + */ + setVelocityX: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setVelocityY}. + */ + setVelocityY: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setAngularVelocity}. + */ + setAngularVelocity: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setAngularAcceleration}. + */ + setAngularAcceleration: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setAngularDrag}. + */ + setAngularDrag: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setMass}. + */ + setMass: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setImmovable}. + */ + setImmovable: boolean; + }; + + type SpriteWithDynamicBody = Phaser.Physics.Arcade.Sprite & { + body: Phaser.Physics.Arcade.Body; + }; + + type SpriteWithStaticBody = Phaser.Physics.Arcade.Sprite & { + body: Phaser.Physics.Arcade.StaticBody; + }; + + } + + namespace Matter { + type MatterBody = MatterJS.BodyType | Phaser.GameObjects.GameObject | Phaser.Physics.Matter.Image | Phaser.Physics.Matter.Sprite | Phaser.Physics.Matter.TileBody; + + type MatterBodyConfig = { + /** + * An arbitrary string-based name to help identify this body. + */ + label?: string; + /** + * Set this Game Object to create and use a new Body based on the configuration object given. + */ + shape?: string | Phaser.Types.Physics.Matter.MatterSetBodyConfig; + /** + * An array of bodies that make up this body. The first body in the array must always be a self reference to the current body instance. All bodies in the `parts` array together form a single rigid compound body. + */ + parts?: MatterJS.BodyType[]; + /** + * An object reserved for storing plugin-specific properties. + */ + plugin?: any; + /** + * A number specifying the angle of the body, in radians. + */ + angle?: number; + /** + * An array of `Vector` objects that specify the convex hull of the rigid body. These should be provided about the origin `(0, 0)`. + */ + vertices?: Phaser.Types.Math.Vector2Like[]; + /** + * A `Vector` that specifies the current world-space position of the body. + */ + position?: Phaser.Types.Math.Vector2Like; + /** + * A `Vector` that specifies the force to apply in the current step. It is zeroed after every `Body.update`. See also `Body.applyForce`. + */ + force?: Phaser.Types.Math.Vector2Like; + /** + * A `Number` that specifies the torque (turning force) to apply in the current step. It is zeroed after every `Body.update`. + */ + torque?: number; + /** + * A flag that indicates whether a body is a sensor. Sensor triggers collision events, but doesn't react with colliding body physically. + */ + isSensor?: boolean; + /** + * A flag that indicates whether a body is considered static. A static body can never change position or angle and is completely fixed. + */ + isStatic?: boolean; + /** + * A `Number` that defines the number of updates in which this body must have near-zero velocity before it is set as sleeping by the `Matter.Sleeping` module (if sleeping is enabled by the engine). + */ + sleepThreshold?: number; + /** + * A `Number` that defines the density of the body, that is its mass per unit area. If you pass the density via `Body.create` the `mass` property is automatically calculated for you based on the size (area) of the object. This is generally preferable to simply setting mass and allows for more intuitive definition of materials (e.g. rock has a higher density than wood). + */ + density?: number; + /** + * A `Number` that defines the restitution (elasticity) of the body. The value is always positive and is in the range `(0, 1)`. + */ + restitution?: number; + /** + * A `Number` that defines the friction of the body. The value is always positive and is in the range `(0, 1)`. A value of `0` means that the body may slide indefinitely. A value of `1` means the body may come to a stop almost instantly after a force is applied. + */ + friction?: number; + /** + * A `Number` that defines the static friction of the body (in the Coulomb friction model). A value of `0` means the body will never 'stick' when it is nearly stationary and only dynamic `friction` is used. The higher the value (e.g. `10`), the more force it will take to initially get the body moving when nearly stationary. This value is multiplied with the `friction` property to make it easier to change `friction` and maintain an appropriate amount of static friction. + */ + frictionStatic?: number; + /** + * A `Number` that defines the air friction of the body (air resistance). A value of `0` means the body will never slow as it moves through space. The higher the value, the faster a body slows when moving through space. + */ + frictionAir?: number; + /** + * An `Object` that specifies the collision filtering properties of this body. + */ + collisionFilter?: Phaser.Types.Physics.Matter.MatterCollisionFilter; + /** + * A `Number` that specifies a tolerance on how far a body is allowed to 'sink' or rotate into other bodies. Avoid changing this value unless you understand the purpose of `slop` in physics engines. The default should generally suffice, although very large bodies may require larger values for stable stacking. + */ + slop?: number; + /** + * A `Number` that allows per-body time scaling, e.g. a force-field where bodies inside are in slow-motion, while others are at full speed. + */ + timeScale?: number; + /** + * A number, or array of numbers, to chamfer the vertices of the body, or a full Chamfer configuration object. + */ + chamfer?: number | number[] | Phaser.Types.Physics.Matter.MatterChamferConfig; + /** + * The radius of this body if a circle. + */ + circleRadius?: number; + /** + * A `Number` that defines the mass of the body, although it may be more appropriate to specify the `density` property instead. If you modify this value, you must also modify the `body.inverseMass` property (`1 / mass`). + */ + mass?: number; + /** + * A `Number` that defines the inverse mass of the body (`1 / mass`). If you modify this value, you must also modify the `body.mass` property. + */ + inverseMass?: number; + /** + * A `Vector` that specifies the initial scale of the body. + */ + scale?: Phaser.Types.Math.Vector2Like; + /** + * A `Vector` that scales the influence of World gravity when applied to this body. + */ + gravityScale?: Phaser.Types.Math.Vector2Like; + /** + * A boolean that toggles if this body should ignore world gravity or not. + */ + ignoreGravity?: boolean; + /** + * A boolean that toggles if this body should ignore pointer / mouse constraints or not. + */ + ignorePointer?: boolean; + /** + * The Debug Render configuration object for this body. + */ + render?: Phaser.Types.Physics.Matter.MatterBodyRenderConfig; + /** + * A callback that is invoked when this Body starts colliding with any other Body. You can register callbacks by providing a function of type `( pair: Matter.Pair) => void`. + */ + onCollideCallback?: Function; + /** + * A callback that is invoked when this Body stops colliding with any other Body. You can register callbacks by providing a function of type `( pair: Matter.Pair) => void`. + */ + onCollideEndCallback?: Function; + /** + * A callback that is invoked for the duration that this Body is colliding with any other Body. You can register callbacks by providing a function of type `( pair: Matter.Pair) => void`. + */ + onCollideActiveCallback?: Function; + /** + * A collision callback dictionary used by the `Body.setOnCollideWith` function. + */ + onCollideWith?: any; + }; + + type MatterBodyRenderConfig = { + /** + * Should this body be rendered by the Debug Renderer? + */ + visible?: boolean; + /** + * The opacity of the body and all parts within it. + */ + opacity?: number; + /** + * The color value of the fill when rendering this body. + */ + fillColor?: number; + /** + * The opacity of the fill when rendering this body, a value between 0 and 1. + */ + fillOpacity?: number; + /** + * The color value of the line stroke when rendering this body. + */ + lineColor?: number; + /** + * The opacity of the line when rendering this body, a value between 0 and 1. + */ + lineOpacity?: number; + /** + * If rendering lines, the thickness of the line. + */ + lineThickness?: number; + /** + * Controls the offset between the body and the parent Game Object, if it has one. + */ + sprite?: object; + /** + * The horizontal offset between the body and the parent Game Object texture, if it has one. + */ + "sprite.xOffset"?: number; + /** + * The vertical offset between the body and the parent Game Object texture, if it has one. + */ + "sprite.yOffset"?: number; + }; + + type MatterBodyTileOptions = { + /** + * Whether or not the newly created body should be made static. This defaults to true since typically tiles should not be moved. + */ + isStatic?: boolean; + /** + * Whether or not to add the newly created body (or existing body if options.body is used) to the Matter world. + */ + addToWorld?: boolean; + }; + + type MatterChamferConfig = { + /** + * A single number, or an array, to specify the radius for each vertex. + */ + radius?: number | number[]; + /** + * The quality of the chamfering. -1 means 'auto'. + */ + quality?: number; + /** + * The minimum quality of the chamfering. The higher this value, the more vertices are created. + */ + qualityMin?: number; + /** + * The maximum quality of the chamfering. The higher this value, the more vertices are created. + */ + qualityMax?: number; + }; + + type MatterCollisionData = { + /** + * Have the pair collided or not? + */ + collided: boolean; + /** + * A reference to the first body involved in the collision. + */ + bodyA: MatterJS.BodyType; + /** + * A reference to the second body involved in the collision. + */ + bodyB: MatterJS.BodyType; + /** + * A reference to the dominant axis body. + */ + axisBody: MatterJS.BodyType; + /** + * The index of the dominant collision axis vector (edge normal) + */ + axisNumber: number; + /** + * The depth of the collision on the minimum overlap. + */ + depth: number; + /** + * A reference to the parent of Body A, or to Body A itself if it has no parent. + */ + parentA: MatterJS.BodyType; + /** + * A reference to the parent of Body B, or to Body B itself if it has no parent. + */ + parentB: MatterJS.BodyType; + /** + * The collision normal, facing away from Body A. + */ + normal: MatterJS.Vector; + /** + * The tangent of the collision normal. + */ + tangent: MatterJS.Vector; + /** + * The penetration distances between the two bodies. + */ + penetration: MatterJS.Vector; + /** + * An array of support points, either exactly one or two points. + */ + supports: MatterJS.Vector[]; + /** + * The resulting inverse mass from the collision. + */ + inverseMass: number; + /** + * The resulting friction from the collision. + */ + friction: number; + /** + * The resulting static friction from the collision. + */ + frictionStatic: number; + /** + * The resulting restitution from the collision. + */ + restitution: number; + /** + * The resulting slop from the collision. + */ + slop: number; + }; + + /** + * An `Object` that specifies the collision filtering properties of this body. + * + * Collisions between two bodies will obey the following rules: + * - If the two bodies have the same non-zero value of `collisionFilter.group`, + * they will always collide if the value is positive, and they will never collide + * if the value is negative. + * - If the two bodies have different values of `collisionFilter.group` or if one + * (or both) of the bodies has a value of 0, then the category/mask rules apply as follows: + * + * Each body belongs to a collision category, given by `collisionFilter.category`. This + * value is used as a bit field and the category should have only one bit set, meaning that + * the value of this property is a power of two in the range [1, 2^31]. Thus, there are 32 + * different collision categories available. + * + * Each body also defines a collision bitmask, given by `collisionFilter.mask` which specifies + * the categories it collides with (the value is the bitwise AND value of all these categories). + * + * Using the category/mask rules, two bodies `A` and `B` collide if each includes the other's + * category in its mask, i.e. `(categoryA & maskB) !== 0` and `(categoryB & maskA) !== 0` + * are both true. + */ + type MatterCollisionFilter = { + /** + * A bit field that specifies the collision category this body belongs to. The category value should have only one bit set, for example `0x0001`. This means there are up to 32 unique collision categories available. + */ + category?: number; + /** + * A bit mask that specifies the collision categories this body may collide with. + */ + mask?: number; + /** + * An Integer `Number`, that specifies the collision group this body belongs to. + */ + group?: number; + }; + + type MatterCollisionPair = { + /** + * The unique auto-generated collision pair id. A combination of the body A and B IDs. + */ + id: string; + /** + * A reference to the first body involved in the collision. + */ + bodyA: MatterJS.BodyType; + /** + * A reference to the second body involved in the collision. + */ + bodyB: MatterJS.BodyType; + /** + * An array containing all of the active contacts between bodies A and B. + */ + contacts: MatterJS.Vector[]; + /** + * The amount of separation that occurred between bodies A and B. + */ + separation: number; + /** + * Is the collision still active or not? + */ + isActive: boolean; + /** + * Has Matter determined the collision are being active yet? + */ + confirmedActive: boolean; + /** + * Is either body A or B a sensor? + */ + isSensor: boolean; + /** + * The timestamp when the collision pair was created. + */ + timeCreated: number; + /** + * The timestamp when the collision pair was most recently updated. + */ + timeUpdated: number; + /** + * The collision data object. + */ + collision: Phaser.Types.Physics.Matter.MatterCollisionData; + /** + * The resulting inverse mass from the collision. + */ + inverseMass: number; + /** + * The resulting friction from the collision. + */ + friction: number; + /** + * The resulting static friction from the collision. + */ + frictionStatic: number; + /** + * The resulting restitution from the collision. + */ + restitution: number; + /** + * The resulting slop from the collision. + */ + slop: number; + }; + + type MatterConstraintConfig = { + /** + * An arbitrary string-based name to help identify this constraint. + */ + label?: string; + /** + * The first possible `Body` that this constraint is attached to. + */ + bodyA?: MatterJS.BodyType; + /** + * The second possible `Body` that this constraint is attached to. + */ + bodyB?: MatterJS.BodyType; + /** + * A `Vector` that specifies the offset of the constraint from center of the `constraint.bodyA` if defined, otherwise a world-space position. + */ + pointA?: Phaser.Types.Math.Vector2Like; + /** + * A `Vector` that specifies the offset of the constraint from center of the `constraint.bodyB` if defined, otherwise a world-space position. + */ + pointB?: Phaser.Types.Math.Vector2Like; + /** + * A `Number` that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`. A value of `1` means the constraint should be very stiff. A value of `0.2` means the constraint acts like a soft spring. + */ + stiffness?: number; + /** + * A `Number` that specifies the angular stiffness of the constraint. + */ + angularStiffness?: number; + /** + * The angleA of the constraint. If bodyA is set, the angle of bodyA is used instead. + */ + angleA?: number; + /** + * The angleB of the constraint. If bodyB is set, the angle of bodyB is used instead. + */ + angleB?: number; + /** + * A `Number` that specifies the damping of the constraint, i.e. the amount of resistance applied to each body based on their velocities to limit the amount of oscillation. Damping will only be apparent when the constraint also has a very low `stiffness`. A value of `0.1` means the constraint will apply heavy damping, resulting in little to no oscillation. A value of `0` means the constraint will apply no damping. + */ + damping?: number; + /** + * A `Number` that specifies the target resting length of the constraint. It is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`. + */ + length?: number; + /** + * An object reserved for storing plugin-specific properties. + */ + plugin?: any; + /** + * The Debug Render configuration object for this constraint. + */ + render?: Phaser.Types.Physics.Matter.MatterConstraintRenderConfig; + }; + + type MatterConstraintRenderConfig = { + /** + * Should this constraint be rendered by the Debug Renderer? + */ + visible?: boolean; + /** + * If this constraint has anchors, should they be rendered? Pin constraints never have anchors. + */ + anchors?: boolean; + /** + * The color value of the line stroke when rendering this constraint. + */ + lineColor?: number; + /** + * The opacity of the line when rendering this constraint, a value between 0 and 1. + */ + lineOpacity?: number; + /** + * If rendering lines, the thickness of the line. + */ + lineThickness?: number; + /** + * The size of the circles drawn when rendering pin constraints. + */ + pinSize?: number; + /** + * The size of the circles drawn as the constraint anchors. + */ + anchorSize?: number; + /** + * The color value of constraint anchors. + */ + anchorColor?: number; + }; + + type MatterDebugConfig = { + /** + * Render all of the body axes? + */ + showAxes?: boolean; + /** + * Render just a single body axis? + */ + showAngleIndicator?: boolean; + /** + * The color of the body angle / axes lines. + */ + angleColor?: number; + /** + * Render the broadphase grid? + */ + showBroadphase?: boolean; + /** + * The color of the broadphase grid. + */ + broadphaseColor?: number; + /** + * Render the bounds of the bodies in the world? + */ + showBounds?: boolean; + /** + * The color of the body bounds. + */ + boundsColor?: number; + /** + * Render the velocity of the bodies in the world? + */ + showVelocity?: boolean; + /** + * The color of the body velocity line. + */ + velocityColor?: number; + /** + * Render the collision points and normals for colliding pairs. + */ + showCollisions?: boolean; + /** + * The color of the collision points. + */ + collisionColor?: number; + /** + * Render lines showing the separation between bodies. + */ + showSeparation?: boolean; + /** + * The color of the body separation line. + */ + separationColor?: number; + /** + * Render the dynamic bodies in the world to the Graphics object? + */ + showBody?: boolean; + /** + * Render the static bodies in the world to the Graphics object? + */ + showStaticBody?: boolean; + /** + * When rendering bodies, render the internal edges as well? + */ + showInternalEdges?: boolean; + /** + * Render the bodies using a fill color. + */ + renderFill?: boolean; + /** + * Render the bodies using a line stroke. + */ + renderLine?: boolean; + /** + * The color value of the fill when rendering dynamic bodies. + */ + fillColor?: number; + /** + * The opacity of the fill when rendering dynamic bodies, a value between 0 and 1. + */ + fillOpacity?: number; + /** + * The color value of the line stroke when rendering dynamic bodies. + */ + lineColor?: number; + /** + * The opacity of the line when rendering dynamic bodies, a value between 0 and 1. + */ + lineOpacity?: number; + /** + * If rendering lines, the thickness of the line. + */ + lineThickness?: number; + /** + * The color value of the fill when rendering static bodies. + */ + staticFillColor?: number; + /** + * The color value of the line stroke when rendering static bodies. + */ + staticLineColor?: number; + /** + * Render any sleeping bodies (dynamic or static) in the world to the Graphics object? + */ + showSleeping?: boolean; + /** + * The amount to multiply the opacity of sleeping static bodies by. + */ + staticBodySleepOpacity?: number; + /** + * The color value of the fill when rendering sleeping dynamic bodies. + */ + sleepFillColor?: number; + /** + * The color value of the line stroke when rendering sleeping dynamic bodies. + */ + sleepLineColor?: number; + /** + * Render bodies or body parts that are flagged as being a sensor? + */ + showSensors?: boolean; + /** + * The fill color when rendering body sensors. + */ + sensorFillColor?: number; + /** + * The line color when rendering body sensors. + */ + sensorLineColor?: number; + /** + * Render the position of non-static bodies? + */ + showPositions?: boolean; + /** + * The size of the rectangle drawn when rendering the body position. + */ + positionSize?: number; + /** + * The color value of the rectangle drawn when rendering the body position. + */ + positionColor?: number; + /** + * Render all world constraints to the Graphics object? + */ + showJoint?: boolean; + /** + * The color value of joints when `showJoint` is set. + */ + jointColor?: number; + /** + * The line opacity when rendering joints, a value between 0 and 1. + */ + jointLineOpacity?: number; + /** + * The line thickness when rendering joints. + */ + jointLineThickness?: number; + /** + * The size of the circles drawn when rendering pin constraints. + */ + pinSize?: number; + /** + * The color value of the circles drawn when rendering pin constraints. + */ + pinColor?: number; + /** + * The color value of spring constraints. + */ + springColor?: number; + /** + * The color value of constraint anchors. + */ + anchorColor?: number; + /** + * The size of the circles drawn as the constraint anchors. + */ + anchorSize?: number; + /** + * When rendering polygon bodies, render the convex hull as well? + */ + showConvexHulls?: boolean; + /** + * The color value of hulls when `showConvexHulls` is set. + */ + hullColor?: number; + }; + + type MatterRunnerConfig = { + /** + * A boolean that specifies if the runner should use a fixed timestep (otherwise it is variable). If timing is fixed, then the apparent simulation speed will change depending on the frame rate (but behaviour will be deterministic). If the timing is variable, then the apparent simulation speed will be constant (approximately, but at the cost of determininism). + */ + isFixed?: boolean; + /** + * A number that specifies the frame rate in seconds. If you don't specify this, but do specify `delta`, those values set the fps rate. + */ + fps?: number; + /** + * A number that specifies the time correction factor to apply to the update. This can help improve the accuracy of the simulation in cases where delta is changing between updates. + */ + correction?: number; + /** + * The size of the delta smoothing array when `isFixed` is `false`. + */ + deltaSampleSize?: number; + /** + * A number that specifies the time step between updates in milliseconds. If you set the `fps` property, this value is set based on that. If `isFixed` is set to `true`, then `delta` is fixed. If it is `false`, then `delta` can dynamically change to maintain the correct apparent simulation speed. + */ + delta?: number; + /** + * A number that specifies the minimum time step between updates in milliseconds. + */ + deltaMin?: number; + /** + * A number that specifies the maximum time step between updates in milliseconds. + */ + deltaMax?: number; + }; + + type MatterSetBodyConfig = { + /** + * The shape type. Either `rectangle`, `circle`, `trapezoid`, `polygon`, `fromVertices`, `fromVerts` or `fromPhysicsEditor`. + */ + type?: string; + /** + * The horizontal world position to place the body at. + */ + x?: number; + /** + * The vertical world position to place the body at. + */ + y?: number; + /** + * The width of the body. + */ + width?: number; + /** + * The height of the body. + */ + height?: number; + /** + * The radius of the body. Used by `circle` and `polygon` shapes. + */ + radius?: number; + /** + * The max sizes of the body. Used by the `circle` shape. + */ + maxSides?: number; + /** + * Used by the `trapezoid` shape. The slope of the trapezoid. 0 creates a rectangle, while 1 creates a triangle. Positive values make the top side shorter, while negative values make the bottom side shorter. + */ + slope?: number; + /** + * Used by the `polygon` shape. The number of sides the polygon will have. + */ + sides?: number; + /** + * Used by the `fromVerts` shape. The vertices data. Either a path string or an array of vertices. + */ + verts?: string | any[]; + /** + * Used by the `fromVerts` shape. Flag internal edges (coincident part edges) + */ + flagInternal?: boolean; + /** + * Used by the `fromVerts` shape. Whether Matter.js will discard collinear edges (to improve performance). + */ + removeCollinear?: number; + /** + * Used by the `fromVerts` shape. During decomposition discard parts that have an area less than this. + */ + minimumArea?: number; + /** + * Should the new body be automatically added to the world? + */ + addToWorld?: boolean; + }; + + type MatterTileOptions = { + /** + * An existing Matter body to be used instead of creating a new one. + */ + body?: MatterJS.BodyType; + /** + * Whether or not the newly created body should be made static. This defaults to true since typically tiles should not be moved. + */ + isStatic?: boolean; + /** + * Whether or not to add the newly created body (or existing body if options.body is used) to the Matter world. + */ + addToWorld?: boolean; + }; + + type MatterWalls = { + /** + * The left wall for the Matter World. + */ + left?: MatterJS.BodyType; + /** + * The right wall for the Matter World. + */ + right?: MatterJS.BodyType; + /** + * The top wall for the Matter World. + */ + top?: MatterJS.BodyType; + /** + * The bottom wall for the Matter World. + */ + bottom?: MatterJS.BodyType; + }; + + type MatterWorldConfig = { + /** + * Sets {@link Phaser.Physics.Matter.World#gravity}. + */ + gravity?: Phaser.Types.Math.Vector2Like; + /** + * Should the world have bounds enabled by default? + */ + setBounds?: object | boolean; + /** + * The x coordinate of the world bounds. + */ + "setBounds.x"?: number; + /** + * The y coordinate of the world bounds. + */ + "setBounds.y"?: number; + /** + * The width of the world bounds. + */ + "setBounds.width"?: number; + /** + * The height of the world bounds. + */ + "setBounds.height"?: number; + /** + * The thickness of the walls of the world bounds. + */ + "setBounds.thickness"?: number; + /** + * Should the left-side world bounds wall be created? + */ + "setBounds.left"?: boolean; + /** + * Should the right-side world bounds wall be created? + */ + "setBounds.right"?: boolean; + /** + * Should the top world bounds wall be created? + */ + "setBounds.top"?: boolean; + /** + * Should the bottom world bounds wall be created? + */ + "setBounds.bottom"?: boolean; + /** + * The number of position iterations to perform each update. The higher the value, the higher quality the simulation will be at the expense of performance. + */ + positionIterations?: number; + /** + * The number of velocity iterations to perform each update. The higher the value, the higher quality the simulation will be at the expense of performance. + */ + velocityIterations?: number; + /** + * The number of constraint iterations to perform each update. The higher the value, the higher quality the simulation will be at the expense of performance. + */ + constraintIterations?: number; + /** + * A flag that specifies whether the engine should allow sleeping via the `Matter.Sleeping` module. Sleeping can improve stability and performance, but often at the expense of accuracy. + */ + enableSleeping?: boolean; + /** + * A `Number` that specifies the current simulation-time in milliseconds starting from `0`. It is incremented on every `Engine.update` by the given `delta` argument. + */ + "timing.timestamp"?: number; + /** + * A `Number` that specifies the global scaling factor of time for all bodies. A value of `0` freezes the simulation. A value of `0.1` gives a slow-motion effect. A value of `1.2` gives a speed-up effect. + */ + "timing.timeScale"?: number; + /** + * Should the Matter Attractor Plugin be enabled? An attractors plugin that makes it easy to apply continual forces on bodies. It's possible to simulate effects such as wind, gravity and magnetism. + */ + "plugins.attractors"?: boolean; + /** + * Should the Matter Wrap Plugin be enabled? A coordinate wrapping plugin that automatically wraps the position of bodies such that they always stay within the given bounds. Upon crossing a boundary the body will appear on the opposite side of the bounds, while maintaining its velocity. + */ + "plugins.wrap"?: boolean; + /** + * Should the Matter Collision Events Plugin be enabled? + */ + "plugins.collisionevents"?: boolean; + /** + * Toggles if the world is enabled or not. + */ + enabled?: boolean; + /** + * An optional Number that specifies the time correction factor to apply to the update. + */ + correction?: number; + /** + * This function is called every time the core game loop steps, which is bound to the Request Animation Frame frequency unless otherwise modified. + */ + getDelta?: Function; + /** + * Automatically call Engine.update every time the game steps. + */ + autoUpdate?: boolean; + /** + * Sets the Resolver resting threshold property. + */ + restingThresh?: number; + /** + * Sets the Resolver resting threshold tangent property. + */ + restingThreshTangent?: number; + /** + * Sets the Resolver position dampen property. + */ + positionDampen?: number; + /** + * Sets the Resolver position warming property. + */ + positionWarming?: number; + /** + * Sets the Resolver friction normal multiplier property. + */ + frictionNormalMultiplier?: number; + /** + * Controls the Matter Debug Rendering options. If a boolean it will use the default values, otherwise, specify a Debug Config object. + */ + debug?: boolean | Phaser.Types.Physics.Matter.MatterDebugConfig; + /** + * Sets the Matter Runner options. + */ + runner?: Phaser.Types.Physics.Matter.MatterRunnerConfig; + }; + + } + + } + + namespace Plugins { + type CorePluginContainer = { + /** + * The unique name of this plugin in the core plugin cache. + */ + key: string; + /** + * The plugin to be stored. Should be the source object, not instantiated. + */ + plugin: Function; + /** + * If this plugin is to be injected into the Scene Systems, this is the property key map used. + */ + mapping?: string; + /** + * Core Scene plugin or a Custom Scene plugin? + */ + custom?: boolean; + }; + + type CustomPluginContainer = { + /** + * The unique name of this plugin in the custom plugin cache. + */ + key: string; + /** + * The plugin to be stored. Should be the source object, not instantiated. + */ + plugin: Function; + }; + + type GlobalPlugin = { + /** + * The unique name of this plugin within the plugin cache. + */ + key: string; + /** + * An instance of the plugin. + */ + plugin: Function; + /** + * Is the plugin active or not? + */ + active?: boolean; + /** + * If this plugin is to be injected into the Scene Systems, this is the property key map used. + */ + mapping?: string; + }; + + } + + namespace Renderer { + namespace Snapshot { + type SnapshotCallback = (snapshot: Phaser.Display.Color | HTMLImageElement)=>void; + + type SnapshotState = { + /** + * The function to call after the snapshot is taken. + */ + callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback; + /** + * The format of the image to create, usually `image/png` or `image/jpeg`. + */ + type?: string; + /** + * The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. + */ + encoderOptions?: number; + /** + * The x coordinate to start the snapshot from. + */ + x?: number; + /** + * The y coordinate to start the snapshot from. + */ + y?: number; + /** + * The width of the snapshot. + */ + width?: number; + /** + * The height of the snapshot. + */ + height?: number; + /** + * Is this a snapshot to get a single pixel, or an area? + */ + getPixel?: boolean; + /** + * Is this snapshot grabbing from a frame buffer or a canvas? + */ + isFramebuffer?: boolean; + /** + * The width of the frame buffer, if a frame buffer grab. + */ + bufferWidth?: number; + /** + * The height of the frame buffer, if a frame buffer grab. + */ + bufferHeight?: number; + }; + + } + + namespace WebGL { + type RenderTargetConfig = { + /** + * A value between 0 and 1. Controls the size of this Render Target in relation to the Renderer. A value of 1 matches it. 0.5 makes the Render Target half the size of the renderer, etc. + */ + scale?: number; + /** + * The minFilter mode of the texture. 0 is `LINEAR`, 1 is `NEAREST`. + */ + minFilter?: number; + /** + * Controls if this Render Target is automatically cleared (via `gl.COLOR_BUFFER_BIT`) during the bind. + */ + autoClear?: boolean; + /** + * Controls if this Render Target is automatically resized when the Renderer resizes. + */ + autoResize?: boolean; + /** + * The width of the Render Target. This is optional. If given it overrides the `scale` property. + */ + width?: number; + /** + * The height of the Render Target. This is optional. If not given, it will be set to the same as the `width` value. + */ + height?: number; + }; + + type WebGLConst = { + /** + * The data type of the attribute, i.e. `gl.BYTE`, `gl.SHORT`, `gl.UNSIGNED_BYTE`, `gl.FLOAT`, etc. + */ + enum: GLenum; + /** + * The size, in bytes, of the data type. + */ + size: number; + }; + + type WebGLPipelineAttribute = { + /** + * The name of the attribute as defined in the vertex shader. + */ + name: string; + /** + * The number of components in the attribute, i.e. 1 for a float, 2 for a vec2, 3 for a vec3, etc. + */ + size: number; + /** + * The data type of the attribute. Either `gl.BYTE`, `gl.SHORT`, `gl.UNSIGNED_BYTE`, `gl.UNSIGNED_SHORT` or `gl.FLOAT`. + */ + type: GLenum; + /** + * The offset, in bytes, of this attribute data in the vertex array. Equivalent to `offsetof(vertex, attrib)` in C. + */ + offset: number; + /** + * Should the attribute data be normalized? + */ + normalized: boolean; + /** + * You should set this to `false` by default. The pipeline will enable it on boot. + */ + enabled: boolean; + undefined: any; + }; + + type WebGLPipelineAttributeConfig = { + /** + * The name of the attribute as defined in the vertex shader. + */ + name: string; + /** + * The number of components in the attribute, i.e. 1 for a float, 2 for a vec2, 3 for a vec3, etc. + */ + size: number; + /** + * The data type of the attribute, one of the `WEBGL_CONST` values, i.e. `WEBGL_CONST.FLOAT`, `WEBGL_CONST.UNSIGNED_BYTE`, etc. + */ + type: Phaser.Types.Renderer.WebGL.WebGLConst; + /** + * Should the attribute data be normalized? + */ + normalized?: boolean; + }; + + type WebGLPipelineBatchEntry = { + /** + * The vertext count this batch entry starts from. + */ + start: number; + /** + * The total number of vertices in this batch entry. + */ + count: number; + /** + * The current texture unit of the batch entry. + */ + unit: number; + /** + * The maximum number of texture units in this batch entry. + */ + maxUnit: number; + /** + * An array of WebGLTextureWrapper references used in this batch entry. + */ + texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper[]; + }; + + type WebGLPipelineConfig = { + /** + * The Phaser.Game instance that owns this pipeline. + */ + game: Phaser.Game; + /** + * The name of the pipeline. + */ + name?: string; + /** + * How the primitives are rendered. The default value is GL_TRIANGLES. Here is the full list of rendering primitives: (https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants). + */ + topology?: GLenum; + /** + * The source code, as a string, for the vertex shader. If you need to assign multiple shaders, see the `shaders` property. + */ + vertShader?: string; + /** + * The source code, as a string, for the fragment shader. Can include `%count%` and `%forloop%` declarations for multi-texture support. If you need to assign multiple shaders, see the `shaders` property. + */ + fragShader?: string; + /** + * The number of quads to hold in the batch. Defaults to `RenderConfig.batchSize`. This amount * 6 gives the vertex capacity. + */ + batchSize?: number; + /** + * The size, in bytes, of a single entry in the vertex buffer. Defaults to Float32Array.BYTES_PER_ELEMENT * 6 + Uint8Array.BYTES_PER_ELEMENT * 4. + */ + vertexSize?: number; + /** + * An optional Array or Typed Array of pre-calculated vertices data that is copied into the vertex data. + */ + vertices?: number[] | Float32Array; + /** + * An array of shader attribute data. All shaders bound to this pipeline must use the same attributes. + */ + attributes?: Phaser.Types.Renderer.WebGL.WebGLPipelineAttributeConfig[]; + /** + * An array of shaders, all of which are created for this one pipeline. Uses the `vertShader`, `fragShader`, `attributes` and `uniforms` properties of this object as defaults. + */ + shaders?: Phaser.Types.Renderer.WebGL.WebGLPipelineShaderConfig[]; + /** + * Force the shader to use just a single sampler2d? Set for anything that extends the Single Pipeline. + */ + forceZero?: boolean; + /** + * Create Render Targets for this pipeline. Can be a number, which determines the quantity, a boolean (sets quantity to 1), or an array of Render Target configuration objects. + */ + renderTarget?: boolean | number | Phaser.Types.Renderer.WebGL.RenderTargetConfig[]; + /** + * If the WebGL renderer resizes, this uniform will be set with the new width and height values as part of the pipeline resize call. + */ + resizeUniform?: string; + }; + + type WebGLPipelineShaderConfig = { + /** + * The name of the shader. Doesn't have to be unique, but makes shader look-up easier if it is. + */ + name?: string; + /** + * The source code, as a string, for the vertex shader. If not given, uses the `Phaser.Types.Renderer.WebGL.WebGLPipelineConfig.vertShader` property instead. + */ + vertShader?: string; + /** + * The source code, as a string, for the fragment shader. Can include `%count%` and `%forloop%` declarations for multi-texture support. If not given, uses the `Phaser.Types.Renderer.WebGL.WebGLPipelineConfig.fragShader` property instead. + */ + fragShader?: string; + /** + * An array of shader attribute data. All shaders bound to this pipeline must use the same attributes. + */ + attributes?: Phaser.Types.Renderer.WebGL.WebGLPipelineAttributeConfig[]; + }; + + type WebGLPipelineUniformsConfig = { + /** + * The name of the uniform as defined in the shader. + */ + name: string; + /** + * The location of the uniform. + */ + location: number; + /** + * The setter function called on the WebGL context to set the uniform value. + */ + setter: Function | null; + /** + * The first cached value of the uniform. + */ + value1?: number; + /** + * The first cached value of the uniform. + */ + value2?: number; + /** + * The first cached value of the uniform. + */ + value3?: number; + /** + * The first cached value of the uniform. + */ + value4?: number; + }; + + type WebGLTextureCompression = { + /** + * Indicates if ASTC compression is supported (mostly iOS). + */ + ASTC: object | undefined; + /** + * Indicates if ATC compression is supported. + */ + ATC: object | undefined; + /** + * Indicates if BPTC compression is supported. + */ + BPTC: object | undefined; + /** + * Indicates if ETC compression is supported (mostly Android). + */ + ETC: object | undefined; + /** + * Indicates if ETC1 compression is supported (mostly Android). + */ + ETC1: object | undefined; + /** + * Indicates the browser supports true color images (all browsers). + */ + IMG: object | undefined; + /** + * Indicates if PVRTC compression is supported (mostly iOS). + */ + PVRTC: object | undefined; + /** + * Indicates if RGTC compression is supported (mostly iOS). + */ + RGTC: object | undefined; + /** + * Indicates if S3TC compression is supported on current device (mostly Windows). + */ + S3TC: object | undefined; + /** + * Indicates if S3TCSRGB compression is supported on current device (mostly Windows). + */ + S3TCSRGB: object | undefined; + }; + + } + + } + + namespace Scenes { + type CreateSceneFromObjectConfig = { + /** + * The scene's init callback. + */ + init?: Phaser.Types.Scenes.SceneInitCallback; + /** + * The scene's preload callback. + */ + preload?: Phaser.Types.Scenes.ScenePreloadCallback; + /** + * The scene's create callback. + */ + create?: Phaser.Types.Scenes.SceneCreateCallback; + /** + * The scene's update callback. See {@link Phaser.Scene#update}. + */ + update?: Phaser.Types.Scenes.SceneUpdateCallback; + /** + * Any additional properties, which will be copied to the Scene after it's created (except `data` or `sys`). + */ + extend?: any; + /** + * Any values, which will be merged into the Scene's Data Manager store. + */ + "extend.data"?: any; + }; + + /** + * Can be defined on your own Scenes. Use it to create your game objects. + * This method is called by the Scene Manager when the scene starts, after `init()` and `preload()`. + * If the LoaderPlugin started after `preload()`, then this method is called only after loading is complete. + */ + type SceneCreateCallback = (this: Phaser.Scene, data: object)=>void; + + /** + * Can be defined on your own Scenes. + * This method is called by the Scene Manager when the scene starts, before `preload()` and `create()`. + */ + type SceneInitCallback = (this: Phaser.Scene, data: object)=>void; + + /** + * Can be defined on your own Scenes. Use it to load assets. + * This method is called by the Scene Manager, after `init()` and before `create()`, only if the Scene has a LoaderPlugin. + * After this method completes, if the LoaderPlugin's queue isn't empty, the LoaderPlugin will start automatically. + */ + type ScenePreloadCallback = (this: Phaser.Scene)=>void; + + type SceneTransitionConfig = { + /** + * The Scene key to transition to. + */ + target: string; + /** + * The duration, in ms, for the transition to last. + */ + duration?: number; + /** + * Will the Scene responsible for the transition be sent to sleep on completion (`true`), or stopped? (`false`) + */ + sleep?: boolean; + /** + * Will the Scene responsible for the transition be removed from the Scene Manager after the transition completes? + */ + remove?: boolean; + /** + * Will the Scenes Input system be able to process events while it is transitioning in or out? + */ + allowInput?: boolean; + /** + * Move the target Scene to be above this one before the transition starts. + */ + moveAbove?: boolean; + /** + * Move the target Scene to be below this one before the transition starts. + */ + moveBelow?: boolean; + /** + * This callback is invoked every frame for the duration of the transition. + */ + onUpdate?: Function; + /** + * The context in which the callback is invoked. + */ + onUpdateScope?: any; + /** + * This callback is invoked when transition starting. + */ + onStart?: Phaser.Types.Scenes.SceneTransitionOnStartCallback; + /** + * The context in which the callback is invoked. + */ + onStartScope?: any; + /** + * An object containing any data you wish to be passed to the target scene's init / create methods (if sleep is false) or to the target scene's wake event callback (if sleep is true). + */ + data?: any; + }; + + type SceneTransitionOnStartCallback = (this: Phaser.Scene, fromScene: Phaser.Scene, toScene: Phaser.Scene)=>void; + + type SceneType = Phaser.Scene | Phaser.Types.Scenes.SettingsConfig | Phaser.Types.Scenes.CreateSceneFromObjectConfig | Function; + + type SceneUpdateCallback = (this: Phaser.Scene, time: number, delta: number)=>void; + + type SettingsConfig = { + /** + * The unique key of this Scene. Must be unique within the entire Game instance. + */ + key?: string; + /** + * Does the Scene start as active or not? An active Scene updates each step. + */ + active?: boolean; + /** + * Does the Scene start as visible or not? A visible Scene renders each step. + */ + visible?: boolean; + /** + * Files to be loaded before the Scene begins. + */ + pack?: false | Phaser.Types.Loader.FileTypes.PackFileSection; + /** + * An optional Camera configuration object. + */ + cameras?: Phaser.Types.Cameras.Scene2D.CameraConfig | Phaser.Types.Cameras.Scene2D.CameraConfig[] | null; + /** + * Overwrites the default injection map for a scene. + */ + map?: {[key: string]: string}; + /** + * Extends the injection map for a scene. + */ + mapAdd?: {[key: string]: string}; + /** + * The physics configuration object for the Scene. + */ + physics?: Phaser.Types.Core.PhysicsConfig; + /** + * The loader configuration object for the Scene. + */ + loader?: Phaser.Types.Core.LoaderConfig; + /** + * The plugin configuration object for the Scene. + */ + plugins?: false | any; + }; + + type SettingsObject = { + /** + * The current status of the Scene. Maps to the Scene constants. + */ + status: number; + /** + * The unique key of this Scene. Unique within the entire Game instance. + */ + key: string; + /** + * The active state of this Scene. An active Scene updates each step. + */ + active: boolean; + /** + * The visible state of this Scene. A visible Scene renders each step. + */ + visible: boolean; + /** + * Has the Scene finished booting? + */ + isBooted: boolean; + /** + * Is the Scene in a state of transition? + */ + isTransition: boolean; + /** + * The Scene this Scene is transitioning from, if set. + */ + transitionFrom: Phaser.Scene | null; + /** + * The duration of the transition, if set. + */ + transitionDuration: number; + /** + * Is this Scene allowed to receive input during transitions? + */ + transitionAllowInput: boolean; + /** + * a data bundle passed to this Scene from the Scene Manager. + */ + data: object; + /** + * Files to be loaded before the Scene begins. + */ + pack: false | Phaser.Types.Loader.FileTypes.PackFileSection; + /** + * The Camera configuration object. + */ + cameras: Phaser.Types.Cameras.Scene2D.CameraConfig | Phaser.Types.Cameras.Scene2D.CameraConfig[] | null; + /** + * The Scene's Injection Map. + */ + map: {[key: string]: string}; + /** + * The physics configuration object for the Scene. + */ + physics: Phaser.Types.Core.PhysicsConfig; + /** + * The loader configuration object for the Scene. + */ + loader: Phaser.Types.Core.LoaderConfig; + /** + * The plugin configuration object for the Scene. + */ + plugins: false | any; + }; + + } + + namespace Sound { + /** + * Audio sprite sound type. + */ + type AudioSpriteSound = { + /** + * Local reference to 'spritemap' object form json file generated by audiosprite tool. + */ + spritemap: object; + }; + + /** + * A Audio Data object. + * + * You can pass an array of these objects to the WebAudioSoundManager `decodeAudio` method to have it decode + * them all at once. + */ + type DecodeAudioConfig = { + /** + * The string-based key to be used to reference the decoded audio in the audio cache. + */ + key: string; + /** + * The audio data, either a base64 encoded string, an audio media-type data uri, or an ArrayBuffer instance. + */ + data: ArrayBuffer | string; + }; + + type EachActiveSoundCallback = (manager: Phaser.Sound.BaseSoundManager, sound: Phaser.Sound.BaseSound, index: number, sounds: Phaser.Sound.BaseSound[])=>void; + + /** + * Config object containing various sound settings. + */ + type SoundConfig = { + /** + * Boolean indicating whether the sound should be muted or not. + */ + mute?: boolean; + /** + * A value between 0 (silence) and 1 (full volume). + */ + volume?: number; + /** + * Defines the speed at which the sound should be played. + */ + rate?: number; + /** + * Represents detuning of sound in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + */ + detune?: number; + /** + * Position of playback for this sound, in seconds. + */ + seek?: number; + /** + * Whether or not the sound or current sound marker should loop. + */ + loop?: boolean; + /** + * Time, in seconds, that should elapse before the sound actually starts its playback. + */ + delay?: number; + /** + * A value between -1 (full left pan) and 1 (full right pan). 0 means no pan. + */ + pan?: number; + /** + * An optional config object containing default spatial sound settings. + */ + source?: Phaser.Types.Sound.SpatialSoundConfig; + }; + + /** + * Marked section of a sound represented by name, and optionally start time, duration, and config object. + */ + type SoundMarker = { + /** + * Unique identifier of a sound marker. + */ + name: string; + /** + * Sound position offset at witch playback should start. + */ + start?: number; + /** + * Playback duration of this marker. + */ + duration?: number; + /** + * An optional config object containing default marker settings. + */ + config?: Phaser.Types.Sound.SoundConfig; + }; + + /** + * Config object containing settings for the source of the spatial sound. + * + * See https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Web_audio_spatialization_basics + */ + type SpatialSoundConfig = { + /** + * The horizontal position of the audio in a right-hand Cartesian coordinate system. + */ + x?: number; + /** + * The vertical position of the audio in a right-hand Cartesian coordinate system. + */ + y?: number; + /** + * Represents the longitudinal (back and forth) position of the audio in a right-hand Cartesian coordinate system. + */ + z?: number; + /** + * An enumerated value determining which spatialization algorithm to use to position the audio in 3D space. + */ + panningModel?: 'equalpower' | 'HRTF'; + /** + * Which algorithm to use to reduce the volume of the audio source as it moves away from the listener. Possible values are "linear", "inverse" and "exponential". The default value is "inverse". + */ + distanceModel?: 'linear' | 'inverse' | 'exponential'; + /** + * The horizontal position of the audio source's vector in a right-hand Cartesian coordinate system. + */ + orientationX?: number; + /** + * The vertical position of the audio source's vector in a right-hand Cartesian coordinate system. + */ + orientationY?: number; + /** + * Represents the longitudinal (back and forth) position of the audio source's vector in a right-hand Cartesian coordinate system. + */ + orientationZ?: number; + /** + * A double value representing the reference distance for reducing volume as the audio source moves further from the listener. For distances greater than this the volume will be reduced based on `rolloffFactor` and `distanceModel`. + */ + refDistance?: number; + /** + * The maximum distance between the audio source and the listener, after which the volume is not reduced any further. + */ + maxDistance?: number; + /** + * A double value describing how quickly the volume is reduced as the source moves away from the listener. This value is used by all distance models. + */ + rolloffFactor?: number; + /** + * The angle, in degrees, of a cone inside of which there will be no volume reduction. + */ + coneInnerAngle?: number; + /** + * The angle, in degrees, of a cone outside of which the volume will be reduced by a constant value, defined by the `coneOuterGain` property. + */ + coneOuterAngle?: number; + /** + * The amount of volume reduction outside the cone defined by the `coneOuterAngle` attribute. Its default value is 0, meaning that no sound can be heard. A value between 0 and 1. + */ + coneOuterGain?: number; + /** + * Set this Sound object to automatically track the x/y position of this object. Can be a Phaser Game Object, Vec2 or anything that exposes public x/y properties. + */ + follow?: Phaser.Types.Math.Vector2Like; + }; + + /** + * An entry in the Web Audio Decoding Queue. + */ + type WebAudioDecodeEntry = { + /** + * The key of the sound. + */ + key: string; + /** + * The callback to invoke on successful decoding. + */ + success: Function; + /** + * The callback to invoke if the decoding fails. + */ + failure: Function; + /** + * Has the decoding of this sound file started? + */ + decoding: boolean; + }; + + } + + namespace Textures { + /** + * An object containing the dimensions and mipmap data for a Compressed Texture. + */ + type CompressedTextureData = { + /** + * Is this a compressed texture? + */ + compressed: boolean; + /** + * Should this texture have mipmaps generated? + */ + generateMipmap: boolean; + /** + * The width of the maximum size of the texture. + */ + width: number; + /** + * The height of the maximum size of the texture. + */ + height: number; + /** + * The WebGL internal texture format. + */ + internalFormat: GLenum; + /** + * An array of MipmapType objects. + */ + mipmaps: Phaser.Types.Textures.MipmapType[]; + }; + + /** + * A Mipmap Data entry for a Compressed Texture. + */ + type MipmapType = { + /** + * The width of this level of the mipmap. + */ + width: number; + /** + * The height of this level of the mipmap. + */ + height: number; + /** + * The decoded pixel data. + */ + data: Uint8Array; + }; + + /** + * An object containing the position and color data for a single pixel in a CanvasTexture. + */ + type PixelConfig = { + /** + * The x-coordinate of the pixel. + */ + x: number; + /** + * The y-coordinate of the pixel. + */ + y: number; + /** + * The color of the pixel, not including the alpha channel. + */ + color: number; + /** + * The alpha of the pixel, between 0 and 1. + */ + alpha: number; + }; + + type SpriteSheetConfig = { + /** + * The fixed width of each frame. + */ + frameWidth: number; + /** + * The fixed height of each frame. If not set it will use the frameWidth as the height. + */ + frameHeight?: number; + /** + * Skip a number of frames. Useful when there are multiple sprite sheets in one Texture. + */ + startFrame?: number; + /** + * The total number of frames to extract from the Sprite Sheet. The default value of -1 means "extract all frames". + */ + endFrame?: number; + /** + * If the frames have been drawn with a margin, specify the amount here. + */ + margin?: number; + /** + * If the frames have been drawn with spacing between them, specify the amount here. + */ + spacing?: number; + }; + + type SpriteSheetFromAtlasConfig = { + /** + * The key of the Texture Atlas in which this Sprite Sheet can be found. + */ + atlas: string; + /** + * The key of the Texture Atlas Frame in which this Sprite Sheet can be found. + */ + frame: string; + /** + * The fixed width of each frame. + */ + frameWidth: number; + /** + * The fixed height of each frame. If not set it will use the frameWidth as the height. + */ + frameHeight?: number; + /** + * Skip a number of frames. Useful when there are multiple sprite sheets in one Texture. + */ + startFrame?: number; + /** + * The total number of frames to extract from the Sprite Sheet. The default value of -1 means "extract all frames". + */ + endFrame?: number; + /** + * If the frames have been drawn with a margin, specify the amount here. + */ + margin?: number; + /** + * If the frames have been drawn with spacing between them, specify the amount here. + */ + spacing?: number; + }; + + /** + * An object containing the position and color data for a single pixel in a CanvasTexture. + */ + type StampConfig = { + /** + * The alpha value used by the stamp. + */ + alpha?: number; + /** + * The tint color value used by the stamp. WebGL only. + */ + tint?: number; + /** + * The angle of the stamp in degrees. Rotation takes place around its origin. + */ + angle?: number; + /** + * The rotation of the stamp in radians. Rotation takes place around its origin. + */ + rotation?: number; + /** + * Sets both the horizontal and vertical scale of the stamp with a single value. + */ + scale?: number; + /** + * Set the horizontal scale of the stamp. Overrides the scale property, if provided. + */ + scaleX?: number; + /** + * Set the vertical scale of the stamp. Overrides the scale property, if provided. + */ + scaleY?: number; + /** + * The horizontal origin of the stamp. 0 is the left, 0.5 is the center and 1 is the right. + */ + originX?: number; + /** + * The vertical origin of the stamp. 0 is the top, 0.5 is the center and 1 is the bottom. + */ + originY?: number; + /** + * The blend mode used when drawing the stamp. Defaults to 0 (normal). + */ + blendMode?: string | Phaser.BlendModes | number; + /** + * Erase this stamp from the texture? + */ + erase?: boolean; + /** + * Skip beginning and ending a batch with this call. Use if this is part of a bigger batched draw. + */ + skipBatch?: boolean; + }; + + } + + namespace Tilemaps { + type CreateFromObjectLayerConfig = { + /** + * A unique Object ID to convert. + */ + id?: number; + /** + * An Object GID to convert. + */ + gid?: number; + /** + * An Object Name to convert. + */ + name?: string; + /** + * An Object Type to convert. + */ + type?: string; + /** + * A custom class type to convert the objects in to. The default is {@link Phaser.GameObjects.Sprite}. A custom class should resemble Sprite or Image; see {@link Phaser.Types.Tilemaps.CreateFromObjectsClassTypeConstructor}. + */ + classType?: Function; + /** + * By default, gid-based objects copy properties and respect the type of the tile at that gid and treat the object as an override. If this is true, they don't, and use only the fields set on the object itself. + */ + ignoreTileset?: boolean; + /** + * A Scene reference, passed to the Game Objects constructors. + */ + scene?: Phaser.Scene; + /** + * Optional Container to which the Game Objects are added. + */ + container?: Phaser.GameObjects.Container; + /** + * Optional key of a Texture to be used, as stored in the Texture Manager, or a Texture instance. If omitted, the object's gid's tileset key is used if available. + */ + key?: string | Phaser.Textures.Texture; + /** + * Optional name or index of the frame within the Texture. If omitted, the tileset index is used, assuming that spritesheet frames exactly match tileset indices & geometries -- if available. + */ + frame?: string | number; + }; + + type CreateFromObjectsClassTypeConstructor = (scene: Phaser.Scene)=>void; + + type DebugStyleOptions = { + /** + * Color to use for drawing a filled rectangle at + * non-colliding tile locations. If set to null, non-colliding tiles will not be drawn. + */ + "styleConfig.tileColor"?: Phaser.Display.Color | null; + /** + * Color to use for drawing a filled + * rectangle at colliding tile locations. If set to null, colliding tiles will not be drawn. + */ + "styleConfig.collidingTileColor"?: Phaser.Display.Color | null; + /** + * Color to use for drawing a line at interesting + * tile faces. If set to null, interesting tile faces will not be drawn. + */ + "styleConfig.faceColor"?: Phaser.Display.Color | null; + }; + + type FilteringOptions = { + /** + * If true, only return tiles that don't have -1 for an index. + */ + isNotEmpty?: boolean; + /** + * If true, only return tiles that collide on at least one side. + */ + isColliding?: boolean; + /** + * If true, only return tiles that have at least one interesting face. + */ + hasInterestingFace?: boolean; + }; + + type GIDData = { + /** + * The Tiled GID. + */ + gid: number; + /** + * Horizontal flip flag. + */ + flippedHorizontal: boolean; + /** + * Vertical flip flag. + */ + flippedVertical: boolean; + /** + * Diagonal flip flag. + */ + flippedAntiDiagonal: boolean; + /** + * Amount of rotation. + */ + rotation: number; + /** + * Is flipped? + */ + flipped: boolean; + }; + + type LayerDataConfig = { + /** + * The name of the layer, if specified in Tiled. + */ + name?: string; + /** + * The x offset of where to draw from the top left. + */ + x?: number; + /** + * The y offset of where to draw from the top left. + */ + y?: number; + /** + * The width of the layer in tiles. + */ + width?: number; + /** + * The height of the layer in tiles. + */ + height?: number; + /** + * The pixel width of the tiles. + */ + tileWidth?: number; + /** + * The pixel height of the tiles. + */ + tileHeight?: number; + /** + * The base tile width. + */ + baseTileWidth?: number; + /** + * The base tile height. + */ + baseTileHeight?: number; + /** + * The width in pixels of the entire layer. + */ + widthInPixels?: number; + /** + * The height in pixels of the entire layer. + */ + heightInPixels?: number; + /** + * The alpha value of the layer. + */ + alpha?: number; + /** + * Is the layer visible or not? + */ + visible?: boolean; + /** + * Layer specific properties (can be specified in Tiled) + */ + properties?: object[]; + /** + * Tile ID index map. + */ + indexes?: any[]; + /** + * Tile Collision ID index map. + */ + collideIndexes?: any[]; + /** + * An array of callbacks. + */ + callbacks?: any[]; + /** + * An array of physics bodies. + */ + bodies?: any[]; + /** + * An array of the tile data indexes. + */ + data?: any[]; + /** + * A reference to the Tilemap layer that owns this data. + */ + tilemapLayer?: Phaser.Tilemaps.TilemapLayer; + }; + + type MapDataConfig = { + /** + * The key in the Phaser cache that corresponds to the loaded tilemap data. + */ + name?: string; + /** + * The width of the entire tilemap. + */ + width?: number; + /** + * The height of the entire tilemap. + */ + height?: number; + /** + * The width of the tiles. + */ + tileWidth?: number; + /** + * The height of the tiles. + */ + tileHeight?: number; + /** + * The width in pixels of the entire tilemap. + */ + widthInPixels?: number; + /** + * The height in pixels of the entire tilemap. + */ + heightInPixels?: number; + /** + * The format of the Tilemap, as defined in Tiled. + */ + format?: number; + /** + * The orientation of the map data (i.e. orthogonal, isometric, hexagonal), default 'orthogonal'. + */ + orientation?: string | Phaser.Tilemaps.Orientation; + /** + * Determines the draw order of tilemap. Default is right-down. + */ + renderOrder?: string; + /** + * The version of Tiled the map uses. + */ + version?: number; + /** + * Map specific properties (can be specified in Tiled). + */ + properties?: number; + /** + * The layers of the tilemap. + */ + layers?: Phaser.Tilemaps.LayerData[]; + /** + * An array with all the layers configured to the MapData. + */ + images?: any[]; + /** + * An array of Tiled Image Layers. + */ + objects?: object; + /** + * An object of Tiled Object Layers. + */ + collision?: object; + /** + * The tilesets the map uses. + */ + tilesets?: Phaser.Tilemaps.Tileset[]; + /** + * The collection of images the map uses(specified in Tiled). + */ + imageCollections?: any[]; + /** + * Array of Tile instances. + */ + tiles?: any[]; + }; + + type ObjectLayerConfig = { + /** + * The name of the Object Layer. + */ + name?: string; + /** + * The opacity of the layer, between 0 and 1. + */ + opacity?: number; + /** + * The custom properties defined on the Object Layer, keyed by their name. + */ + properties?: any; + /** + * The type of each custom property defined on the Object Layer, keyed by its name. + */ + propertytypes?: any; + /** + * The type of the layer, which should be `objectgroup`. + */ + type?: string; + /** + * Whether the layer is shown (`true`) or hidden (`false`). + */ + visible?: boolean; + /** + * An array of all objects on this Object Layer. + */ + objects?: any[]; + }; + + type StyleConfig = { + /** + * Color to use for drawing a filled rectangle at non-colliding tile locations. If set to null, non-colliding tiles will not be drawn. + */ + tileColor?: Phaser.Display.Color | number | null | null; + /** + * Color to use for drawing a filled rectangle at colliding tile locations. If set to null, colliding tiles will not be drawn. + */ + collidingTileColor?: Phaser.Display.Color | number | null | null; + /** + * Color to use for drawing a line at interesting tile faces. If set to null, interesting tile faces will not be drawn. + */ + faceColor?: Phaser.Display.Color | number | null | null; + }; + + type TiledObject = { + /** + * The unique object ID. + */ + id: number; + /** + * The name this object was assigned in Tiled. + */ + name: string; + /** + * The string type of this instance, as assigned in Tiled. Tiled supports inheriting instance types from tilesets; in that case, the type will be set in the tile's data, but will be `''` here; use the `gid` to fetch the tile data or properties. + */ + type: string; + /** + * The visible state of this object. + */ + visible?: boolean; + /** + * The horizontal position of this object, in pixels, relative to the tilemap. + */ + x?: number; + /** + * The vertical position of this object, in pixels, relative to the tilemap. + */ + y?: number; + /** + * The width of this object, in pixels. + */ + width?: number; + /** + * The height of this object, in pixels. + */ + height?: number; + /** + * The rotation of the object in clockwise degrees. + */ + rotation?: number; + /** + * Custom properties object. + */ + properties?: any; + /** + * Only set if of type 'tile'. + */ + gid?: number; + /** + * Only set if a tile object. The horizontal flip value. + */ + flippedHorizontal?: boolean; + /** + * Only set if a tile object. The vertical flip value. + */ + flippedVertical?: boolean; + /** + * Only set if a tile object. The diagonal flip value. + */ + flippedAntiDiagonal?: boolean; + /** + * Only set if a polyline object. An array of objects corresponding to points, where each point has an `x` property and a `y` property. + */ + polyline?: Phaser.Types.Math.Vector2Like[]; + /** + * Only set if a polygon object. An array of objects corresponding to points, where each point has an `x` property and a `y` property. + */ + polygon?: Phaser.Types.Math.Vector2Like[]; + /** + * Only set if a text object. Contains the text objects properties. + */ + text?: any; + /** + * Only set, and set to `true`, if a rectangle object. + */ + rectangle?: boolean; + /** + * Only set, and set to `true`, if a ellipse object. + */ + ellipse?: boolean; + /** + * Only set, and set to `true`, if a point object. + */ + point?: boolean; + }; + + type TilemapConfig = { + /** + * The key in the Phaser cache that corresponds to the loaded tilemap data. + */ + key?: string; + /** + * Instead of loading from the cache, you can also load directly from a 2D array of tile indexes. + */ + data?: number[][]; + /** + * The width of a tile in pixels. + */ + tileWidth?: number; + /** + * The height of a tile in pixels. + */ + tileHeight?: number; + /** + * The width of the map in tiles. + */ + width?: number; + /** + * The height of the map in tiles. + */ + height?: number; + /** + * Controls how empty tiles, tiles with an index of -1, + * in the map data are handled. If `true`, empty locations will get a value of `null`. If `false`, + * empty location will get a Tile object with an index of -1. If you've a large sparsely populated + * map and the tile data doesn't need to change then setting this value to `true` will help with + * memory consumption. However if your map is small or you need to update the tiles dynamically, + * then leave the default value set. + */ + insertNull?: boolean; + }; + + } + + namespace Time { + type TimelineEvent = { + /** + * Has this event completed yet? + */ + complete: boolean; + /** + * Is this a once only event? + */ + once: boolean; + /** + * The time (in elapsed ms) at which this event will fire. + */ + time: number; + /** + * The amount of times this Event has repeated. + */ + repeat?: Function; + /** + * User-land callback which will be called if set. If it returns `true` then this event run all of its actions, otherwise it will be skipped. + */ + if?: Function; + /** + * User-land callback which will be called when the Event fires. + */ + run?: Function; + /** + * User-land callback which will be called when the Event loops. + */ + loop?: Function; + /** + * Tween configuration object which will be used to create a Tween when the Event fires if set. + */ + tween?: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenChainBuilderConfig | Phaser.Tweens.Tween | Phaser.Tweens.TweenChain; + /** + * Object containing properties to set on the `target` when the Event fires if set. + */ + set?: object; + /** + * Sound configuration object which will be used to create a Sound when the Event fires if set. + */ + sound?: string | object; + /** + * The scope (`this` object) with which to invoke the run `callback`. + */ + target?: any; + /** + * Optional event name to emit when the Event fires. + */ + event?: string; + }; + + type TimelineEventConfig = { + /** + * The time (in ms) at which the Event will fire. The Timeline starts at 0. + */ + at?: number; + /** + * If the Timeline is running, this is the time (in ms) at which the Event will fire based on its current elapsed value. If set it will override the `at` property. + */ + in?: number; + /** + * Fire this event 'from' milliseconds after the previous event in the Timeline. If set it will override the `at` and `in` properties. + */ + from?: number; + /** + * A function which will be called when the Event fires. + */ + run?: Function; + /** + * A function which will be called when the Event loops, this does not get called if the `repeat` method is not used or on first iteration. + */ + loop?: Function; + /** + * Optional string-based event name to emit when the Event fires. The event is emitted from the Timeline instance. + */ + event?: string; + /** + * The scope (`this` object) with which to invoke the run `callback`, if set. + */ + target?: any; + /** + * If set, the Event will be removed from the Timeline when it fires. + */ + once?: boolean; + /** + * If set, the Timeline will stop and enter a complete state when this Event fires, even if there are other events after it. + */ + stop?: boolean; + /** + * A Tween or TweenChain configuration object or instance. If set, the Event will create this Tween when it fires. + */ + tween?: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenChainBuilderConfig | Phaser.Tweens.Tween | Phaser.Tweens.TweenChain; + /** + * A key-value object of properties to set on the `target` when the Event fires. Ignored if no `target` is given. + */ + set?: object; + /** + * A key from the Sound Manager to play, or a config object for a sound to play when the Event fires. If a config object it must provide two properties: `key` and `config`. The `key` is the key of the sound to play, and the `config` is the config is a Phaser.Types.Sound.SoundConfig object. + */ + sound?: string | object; + }; + + type TimerEventConfig = { + /** + * The delay after which the Timer Event should fire, in milliseconds. + */ + delay?: number; + /** + * The total number of times the Timer Event will repeat before finishing. + */ + repeat?: number; + /** + * `true` if the Timer Event should repeat indefinitely. + */ + loop?: boolean; + /** + * The callback which will be called when the Timer Event fires. + */ + callback?: Function; + /** + * The scope (`this` object) with which to invoke the `callback`. The default is the Timer Event. + */ + callbackScope?: any; + /** + * Additional arguments to be passed to the `callback`. + */ + args?: any[]; + /** + * The scale of the elapsed time. + */ + timeScale?: number; + /** + * The initial elapsed time in milliseconds. Useful if you want a long duration with repeat, but for the first loop to fire quickly. + */ + startAt?: number; + /** + * `true` if the Timer Event should be paused. + */ + paused?: boolean; + }; + + } + + namespace Tweens { + type TweenConfigDefaults = { + /** + * The object, or an array of objects, to run the tween on. + */ + targets: object | object[]; + /** + * The number of milliseconds to delay before the tween will start. + */ + delay?: number; + /** + * The duration of the tween in milliseconds. + */ + duration?: number; + /** + * The easing equation to use for the tween. + */ + ease?: string; + /** + * Optional easing parameters. + */ + easeParams?: any[]; + /** + * The number of milliseconds to hold the tween for before yoyo'ing. + */ + hold?: number; + /** + * The number of times to repeat the tween. + */ + repeat?: number; + /** + * The number of milliseconds to pause before a tween will repeat. + */ + repeatDelay?: number; + /** + * Should the tween complete, then reverse the values incrementally to get back to the starting tween values? The reverse tweening will also take `duration` milliseconds to complete. + */ + yoyo?: boolean; + /** + * Horizontally flip the target of the Tween when it completes (before it yoyos, if set to do so). Only works for targets that support the `flipX` property. + */ + flipX?: boolean; + /** + * Vertically flip the target of the Tween when it completes (before it yoyos, if set to do so). Only works for targets that support the `flipY` property. + */ + flipY?: boolean; + /** + * Retain the tween within the Tween Manager, even after playback completes? + */ + persist?: boolean; + /** + * The interpolation function to use for array-based tween values. + */ + interpolation?: Function; + }; + + /** + * A Tween Event. + */ + type Event = string; + + type GetActiveCallback = (target: any, key: string, value: number, targetIndex: number, totalTargets: number, tween: Phaser.Tweens.Tween)=>number; + + type GetEndCallback = (target: any, key: string, value: number, targetIndex: number, totalTargets: number, tween: Phaser.Tweens.Tween)=>number; + + type GetStartCallback = (target: any, key: string, value: number, targetIndex: number, totalTargets: number, tween: Phaser.Tweens.Tween)=>number; + + type NumberTweenBuilderConfig = { + /** + * The start number. + */ + from?: number; + /** + * The end number. + */ + to?: number; + /** + * The number of milliseconds to delay before the counter will start. + */ + delay?: number; + /** + * The duration of the counter in milliseconds. + */ + duration?: number; + /** + * The easing equation to use for the counter. + */ + ease?: string | Function; + /** + * Optional easing parameters. + */ + easeParams?: any[]; + /** + * The number of milliseconds to hold the counter for before yoyo'ing. + */ + hold?: number; + /** + * The number of times to repeat the counter. + */ + repeat?: number; + /** + * The number of milliseconds to pause before the counter will repeat. + */ + repeatDelay?: number; + /** + * Should the counter play forward to the end value and then backwards to the start? The reverse playback will also take `duration` milliseconds to complete. + */ + yoyo?: boolean; + /** + * The time the counter will wait before the onComplete event is dispatched once it has completed, in ms. + */ + completeDelay?: string | number | Function | object | any[]; + /** + * The number of times the counter will repeat. (A value of 1 means the counter will play twice, as it repeated once.) + */ + loop?: string | number | Function | object | any[]; + /** + * The time the counter will pause before starting either a yoyo or returning to the start for a repeat. + */ + loopDelay?: string | number | Function | object | any[]; + /** + * Does the counter start in a paused state (true) or playing (false)? + */ + paused?: boolean; + /** + * Scope (this) for the callbacks. The default scope is the counter. + */ + callbackScope?: any; + /** + * A function to call when the counter completes. + */ + onComplete?: Phaser.Types.Tweens.TweenOnCompleteCallback; + /** + * Additional parameters to pass to `onComplete`. + */ + onCompleteParams?: any[]; + /** + * A function to call each time the counter loops. + */ + onLoop?: Phaser.Types.Tweens.TweenOnLoopCallback; + /** + * Additional parameters to pass to `onLoop`. + */ + onLoopParams?: any[]; + /** + * A function to call each time the counter repeats. + */ + onRepeat?: Phaser.Types.Tweens.TweenOnRepeatCallback; + /** + * Additional parameters to pass to `onRepeat`. + */ + onRepeatParams?: any[]; + /** + * A function to call when the counter starts. + */ + onStart?: Phaser.Types.Tweens.TweenOnStartCallback; + /** + * Additional parameters to pass to `onStart`. + */ + onStartParams?: any[]; + /** + * A function to call when the counter is stopped. + */ + onStop?: Phaser.Types.Tweens.TweenOnStopCallback; + /** + * Additional parameters to pass to `onStop`. + */ + onStopParams?: any[]; + /** + * A function to call each time the counter steps. + */ + onUpdate?: Phaser.Types.Tweens.TweenOnUpdateCallback; + /** + * Additional parameters to pass to `onUpdate`. + */ + onUpdateParams?: any[]; + /** + * A function to call each time the counter yoyos. + */ + onYoyo?: Phaser.Types.Tweens.TweenOnYoyoCallback; + /** + * Additional parameters to pass to `onYoyo`. + */ + onYoyoParams?: any[]; + /** + * A function to call when the counter is paused. + */ + onPause?: Phaser.Types.Tweens.TweenOnPauseCallback; + /** + * Additional parameters to pass to `onPause`. + */ + onPauseParams?: any[]; + /** + * A function to call when the counter is resumed after being paused. + */ + onResume?: Phaser.Types.Tweens.TweenOnResumeCallback; + /** + * Additional parameters to pass to `onResume`. + */ + onResumeParams?: any[]; + /** + * Will the counter be automatically destroyed on completion, or retained for future playback? + */ + persist?: boolean; + /** + * The interpolation function to use if the `value` given is an array of numbers. + */ + interpolation?: string | Function; + }; + + type StaggerConfig = { + /** + * The value to start the stagger from. Can be used as a way to offset the stagger while still using a range for the value. + */ + start?: number; + /** + * An ease to apply across the staggered values. Can either be a string, such as 'sine.inout', or a function. + */ + ease?: string | Function; + /** + * The index to start the stagger from. Can be the strings `first`, `last` or `center`, or an integer representing the stagger position. + */ + from?: string | number; + /** + * Set the stagger to run across a grid by providing an array where element 0 is the width of the grid and element 1 is the height. Combine with the 'from' property to control direction. + */ + grid?: number[]; + }; + + type TweenBuilderConfig = {[key: string]: any} & { + /** + * The object, or an array of objects, to run the tween on. + */ + targets: any; + /** + * The number of milliseconds to delay before the tween will start. + */ + delay?: number | Function; + /** + * The duration of the tween in milliseconds. + */ + duration?: number; + /** + * The easing equation to use for the tween. + */ + ease?: string | Function; + /** + * Optional easing parameters. + */ + easeParams?: any[]; + /** + * The number of milliseconds to hold the tween for before yoyo'ing. + */ + hold?: number; + /** + * The number of times each property tween repeats. + */ + repeat?: number; + /** + * The number of milliseconds to pause before a repeat. + */ + repeatDelay?: number; + /** + * Should the tween complete, then reverse the values incrementally to get back to the starting tween values? The reverse tweening will also take `duration` milliseconds to complete. + */ + yoyo?: boolean; + /** + * Horizontally flip the target of the Tween when it completes (before it yoyos, if set to do so). Only works for targets that support the `flipX` property. + */ + flipX?: boolean; + /** + * Vertically flip the target of the Tween when it completes (before it yoyos, if set to do so). Only works for targets that support the `flipY` property. + */ + flipY?: boolean; + /** + * The time the tween will wait before the onComplete event is dispatched once it has completed, in ms. + */ + completeDelay?: string | number | Function | object | any[]; + /** + * The number of times the tween will repeat. (A value of 1 means the tween will play twice, as it repeated once.) The first loop starts after every property in the tween has completed once. + */ + loop?: string | number | Function | object | any[]; + /** + * The time the tween will pause before starting either a yoyo or returning to the start for a repeat. + */ + loopDelay?: string | number | Function | object | any[]; + /** + * Does the tween start in a paused state (true) or playing (false)? + */ + paused?: boolean; + /** + * The properties to tween. + */ + props?: {[key: string]: (number|string|Phaser.Types.Tweens.GetEndCallback|Phaser.Types.Tweens.TweenPropConfig)}; + /** + * The scope (or context) for all of the callbacks. The default scope is the tween. + */ + callbackScope?: any; + /** + * A function to call when the tween completes. + */ + onComplete?: Phaser.Types.Tweens.TweenOnCompleteCallback; + /** + * Additional parameters to pass to `onComplete`. + */ + onCompleteParams?: any[]; + /** + * A function to call each time the tween loops. + */ + onLoop?: Phaser.Types.Tweens.TweenOnLoopCallback; + /** + * Additional parameters to pass to `onLoop`. + */ + onLoopParams?: any[]; + /** + * A function to call each time a property tween repeats. Called once per property per target. + */ + onRepeat?: Phaser.Types.Tweens.TweenOnRepeatCallback; + /** + * Additional parameters to pass to `onRepeat`. + */ + onRepeatParams?: any[]; + /** + * A function to call when the tween starts playback, after any delays have expired. + */ + onStart?: Phaser.Types.Tweens.TweenOnStartCallback; + /** + * Additional parameters to pass to `onStart`. + */ + onStartParams?: any[]; + /** + * A function to call when the tween is stopped. + */ + onStop?: Phaser.Types.Tweens.TweenOnStopCallback; + /** + * Additional parameters to pass to `onStop`. + */ + onStopParams?: any[]; + /** + * A function to call each time the tween steps. Called once per property per target. + */ + onUpdate?: Phaser.Types.Tweens.TweenOnUpdateCallback; + /** + * Additional parameters to pass to `onUpdate`. + */ + onUpdateParams?: any[]; + /** + * A function to call each time a property tween yoyos. Called once per property per target. + */ + onYoyo?: Phaser.Types.Tweens.TweenOnYoyoCallback; + /** + * Additional parameters to pass to `onYoyo`. + */ + onYoyoParams?: any[]; + /** + * A function to call when the tween becomes active within the Tween Manager. + */ + onActive?: Phaser.Types.Tweens.TweenOnActiveCallback; + /** + * Additional parameters to pass to `onActive`. + */ + onActiveParams?: any[]; + /** + * A function to call when the tween is paused. + */ + onPause?: Phaser.Types.Tweens.TweenOnPauseCallback; + /** + * Additional parameters to pass to `onPause`. + */ + onPauseParams?: any[]; + /** + * A function to call when the tween is resumed after being paused. + */ + onResume?: Phaser.Types.Tweens.TweenOnResumeCallback; + /** + * Additional parameters to pass to `onResume`. + */ + onResumeParams?: any[]; + /** + * Will the Tween be automatically destroyed on completion, or retained for future playback? + */ + persist?: boolean; + /** + * The interpolation function to use if the `value` given is an array of numbers. + */ + interpolation?: string | Function; + }; + + type TweenCallbacks = { + /** + * A function to call when the tween becomes active within the Tween Manager. + */ + onActive?: Phaser.Types.Tweens.TweenOnActiveCallback; + /** + * A function to call when the tween starts playback, after any delays have expired. + */ + onStart?: Phaser.Types.Tweens.TweenOnStartCallback; + /** + * A function to call when the tween completes. + */ + onComplete?: Phaser.Types.Tweens.TweenOnCompleteCallback; + /** + * A function to call each time the tween loops. + */ + onLoop?: Phaser.Types.Tweens.TweenOnLoopCallback; + /** + * A function to call each time the tween is paused. + */ + onPause?: Phaser.Types.Tweens.TweenOnPauseCallback; + /** + * A function to call each time the tween is resumed. + */ + onResume?: Phaser.Types.Tweens.TweenOnResumeCallback; + /** + * A function to call each time the tween repeats. Called once per property per target. + */ + onRepeat?: Phaser.Types.Tweens.TweenOnRepeatCallback; + /** + * A function to call when the tween is stopped. + */ + onStop?: Phaser.Types.Tweens.TweenOnStopCallback; + /** + * A function to call each time the tween steps. Called once per property per target. + */ + onUpdate?: Phaser.Types.Tweens.TweenOnUpdateCallback; + /** + * A function to call each time the tween yoyos. Called once per property per target. + */ + onYoyo?: Phaser.Types.Tweens.TweenOnYoyoCallback; + }; + + type TweenCallbackTypes = 'onActive' | 'onComplete' | 'onLoop' | 'onPause' | 'onRepeat' | 'onResume' | 'onStart' | 'onStop' | 'onUpdate' | 'onYoyo'; + + type TweenChainBuilderConfig = {[key: string]: any} & { + /** + * The object, or an array of objects, to run each tween on. + */ + targets: any; + /** + * The number of milliseconds to delay before the chain will start. + */ + delay?: number | Function; + /** + * The time the chain will wait before the onComplete event is dispatched once it has completed, in ms. + */ + completeDelay?: string | number | Function | object | any[]; + /** + * The number of times the chain will repeat. (A value of 1 means the chain will play twice, as it repeated once.) The first loop starts after every tween has completed once. + */ + loop?: string | number | Function | object | any[]; + /** + * The time the chain will pause before returning to the start for a repeat. + */ + loopDelay?: string | number | Function | object | any[]; + /** + * Does the chain start in a paused state (true) or playing (false)? + */ + paused?: boolean; + /** + * The tweens to chain together. + */ + tweens?: Phaser.Types.Tweens.TweenBuilderConfig[]; + /** + * The scope (or context) for all of the callbacks. The default scope is the chain. + */ + callbackScope?: any; + /** + * A function to call when the chain completes. + */ + onComplete?: Phaser.Types.Tweens.TweenOnCompleteCallback; + /** + * Additional parameters to pass to `onComplete`. + */ + onCompleteParams?: any[]; + /** + * A function to call each time the chain loops. + */ + onLoop?: Phaser.Types.Tweens.TweenOnLoopCallback; + /** + * Additional parameters to pass to `onLoop`. + */ + onLoopParams?: any[]; + /** + * A function to call when the chain starts playback, after any delays have expired. + */ + onStart?: Phaser.Types.Tweens.TweenOnStartCallback; + /** + * Additional parameters to pass to `onStart`. + */ + onStartParams?: any[]; + /** + * A function to call when the chain is stopped. + */ + onStop?: Phaser.Types.Tweens.TweenOnStopCallback; + /** + * Additional parameters to pass to `onStop`. + */ + onStopParams?: any[]; + /** + * A function to call when the chain becomes active within the Tween Manager. + */ + onActive?: Phaser.Types.Tweens.TweenOnActiveCallback; + /** + * Additional parameters to pass to `onActive`. + */ + onActiveParams?: any[]; + /** + * A function to call when the chain is paused. + */ + onPause?: Phaser.Types.Tweens.TweenOnPauseCallback; + /** + * Additional parameters to pass to `onPause`. + */ + onPauseParams?: any[]; + /** + * A function to call when the chain is resumed after being paused. + */ + onResume?: Phaser.Types.Tweens.TweenOnResumeCallback; + /** + * Additional parameters to pass to `onResume`. + */ + onResumeParams?: any[]; + /** + * Will the Tween be automatically destroyed on completion, or retained for future playback? + */ + persist?: boolean; + }; + + type TweenDataConfig = { + /** + * The target to tween. + */ + target: any; + /** + * The target index within the Tween targets array. + */ + index: number; + /** + * The property of the target being tweened. + */ + key: string; + /** + * If not null, is invoked _immediately_ as soon as the TweenData is running, and is set on the target property. + */ + getActiveValue: Phaser.Types.Tweens.GetActiveCallback | null; + /** + * The returned value sets what the property will be at the END of the Tween. + */ + getEndValue: Phaser.Types.Tweens.GetEndCallback; + /** + * The returned value sets what the property will be at the START of the Tween. + */ + getStartValue: Phaser.Types.Tweens.GetStartCallback; + /** + * The ease function this tween uses. + */ + ease: Function; + /** + * Duration of the tween in milliseconds, excludes time for yoyo or repeats. + */ + duration?: number; + /** + * The total calculated duration of this TweenData (based on duration, repeat, delay and yoyo) + */ + totalDuration?: number; + /** + * Time in milliseconds before tween will start. + */ + delay?: number; + /** + * Cause the tween to return back to its start value after hold has expired. + */ + yoyo?: boolean; + /** + * Time in milliseconds the tween will pause before running the yoyo or starting a repeat. + */ + hold?: number; + /** + * Number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + */ + repeat?: number; + /** + * Time in milliseconds before the repeat will start. + */ + repeatDelay?: number; + /** + * Automatically call toggleFlipX when the TweenData yoyos or repeats + */ + flipX?: boolean; + /** + * Automatically call toggleFlipY when the TweenData yoyos or repeats + */ + flipY?: boolean; + /** + * Between 0 and 1 showing completion of this TweenData. + */ + progress?: number; + /** + * Delta counter + */ + elapsed?: number; + /** + * How many repeats are left to run? + */ + repeatCounter?: number; + /** + * The property value at the start of the ease. + */ + start?: number; + /** + * The current propety value. + */ + current?: number; + /** + * The previous property value. + */ + previous?: number; + /** + * The property value at the end of the ease. + */ + end?: number; + /** + * LoadValue generation functions. + */ + gen?: Phaser.Types.Tweens.TweenDataGenConfig; + /** + * TWEEN_CONST.CREATED + */ + state?: Phaser.Tweens.StateType; + }; + + type TweenDataGenConfig = { + /** + * Time in milliseconds before tween will start. + */ + delay: Function; + /** + * Duration of the tween in milliseconds, excludes time for yoyo or repeats. + */ + duration: Function; + /** + * Time in milliseconds the tween will pause before running the yoyo or starting a repeat. + */ + hold: Function; + /** + * Number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + */ + repeat: Function; + /** + * Time in milliseconds before the repeat will start. + */ + repeatDelay: Function; + }; + + type TweenFrameDataConfig = { + /** + * The target to tween. + */ + target: any; + /** + * The target index within the Tween targets array. + */ + index: number; + /** + * The property of the target being tweened. + */ + key: string; + /** + * Duration of the tween in milliseconds, excludes time for yoyo or repeats. + */ + duration?: number; + /** + * The total calculated duration of this TweenData (based on duration, repeat, delay and yoyo) + */ + totalDuration?: number; + /** + * Time in milliseconds before tween will start. + */ + delay?: number; + /** + * Time in milliseconds the tween will pause before running the yoyo or starting a repeat. + */ + hold?: number; + /** + * Number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + */ + repeat?: number; + /** + * Time in milliseconds before the repeat will start. + */ + repeatDelay?: number; + /** + * Automatically call toggleFlipX when the TweenData yoyos or repeats + */ + flipX?: boolean; + /** + * Automatically call toggleFlipY when the TweenData yoyos or repeats + */ + flipY?: boolean; + /** + * Between 0 and 1 showing completion of this TweenData. + */ + progress?: number; + /** + * Delta counter + */ + elapsed?: number; + /** + * How many repeats are left to run? + */ + repeatCounter?: number; + /** + * LoadValue generation functions. + */ + gen?: Phaser.Types.Tweens.TweenDataGenConfig; + /** + * TWEEN_CONST.CREATED + */ + state?: Phaser.Tweens.StateType; + }; + + type TweenOnActiveCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnCompleteCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnLoopCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnPauseCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnRepeatCallback = (tween: Phaser.Tweens.Tween, target: any, key: string, current: number, previous: number, ...param: any[])=>void; + + type TweenOnResumeCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnStartCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnStopCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnUpdateCallback = (tween: Phaser.Tweens.Tween, target: any, key: string, current: number, previous: number, ...param: any[])=>void; + + type TweenOnYoyoCallback = (tween: Phaser.Tweens.Tween, target: any, key: string, current: number, previous: number, ...param: any[])=>void; + + type TweenPropConfig = { + /** + * What the property will be at the END of the Tween. + */ + value?: number | number[] | string | Phaser.Types.Tweens.GetEndCallback | Phaser.Types.Tweens.TweenPropConfig; + /** + * What the property will be set to immediately when this tween becomes active. + */ + getActive?: Phaser.Types.Tweens.GetActiveCallback; + /** + * What the property will be at the END of the Tween. + */ + getEnd?: Phaser.Types.Tweens.GetEndCallback; + /** + * What the property will be at the START of the Tween. + */ + getStart?: Phaser.Types.Tweens.GetStartCallback; + /** + * The ease function this tween uses. + */ + ease?: string | Function; + /** + * Time in milliseconds before tween will start. + */ + delay?: number; + /** + * Duration of the tween in milliseconds. + */ + duration?: number; + /** + * Determines whether the tween should return back to its start value after hold has expired. + */ + yoyo?: boolean; + /** + * Time in milliseconds the tween will pause before repeating or returning to its starting value if yoyo is set to true. + */ + hold?: number; + /** + * Number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + */ + repeat?: number; + /** + * Time in milliseconds before the repeat will start. + */ + repeatDelay?: number; + /** + * Should toggleFlipX be called when yoyo or repeat happens? + */ + flipX?: boolean; + /** + * Should toggleFlipY be called when yoyo or repeat happens? + */ + flipY?: boolean; + /** + * The interpolation function to use if the `value` given is an array of numbers. + */ + interpolation?: string | Function; + }; + + } + + } + + namespace Physics { + namespace Arcade { + /** + * An Arcade Physics Image is an Image with an Arcade Physics body and related components. + * The body can be dynamic or static. + * + * The main difference between an Arcade Image and an Arcade Sprite is that you cannot animate an Arcade Image. + */ + class Image extends Phaser.GameObjects.Image implements Phaser.Physics.Arcade.Components.Acceleration, Phaser.Physics.Arcade.Components.Angular, Phaser.Physics.Arcade.Components.Bounce, Phaser.Physics.Arcade.Components.Collision, Phaser.Physics.Arcade.Components.Debug, Phaser.Physics.Arcade.Components.Drag, Phaser.Physics.Arcade.Components.Enable, Phaser.Physics.Arcade.Components.Friction, Phaser.Physics.Arcade.Components.Gravity, Phaser.Physics.Arcade.Components.Immovable, Phaser.Physics.Arcade.Components.Mass, Phaser.Physics.Arcade.Components.Pushable, Phaser.Physics.Arcade.Components.Size, Phaser.Physics.Arcade.Components.Velocity, Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number); + + /** + * This Game Object's Physics Body. + */ + body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody | null; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * Sets the body's horizontal and vertical acceleration. If the vertical acceleration value is not provided, the vertical acceleration is set to the same value as the horizontal acceleration. + * @param x The horizontal acceleration + * @param y The vertical acceleration Default x. + */ + setAcceleration(x: number, y?: number): this; + + /** + * Sets the body's horizontal acceleration. + * @param value The horizontal acceleration + */ + setAccelerationX(value: number): this; + + /** + * Sets the body's vertical acceleration. + * @param value The vertical acceleration + */ + setAccelerationY(value: number): this; + + /** + * Sets the angular velocity of the body. + * + * In Arcade Physics, bodies cannot rotate. They are always axis-aligned. + * However, they can have angular motion, which is passed on to the Game Object bound to the body, + * causing them to visually rotate, even though the body remains axis-aligned. + * @param value The amount of angular velocity. + */ + setAngularVelocity(value: number): this; + + /** + * Sets the angular acceleration of the body. + * + * In Arcade Physics, bodies cannot rotate. They are always axis-aligned. + * However, they can have angular motion, which is passed on to the Game Object bound to the body, + * causing them to visually rotate, even though the body remains axis-aligned. + * @param value The amount of angular acceleration. + */ + setAngularAcceleration(value: number): this; + + /** + * Sets the angular drag of the body. Drag is applied to the current velocity, providing a form of deceleration. + * @param value The amount of drag. + */ + setAngularDrag(value: number): this; + + /** + * Sets the bounce values of this body. + * + * Bounce is the amount of restitution, or elasticity, the body has when it collides with another object. + * A value of 1 means that it will retain its full velocity after the rebound. A value of 0 means it will not rebound at all. + * @param x The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1. + * @param y The amount of vertical bounce to apply on collision. A float, typically between 0 and 1. Default x. + */ + setBounce(x: number, y?: number): this; + + /** + * Sets the horizontal bounce value for this body. + * @param value The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1. + */ + setBounceX(value: number): this; + + /** + * Sets the vertical bounce value for this body. + * @param value The amount of vertical bounce to apply on collision. A float, typically between 0 and 1. + */ + setBounceY(value: number): this; + + /** + * Sets whether this Body collides with the world boundary. + * + * Optionally also sets the World Bounce values. If the `Body.worldBounce` is null, it's set to a new Phaser.Math.Vector2 first. + * @param value `true` if this body should collide with the world bounds, otherwise `false`. Default true. + * @param bounceX If given this will be replace the `worldBounce.x` value. + * @param bounceY If given this will be replace the `worldBounce.y` value. + * @param onWorldBounds If given this replaces the Body's `onWorldBounds` value. + */ + setCollideWorldBounds(value?: boolean, bounceX?: number, bounceY?: number, onWorldBounds?: boolean): this; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + /** + * Sets the debug values of this body. + * + * Bodies will only draw their debug if debug has been enabled for Arcade Physics as a whole. + * Note that there is a performance cost in drawing debug displays. It should never be used in production. + * @param showBody Set to `true` to have this body render its outline to the debug display. + * @param showVelocity Set to `true` to have this body render a velocity marker to the debug display. + * @param bodyColor The color of the body outline when rendered to the debug display. + */ + setDebug(showBody: boolean, showVelocity: boolean, bodyColor: number): this; + + /** + * Sets the color of the body outline when it renders to the debug display. + * @param value The color of the body outline when rendered to the debug display. + */ + setDebugBodyColor(value: number): this; + + /** + * Set to `true` to have this body render its outline to the debug display. + */ + debugShowBody: boolean; + + /** + * Set to `true` to have this body render a velocity marker to the debug display. + */ + debugShowVelocity: boolean; + + /** + * The color of the body outline when it renders to the debug display. + */ + debugBodyColor: number; + + /** + * Sets the body's horizontal and vertical drag. If the vertical drag value is not provided, the vertical drag is set to the same value as the horizontal drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param x The amount of horizontal drag to apply. + * @param y The amount of vertical drag to apply. Default x. + */ + setDrag(x: number, y?: number): this; + + /** + * Sets the body's horizontal drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param value The amount of horizontal drag to apply. + */ + setDragX(value: number): this; + + /** + * Sets the body's vertical drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param value The amount of vertical drag to apply. + */ + setDragY(value: number): this; + + /** + * If this Body is using `drag` for deceleration this function controls how the drag is applied. + * If set to `true` drag will use a damping effect rather than a linear approach. If you are + * creating a game where the Body moves freely at any angle (i.e. like the way the ship moves in + * the game Asteroids) then you will get a far smoother and more visually correct deceleration + * by using damping, avoiding the axis-drift that is prone with linear deceleration. + * + * If you enable this property then you should use far smaller `drag` values than with linear, as + * they are used as a multiplier on the velocity. Values such as 0.95 will give a nice slow + * deceleration, where-as smaller values, such as 0.5 will stop an object almost immediately. + * @param value `true` to use damping for deceleration, or `false` to use linear deceleration. + */ + setDamping(value: boolean): this; + + /** + * Sets whether this Body should calculate its velocity based on its change in + * position every frame. The default, which is to not do this, means that you + * make this Body move by setting the velocity directly. However, if you are + * trying to move this Body via a Tween, or have it follow a Path, then you + * should enable this instead. This will allow it to still collide with other + * bodies, something that isn't possible if you're just changing its position directly. + * @param value `true` if the Body calculate velocity based on changes in position, otherwise `false`. Default true. + */ + setDirectControl(value?: boolean): this; + + /** + * Enables this Game Object's Body. + * If you reset the Body you must also pass `x` and `y`. + * @param reset Also reset the Body and place the Game Object at (x, y). + * @param x The horizontal position to place the Game Object, if `reset` is true. + * @param y The horizontal position to place the Game Object, if `reset` is true. + * @param enableGameObject Also set this Game Object's `active` to true. + * @param showGameObject Also set this Game Object's `visible` to true. + */ + enableBody(reset?: boolean, x?: number, y?: number, enableGameObject?: boolean, showGameObject?: boolean): this; + + /** + * Stops and disables this Game Object's Body. + * @param disableGameObject Also set this Game Object's `active` to false. Default false. + * @param hideGameObject Also set this Game Object's `visible` to false. Default false. + */ + disableBody(disableGameObject?: boolean, hideGameObject?: boolean): this; + + /** + * Syncs the Body's position and size with its parent Game Object. + * You don't need to call this for Dynamic Bodies, as it happens automatically. + * But for Static bodies it's a useful way of modifying the position of a Static Body + * in the Physics World, based on its Game Object. + */ + refreshBody(): this; + + /** + * Sets the friction of this game object's physics body. + * In Arcade Physics, friction is a special case of motion transfer from an "immovable" body to a riding body. + * @param x The amount of horizontal friction to apply, [0, 1]. + * @param y The amount of vertical friction to apply, [0, 1]. Default x. + */ + setFriction(x: number, y?: number): this; + + /** + * Sets the horizontal friction of this game object's physics body. + * This can move a riding body horizontally when it collides with this one on the vertical axis. + * @param x The amount of friction to apply, [0, 1]. + */ + setFrictionX(x: number): this; + + /** + * Sets the vertical friction of this game object's physics body. + * This can move a riding body vertically when it collides with this one on the horizontal axis. + * @param y The amount of friction to apply, [0, 1]. + */ + setFrictionY(y: number): this; + + /** + * Set the X and Y values of the gravitational pull to act upon this Arcade Physics Game Object. Values can be positive or negative. Larger values result in a stronger effect. + * + * If only one value is provided, this value will be used for both the X and Y axis. + * @param x The gravitational force to be applied to the X-axis. + * @param y The gravitational force to be applied to the Y-axis. If this is not specified, the X value will be used. Default x. + */ + setGravity(x: number, y?: number): this; + + /** + * Set the gravitational force to be applied to the X axis. Value can be positive or negative. Larger values result in a stronger effect. + * @param x The gravitational force to be applied to the X-axis. + */ + setGravityX(x: number): this; + + /** + * Set the gravitational force to be applied to the Y axis. Value can be positive or negative. Larger values result in a stronger effect. + * @param y The gravitational force to be applied to the Y-axis. + */ + setGravityY(y: number): this; + + /** + * Sets if this Body can be separated during collisions with other bodies. + * + * When a body is immovable it means it won't move at all, not even to separate it from collision + * overlap. If you just wish to prevent a body from being knocked around by other bodies, see + * the `setPushable` method instead. + * @param value Sets if this body will be separated during collisions with other bodies. Default true. + */ + setImmovable(value?: boolean): this; + + /** + * Sets the mass of the physics body + * @param value New value for the mass of the body. + */ + setMass(value: number): this; + + /** + * Sets if this Body can be pushed by another Body. + * + * A body that cannot be pushed will reflect back all of the velocity it is given to the + * colliding body. If that body is also not pushable, then the separation will be split + * between them evenly. + * + * If you want your body to never move or seperate at all, see the `setImmovable` method. + * @param value Sets if this body can be pushed by collisions with another Body. Default true. + */ + setPushable(value?: boolean): this; + + /** + * Sets the body offset. This allows you to adjust the difference between the center of the body + * and the x and y coordinates of the parent Game Object. + * @param x The amount to offset the body from the parent Game Object along the x-axis. + * @param y The amount to offset the body from the parent Game Object along the y-axis. Defaults to the value given for the x-axis. Default x. + */ + setOffset(x: number, y?: number): this; + + /** + * Sets the size of this physics body. Setting the size does not adjust the dimensions of the parent Game Object. + * @param width The new width of the physics body, in pixels. + * @param height The new height of the physics body, in pixels. + * @param center Should the body be re-positioned so its center aligns with the parent Game Object? Default true. + */ + setBodySize(width: number, height: number, center?: boolean): this; + + /** + * Sets this physics body to use a circle for collision instead of a rectangle. + * @param radius The radius of the physics body, in pixels. + * @param offsetX The amount to offset the body from the parent Game Object along the x-axis. + * @param offsetY The amount to offset the body from the parent Game Object along the y-axis. + */ + setCircle(radius: number, offsetX?: number, offsetY?: number): this; + + /** + * Sets the velocity of the Body. + * @param x The horizontal velocity of the body. Positive values move the body to the right, while negative values move it to the left. + * @param y The vertical velocity of the body. Positive values move the body down, while negative values move it up. Default x. + */ + setVelocity(x: number, y?: number): this; + + /** + * Sets the horizontal component of the body's velocity. + * + * Positive values move the body to the right, while negative values move it to the left. + * @param x The new horizontal velocity. + */ + setVelocityX(x: number): this; + + /** + * Sets the vertical component of the body's velocity. + * + * Positive values move the body down, while negative values move it up. + * @param y The new vertical velocity of the body. + */ + setVelocityY(y: number): this; + + /** + * Sets the maximum velocity of the body. + * @param x The new maximum horizontal velocity. + * @param y The new maximum vertical velocity. Default x. + */ + setMaxVelocity(x: number, y?: number): this; + + } + + /** + * The Arcade Physics Plugin belongs to a Scene and sets up and manages the Scene's physics simulation. + * It also holds some useful methods for moving and rotating Arcade Physics Bodies. + * + * You can access it from within a Scene using `this.physics`. + * + * Arcade Physics uses the Projection Method of collision resolution and separation. While it's fast and suitable + * for 'arcade' style games it lacks stability when multiple objects are in close proximity or resting upon each other. + * The separation that stops two objects penetrating may create a new penetration against a different object. If you + * require a high level of stability please consider using an alternative physics system, such as Matter.js. + */ + class ArcadePhysics { + /** + * + * @param scene The Scene that this Plugin belongs to. + */ + constructor(scene: Phaser.Scene); + + /** + * The Scene that this Plugin belongs to. + */ + scene: Phaser.Scene; + + /** + * The Scene's Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * A configuration object. Union of the `physics.arcade.*` properties of the GameConfig and SceneConfig objects. + */ + config: Phaser.Types.Physics.Arcade.ArcadeWorldConfig; + + /** + * The physics simulation. + */ + world: Phaser.Physics.Arcade.World; + + /** + * An object holding the Arcade Physics factory methods. + */ + add: Phaser.Physics.Arcade.Factory; + + /** + * Causes `World.update` to be automatically called each time the Scene + * emits and `UPDATE` event. This is the default setting, so only needs + * calling if you have specifically disabled it. + */ + enableUpdate(): void; + + /** + * Causes `World.update` to **not** be automatically called each time the Scene + * emits and `UPDATE` event. + * + * If you wish to run the World update at your own rate, or from your own + * component, then you should call this method to disable the built-in link, + * and then call `World.update(delta, time)` accordingly. + * + * Note that `World.postUpdate` is always automatically called when the Scene + * emits a `POST_UPDATE` event, regardless of this setting. + */ + disableUpdate(): void; + + /** + * Creates the physics configuration for the current Scene. + */ + getConfig(): Phaser.Types.Physics.Arcade.ArcadeWorldConfig; + + /** + * Returns the next available collision category. + * + * You can have a maximum of 32 categories. + * + * By default all bodies collide with all other bodies. + * + * Use the `Body.setCollisionCategory()` and + * `Body.setCollidesWith()` methods to change this. + */ + nextCategory(): number; + + /** + * Tests if Game Objects overlap. See {@link Phaser.Physics.Arcade.World#overlap} + * @param object1 The first object or array of objects to check. + * @param object2 The second object or array of objects to check, or `undefined`. + * @param overlapCallback An optional callback function that is called if the objects overlap. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they overlap. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + overlap(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2?: Phaser.Types.Physics.Arcade.ArcadeColliderType, overlapCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * Performs a collision check and separation between the two physics enabled objects given, which can be single + * Game Objects, arrays of Game Objects, Physics Groups, arrays of Physics Groups or normal Groups. + * + * If you don't require separation then use {@link #overlap} instead. + * + * If two Groups or arrays are passed, each member of one will be tested against each member of the other. + * + * If **only** one Group is passed (as `object1`), each member of the Group will be collided against the other members. + * + * If **only** one Array is passed, the array is iterated and every element in it is tested against the others. + * + * Two callbacks can be provided. The `collideCallback` is invoked if a collision occurs and the two colliding + * objects are passed to it. + * + * Arcade Physics uses the Projection Method of collision resolution and separation. While it's fast and suitable + * for 'arcade' style games it lacks stability when multiple objects are in close proximity or resting upon each other. + * The separation that stops two objects penetrating may create a new penetration against a different object. If you + * require a high level of stability please consider using an alternative physics system, such as Matter.js. + * @param object1 The first object or array of objects to check. + * @param object2 The second object or array of objects to check, or `undefined`. + * @param collideCallback An optional callback function that is called if the objects collide. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + collide(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2?: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * This advanced method is specifically for testing for collision between a single Sprite and an array of Tile objects. + * + * You should generally use the `collide` method instead, with a Sprite vs. a Tilemap Layer, as that will perform + * tile filtering and culling for you, as well as handle the interesting face collision automatically. + * + * This method is offered for those who would like to check for collision with specific Tiles in a layer, without + * having to set any collision attributes on the tiles in question. This allows you to perform quick dynamic collisions + * on small sets of Tiles. As such, no culling or checks are made to the array of Tiles given to this method, + * you should filter them before passing them to this method. + * + * Important: Use of this method skips the `interesting faces` system that Tilemap Layers use. This means if you have + * say a row or column of tiles, and you jump into, or walk over them, it's possible to get stuck on the edges of the + * tiles as the interesting face calculations are skipped. However, for quick-fire small collision set tests on + * dynamic maps, this method can prove very useful. + * @param sprite The first object to check for collision. + * @param tiles An array of Tiles to check for collision against. + * @param collideCallback An optional callback function that is called if the objects collide. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + collideTiles(sprite: Phaser.GameObjects.GameObject, tiles: Phaser.Tilemaps.Tile[], collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * This advanced method is specifically for testing for overlaps between a single Sprite and an array of Tile objects. + * + * You should generally use the `overlap` method instead, with a Sprite vs. a Tilemap Layer, as that will perform + * tile filtering and culling for you, as well as handle the interesting face collision automatically. + * + * This method is offered for those who would like to check for overlaps with specific Tiles in a layer, without + * having to set any collision attributes on the tiles in question. This allows you to perform quick dynamic overlap + * tests on small sets of Tiles. As such, no culling or checks are made to the array of Tiles given to this method, + * you should filter them before passing them to this method. + * @param sprite The first object to check for collision. + * @param tiles An array of Tiles to check for collision against. + * @param collideCallback An optional callback function that is called if the objects overlap. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + overlapTiles(sprite: Phaser.GameObjects.GameObject, tiles: Phaser.Tilemaps.Tile[], collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * Pauses the simulation. + */ + pause(): Phaser.Physics.Arcade.World; + + /** + * Resumes the simulation (if paused). + */ + resume(): Phaser.Physics.Arcade.World; + + /** + * Sets the acceleration.x/y property on the game object so it will move towards the x/y coordinates at the given rate (in pixels per second squared) + * + * You must give a maximum speed value, beyond which the game object won't go any faster. + * + * Note: The game object does not continuously track the target. If the target changes location during transit the game object will not modify its course. + * Note: The game object doesn't stop moving once it reaches the destination coordinates. + * @param gameObject Any Game Object with an Arcade Physics body. + * @param x The x coordinate to accelerate towards. + * @param y The y coordinate to accelerate towards. + * @param speed The acceleration (change in speed) in pixels per second squared. Default 60. + * @param xSpeedMax The maximum x velocity the game object can reach. Default 500. + * @param ySpeedMax The maximum y velocity the game object can reach. Default 500. + */ + accelerateTo(gameObject: Phaser.GameObjects.GameObject, x: number, y: number, speed?: number, xSpeedMax?: number, ySpeedMax?: number): number; + + /** + * Sets the acceleration.x/y property on the game object so it will move towards the x/y coordinates at the given rate (in pixels per second squared) + * + * You must give a maximum speed value, beyond which the game object won't go any faster. + * + * Note: The game object does not continuously track the target. If the target changes location during transit the game object will not modify its course. + * Note: The game object doesn't stop moving once it reaches the destination coordinates. + * @param gameObject Any Game Object with an Arcade Physics body. + * @param destination The Game Object to move towards. Can be any object but must have visible x/y properties. + * @param speed The acceleration (change in speed) in pixels per second squared. Default 60. + * @param xSpeedMax The maximum x velocity the game object can reach. Default 500. + * @param ySpeedMax The maximum y velocity the game object can reach. Default 500. + */ + accelerateToObject(gameObject: Phaser.GameObjects.GameObject, destination: Phaser.GameObjects.GameObject, speed?: number, xSpeedMax?: number, ySpeedMax?: number): number; + + /** + * Finds the Body or Game Object closest to a source point or object. + * + * If a `targets` argument is passed, this method finds the closest of those. + * The targets can be Arcade Physics Game Objects, Dynamic Bodies, or Static Bodies. + * + * If no `targets` argument is passed, this method finds the closest Dynamic Body. + * + * If two or more targets are the exact same distance from the source point, only the first target + * is returned. + * @param source Any object with public `x` and `y` properties, such as a Game Object or Geometry object. + * @param targets The targets. + */ + closest(source: Phaser.Types.Math.Vector2Like, targets?: Target[]): Target | null; + + /** + * Finds the Body or Game Object farthest from a source point or object. + * + * If a `targets` argument is passed, this method finds the farthest of those. + * The targets can be Arcade Physics Game Objects, Dynamic Bodies, or Static Bodies. + * + * If no `targets` argument is passed, this method finds the farthest Dynamic Body. + * + * If two or more targets are the exact same distance from the source point, only the first target + * is returned. + * @param source Any object with public `x` and `y` properties, such as a Game Object or Geometry object. + * @param targets The targets. + */ + furthest(source: any, targets?: Phaser.Physics.Arcade.Body[] | Phaser.Physics.Arcade.StaticBody[] | Phaser.GameObjects.GameObject[]): Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody | Phaser.GameObjects.GameObject | null; + + /** + * Move the given display object towards the x/y coordinates at a steady velocity. + * If you specify a maxTime then it will adjust the speed (over-writing what you set) so it arrives at the destination in that number of seconds. + * Timings are approximate due to the way browser timers work. Allow for a variance of +- 50ms. + * Note: The display object does not continuously track the target. If the target changes location during transit the display object will not modify its course. + * Note: The display object doesn't stop moving once it reaches the destination coordinates. + * Note: Doesn't take into account acceleration, maxVelocity or drag (if you've set drag or acceleration too high this object may not move at all) + * @param gameObject Any Game Object with an Arcade Physics body. + * @param x The x coordinate to move towards. + * @param y The y coordinate to move towards. + * @param speed The speed it will move, in pixels per second (default is 60 pixels/sec) Default 60. + * @param maxTime Time given in milliseconds (1000 = 1 sec). If set the speed is adjusted so the object will arrive at destination in the given number of ms. Default 0. + */ + moveTo(gameObject: Phaser.GameObjects.GameObject, x: number, y: number, speed?: number, maxTime?: number): number; + + /** + * Move the given display object towards the destination object at a steady velocity. + * If you specify a maxTime then it will adjust the speed (overwriting what you set) so it arrives at the destination in that number of seconds. + * Timings are approximate due to the way browser timers work. Allow for a variance of +- 50ms. + * Note: The display object does not continuously track the target. If the target changes location during transit the display object will not modify its course. + * Note: The display object doesn't stop moving once it reaches the destination coordinates. + * Note: Doesn't take into account acceleration, maxVelocity or drag (if you've set drag or acceleration too high this object may not move at all) + * @param gameObject Any Game Object with an Arcade Physics body. + * @param destination Any object with public `x` and `y` properties, such as a Game Object or Geometry object. + * @param speed The speed it will move, in pixels per second (default is 60 pixels/sec) Default 60. + * @param maxTime Time given in milliseconds (1000 = 1 sec). If set the speed is adjusted so the object will arrive at destination in the given number of ms. Default 0. + */ + moveToObject(gameObject: Phaser.GameObjects.GameObject, destination: object, speed?: number, maxTime?: number): number; + + /** + * Given the angle (in degrees) and speed calculate the velocity and return it as a vector, or set it to the given vector object. + * One way to use this is: velocityFromAngle(angle, 200, sprite.body.velocity) which will set the values directly to the sprite's velocity and not create a new vector object. + * @param angle The angle in degrees calculated in clockwise positive direction (down = 90 degrees positive, right = 0 degrees positive, up = 90 degrees negative) + * @param speed The speed it will move, in pixels per second squared. Default 60. + * @param vec2 The Vector2 in which the x and y properties will be set to the calculated velocity. + */ + velocityFromAngle(angle: number, speed?: number, vec2?: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Given the rotation (in radians) and speed calculate the velocity and return it as a vector, or set it to the given vector object. + * One way to use this is: velocityFromRotation(rotation, 200, sprite.body.velocity) which will set the values directly to the sprite's velocity and not create a new vector object. + * @param rotation The angle in radians. + * @param speed The speed it will move, in pixels per second squared Default 60. + * @param vec2 The Vector2 in which the x and y properties will be set to the calculated velocity. + */ + velocityFromRotation(rotation: number, speed?: number, vec2?: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * This method will search the given rectangular area and return an array of all physics bodies that + * overlap with it. It can return either Dynamic, Static bodies or a mixture of both. + * + * A body only has to intersect with the search area to be considered, it doesn't have to be fully + * contained within it. + * + * If Arcade Physics is set to use the RTree (which it is by default) then the search for is extremely fast, + * otherwise the search is O(N) for Dynamic Bodies. + * @param x The top-left x coordinate of the area to search within. + * @param y The top-left y coordinate of the area to search within. + * @param width The width of the area to search within. + * @param height The height of the area to search within. + * @param includeDynamic Should the search include Dynamic Bodies? Default true. + * @param includeStatic Should the search include Static Bodies? Default false. + */ + overlapRect(x: number, y: number, width: number, height: number, includeDynamic?: boolean, includeStatic?: boolean): Phaser.Physics.Arcade.Body[] | Phaser.Physics.Arcade.StaticBody[]; + + /** + * This method will search the given circular area and return an array of all physics bodies that + * overlap with it. It can return either Dynamic, Static bodies or a mixture of both. + * + * A body only has to intersect with the search area to be considered, it doesn't have to be fully + * contained within it. + * + * If Arcade Physics is set to use the RTree (which it is by default) then the search is rather fast, + * otherwise the search is O(N) for Dynamic Bodies. + * @param x The x coordinate of the center of the area to search within. + * @param y The y coordinate of the center of the area to search within. + * @param radius The radius of the area to search within. + * @param includeDynamic Should the search include Dynamic Bodies? Default true. + * @param includeStatic Should the search include Static Bodies? Default false. + */ + overlapCirc(x: number, y: number, radius: number, includeDynamic?: boolean, includeStatic?: boolean): Phaser.Physics.Arcade.Body[] | Phaser.Physics.Arcade.StaticBody[]; + + /** + * The Scene that owns this plugin is shutting down. + * We need to kill and reset all internal properties as well as stop listening to Scene events. + */ + shutdown(): void; + + /** + * The Scene that owns this plugin is being destroyed. + * We need to shutdown and then kill off all external references. + */ + destroy(): void; + + } + + /** + * An Arcade Physics Sprite is a Sprite with an Arcade Physics body and related components. + * The body can be dynamic or static. + * + * The main difference between an Arcade Sprite and an Arcade Image is that you cannot animate an Arcade Image. + * If you do not require animation then you can safely use Arcade Images instead of Arcade Sprites. + */ + class Sprite extends Phaser.GameObjects.Sprite implements Phaser.Physics.Arcade.Components.Acceleration, Phaser.Physics.Arcade.Components.Angular, Phaser.Physics.Arcade.Components.Bounce, Phaser.Physics.Arcade.Components.Collision, Phaser.Physics.Arcade.Components.Debug, Phaser.Physics.Arcade.Components.Drag, Phaser.Physics.Arcade.Components.Enable, Phaser.Physics.Arcade.Components.Friction, Phaser.Physics.Arcade.Components.Gravity, Phaser.Physics.Arcade.Components.Immovable, Phaser.Physics.Arcade.Components.Mass, Phaser.Physics.Arcade.Components.Pushable, Phaser.Physics.Arcade.Components.Size, Phaser.Physics.Arcade.Components.Velocity, Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number); + + /** + * This Game Object's Physics Body. + */ + body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody | null; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * Sets the body's horizontal and vertical acceleration. If the vertical acceleration value is not provided, the vertical acceleration is set to the same value as the horizontal acceleration. + * @param x The horizontal acceleration + * @param y The vertical acceleration Default x. + */ + setAcceleration(x: number, y?: number): this; + + /** + * Sets the body's horizontal acceleration. + * @param value The horizontal acceleration + */ + setAccelerationX(value: number): this; + + /** + * Sets the body's vertical acceleration. + * @param value The vertical acceleration + */ + setAccelerationY(value: number): this; + + /** + * Sets the angular velocity of the body. + * + * In Arcade Physics, bodies cannot rotate. They are always axis-aligned. + * However, they can have angular motion, which is passed on to the Game Object bound to the body, + * causing them to visually rotate, even though the body remains axis-aligned. + * @param value The amount of angular velocity. + */ + setAngularVelocity(value: number): this; + + /** + * Sets the angular acceleration of the body. + * + * In Arcade Physics, bodies cannot rotate. They are always axis-aligned. + * However, they can have angular motion, which is passed on to the Game Object bound to the body, + * causing them to visually rotate, even though the body remains axis-aligned. + * @param value The amount of angular acceleration. + */ + setAngularAcceleration(value: number): this; + + /** + * Sets the angular drag of the body. Drag is applied to the current velocity, providing a form of deceleration. + * @param value The amount of drag. + */ + setAngularDrag(value: number): this; + + /** + * Sets the bounce values of this body. + * + * Bounce is the amount of restitution, or elasticity, the body has when it collides with another object. + * A value of 1 means that it will retain its full velocity after the rebound. A value of 0 means it will not rebound at all. + * @param x The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1. + * @param y The amount of vertical bounce to apply on collision. A float, typically between 0 and 1. Default x. + */ + setBounce(x: number, y?: number): this; + + /** + * Sets the horizontal bounce value for this body. + * @param value The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1. + */ + setBounceX(value: number): this; + + /** + * Sets the vertical bounce value for this body. + * @param value The amount of vertical bounce to apply on collision. A float, typically between 0 and 1. + */ + setBounceY(value: number): this; + + /** + * Sets whether this Body collides with the world boundary. + * + * Optionally also sets the World Bounce values. If the `Body.worldBounce` is null, it's set to a new Phaser.Math.Vector2 first. + * @param value `true` if this body should collide with the world bounds, otherwise `false`. Default true. + * @param bounceX If given this will be replace the `worldBounce.x` value. + * @param bounceY If given this will be replace the `worldBounce.y` value. + * @param onWorldBounds If given this replaces the Body's `onWorldBounds` value. + */ + setCollideWorldBounds(value?: boolean, bounceX?: number, bounceY?: number, onWorldBounds?: boolean): this; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + /** + * Sets the debug values of this body. + * + * Bodies will only draw their debug if debug has been enabled for Arcade Physics as a whole. + * Note that there is a performance cost in drawing debug displays. It should never be used in production. + * @param showBody Set to `true` to have this body render its outline to the debug display. + * @param showVelocity Set to `true` to have this body render a velocity marker to the debug display. + * @param bodyColor The color of the body outline when rendered to the debug display. + */ + setDebug(showBody: boolean, showVelocity: boolean, bodyColor: number): this; + + /** + * Sets the color of the body outline when it renders to the debug display. + * @param value The color of the body outline when rendered to the debug display. + */ + setDebugBodyColor(value: number): this; + + /** + * Set to `true` to have this body render its outline to the debug display. + */ + debugShowBody: boolean; + + /** + * Set to `true` to have this body render a velocity marker to the debug display. + */ + debugShowVelocity: boolean; + + /** + * The color of the body outline when it renders to the debug display. + */ + debugBodyColor: number; + + /** + * Sets the body's horizontal and vertical drag. If the vertical drag value is not provided, the vertical drag is set to the same value as the horizontal drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param x The amount of horizontal drag to apply. + * @param y The amount of vertical drag to apply. Default x. + */ + setDrag(x: number, y?: number): this; + + /** + * Sets the body's horizontal drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param value The amount of horizontal drag to apply. + */ + setDragX(value: number): this; + + /** + * Sets the body's vertical drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param value The amount of vertical drag to apply. + */ + setDragY(value: number): this; + + /** + * If this Body is using `drag` for deceleration this function controls how the drag is applied. + * If set to `true` drag will use a damping effect rather than a linear approach. If you are + * creating a game where the Body moves freely at any angle (i.e. like the way the ship moves in + * the game Asteroids) then you will get a far smoother and more visually correct deceleration + * by using damping, avoiding the axis-drift that is prone with linear deceleration. + * + * If you enable this property then you should use far smaller `drag` values than with linear, as + * they are used as a multiplier on the velocity. Values such as 0.95 will give a nice slow + * deceleration, where-as smaller values, such as 0.5 will stop an object almost immediately. + * @param value `true` to use damping for deceleration, or `false` to use linear deceleration. + */ + setDamping(value: boolean): this; + + /** + * Sets whether this Body should calculate its velocity based on its change in + * position every frame. The default, which is to not do this, means that you + * make this Body move by setting the velocity directly. However, if you are + * trying to move this Body via a Tween, or have it follow a Path, then you + * should enable this instead. This will allow it to still collide with other + * bodies, something that isn't possible if you're just changing its position directly. + * @param value `true` if the Body calculate velocity based on changes in position, otherwise `false`. Default true. + */ + setDirectControl(value?: boolean): this; + + /** + * Enables this Game Object's Body. + * If you reset the Body you must also pass `x` and `y`. + * @param reset Also reset the Body and place the Game Object at (x, y). + * @param x The horizontal position to place the Game Object, if `reset` is true. + * @param y The horizontal position to place the Game Object, if `reset` is true. + * @param enableGameObject Also set this Game Object's `active` to true. + * @param showGameObject Also set this Game Object's `visible` to true. + */ + enableBody(reset?: boolean, x?: number, y?: number, enableGameObject?: boolean, showGameObject?: boolean): this; + + /** + * Stops and disables this Game Object's Body. + * @param disableGameObject Also set this Game Object's `active` to false. Default false. + * @param hideGameObject Also set this Game Object's `visible` to false. Default false. + */ + disableBody(disableGameObject?: boolean, hideGameObject?: boolean): this; + + /** + * Syncs the Body's position and size with its parent Game Object. + * You don't need to call this for Dynamic Bodies, as it happens automatically. + * But for Static bodies it's a useful way of modifying the position of a Static Body + * in the Physics World, based on its Game Object. + */ + refreshBody(): this; + + /** + * Sets the friction of this game object's physics body. + * In Arcade Physics, friction is a special case of motion transfer from an "immovable" body to a riding body. + * @param x The amount of horizontal friction to apply, [0, 1]. + * @param y The amount of vertical friction to apply, [0, 1]. Default x. + */ + setFriction(x: number, y?: number): this; + + /** + * Sets the horizontal friction of this game object's physics body. + * This can move a riding body horizontally when it collides with this one on the vertical axis. + * @param x The amount of friction to apply, [0, 1]. + */ + setFrictionX(x: number): this; + + /** + * Sets the vertical friction of this game object's physics body. + * This can move a riding body vertically when it collides with this one on the horizontal axis. + * @param y The amount of friction to apply, [0, 1]. + */ + setFrictionY(y: number): this; + + /** + * Set the X and Y values of the gravitational pull to act upon this Arcade Physics Game Object. Values can be positive or negative. Larger values result in a stronger effect. + * + * If only one value is provided, this value will be used for both the X and Y axis. + * @param x The gravitational force to be applied to the X-axis. + * @param y The gravitational force to be applied to the Y-axis. If this is not specified, the X value will be used. Default x. + */ + setGravity(x: number, y?: number): this; + + /** + * Set the gravitational force to be applied to the X axis. Value can be positive or negative. Larger values result in a stronger effect. + * @param x The gravitational force to be applied to the X-axis. + */ + setGravityX(x: number): this; + + /** + * Set the gravitational force to be applied to the Y axis. Value can be positive or negative. Larger values result in a stronger effect. + * @param y The gravitational force to be applied to the Y-axis. + */ + setGravityY(y: number): this; + + /** + * Sets if this Body can be separated during collisions with other bodies. + * + * When a body is immovable it means it won't move at all, not even to separate it from collision + * overlap. If you just wish to prevent a body from being knocked around by other bodies, see + * the `setPushable` method instead. + * @param value Sets if this body will be separated during collisions with other bodies. Default true. + */ + setImmovable(value?: boolean): this; + + /** + * Sets the mass of the physics body + * @param value New value for the mass of the body. + */ + setMass(value: number): this; + + /** + * Sets if this Body can be pushed by another Body. + * + * A body that cannot be pushed will reflect back all of the velocity it is given to the + * colliding body. If that body is also not pushable, then the separation will be split + * between them evenly. + * + * If you want your body to never move or seperate at all, see the `setImmovable` method. + * @param value Sets if this body can be pushed by collisions with another Body. Default true. + */ + setPushable(value?: boolean): this; + + /** + * Sets the body offset. This allows you to adjust the difference between the center of the body + * and the x and y coordinates of the parent Game Object. + * @param x The amount to offset the body from the parent Game Object along the x-axis. + * @param y The amount to offset the body from the parent Game Object along the y-axis. Defaults to the value given for the x-axis. Default x. + */ + setOffset(x: number, y?: number): this; + + /** + * Sets the size of this physics body. Setting the size does not adjust the dimensions of the parent Game Object. + * @param width The new width of the physics body, in pixels. + * @param height The new height of the physics body, in pixels. + * @param center Should the body be re-positioned so its center aligns with the parent Game Object? Default true. + */ + setBodySize(width: number, height: number, center?: boolean): this; + + /** + * Sets this physics body to use a circle for collision instead of a rectangle. + * @param radius The radius of the physics body, in pixels. + * @param offsetX The amount to offset the body from the parent Game Object along the x-axis. + * @param offsetY The amount to offset the body from the parent Game Object along the y-axis. + */ + setCircle(radius: number, offsetX?: number, offsetY?: number): this; + + /** + * Sets the velocity of the Body. + * @param x The horizontal velocity of the body. Positive values move the body to the right, while negative values move it to the left. + * @param y The vertical velocity of the body. Positive values move the body down, while negative values move it up. Default x. + */ + setVelocity(x: number, y?: number): this; + + /** + * Sets the horizontal component of the body's velocity. + * + * Positive values move the body to the right, while negative values move it to the left. + * @param x The new horizontal velocity. + */ + setVelocityX(x: number): this; + + /** + * Sets the vertical component of the body's velocity. + * + * Positive values move the body down, while negative values move it up. + * @param y The new vertical velocity of the body. + */ + setVelocityY(y: number): this; + + /** + * Sets the maximum velocity of the body. + * @param x The new maximum horizontal velocity. + * @param y The new maximum vertical velocity. Default x. + */ + setMaxVelocity(x: number, y?: number): this; + + } + + /** + * A Dynamic Arcade Body. + * + * Its static counterpart is {@link Phaser.Physics.Arcade.StaticBody}. + */ + class Body implements Phaser.Physics.Arcade.Components.Collision { + /** + * + * @param world The Arcade Physics simulation this Body belongs to. + * @param gameObject The Game Object this Body belongs to. As of Phaser 3.60 this is now optional. + */ + constructor(world: Phaser.Physics.Arcade.World, gameObject?: Phaser.GameObjects.GameObject); + + /** + * The Arcade Physics simulation this Body belongs to. + */ + world: Phaser.Physics.Arcade.World; + + /** + * The Game Object this Body belongs to. + * + * As of Phaser 3.60 this is now optional and can be undefined. + */ + gameObject: Phaser.GameObjects.GameObject; + + /** + * A quick-test flag that signifies this is a Body, used in the World collision handler. + */ + readonly isBody: boolean; + + /** + * Transformations applied to this Body. + */ + transform: object; + + /** + * Whether the Body is drawn to the debug display. + */ + debugShowBody: boolean; + + /** + * Whether the Body's velocity is drawn to the debug display. + */ + debugShowVelocity: boolean; + + /** + * The color of this Body on the debug display. + */ + debugBodyColor: number; + + /** + * Whether this Body is updated by the physics simulation. + */ + enable: boolean; + + /** + * Whether this Body is circular (true) or rectangular (false). + */ + isCircle: boolean; + + /** + * If this Body is circular, this is the unscaled radius of the Body, as set by setCircle(), in source pixels. + * The true radius is equal to `halfWidth`. + */ + radius: number; + + /** + * The offset of this Body's position from its Game Object's position, in source pixels. + */ + offset: Phaser.Math.Vector2; + + /** + * The position of this Body within the simulation. + */ + position: Phaser.Math.Vector2; + + /** + * The position of this Body during the previous step. + */ + prev: Phaser.Math.Vector2; + + /** + * The position of this Body during the previous frame. + */ + prevFrame: Phaser.Math.Vector2; + + /** + * Whether this Body's `rotation` is affected by its angular acceleration and angular velocity. + */ + allowRotation: boolean; + + /** + * This body's rotation, in degrees, based on its angular acceleration and angular velocity. + * The Body's rotation controls the `angle` of its Game Object. + * It doesn't rotate the Body's own geometry, which is always an axis-aligned rectangle or a circle. + */ + rotation: number; + + /** + * The Body rotation, in degrees, during the previous step. + */ + preRotation: number; + + /** + * The width of the Body, in pixels. + * If the Body is circular, this is also the diameter. + * If you wish to change the width use the `Body.setSize` method. + */ + readonly width: number; + + /** + * The height of the Body, in pixels. + * If the Body is circular, this is also the diameter. + * If you wish to change the height use the `Body.setSize` method. + */ + readonly height: number; + + /** + * The unscaled width of the Body, in source pixels, as set by setSize(). + * The default is the width of the Body's Game Object's texture frame. + */ + sourceWidth: number; + + /** + * The unscaled height of the Body, in source pixels, as set by setSize(). + * The default is the height of the Body's Game Object's texture frame. + */ + sourceHeight: number; + + /** + * Half the Body's width, in pixels. + */ + halfWidth: number; + + /** + * Half the Body's height, in pixels. + */ + halfHeight: number; + + /** + * The center of the Body. + * The midpoint of its `position` (top-left corner) and its bottom-right corner. + */ + center: Phaser.Math.Vector2; + + /** + * The Body's velocity, in pixels per second. + */ + velocity: Phaser.Math.Vector2; + + /** + * The Body's change in position (due to velocity) at the last step, in pixels. + * + * The size of this value depends on the simulation's step rate. + */ + readonly newVelocity: Phaser.Math.Vector2; + + /** + * The Body's absolute maximum change in position, in pixels per step. + */ + deltaMax: Phaser.Math.Vector2; + + /** + * The Body's change in velocity, in pixels per second squared. + */ + acceleration: Phaser.Math.Vector2; + + /** + * Whether this Body's velocity is affected by its `drag`. + */ + allowDrag: boolean; + + /** + * When `useDamping` is false (the default), this is absolute loss of velocity due to movement, in pixels per second squared. + * + * When `useDamping` is true, this is a damping multiplier between 0 and 1. + * A value of 0 means the Body stops instantly. + * A value of 0.01 mean the Body keeps 1% of its velocity per second, losing 99%. + * A value of 0.1 means the Body keeps 10% of its velocity per second, losing 90%. + * A value of 1 means the Body loses no velocity. + * You can use very small values (e.g., 0.001) to stop the Body quickly. + * + * The x and y components are applied separately. + * + * Drag is applied only when `acceleration` is zero. + */ + drag: Phaser.Math.Vector2; + + /** + * Whether this Body's position is affected by gravity (local or world). + */ + allowGravity: boolean; + + /** + * Acceleration due to gravity (specific to this Body), in pixels per second squared. + * Total gravity is the sum of this vector and the simulation's `gravity`. + */ + gravity: Phaser.Math.Vector2; + + /** + * Rebound following a collision, relative to 1. + */ + bounce: Phaser.Math.Vector2; + + /** + * Rebound following a collision with the world boundary, relative to 1. + * If null, `bounce` is used instead. + */ + worldBounce: Phaser.Math.Vector2 | null; + + /** + * The rectangle used for world boundary collisions. + * + * By default it is set to the world boundary rectangle. Or, if this Body was + * created by a Physics Group, then whatever rectangle that Group defined. + * + * You can also change it by using the `Body.setBoundsRectangle` method. + */ + customBoundsRectangle: Phaser.Geom.Rectangle; + + /** + * Whether the simulation emits a `worldbounds` event when this Body collides with the world boundary + * (and `collideWorldBounds` is also true). + */ + onWorldBounds: boolean; + + /** + * Whether the simulation emits a `collide` event when this Body collides with another. + */ + onCollide: boolean; + + /** + * Whether the simulation emits an `overlap` event when this Body overlaps with another. + */ + onOverlap: boolean; + + /** + * The absolute maximum velocity of this body, in pixels per second. + * The horizontal and vertical components are applied separately. + */ + maxVelocity: Phaser.Math.Vector2; + + /** + * The maximum speed this Body is allowed to reach, in pixels per second. + * + * If not negative it limits the scalar value of speed. + * + * Any negative value means no maximum is being applied (the default). + */ + maxSpeed: number; + + /** + * If this Body is `immovable` and in motion, `friction` is the proportion of this Body's motion received by the riding Body on each axis, relative to 1. + * The horizontal component (x) is applied only when two colliding Bodies are separated vertically. + * The vertical component (y) is applied only when two colliding Bodies are separated horizontally. + * The default value (1, 0) moves the riding Body horizontally in equal proportion to this Body and vertically not at all. + */ + friction: Phaser.Math.Vector2; + + /** + * If this Body is using `drag` for deceleration this property controls how the drag is applied. + * If set to `true` drag will use a damping effect rather than a linear approach. If you are + * creating a game where the Body moves freely at any angle (i.e. like the way the ship moves in + * the game Asteroids) then you will get a far smoother and more visually correct deceleration + * by using damping, avoiding the axis-drift that is prone with linear deceleration. + * + * If you enable this property then you should use far smaller `drag` values than with linear, as + * they are used as a multiplier on the velocity. Values such as 0.05 will give a nice slow + * deceleration. + */ + useDamping: boolean; + + /** + * The rate of change of this Body's `rotation`, in degrees per second. + */ + angularVelocity: number; + + /** + * The Body's angular acceleration (change in angular velocity), in degrees per second squared. + */ + angularAcceleration: number; + + /** + * Loss of angular velocity due to angular movement, in degrees per second. + * + * Angular drag is applied only when angular acceleration is zero. + */ + angularDrag: number; + + /** + * The Body's maximum angular velocity, in degrees per second. + */ + maxAngular: number; + + /** + * The Body's inertia, relative to a default unit (1). + * With `bounce`, this affects the exchange of momentum (velocities) during collisions. + */ + mass: number; + + /** + * The calculated angle of this Body's velocity vector, in radians, during the last step. + */ + angle: number; + + /** + * The calculated magnitude of the Body's velocity, in pixels per second, during the last step. + */ + speed: number; + + /** + * The direction of the Body's velocity, as calculated during the last step. + * This is a numeric constant value (FACING_UP, FACING_DOWN, FACING_LEFT, FACING_RIGHT). + * If the Body is moving on both axes, this describes motion on the vertical axis only. + */ + facing: number; + + /** + * Whether this Body can be moved by collisions with another Body. + */ + immovable: boolean; + + /** + * Sets if this Body can be pushed by another Body. + * + * A body that cannot be pushed will reflect back all of the velocity it is given to the + * colliding body. If that body is also not pushable, then the separation will be split + * between them evenly. + * + * If you want your body to never move or seperate at all, see the `setImmovable` method. + * + * By default, Dynamic Bodies are always pushable. + */ + pushable: boolean; + + /** + * The Slide Factor of this Body. + * + * The Slide Factor controls how much velocity is preserved when + * this Body is pushed by another Body. + * + * The default value is 1, which means that it will take on all + * velocity given in the push. You can adjust this value to control + * how much velocity is retained by this Body when the push ends. + * + * A value of 0, for example, will allow this Body to be pushed + * but then remain completely still after the push ends, such as + * you see in a game like Sokoban. + * + * Or you can set a mid-point, such as 0.25 which will allow it + * to keep 25% of the original velocity when the push ends. You + * can combine this with the `setDrag()` method to create deceleration. + */ + slideFactor: Phaser.Math.Vector2; + + /** + * Whether the Body's position and rotation are affected by its velocity, acceleration, drag, and gravity. + */ + moves: boolean; + + /** + * A flag disabling the default horizontal separation of colliding bodies. + * Pass your own `collideCallback` to the collider. + */ + customSeparateX: boolean; + + /** + * A flag disabling the default vertical separation of colliding bodies. + * Pass your own `collideCallback` to the collider. + */ + customSeparateY: boolean; + + /** + * The amount of horizontal overlap (before separation), if this Body is colliding with another. + */ + overlapX: number; + + /** + * The amount of vertical overlap (before separation), if this Body is colliding with another. + */ + overlapY: number; + + /** + * The amount of overlap (before separation), if this Body is circular and colliding with another circular body. + */ + overlapR: number; + + /** + * Whether this Body is overlapped with another and both are not moving, on at least one axis. + */ + embedded: boolean; + + /** + * Whether this Body interacts with the world boundary. + */ + collideWorldBounds: boolean; + + /** + * Whether this Body is checked for collisions and for which directions. + * You can set `checkCollision.none = true` to disable collision checks. + */ + checkCollision: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * Whether this Body is colliding with a Body or Static Body and in which direction. + * In a collision where both bodies have zero velocity, `embedded` will be set instead. + */ + touching: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * This Body's `touching` value during the previous step. + */ + wasTouching: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * Whether this Body is colliding with a Static Body, a tile, or the world boundary. + * In a collision with a Static Body, if this Body has zero velocity then `embedded` will be set instead. + */ + blocked: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * Whether to automatically synchronize this Body's dimensions to the dimensions of its Game Object's visual bounds. + */ + syncBounds: boolean; + + /** + * The Body's physics type (dynamic or static). + */ + readonly physicsType: number; + + /** + * The Arcade Physics Body Collision Category. + * + * This can be set to any valid collision bitfield value. + * + * See the `setCollisionCategory` method for more details. + */ + collisionCategory: number; + + /** + * The Arcade Physics Body Collision Mask. + * + * See the `setCollidesWith` method for more details. + */ + collisionMask: number; + + /** + * Is this Body under direct control, outside of the physics engine? For example, + * are you trying to move it via a Tween? Or have it follow a path? If so then + * you can enable this boolean so that the Body will calculate its velocity based + * purely on its change in position each frame. This allows you to then tween + * the position and still have it collide with other objects. However, setting + * the velocity will have no impact on this Body while this is set. + */ + directControl: boolean; + + /** + * Updates the Body's `transform`, `width`, `height`, and `center` from its Game Object. + * The Body's `position` isn't changed. + */ + updateBounds(): void; + + /** + * Updates the Body's `center` from its `position`, `width`, and `height`. + */ + updateCenter(): void; + + /** + * Updates the Body's `position`, `width`, `height`, and `center` from its Game Object and `offset`. + * + * You don't need to call this for Dynamic Bodies, as it happens automatically during the physics step. + * But you could use it if you have modified the Body offset or Game Object transform and need to immediately + * read the Body's new `position` or `center`. + * + * To resynchronize the Body with its Game Object, use `reset()` instead. + */ + updateFromGameObject(): void; + + /** + * Prepares the Body for a physics step by resetting the `wasTouching`, `touching` and `blocked` states. + * + * This method is only called if the physics world is going to run a step this frame. + * @param clear Set the `wasTouching` values to their defaults. Default false. + */ + resetFlags(clear?: boolean): void; + + /** + * Syncs the position body position with the parent Game Object. + * + * This method is called every game frame, regardless if the world steps or not. + * @param willStep Will this Body run an update as well? + * @param delta The delta time, in seconds, elapsed since the last frame. + */ + preUpdate(willStep: boolean, delta: number): void; + + /** + * Performs a single physics step and updates the body velocity, angle, speed and other properties. + * + * This method can be called multiple times per game frame, depending on the physics step rate. + * + * The results are synced back to the Game Object in `postUpdate`. + * @param delta The delta time, in seconds, elapsed since the last frame. + */ + update(delta: number): void; + + /** + * Feeds the Body results back into the parent Game Object. + * + * This method is called every game frame, regardless if the world steps or not. + */ + postUpdate(): void; + + /** + * Sets a custom collision boundary rectangle. Use if you want to have a custom + * boundary instead of the world boundaries. + * @param bounds The new boundary rectangle. Pass `null` to use the World bounds. + */ + setBoundsRectangle(bounds?: Phaser.Geom.Rectangle | undefined): this; + + /** + * Checks for collisions between this Body and the world boundary and separates them. + */ + checkWorldBounds(): boolean; + + /** + * Sets the offset of the Body's position from its Game Object's position. + * The Body's `position` isn't changed until the next `preUpdate`. + * @param x The horizontal offset, in source pixels. + * @param y The vertical offset, in source pixels. Default x. + */ + setOffset(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Assign this Body to a new Game Object. + * + * Removes this body from the Physics World, assigns to the new Game Object, calls `setSize` and then + * adds this body back into the World again, setting it enabled, unless the `enable` argument is set to `false`. + * + * If this body already has a Game Object, then it will remove itself from that Game Object first. + * + * Only if the given `gameObject` has a `body` property will this Body be assigned to it. + * @param gameObject The Game Object this Body belongs to. + * @param enable Automatically enable this Body for physics. Default true. + */ + setGameObject(gameObject: Phaser.GameObjects.GameObject, enable?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sizes and positions this Body, as a rectangle. + * Modifies the Body `offset` if `center` is true (the default). + * Resets the width and height to match current frame, if no width and height provided and a frame is found. + * @param width The width of the Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame width. + * @param height The height of the Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame height. + * @param center Modify the Body's `offset`, placing the Body's center on its Game Object's center. Only works if the Game Object has the `getCenter` method. Default true. + */ + setSize(width?: number, height?: number, center?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sizes and positions this Body, as a circle. + * @param radius The radius of the Body, in source pixels. + * @param offsetX The horizontal offset of the Body from its Game Object, in source pixels. + * @param offsetY The vertical offset of the Body from its Game Object, in source pixels. + */ + setCircle(radius: number, offsetX?: number, offsetY?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets this Body's parent Game Object to the given coordinates and resets this Body at the new coordinates. + * If the Body had any velocity or acceleration it is lost as a result of calling this. + * @param x The horizontal position to place the Game Object. + * @param y The vertical position to place the Game Object. + */ + reset(x: number, y: number): void; + + /** + * Sets acceleration, velocity, and speed to zero. + */ + stop(): Phaser.Physics.Arcade.Body; + + /** + * Copies the coordinates of this Body's edges into an object. + * @param obj An object to copy the values into. + */ + getBounds(obj: Phaser.Types.Physics.Arcade.ArcadeBodyBounds): Phaser.Types.Physics.Arcade.ArcadeBodyBounds; + + /** + * Tests if the coordinates are within this Body. + * @param x The horizontal coordinate. + * @param y The vertical coordinate. + */ + hitTest(x: number, y: number): boolean; + + /** + * Whether this Body is touching a tile or the world boundary while moving down. + */ + onFloor(): boolean; + + /** + * Whether this Body is touching a tile or the world boundary while moving up. + */ + onCeiling(): boolean; + + /** + * Whether this Body is touching a tile or the world boundary while moving left or right. + */ + onWall(): boolean; + + /** + * The absolute (non-negative) change in this Body's horizontal position from the previous step. + */ + deltaAbsX(): number; + + /** + * The absolute (non-negative) change in this Body's vertical position from the previous step. + */ + deltaAbsY(): number; + + /** + * The change in this Body's horizontal position from the previous step. + * This value is set during the Body's update phase. + * + * As a Body can update multiple times per step this may not hold the final + * delta value for the Body. In this case, please see the `deltaXFinal` method. + */ + deltaX(): number; + + /** + * The change in this Body's vertical position from the previous step. + * This value is set during the Body's update phase. + * + * As a Body can update multiple times per step this may not hold the final + * delta value for the Body. In this case, please see the `deltaYFinal` method. + */ + deltaY(): number; + + /** + * The change in this Body's horizontal position from the previous game update. + * + * This value is set during the `postUpdate` phase and takes into account the + * `deltaMax` and final position of the Body. + * + * Because this value is not calculated until `postUpdate`, you must listen for it + * during a Scene `POST_UPDATE` or `RENDER` event, and not in `update`, as it will + * not be calculated by that point. If you _do_ use these values in `update` they + * will represent the delta from the _previous_ game frame. + */ + deltaXFinal(): number; + + /** + * The change in this Body's vertical position from the previous game update. + * + * This value is set during the `postUpdate` phase and takes into account the + * `deltaMax` and final position of the Body. + * + * Because this value is not calculated until `postUpdate`, you must listen for it + * during a Scene `POST_UPDATE` or `RENDER` event, and not in `update`, as it will + * not be calculated by that point. If you _do_ use these values in `update` they + * will represent the delta from the _previous_ game frame. + */ + deltaYFinal(): number; + + /** + * The change in this Body's rotation from the previous step, in degrees. + */ + deltaZ(): number; + + /** + * Disables this Body and marks it for deletion by the simulation. + */ + destroy(): void; + + /** + * Draws this Body and its velocity, if enabled. + * @param graphic The Graphics object to draw on. + */ + drawDebug(graphic: Phaser.GameObjects.Graphics): void; + + /** + * Whether this Body will be drawn to the debug display. + */ + willDrawDebug(): boolean; + + /** + * Sets whether this Body should calculate its velocity based on its change in + * position every frame. The default, which is to not do this, means that you + * make this Body move by setting the velocity directly. However, if you are + * trying to move this Body via a Tween, or have it follow a Path, then you + * should enable this instead. This will allow it to still collide with other + * bodies, something that isn't possible if you're just changing its position directly. + * @param value `true` if the Body calculate velocity based on changes in position, otherwise `false`. Default true. + */ + setDirectControl(value?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sets whether this Body collides with the world boundary. + * + * Optionally also sets the World Bounce and `onWorldBounds` values. + * @param value `true` if the Body should collide with the world bounds, otherwise `false`. Default true. + * @param bounceX If given this replaces the Body's `worldBounce.x` value. + * @param bounceY If given this replaces the Body's `worldBounce.y` value. + * @param onWorldBounds If given this replaces the Body's `onWorldBounds` value. + */ + setCollideWorldBounds(value?: boolean, bounceX?: number, bounceY?: number, onWorldBounds?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's velocity. + * @param x The horizontal velocity, in pixels per second. + * @param y The vertical velocity, in pixels per second. Default x. + */ + setVelocity(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's horizontal velocity. + * @param value The velocity, in pixels per second. + */ + setVelocityX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's vertical velocity. + * @param value The velocity, in pixels per second. + */ + setVelocityY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's maximum velocity. + * @param x The horizontal velocity, in pixels per second. + * @param y The vertical velocity, in pixels per second. Default x. + */ + setMaxVelocity(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's maximum horizontal velocity. + * @param value The maximum horizontal velocity, in pixels per second. + */ + setMaxVelocityX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's maximum vertical velocity. + * @param value The maximum vertical velocity, in pixels per second. + */ + setMaxVelocityY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the maximum speed the Body can move. + * @param value The maximum speed value, in pixels per second. Set to a negative value to disable. + */ + setMaxSpeed(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Slide Factor of this Body. + * + * The Slide Factor controls how much velocity is preserved when + * this Body is pushed by another Body. + * + * The default value is 1, which means that it will take on all + * velocity given in the push. You can adjust this value to control + * how much velocity is retained by this Body when the push ends. + * + * A value of 0, for example, will allow this Body to be pushed + * but then remain completely still after the push ends, such as + * you see in a game like Sokoban. + * + * Or you can set a mid-point, such as 0.25 which will allow it + * to keep 25% of the original velocity when the push ends. You + * can combine this with the `setDrag()` method to create deceleration. + * @param x The horizontal slide factor. A value between 0 and 1. + * @param y The vertical slide factor. A value between 0 and 1. Default x. + */ + setSlideFactor(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's bounce. + * @param x The horizontal bounce, relative to 1. + * @param y The vertical bounce, relative to 1. Default x. + */ + setBounce(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's horizontal bounce. + * @param value The bounce, relative to 1. + */ + setBounceX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's vertical bounce. + * @param value The bounce, relative to 1. + */ + setBounceY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's acceleration. + * @param x The horizontal component, in pixels per second squared. + * @param y The vertical component, in pixels per second squared. Default x. + */ + setAcceleration(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's horizontal acceleration. + * @param value The acceleration, in pixels per second squared. + */ + setAccelerationX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's vertical acceleration. + * @param value The acceleration, in pixels per second squared. + */ + setAccelerationY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Enables or disables drag. + * @param value `true` to allow drag on this body, or `false` to disable it. Default true. + */ + setAllowDrag(value?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Enables or disables gravity's effect on this Body. + * @param value `true` to allow gravity on this body, or `false` to disable it. Default true. + */ + setAllowGravity(value?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Enables or disables rotation. + * @param value `true` to allow rotation on this body, or `false` to disable it. Default true. + */ + setAllowRotation(value?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's drag. + * @param x The horizontal component, in pixels per second squared. + * @param y The vertical component, in pixels per second squared. Default x. + */ + setDrag(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * If this Body is using `drag` for deceleration this property controls how the drag is applied. + * If set to `true` drag will use a damping effect rather than a linear approach. If you are + * creating a game where the Body moves freely at any angle (i.e. like the way the ship moves in + * the game Asteroids) then you will get a far smoother and more visually correct deceleration + * by using damping, avoiding the axis-drift that is prone with linear deceleration. + * + * If you enable this property then you should use far smaller `drag` values than with linear, as + * they are used as a multiplier on the velocity. Values such as 0.95 will give a nice slow + * deceleration, where-as smaller values, such as 0.5 will stop an object almost immediately. + * @param value `true` to use damping, or `false` to use drag. + */ + setDamping(value: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's horizontal drag. + * @param value The drag, in pixels per second squared. + */ + setDragX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's vertical drag. + * @param value The drag, in pixels per second squared. + */ + setDragY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's gravity. + * @param x The horizontal component, in pixels per second squared. + * @param y The vertical component, in pixels per second squared. Default x. + */ + setGravity(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's horizontal gravity. + * @param value The gravity, in pixels per second squared. + */ + setGravityX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's vertical gravity. + * @param value The gravity, in pixels per second squared. + */ + setGravityY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's friction. + * @param x The horizontal component, relative to 1. + * @param y The vertical component, relative to 1. Default x. + */ + setFriction(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's horizontal friction. + * @param value The friction value, relative to 1. + */ + setFrictionX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's vertical friction. + * @param value The friction value, relative to 1. + */ + setFrictionY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's angular velocity. + * @param value The velocity, in degrees per second. + */ + setAngularVelocity(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's angular acceleration. + * @param value The acceleration, in degrees per second squared. + */ + setAngularAcceleration(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's angular drag. + * @param value The drag, in degrees per second squared. + */ + setAngularDrag(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's mass. + * @param value The mass value, relative to 1. + */ + setMass(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's `immovable` property. + * @param value The value to assign to `immovable`. Default true. + */ + setImmovable(value?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's `enable` property. + * @param value The value to assign to `enable`. Default true. + */ + setEnable(value?: boolean): Phaser.Physics.Arcade.Body; + + /** + * This is an internal handler, called by the `ProcessX` function as part + * of the collision step. You should almost never call this directly. + * @param x The amount to add to the Body position. + * @param vx The amount to add to the Body velocity. + * @param left Set the blocked.left value? + * @param right Set the blocked.right value? + */ + processX(x: number, vx?: number, left?: boolean, right?: boolean): void; + + /** + * This is an internal handler, called by the `ProcessY` function as part + * of the collision step. You should almost never call this directly. + * @param y The amount to add to the Body position. + * @param vy The amount to add to the Body velocity. + * @param up Set the blocked.up value? + * @param down Set the blocked.down value? + */ + processY(y: number, vy?: number, up?: boolean, down?: boolean): void; + + /** + * The Bodys horizontal position (left edge). + */ + x: number; + + /** + * The Bodys vertical position (top edge). + */ + y: number; + + /** + * The left edge of the Body. Identical to x. + */ + readonly left: number; + + /** + * The right edge of the Body. + */ + readonly right: number; + + /** + * The top edge of the Body. Identical to y. + */ + readonly top: number; + + /** + * The bottom edge of this Body. + */ + readonly bottom: number; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + } + + /** + * An Arcade Physics Collider will automatically check for collision, or overlaps, between two objects + * every step. If a collision, or overlap, occurs it will invoke the given callbacks. + * + * Note, if setting `overlapOnly` to `true`, and one of the objects is a `TilemapLayer`, every tile in the layer, regardless of tile ID, will be checked for collision. + * Even if the layer has had only a subset of tile IDs enabled for collision, all tiles will still be checked for overlap. + */ + class Collider { + /** + * + * @param world The Arcade physics World that will manage the collisions. + * @param overlapOnly Whether to check for collisions or overlaps. + * @param object1 The first object to check for collision. + * @param object2 The second object to check for collision. + * @param collideCallback The callback to invoke when the two objects collide. + * @param processCallback The callback to invoke when the two objects collide. Must return a boolean. + * @param callbackContext The scope in which to call the callbacks. + */ + constructor(world: Phaser.Physics.Arcade.World, overlapOnly: boolean, object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext: any); + + /** + * The world in which the bodies will collide. + */ + world: Phaser.Physics.Arcade.World; + + /** + * The name of the collider (unused by Phaser). + */ + name: string; + + /** + * Whether the collider is active. + */ + active: boolean; + + /** + * Whether to check for collisions or overlaps. + */ + overlapOnly: boolean; + + /** + * The first object to check for collision. + */ + object1: Phaser.Types.Physics.Arcade.ArcadeColliderType; + + /** + * The second object to check for collision. + */ + object2: Phaser.Types.Physics.Arcade.ArcadeColliderType; + + /** + * The callback to invoke when the two objects collide. + */ + collideCallback: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback; + + /** + * If a processCallback exists it must return true or collision checking will be skipped. + */ + processCallback: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback; + + /** + * The context the collideCallback and processCallback will run in. + */ + callbackContext: object; + + /** + * A name for the Collider. + * + * Phaser does not use this value, it's for your own reference. + * @param name The name to assign to the Collider. + */ + setName(name: string): Phaser.Physics.Arcade.Collider; + + /** + * Called by World as part of its step processing, initial operation of collision checking. + */ + update(): void; + + /** + * Removes Collider from World and disposes of its resources. + */ + destroy(): void; + + } + + namespace Components { + /** + * Provides methods used for setting the acceleration properties of an Arcade Physics Body. + */ + interface Acceleration { + /** + * Sets the body's horizontal and vertical acceleration. If the vertical acceleration value is not provided, the vertical acceleration is set to the same value as the horizontal acceleration. + * @param x The horizontal acceleration + * @param y The vertical acceleration Default x. + */ + setAcceleration(x: number, y?: number): this; + /** + * Sets the body's horizontal acceleration. + * @param value The horizontal acceleration + */ + setAccelerationX(value: number): this; + /** + * Sets the body's vertical acceleration. + * @param value The vertical acceleration + */ + setAccelerationY(value: number): this; + } + + /** + * Provides methods used for setting the angular acceleration properties of an Arcade Physics Body. + */ + interface Angular { + /** + * Sets the angular velocity of the body. + * + * In Arcade Physics, bodies cannot rotate. They are always axis-aligned. + * However, they can have angular motion, which is passed on to the Game Object bound to the body, + * causing them to visually rotate, even though the body remains axis-aligned. + * @param value The amount of angular velocity. + */ + setAngularVelocity(value: number): this; + /** + * Sets the angular acceleration of the body. + * + * In Arcade Physics, bodies cannot rotate. They are always axis-aligned. + * However, they can have angular motion, which is passed on to the Game Object bound to the body, + * causing them to visually rotate, even though the body remains axis-aligned. + * @param value The amount of angular acceleration. + */ + setAngularAcceleration(value: number): this; + /** + * Sets the angular drag of the body. Drag is applied to the current velocity, providing a form of deceleration. + * @param value The amount of drag. + */ + setAngularDrag(value: number): this; + } + + /** + * Provides methods used for setting the bounce properties of an Arcade Physics Body. + */ + interface Bounce { + /** + * Sets the bounce values of this body. + * + * Bounce is the amount of restitution, or elasticity, the body has when it collides with another object. + * A value of 1 means that it will retain its full velocity after the rebound. A value of 0 means it will not rebound at all. + * @param x The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1. + * @param y The amount of vertical bounce to apply on collision. A float, typically between 0 and 1. Default x. + */ + setBounce(x: number, y?: number): this; + /** + * Sets the horizontal bounce value for this body. + * @param value The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1. + */ + setBounceX(value: number): this; + /** + * Sets the vertical bounce value for this body. + * @param value The amount of vertical bounce to apply on collision. A float, typically between 0 and 1. + */ + setBounceY(value: number): this; + /** + * Sets whether this Body collides with the world boundary. + * + * Optionally also sets the World Bounce values. If the `Body.worldBounce` is null, it's set to a new Phaser.Math.Vector2 first. + * @param value `true` if this body should collide with the world bounds, otherwise `false`. Default true. + * @param bounceX If given this will be replace the `worldBounce.x` value. + * @param bounceY If given this will be replace the `worldBounce.y` value. + * @param onWorldBounds If given this replaces the Body's `onWorldBounds` value. + */ + setCollideWorldBounds(value?: boolean, bounceX?: number, bounceY?: number, onWorldBounds?: boolean): this; + } + + /** + * Provides methods used for setting the collision category and mask of an Arcade Physics Body. + */ + interface Collision { + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + } + + /** + * Provides methods used for setting the debug properties of an Arcade Physics Body. + */ + interface Debug { + /** + * Sets the debug values of this body. + * + * Bodies will only draw their debug if debug has been enabled for Arcade Physics as a whole. + * Note that there is a performance cost in drawing debug displays. It should never be used in production. + * @param showBody Set to `true` to have this body render its outline to the debug display. + * @param showVelocity Set to `true` to have this body render a velocity marker to the debug display. + * @param bodyColor The color of the body outline when rendered to the debug display. + */ + setDebug(showBody: boolean, showVelocity: boolean, bodyColor: number): this; + /** + * Sets the color of the body outline when it renders to the debug display. + * @param value The color of the body outline when rendered to the debug display. + */ + setDebugBodyColor(value: number): this; + /** + * Set to `true` to have this body render its outline to the debug display. + */ + debugShowBody: boolean; + /** + * Set to `true` to have this body render a velocity marker to the debug display. + */ + debugShowVelocity: boolean; + /** + * The color of the body outline when it renders to the debug display. + */ + debugBodyColor: number; + } + + /** + * Provides methods used for setting the drag properties of an Arcade Physics Body. + */ + interface Drag { + /** + * Sets the body's horizontal and vertical drag. If the vertical drag value is not provided, the vertical drag is set to the same value as the horizontal drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param x The amount of horizontal drag to apply. + * @param y The amount of vertical drag to apply. Default x. + */ + setDrag(x: number, y?: number): this; + /** + * Sets the body's horizontal drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param value The amount of horizontal drag to apply. + */ + setDragX(value: number): this; + /** + * Sets the body's vertical drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param value The amount of vertical drag to apply. + */ + setDragY(value: number): this; + /** + * If this Body is using `drag` for deceleration this function controls how the drag is applied. + * If set to `true` drag will use a damping effect rather than a linear approach. If you are + * creating a game where the Body moves freely at any angle (i.e. like the way the ship moves in + * the game Asteroids) then you will get a far smoother and more visually correct deceleration + * by using damping, avoiding the axis-drift that is prone with linear deceleration. + * + * If you enable this property then you should use far smaller `drag` values than with linear, as + * they are used as a multiplier on the velocity. Values such as 0.95 will give a nice slow + * deceleration, where-as smaller values, such as 0.5 will stop an object almost immediately. + * @param value `true` to use damping for deceleration, or `false` to use linear deceleration. + */ + setDamping(value: boolean): this; + } + + /** + * Provides methods used for setting the enable properties of an Arcade Physics Body. + */ + interface Enable { + /** + * Sets whether this Body should calculate its velocity based on its change in + * position every frame. The default, which is to not do this, means that you + * make this Body move by setting the velocity directly. However, if you are + * trying to move this Body via a Tween, or have it follow a Path, then you + * should enable this instead. This will allow it to still collide with other + * bodies, something that isn't possible if you're just changing its position directly. + * @param value `true` if the Body calculate velocity based on changes in position, otherwise `false`. Default true. + */ + setDirectControl(value?: boolean): this; + /** + * Enables this Game Object's Body. + * If you reset the Body you must also pass `x` and `y`. + * @param reset Also reset the Body and place the Game Object at (x, y). + * @param x The horizontal position to place the Game Object, if `reset` is true. + * @param y The horizontal position to place the Game Object, if `reset` is true. + * @param enableGameObject Also set this Game Object's `active` to true. + * @param showGameObject Also set this Game Object's `visible` to true. + */ + enableBody(reset?: boolean, x?: number, y?: number, enableGameObject?: boolean, showGameObject?: boolean): this; + /** + * Stops and disables this Game Object's Body. + * @param disableGameObject Also set this Game Object's `active` to false. Default false. + * @param hideGameObject Also set this Game Object's `visible` to false. Default false. + */ + disableBody(disableGameObject?: boolean, hideGameObject?: boolean): this; + /** + * Syncs the Body's position and size with its parent Game Object. + * You don't need to call this for Dynamic Bodies, as it happens automatically. + * But for Static bodies it's a useful way of modifying the position of a Static Body + * in the Physics World, based on its Game Object. + */ + refreshBody(): this; + } + + /** + * Methods for setting the friction of an Arcade Physics Body. + * + * In Arcade Physics, friction is a special case of motion transfer from an "immovable" body to a riding body. + */ + interface Friction { + /** + * Sets the friction of this game object's physics body. + * In Arcade Physics, friction is a special case of motion transfer from an "immovable" body to a riding body. + * @param x The amount of horizontal friction to apply, [0, 1]. + * @param y The amount of vertical friction to apply, [0, 1]. Default x. + */ + setFriction(x: number, y?: number): this; + /** + * Sets the horizontal friction of this game object's physics body. + * This can move a riding body horizontally when it collides with this one on the vertical axis. + * @param x The amount of friction to apply, [0, 1]. + */ + setFrictionX(x: number): this; + /** + * Sets the vertical friction of this game object's physics body. + * This can move a riding body vertically when it collides with this one on the horizontal axis. + * @param y The amount of friction to apply, [0, 1]. + */ + setFrictionY(y: number): this; + } + + /** + * Provides methods for setting the gravity properties of an Arcade Physics Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Gravity { + /** + * Set the X and Y values of the gravitational pull to act upon this Arcade Physics Game Object. Values can be positive or negative. Larger values result in a stronger effect. + * + * If only one value is provided, this value will be used for both the X and Y axis. + * @param x The gravitational force to be applied to the X-axis. + * @param y The gravitational force to be applied to the Y-axis. If this is not specified, the X value will be used. Default x. + */ + setGravity(x: number, y?: number): this; + /** + * Set the gravitational force to be applied to the X axis. Value can be positive or negative. Larger values result in a stronger effect. + * @param x The gravitational force to be applied to the X-axis. + */ + setGravityX(x: number): this; + /** + * Set the gravitational force to be applied to the Y axis. Value can be positive or negative. Larger values result in a stronger effect. + * @param y The gravitational force to be applied to the Y-axis. + */ + setGravityY(y: number): this; + } + + /** + * Provides methods used for setting the immovable properties of an Arcade Physics Body. + */ + interface Immovable { + /** + * Sets if this Body can be separated during collisions with other bodies. + * + * When a body is immovable it means it won't move at all, not even to separate it from collision + * overlap. If you just wish to prevent a body from being knocked around by other bodies, see + * the `setPushable` method instead. + * @param value Sets if this body will be separated during collisions with other bodies. Default true. + */ + setImmovable(value?: boolean): this; + } + + /** + * Provides methods used for setting the mass properties of an Arcade Physics Body. + */ + interface Mass { + /** + * Sets the mass of the physics body + * @param value New value for the mass of the body. + */ + setMass(value: number): this; + } + + /** + * This method will search the given circular area and return an array of all physics bodies that + * overlap with it. It can return either Dynamic, Static bodies or a mixture of both. + * + * A body only has to intersect with the search area to be considered, it doesn't have to be fully + * contained within it. + * + * If Arcade Physics is set to use the RTree (which it is by default) then the search is rather fast, + * otherwise the search is O(N) for Dynamic Bodies. + */ + interface OverlapCirc { + } + + /** + * This method will search the given rectangular area and return an array of all physics bodies that + * overlap with it. It can return either Dynamic, Static bodies or a mixture of both. + * + * A body only has to intersect with the search area to be considered, it doesn't have to be fully + * contained within it. + * + * If Arcade Physics is set to use the RTree (which it is by default) then the search for is extremely fast, + * otherwise the search is O(N) for Dynamic Bodies. + */ + interface OverlapRect { + } + + /** + * Provides methods used for setting the pushable property of an Arcade Physics Body. + */ + interface Pushable { + /** + * Sets if this Body can be pushed by another Body. + * + * A body that cannot be pushed will reflect back all of the velocity it is given to the + * colliding body. If that body is also not pushable, then the separation will be split + * between them evenly. + * + * If you want your body to never move or seperate at all, see the `setImmovable` method. + * @param value Sets if this body can be pushed by collisions with another Body. Default true. + */ + setPushable(value?: boolean): this; + } + + /** + * Provides methods for setting the size of an Arcade Physics Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Size { + /** + * Sets the body offset. This allows you to adjust the difference between the center of the body + * and the x and y coordinates of the parent Game Object. + * @param x The amount to offset the body from the parent Game Object along the x-axis. + * @param y The amount to offset the body from the parent Game Object along the y-axis. Defaults to the value given for the x-axis. Default x. + */ + setOffset(x: number, y?: number): this; + /** + * **DEPRECATED**: Please use `setBodySize` instead. + * + * Sets the size of this physics body. Setting the size does not adjust the dimensions of the parent Game Object. + * @param width The new width of the physics body, in pixels. + * @param height The new height of the physics body, in pixels. + * @param center Should the body be re-positioned so its center aligns with the parent Game Object? Default true. + */ + setSize(width: number, height: number, center?: boolean): this; + /** + * Sets the size of this physics body. Setting the size does not adjust the dimensions of the parent Game Object. + * @param width The new width of the physics body, in pixels. + * @param height The new height of the physics body, in pixels. + * @param center Should the body be re-positioned so its center aligns with the parent Game Object? Default true. + */ + setBodySize(width: number, height: number, center?: boolean): this; + /** + * Sets this physics body to use a circle for collision instead of a rectangle. + * @param radius The radius of the physics body, in pixels. + * @param offsetX The amount to offset the body from the parent Game Object along the x-axis. + * @param offsetY The amount to offset the body from the parent Game Object along the y-axis. + */ + setCircle(radius: number, offsetX?: number, offsetY?: number): this; + } + + /** + * Provides methods for modifying the velocity of an Arcade Physics body. + * + * Should be applied as a mixin and not used directly. + */ + interface Velocity { + /** + * Sets the velocity of the Body. + * @param x The horizontal velocity of the body. Positive values move the body to the right, while negative values move it to the left. + * @param y The vertical velocity of the body. Positive values move the body down, while negative values move it up. Default x. + */ + setVelocity(x: number, y?: number): this; + /** + * Sets the horizontal component of the body's velocity. + * + * Positive values move the body to the right, while negative values move it to the left. + * @param x The new horizontal velocity. + */ + setVelocityX(x: number): this; + /** + * Sets the vertical component of the body's velocity. + * + * Positive values move the body down, while negative values move it up. + * @param y The new vertical velocity of the body. + */ + setVelocityY(y: number): this; + /** + * Sets the maximum velocity of the body. + * @param x The new maximum horizontal velocity. + * @param y The new maximum vertical velocity. Default x. + */ + setMaxVelocity(x: number, y?: number): this; + } + + } + + /** + * Dynamic Body. + */ + var DYNAMIC_BODY: number; + + /** + * Static Body. + */ + var STATIC_BODY: number; + + /** + * Arcade Physics Group containing Dynamic Bodies. + */ + var GROUP: number; + + /** + * A Tilemap Layer. + */ + var TILEMAPLAYER: number; + + /** + * Facing no direction (initial value). + */ + var FACING_NONE: number; + + /** + * Facing up. + */ + var FACING_UP: number; + + /** + * Facing down. + */ + var FACING_DOWN: number; + + /** + * Facing left. + */ + var FACING_LEFT: number; + + /** + * Facing right. + */ + var FACING_RIGHT: number; + + namespace Events { + /** + * The Arcade Physics World Collide Event. + * + * This event is dispatched by an Arcade Physics World instance if two bodies collide _and_ at least + * one of them has their [onCollide]{@link Phaser.Physics.Arcade.Body#onCollide} property set to `true`. + * + * It provides an alternative means to handling collide events rather than using the callback approach. + * + * Listen to it from a Scene using: `this.physics.world.on('collide', listener)`. + * + * Please note that 'collide' and 'overlap' are two different things in Arcade Physics. + */ + const COLLIDE: string; + + /** + * The Arcade Physics World Overlap Event. + * + * This event is dispatched by an Arcade Physics World instance if two bodies overlap _and_ at least + * one of them has their [onOverlap]{@link Phaser.Physics.Arcade.Body#onOverlap} property set to `true`. + * + * It provides an alternative means to handling overlap events rather than using the callback approach. + * + * Listen to it from a Scene using: `this.physics.world.on('overlap', listener)`. + * + * Please note that 'collide' and 'overlap' are two different things in Arcade Physics. + */ + const OVERLAP: string; + + /** + * The Arcade Physics World Pause Event. + * + * This event is dispatched by an Arcade Physics World instance when it is paused. + * + * Listen to it from a Scene using: `this.physics.world.on('pause', listener)`. + */ + const PAUSE: string; + + /** + * The Arcade Physics World Resume Event. + * + * This event is dispatched by an Arcade Physics World instance when it resumes from a paused state. + * + * Listen to it from a Scene using: `this.physics.world.on('resume', listener)`. + */ + const RESUME: string; + + /** + * The Arcade Physics Tile Collide Event. + * + * This event is dispatched by an Arcade Physics World instance if a body collides with a Tile _and_ + * has its [onCollide]{@link Phaser.Physics.Arcade.Body#onCollide} property set to `true`. + * + * It provides an alternative means to handling collide events rather than using the callback approach. + * + * Listen to it from a Scene using: `this.physics.world.on('tilecollide', listener)`. + * + * Please note that 'collide' and 'overlap' are two different things in Arcade Physics. + */ + const TILE_COLLIDE: string; + + /** + * The Arcade Physics Tile Overlap Event. + * + * This event is dispatched by an Arcade Physics World instance if a body overlaps with a Tile _and_ + * has its [onOverlap]{@link Phaser.Physics.Arcade.Body#onOverlap} property set to `true`. + * + * It provides an alternative means to handling overlap events rather than using the callback approach. + * + * Listen to it from a Scene using: `this.physics.world.on('tileoverlap', listener)`. + * + * Please note that 'collide' and 'overlap' are two different things in Arcade Physics. + */ + const TILE_OVERLAP: string; + + /** + * The Arcade Physics World Bounds Event. + * + * This event is dispatched by an Arcade Physics World instance if a body makes contact with the world bounds _and_ + * it has its [onWorldBounds]{@link Phaser.Physics.Arcade.Body#onWorldBounds} property set to `true`. + * + * It provides an alternative means to handling collide events rather than using the callback approach. + * + * Listen to it from a Scene using: `this.physics.world.on('worldbounds', listener)`. + */ + const WORLD_BOUNDS: string; + + /** + * The Arcade Physics World Step Event. + * + * This event is dispatched by an Arcade Physics World instance whenever a physics step is run. + * It is emitted _after_ the bodies and colliders have been updated. + * + * In high framerate settings this can be multiple times per game frame. + * + * Listen to it from a Scene using: `this.physics.world.on('worldstep', listener)`. + */ + const WORLD_STEP: string; + + } + + /** + * The Arcade Physics Factory allows you to easily create Arcade Physics enabled Game Objects. + * Objects that are created by this Factory are automatically added to the physics world. + */ + class Factory { + /** + * + * @param world The Arcade Physics World instance. + */ + constructor(world: Phaser.Physics.Arcade.World); + + /** + * A reference to the Arcade Physics World. + */ + world: Phaser.Physics.Arcade.World; + + /** + * A reference to the Scene this Arcade Physics instance belongs to. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene.Systems this Arcade Physics instance belongs to. + */ + sys: Phaser.Scenes.Systems; + + /** + * Creates a new Arcade Physics Collider object. + * @param object1 The first object to check for collision. + * @param object2 The second object to check for collision. + * @param collideCallback The callback to invoke when the two objects collide. + * @param processCallback The callback to invoke when the two objects collide. Must return a boolean. + * @param callbackContext The scope in which to call the callbacks. + */ + collider(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): Phaser.Physics.Arcade.Collider; + + /** + * Creates a new Arcade Physics Collider Overlap object. + * @param object1 The first object to check for overlap. + * @param object2 The second object to check for overlap. + * @param collideCallback The callback to invoke when the two objects collide. + * @param processCallback The callback to invoke when the two objects collide. Must return a boolean. + * @param callbackContext The scope in which to call the callbacks. + */ + overlap(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): Phaser.Physics.Arcade.Collider; + + /** + * Adds an Arcade Physics Body to the given Game Object. + * @param gameObject A Game Object. + * @param isStatic Create a Static body (true) or Dynamic body (false). Default false. + */ + existing(gameObject: G, isStatic?: boolean): G; + + /** + * Creates a new Arcade Image object with a Static body. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + staticImage(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.Types.Physics.Arcade.ImageWithStaticBody; + + /** + * Creates a new Arcade Image object with a Dynamic body. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + image(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.Types.Physics.Arcade.ImageWithDynamicBody; + + /** + * Creates a new Arcade Sprite object with a Static body. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + staticSprite(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.Types.Physics.Arcade.SpriteWithStaticBody; + + /** + * Creates a new Arcade Sprite object with a Dynamic body. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param key The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + sprite(x: number, y: number, key: string, frame?: string | number): Phaser.Types.Physics.Arcade.SpriteWithDynamicBody; + + /** + * Creates a Static Physics Group object. + * All Game Objects created by this Group will automatically be static Arcade Physics objects. + * @param children Game Objects to add to this group; or the `config` argument. + * @param config Settings for this group. + */ + staticGroup(children?: Phaser.GameObjects.GameObject[] | Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig, config?: Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig): Phaser.Physics.Arcade.StaticGroup; + + /** + * Creates a Physics Group object. + * All Game Objects created by this Group will automatically be dynamic Arcade Physics objects. + * @param children Game Objects to add to this group; or the `config` argument. + * @param config Settings for this group. + */ + group(children?: Phaser.GameObjects.GameObject[] | Phaser.Types.Physics.Arcade.PhysicsGroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig, config?: Phaser.Types.Physics.Arcade.PhysicsGroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig): Phaser.Physics.Arcade.Group; + + /** + * Creates a new physics Body with the given position and size. + * + * This Body is not associated with any Game Object, but still exists within the world + * and can be tested for collision, have velocity, etc. + * @param x The horizontal position of this Body in the physics world. + * @param y The vertical position of this Body in the physics world. + * @param width The width of the Body in pixels. Cannot be negative or zero. Default 64. + * @param height The height of the Body in pixels. Cannot be negative or zero. Default 64. + */ + body(x: number, y: number, width?: number, height?: number): Phaser.Physics.Arcade.Body; + + /** + * Creates a new static physics Body with the given position and size. + * + * This Body is not associated with any Game Object, but still exists within the world + * and can be tested for collision, etc. + * @param x The horizontal position of this Body in the physics world. + * @param y The vertical position of this Body in the physics world. + * @param width The width of the Body in pixels. Cannot be negative or zero. Default 64. + * @param height The height of the Body in pixels. Cannot be negative or zero. Default 64. + */ + staticBody(x: number, y: number, width?: number, height?: number): Phaser.Physics.Arcade.StaticBody; + + /** + * Destroys this Factory. + */ + destroy(): void; + + } + + /** + * Calculates and returns the bitmask needed to determine if the given + * categories will collide with each other or not. + * @param categories A unique category bitfield, or an array of them. + */ + function GetCollidesWith(categories: number | number[]): number; + + /** + * Calculates and returns the horizontal overlap between two arcade physics bodies and sets their properties + * accordingly, including: `touching.left`, `touching.right`, `touching.none` and `overlapX'. + * @param body1 The first Body to separate. + * @param body2 The second Body to separate. + * @param overlapOnly Is this an overlap only check, or part of separation? + * @param bias A value added to the delta values during collision checks. Increase it to prevent sprite tunneling(sprites passing through another instead of colliding). + */ + function GetOverlapX(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body, overlapOnly: boolean, bias: number): number; + + /** + * Calculates and returns the vertical overlap between two arcade physics bodies and sets their properties + * accordingly, including: `touching.up`, `touching.down`, `touching.none` and `overlapY'. + * @param body1 The first Body to separate. + * @param body2 The second Body to separate. + * @param overlapOnly Is this an overlap only check, or part of separation? + * @param bias A value added to the delta values during collision checks. Increase it to prevent sprite tunneling(sprites passing through another instead of colliding). + */ + function GetOverlapY(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body, overlapOnly: boolean, bias: number): number; + + /** + * An Arcade Physics Group object. + * + * The primary use of a Physics Group is a way to collect together physics enable objects + * that share the same intrinsic structure into a single pool. They can they be easily + * compared against other Groups, or Game Objects. + * + * All Game Objects created by, or added to this Group will automatically be given **dynamic** + * Arcade Physics bodies (if they have no body already) and the bodies will receive the + * Groups {@link Phaser.Physics.Arcade.Group#defaults default values}. + * + * You should not pass objects into this Group that should not receive a body. For example, + * do not add basic Geometry or Tilemap Layers into a Group, as they will not behave in the + * way you may expect. Groups should all ideally have objects of the same type in them. + * + * If you wish to create a Group filled with Static Bodies, please see {@link Phaser.Physics.Arcade.StaticGroup}. + */ + class Group extends Phaser.GameObjects.Group implements Phaser.Physics.Arcade.Components.Collision { + /** + * + * @param world The physics simulation. + * @param scene The scene this group belongs to. + * @param children Game Objects to add to this group; or the `config` argument. + * @param config Settings for this group. + */ + constructor(world: Phaser.Physics.Arcade.World, scene: Phaser.Scene, children?: Phaser.GameObjects.GameObject[] | Phaser.Types.Physics.Arcade.PhysicsGroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig, config?: Phaser.Types.Physics.Arcade.PhysicsGroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig); + + /** + * The physics simulation. + */ + world: Phaser.Physics.Arcade.World; + + /** + * The class to create new Group members from. + * + * This should be either `Phaser.Physics.Arcade.Image`, `Phaser.Physics.Arcade.Sprite`, or a class extending one of those. + */ + classType: Function; + + /** + * The physics type of the Group's members. + */ + physicsType: number; + + /** + * The Arcade Physics Group Collision Category. + * + * This can be set to any valid collision bitfield value. + * + * See the `setCollisionCategory` method for more details. + */ + collisionCategory: number; + + /** + * The Arcade Physics Group Collision Mask. + * + * See the `setCollidesWith` method for more details. + */ + collisionMask: number; + + /** + * Default physics properties applied to Game Objects added to the Group or created by the Group. Derived from the `config` argument. + * + * You can remove the default values by setting this property to `{}`. + */ + defaults: Phaser.Types.Physics.Arcade.PhysicsGroupDefaults; + + /** + * A textual representation of this Game Object. + * Used internally by Phaser but is available for your own custom classes to populate. + */ + type: string; + + /** + * Enables a Game Object's Body and assigns `defaults`. Called when a Group member is added or created. + * @param child The Game Object being added. + */ + createCallbackHandler(child: Phaser.GameObjects.GameObject): void; + + /** + * Disables a Game Object's Body. Called when a Group member is removed. + * @param child The Game Object being removed. + */ + removeCallbackHandler(child: Phaser.GameObjects.GameObject): void; + + /** + * Sets the velocity of each Group member. + * @param x The horizontal velocity. + * @param y The vertical velocity. + * @param step The velocity increment. When set, the first member receives velocity (x, y), the second (x + step, y + step), and so on. Default 0. + */ + setVelocity(x: number, y: number, step?: number): Phaser.Physics.Arcade.Group; + + /** + * Sets the horizontal velocity of each Group member. + * @param value The velocity value. + * @param step The velocity increment. When set, the first member receives velocity (x), the second (x + step), and so on. Default 0. + */ + setVelocityX(value: number, step?: number): Phaser.Physics.Arcade.Group; + + /** + * Sets the vertical velocity of each Group member. + * @param value The velocity value. + * @param step The velocity increment. When set, the first member receives velocity (y), the second (y + step), and so on. Default 0. + */ + setVelocityY(value: number, step?: number): Phaser.Physics.Arcade.Group; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + } + + /** + * Separates two overlapping bodies on the X-axis (horizontally). + * + * Separation involves moving two overlapping bodies so they don't overlap anymore and adjusting their velocities based on their mass. This is a core part of collision detection. + * + * The bodies won't be separated if there is no horizontal overlap between them, if they are static, or if either one uses custom logic for its separation. + * @param body1 The first Body to separate. + * @param body2 The second Body to separate. + * @param overlapOnly If `true`, the bodies will only have their overlap data set and no separation will take place. + * @param bias A value to add to the delta value during overlap checking. Used to prevent sprite tunneling. + * @param overlap If given then this value will be used as the overlap and no check will be run. + */ + function SeparateX(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body, overlapOnly: boolean, bias: number, overlap?: number): boolean; + + /** + * Separates two overlapping bodies on the Y-axis (vertically). + * + * Separation involves moving two overlapping bodies so they don't overlap anymore and adjusting their velocities based on their mass. This is a core part of collision detection. + * + * The bodies won't be separated if there is no vertical overlap between them, if they are static, or if either one uses custom logic for its separation. + * @param body1 The first Body to separate. + * @param body2 The second Body to separate. + * @param overlapOnly If `true`, the bodies will only have their overlap data set and no separation will take place. + * @param bias A value to add to the delta value during overlap checking. Used to prevent sprite tunneling. + * @param overlap If given then this value will be used as the overlap and no check will be run. + */ + function SeparateY(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body, overlapOnly: boolean, bias: number, overlap?: number): boolean; + + /** + * Either sets or creates the Arcade Body Collision object. + * + * Mostly only used internally. + * @param noneFlip Is `none` true or false? + * @param data The collision data object to populate, or create if not given. + */ + function SetCollisionObject(noneFlip: boolean, data?: Phaser.Types.Physics.Arcade.ArcadeBodyCollision): Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * A Static Arcade Physics Body. + * + * A Static Body never moves, and isn't automatically synchronized with its parent Game Object. + * That means if you make any change to the parent's origin, position, or scale after creating or adding the body, you'll need to update the Static Body manually. + * + * A Static Body can collide with other Bodies, but is never moved by collisions. + * + * Its dynamic counterpart is {@link Phaser.Physics.Arcade.Body}. + */ + class StaticBody implements Phaser.Physics.Arcade.Components.Collision { + /** + * + * @param world The Arcade Physics simulation this Static Body belongs to. + * @param gameObject The Game Object this Body belongs to. As of Phaser 3.60 this is now optional. + */ + constructor(world: Phaser.Physics.Arcade.World, gameObject?: Phaser.GameObjects.GameObject); + + /** + * The Arcade Physics simulation this Static Body belongs to. + */ + world: Phaser.Physics.Arcade.World; + + /** + * The Game Object this Static Body belongs to. + * + * As of Phaser 3.60 this is now optional and can be undefined. + */ + gameObject: Phaser.GameObjects.GameObject; + + /** + * A quick-test flag that signifies this is a Body, used in the World collision handler. + */ + readonly isBody: boolean; + + /** + * Whether the Static Body's boundary is drawn to the debug display. + */ + debugShowBody: boolean; + + /** + * The color of this Static Body on the debug display. + */ + debugBodyColor: number; + + /** + * Whether this Static Body is updated by the physics simulation. + */ + enable: boolean; + + /** + * Whether this Static Body's boundary is circular (`true`) or rectangular (`false`). + */ + isCircle: boolean; + + /** + * If this Static Body is circular, this is the radius of the boundary, as set by {@link Phaser.Physics.Arcade.StaticBody#setCircle}, in pixels. + * Equal to `halfWidth`. + */ + radius: number; + + /** + * The offset set by {@link Phaser.Physics.Arcade.StaticBody#setCircle} or {@link Phaser.Physics.Arcade.StaticBody#setSize}. + * + * This doesn't affect the Static Body's position, because a Static Body does not follow its Game Object. + */ + readonly offset: Phaser.Math.Vector2; + + /** + * The position of this Static Body within the simulation. + */ + position: Phaser.Math.Vector2; + + /** + * The width of the Static Body's boundary, in pixels. + * If the Static Body is circular, this is also the Static Body's diameter. + */ + width: number; + + /** + * The height of the Static Body's boundary, in pixels. + * If the Static Body is circular, this is also the Static Body's diameter. + */ + height: number; + + /** + * Half the Static Body's width, in pixels. + * If the Static Body is circular, this is also the Static Body's radius. + */ + halfWidth: number; + + /** + * Half the Static Body's height, in pixels. + * If the Static Body is circular, this is also the Static Body's radius. + */ + halfHeight: number; + + /** + * The center of the Static Body's boundary. + * This is the midpoint of its `position` (top-left corner) and its bottom-right corner. + */ + center: Phaser.Math.Vector2; + + /** + * A constant zero velocity used by the Arcade Physics simulation for calculations. + */ + readonly velocity: Phaser.Math.Vector2; + + /** + * A constant `false` value expected by the Arcade Physics simulation. + */ + readonly allowGravity: boolean; + + /** + * Gravitational force applied specifically to this Body. Values are in pixels per second squared. Always zero for a Static Body. + */ + readonly gravity: Phaser.Math.Vector2; + + /** + * Rebound, or restitution, following a collision, relative to 1. Always zero for a Static Body. + */ + readonly bounce: Phaser.Math.Vector2; + + /** + * Whether the simulation emits a `worldbounds` event when this StaticBody collides with the world boundary. + * Always false for a Static Body. (Static Bodies never collide with the world boundary and never trigger a `worldbounds` event.) + */ + readonly onWorldBounds: boolean; + + /** + * Whether the simulation emits a `collide` event when this StaticBody collides with another. + */ + onCollide: boolean; + + /** + * Whether the simulation emits an `overlap` event when this StaticBody overlaps with another. + */ + onOverlap: boolean; + + /** + * The StaticBody's inertia, relative to a default unit (1). With `bounce`, this affects the exchange of momentum (velocities) during collisions. + */ + mass: number; + + /** + * Whether this object can be moved by collisions with another body. + */ + immovable: boolean; + + /** + * Sets if this Body can be pushed by another Body. + * + * A body that cannot be pushed will reflect back all of the velocity it is given to the + * colliding body. If that body is also not pushable, then the separation will be split + * between them evenly. + * + * If you want your body to never move or seperate at all, see the `setImmovable` method. + * + * By default, Static Bodies are not pushable. + */ + pushable: boolean; + + /** + * A flag disabling the default horizontal separation of colliding bodies. Pass your own `collideHandler` to the collider. + */ + customSeparateX: boolean; + + /** + * A flag disabling the default vertical separation of colliding bodies. Pass your own `collideHandler` to the collider. + */ + customSeparateY: boolean; + + /** + * The amount of horizontal overlap (before separation), if this Body is colliding with another. + */ + overlapX: number; + + /** + * The amount of vertical overlap (before separation), if this Body is colliding with another. + */ + overlapY: number; + + /** + * The amount of overlap (before separation), if this StaticBody is circular and colliding with another circular body. + */ + overlapR: number; + + /** + * Whether this StaticBody has ever overlapped with another while both were not moving. + */ + embedded: boolean; + + /** + * Whether this StaticBody interacts with the world boundary. + * Always false for a Static Body. (Static Bodies never collide with the world boundary.) + */ + readonly collideWorldBounds: boolean; + + /** + * Whether this StaticBody is checked for collisions and for which directions. You can set `checkCollision.none = false` to disable collision checks. + */ + checkCollision: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * This property is kept for compatibility with Dynamic Bodies. + * Avoid using it. + */ + touching: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * This property is kept for compatibility with Dynamic Bodies. + * Avoid using it. + * The values are always false for a Static Body. + */ + wasTouching: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * This property is kept for compatibility with Dynamic Bodies. + * Avoid using it. + */ + blocked: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * The StaticBody's physics type (static by default). + */ + physicsType: number; + + /** + * The Arcade Physics Body Collision Category. + * + * This can be set to any valid collision bitfield value. + * + * See the `setCollisionCategory` method for more details. + */ + collisionCategory: number; + + /** + * The Arcade Physics Body Collision Mask. + * + * See the `setCollidesWith` method for more details. + */ + collisionMask: number; + + /** + * Changes the Game Object this Body is bound to. + * First it removes its reference from the old Game Object, then sets the new one. + * You can optionally update the position and dimensions of this Body to reflect that of the new Game Object. + * @param gameObject The new Game Object that will own this Body. + * @param update Reposition and resize this Body to match the new Game Object? Default true. + */ + setGameObject(gameObject: Phaser.GameObjects.GameObject, update?: boolean): Phaser.Physics.Arcade.StaticBody; + + /** + * Syncs the Static Body's position and size with its parent Game Object. + */ + updateFromGameObject(): Phaser.Physics.Arcade.StaticBody; + + /** + * Positions the Static Body at an offset from its Game Object. + * @param x The horizontal offset of the Static Body from the Game Object's `x`. + * @param y The vertical offset of the Static Body from the Game Object's `y`. + */ + setOffset(x: number, y: number): Phaser.Physics.Arcade.StaticBody; + + /** + * Sets the size of the Static Body. + * When `center` is true, also repositions it. + * Resets the width and height to match current frame, if no width and height provided and a frame is found. + * @param width The width of the Static Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame width. + * @param height The height of the Static Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame height. + * @param center Place the Static Body's center on its Game Object's center. Only works if the Game Object has the `getCenter` method. Default true. + */ + setSize(width?: number, height?: number, center?: boolean): Phaser.Physics.Arcade.StaticBody; + + /** + * Sets this Static Body to have a circular body and sets its size and position. + * @param radius The radius of the StaticBody, in pixels. + * @param offsetX The horizontal offset of the StaticBody from its Game Object, in pixels. + * @param offsetY The vertical offset of the StaticBody from its Game Object, in pixels. + */ + setCircle(radius: number, offsetX?: number, offsetY?: number): Phaser.Physics.Arcade.StaticBody; + + /** + * Updates the StaticBody's `center` from its `position` and dimensions. + */ + updateCenter(): void; + + /** + * Resets this Static Body to its parent Game Object's position. + * + * If `x` and `y` are given, the parent Game Object is placed there and this Static Body is centered on it. + * Otherwise this Static Body is centered on the Game Object's current position. + * @param x The x coordinate to reset the body to. If not given will use the parent Game Object's coordinate. + * @param y The y coordinate to reset the body to. If not given will use the parent Game Object's coordinate. + */ + reset(x?: number, y?: number): void; + + /** + * NOOP function. A Static Body cannot be stopped. + */ + stop(): Phaser.Physics.Arcade.StaticBody; + + /** + * Returns the x and y coordinates of the top left and bottom right points of the StaticBody. + * @param obj The object which will hold the coordinates of the bounds. + */ + getBounds(obj: Phaser.Types.Physics.Arcade.ArcadeBodyBounds): Phaser.Types.Physics.Arcade.ArcadeBodyBounds; + + /** + * Checks to see if a given x,y coordinate is colliding with this Static Body. + * @param x The x coordinate to check against this body. + * @param y The y coordinate to check against this body. + */ + hitTest(x: number, y: number): boolean; + + /** + * NOOP + */ + postUpdate(): void; + + /** + * The absolute (non-negative) change in this StaticBody's horizontal position from the previous step. Always zero. + */ + deltaAbsX(): number; + + /** + * The absolute (non-negative) change in this StaticBody's vertical position from the previous step. Always zero. + */ + deltaAbsY(): number; + + /** + * The change in this StaticBody's horizontal position from the previous step. Always zero. + */ + deltaX(): number; + + /** + * The change in this StaticBody's vertical position from the previous step. Always zero. + */ + deltaY(): number; + + /** + * The change in this StaticBody's rotation from the previous step. Always zero. + */ + deltaZ(): number; + + /** + * Disables this Body and marks it for destruction during the next step. + */ + destroy(): void; + + /** + * Draws a graphical representation of the StaticBody for visual debugging purposes. + * @param graphic The Graphics object to use for the debug drawing of the StaticBody. + */ + drawDebug(graphic: Phaser.GameObjects.Graphics): void; + + /** + * Indicates whether the StaticBody is going to be showing a debug visualization during postUpdate. + */ + willDrawDebug(): boolean; + + /** + * Sets the Mass of the StaticBody. Will set the Mass to 0.1 if the value passed is less than or equal to zero. + * @param value The value to set the Mass to. Values of zero or less are changed to 0.1. + */ + setMass(value: number): Phaser.Physics.Arcade.StaticBody; + + /** + * The x coordinate of the StaticBody. + */ + x: number; + + /** + * The y coordinate of the StaticBody. + */ + y: number; + + /** + * Returns the left-most x coordinate of the area of the StaticBody. + */ + readonly left: number; + + /** + * The right-most x coordinate of the area of the StaticBody. + */ + readonly right: number; + + /** + * The highest y coordinate of the area of the StaticBody. + */ + readonly top: number; + + /** + * The lowest y coordinate of the area of the StaticBody. (y + height) + */ + readonly bottom: number; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + } + + /** + * An Arcade Physics Static Group object. + * + * All Game Objects created by or added to this Group will automatically be given static Arcade Physics bodies, if they have no body. + * + * Its dynamic counterpart is {@link Phaser.Physics.Arcade.Group}. + */ + class StaticGroup extends Phaser.GameObjects.Group implements Phaser.Physics.Arcade.Components.Collision { + /** + * + * @param world The physics simulation. + * @param scene The scene this group belongs to. + * @param children Game Objects to add to this group; or the `config` argument. + * @param config Settings for this group. + */ + constructor(world: Phaser.Physics.Arcade.World, scene: Phaser.Scene, children?: Phaser.GameObjects.GameObject[] | Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig, config?: Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig); + + /** + * The physics simulation. + */ + world: Phaser.Physics.Arcade.World; + + /** + * The scene this group belongs to. + */ + physicsType: number; + + /** + * The Arcade Physics Static Group Collision Category. + * + * This can be set to any valid collision bitfield value. + * + * See the `setCollisionCategory` method for more details. + */ + collisionCategory: number; + + /** + * The Arcade Physics Static Group Collision Mask. + * + * See the `setCollidesWith` method for more details. + */ + collisionMask: number; + + /** + * A textual representation of this Game Object. + * Used internally by Phaser but is available for your own custom classes to populate. + */ + type: string; + + /** + * Adds a static physics body to the new group member (if it lacks one) and adds it to the simulation. + * @param child The new group member. + */ + createCallbackHandler(child: Phaser.GameObjects.GameObject): void; + + /** + * Disables the group member's physics body, removing it from the simulation. + * @param child The group member being removed. + */ + removeCallbackHandler(child: Phaser.GameObjects.GameObject): void; + + /** + * Refreshes the group. + * @param entries The newly created group members. + */ + createMultipleCallbackHandler(entries: Phaser.GameObjects.GameObject[]): void; + + /** + * Resets each Body to the position of its parent Game Object. + * Body sizes aren't changed (use {@link Phaser.Physics.Arcade.Components.Enable#refreshBody} for that). + */ + refresh(): Phaser.Physics.Arcade.StaticGroup; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + } + + namespace Tilemap { + /** + * A function to process the collision callbacks between a single tile and an Arcade Physics enabled Game Object. + * @param tile The Tile to process. + * @param sprite The Game Object to process with the Tile. + */ + function ProcessTileCallbacks(tile: Phaser.Tilemaps.Tile, sprite: Phaser.GameObjects.Sprite): boolean; + + /** + * Internal function to process the separation of a physics body from a tile. + * @param body The Body object to separate. + * @param x The x separation amount. + */ + function ProcessTileSeparationX(body: Phaser.Physics.Arcade.Body, x: number): void; + + /** + * Internal function to process the separation of a physics body from a tile. + * @param body The Body object to separate. + * @param y The y separation amount. + */ + function ProcessTileSeparationY(body: Phaser.Physics.Arcade.Body, y: number): void; + + /** + * The core separation function to separate a physics body and a tile. + * @param i The index of the tile within the map data. + * @param body The Body object to separate. + * @param tile The tile to collide against. + * @param tileWorldRect A rectangle-like object defining the dimensions of the tile. + * @param tilemapLayer The tilemapLayer to collide against. + * @param tileBias The tile bias value. Populated by the `World.TILE_BIAS` constant. + * @param isLayer Is this check coming from a TilemapLayer or an array of tiles? + */ + function SeparateTile(i: number, body: Phaser.Physics.Arcade.Body, tile: Phaser.Tilemaps.Tile, tileWorldRect: Phaser.Geom.Rectangle, tilemapLayer: Phaser.Tilemaps.TilemapLayer, tileBias: number, isLayer: boolean): boolean; + + /** + * Check the body against the given tile on the X axis. + * Used internally by the SeparateTile function. + * @param body The Body object to separate. + * @param tile The tile to check. + * @param tileLeft The left position of the tile within the tile world. + * @param tileRight The right position of the tile within the tile world. + * @param tileBias The tile bias value. Populated by the `World.TILE_BIAS` constant. + * @param isLayer Is this check coming from a TilemapLayer or an array of tiles? + */ + function TileCheckX(body: Phaser.Physics.Arcade.Body, tile: Phaser.Tilemaps.Tile, tileLeft: number, tileRight: number, tileBias: number, isLayer: boolean): number; + + /** + * Check the body against the given tile on the Y axis. + * Used internally by the SeparateTile function. + * @param body The Body object to separate. + * @param tile The tile to check. + * @param tileTop The top position of the tile within the tile world. + * @param tileBottom The bottom position of the tile within the tile world. + * @param tileBias The tile bias value. Populated by the `World.TILE_BIAS` constant. + * @param isLayer Is this check coming from a TilemapLayer or an array of tiles? + */ + function TileCheckY(body: Phaser.Physics.Arcade.Body, tile: Phaser.Tilemaps.Tile, tileTop: number, tileBottom: number, tileBias: number, isLayer: boolean): number; + + /** + * Checks for intersection between the given tile rectangle-like object and an Arcade Physics body. + * @param tileWorldRect A rectangle object that defines the tile placement in the world. + * @param body The body to check for intersection against. + */ + function TileIntersectsBody(tileWorldRect: Object, body: Phaser.Physics.Arcade.Body): boolean; + + } + + /** + * The Arcade Physics World. + * + * The World is responsible for creating, managing, colliding and updating all of the bodies within it. + * + * An instance of the World belongs to a Phaser.Scene and is accessed via the property `physics.world`. + */ + class World extends Phaser.Events.EventEmitter { + /** + * + * @param scene The Scene to which this World instance belongs. + * @param config An Arcade Physics Configuration object. + */ + constructor(scene: Phaser.Scene, config: Phaser.Types.Physics.Arcade.ArcadeWorldConfig); + + /** + * The Scene this simulation belongs to. + */ + scene: Phaser.Scene; + + /** + * Dynamic Bodies in this simulation. + */ + bodies: Phaser.Structs.Set; + + /** + * Static Bodies in this simulation. + */ + staticBodies: Phaser.Structs.Set; + + /** + * Static Bodies marked for deletion. + */ + pendingDestroy: Phaser.Structs.Set<(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)>; + + /** + * This simulation's collision processors. + */ + colliders: Phaser.Structs.ProcessQueue; + + /** + * Acceleration of Bodies due to gravity, in pixels per second. + */ + gravity: Phaser.Math.Vector2; + + /** + * A boundary constraining Bodies. + */ + bounds: Phaser.Geom.Rectangle; + + /** + * The boundary edges that Bodies can collide with. + */ + checkCollision: Phaser.Types.Physics.Arcade.CheckCollisionObject; + + /** + * The number of physics steps to be taken per second. + * + * This property is read-only. Use the `setFPS` method to modify it at run-time. + */ + readonly fps: number; + + /** + * Should Physics use a fixed update time-step (true) or sync to the render fps (false)?. + * False value of this property disables fps and timeScale properties. + */ + fixedStep: boolean; + + /** + * The number of steps that took place in the last frame. + */ + readonly stepsLastFrame: number; + + /** + * Scaling factor applied to the frame rate. + * + * - 1.0 = normal speed + * - 2.0 = half speed + * - 0.5 = double speed + */ + timeScale: number; + + /** + * The maximum absolute difference of a Body's per-step velocity and its overlap with another Body that will result in separation on *each axis*. + * Larger values favor separation. + * Smaller values favor no separation. + */ + OVERLAP_BIAS: number; + + /** + * The maximum absolute value of a Body's overlap with a tile that will result in separation on *each axis*. + * Larger values favor separation. + * Smaller values favor no separation. + * The optimum value may be similar to the tile size. + */ + TILE_BIAS: number; + + /** + * Always separate overlapping Bodies horizontally before vertically. + * False (the default) means Bodies are first separated on the axis of greater gravity, or the vertical axis if neither is greater. + */ + forceX: boolean; + + /** + * Whether the simulation advances with the game loop. + */ + isPaused: boolean; + + /** + * Enables the debug display. + */ + drawDebug: boolean; + + /** + * The graphics object drawing the debug display. + */ + debugGraphic: Phaser.GameObjects.Graphics; + + /** + * Default debug display settings for new Bodies. + */ + defaults: Phaser.Types.Physics.Arcade.ArcadeWorldDefaults; + + /** + * The maximum number of items per node on the RTree. + * + * This is ignored if `useTree` is `false`. If you have a large number of bodies in + * your world then you may find search performance improves by increasing this value, + * to allow more items per node and less node division. + */ + maxEntries: number; + + /** + * Should this Arcade Physics World use an RTree for Dynamic bodies? + * + * An RTree is a fast way of spatially sorting of all the bodies in the world. + * However, at certain limits, the cost of clearing and inserting the bodies into the + * tree every frame becomes more expensive than the search speed gains it provides. + * + * If you have a large number of dynamic bodies in your world then it may be best to + * disable the use of the RTree by setting this property to `false` in the physics config. + * + * The number it can cope with depends on browser and device, but a conservative estimate + * of around 5,000 bodies should be considered the max before disabling it. + * + * This only applies to dynamic bodies. Static bodies are always kept in an RTree, + * because they don't have to be cleared every frame, so you benefit from the + * massive search speeds all the time. + */ + useTree: boolean; + + /** + * The spatial index of Dynamic Bodies. + */ + tree: Phaser.Structs.RTree; + + /** + * The spatial index of Static Bodies. + */ + staticTree: Phaser.Structs.RTree; + + /** + * Recycled input for tree searches. + */ + treeMinMax: Phaser.Types.Physics.Arcade.ArcadeWorldTreeMinMax; + + /** + * The Filtering Options passed to `GetTilesWithinWorldXY` as part of the `collideSpriteVsTilemapLayer` check. + */ + tileFilterOptions: Phaser.Types.Tilemaps.FilteringOptions; + + /** + * Adds an Arcade Physics Body to a Game Object, an array of Game Objects, or the children of a Group. + * + * The difference between this and the `enableBody` method is that you can pass arrays or Groups + * to this method. + * + * You can specify if the bodies are to be Dynamic or Static. A dynamic body can move via velocity and + * acceleration. A static body remains fixed in place and as such is able to use an optimized search + * tree, making it ideal for static elements such as level objects. You can still collide and overlap + * with static bodies. + * + * Normally, rather than calling this method directly, you'd use the helper methods available in the + * Arcade Physics Factory, such as: + * + * ```javascript + * this.physics.add.image(x, y, textureKey); + * this.physics.add.sprite(x, y, textureKey); + * ``` + * + * Calling factory methods encapsulates the creation of a Game Object and the creation of its + * body at the same time. If you are creating custom classes then you can pass them to this + * method to have their bodies created. + * @param object The object, or objects, on which to create the bodies. + * @param bodyType The type of Body to create. Either `DYNAMIC_BODY` or `STATIC_BODY`. + */ + enable(object: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[] | Phaser.GameObjects.Group | Phaser.GameObjects.Group[], bodyType?: number): void; + + /** + * Creates an Arcade Physics Body on a single Game Object. + * + * If the Game Object already has a body, this method will simply add it back into the simulation. + * + * You can specify if the body is Dynamic or Static. A dynamic body can move via velocity and + * acceleration. A static body remains fixed in place and as such is able to use an optimized search + * tree, making it ideal for static elements such as level objects. You can still collide and overlap + * with static bodies. + * + * Normally, rather than calling this method directly, you'd use the helper methods available in the + * Arcade Physics Factory, such as: + * + * ```javascript + * this.physics.add.image(x, y, textureKey); + * this.physics.add.sprite(x, y, textureKey); + * ``` + * + * Calling factory methods encapsulates the creation of a Game Object and the creation of its + * body at the same time. If you are creating custom classes then you can pass them to this + * method to have their bodies created. + * @param object The Game Object on which to create the body. + * @param bodyType The type of Body to create. Either `DYNAMIC_BODY` or `STATIC_BODY`. + */ + enableBody(object: Phaser.GameObjects.GameObject, bodyType?: number): Phaser.GameObjects.GameObject; + + /** + * Adds an existing Arcade Physics Body or StaticBody to the simulation. + * + * The body is enabled and added to the local search trees. + * @param body The Body to be added to the simulation. + */ + add(body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody): Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody; + + /** + * Disables the Arcade Physics Body of a Game Object, an array of Game Objects, or the children of a Group. + * + * The difference between this and the `disableBody` method is that you can pass arrays or Groups + * to this method. + * + * The body itself is not deleted, it just has its `enable` property set to false, which + * means you can re-enable it again at any point by passing it to enable `World.enable` or `World.add`. + * @param object The object, or objects, on which to disable the bodies. + */ + disable(object: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[] | Phaser.GameObjects.Group | Phaser.GameObjects.Group[]): void; + + /** + * Disables an existing Arcade Physics Body or StaticBody and removes it from the simulation. + * + * The body is disabled and removed from the local search trees. + * + * The body itself is not deleted, it just has its `enable` property set to false, which + * means you can re-enable it again at any point by passing it to enable `World.enable` or `World.add`. + * @param body The Body to be disabled. + */ + disableBody(body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody): void; + + /** + * Removes an existing Arcade Physics Body or StaticBody from the simulation. + * + * The body is disabled and removed from the local search trees. + * + * The body itself is not deleted, it just has its `enabled` property set to false, which + * means you can re-enable it again at any point by passing it to enable `enable` or `add`. + * @param body The body to be removed from the simulation. + */ + remove(body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody): void; + + /** + * Creates a Graphics Game Object that the world will use to render the debug display to. + * + * This is called automatically when the World is instantiated if the `debug` config property + * was set to `true`. However, you can call it at any point should you need to display the + * debug Graphic from a fixed point. + * + * You can control which objects are drawn to the Graphics object, and the colors they use, + * by setting the debug properties in the physics config. + * + * You should not typically use this in a production game. Use it to aid during debugging. + */ + createDebugGraphic(): Phaser.GameObjects.Graphics; + + /** + * Sets the position, size and properties of the World boundary. + * + * The World boundary is an invisible rectangle that defines the edges of the World. + * If a Body is set to collide with the world bounds then it will automatically stop + * when it reaches any of the edges. You can optionally set which edges of the boundary + * should be checked against. + * @param x The top-left x coordinate of the boundary. + * @param y The top-left y coordinate of the boundary. + * @param width The width of the boundary. + * @param height The height of the boundary. + * @param checkLeft Should bodies check against the left edge of the boundary? + * @param checkRight Should bodies check against the right edge of the boundary? + * @param checkUp Should bodies check against the top edge of the boundary? + * @param checkDown Should bodies check against the bottom edge of the boundary? + */ + setBounds(x: number, y: number, width: number, height: number, checkLeft?: boolean, checkRight?: boolean, checkUp?: boolean, checkDown?: boolean): Phaser.Physics.Arcade.World; + + /** + * Enables or disables collisions on each edge of the World boundary. + * @param left Should bodies check against the left edge of the boundary? Default true. + * @param right Should bodies check against the right edge of the boundary? Default true. + * @param up Should bodies check against the top edge of the boundary? Default true. + * @param down Should bodies check against the bottom edge of the boundary? Default true. + */ + setBoundsCollision(left?: boolean, right?: boolean, up?: boolean, down?: boolean): Phaser.Physics.Arcade.World; + + /** + * Pauses the simulation. + * + * A paused simulation does not update any existing bodies, or run any Colliders. + * + * However, you can still enable and disable bodies within it, or manually run collide or overlap + * checks. + */ + pause(): Phaser.Physics.Arcade.World; + + /** + * Resumes the simulation, if paused. + */ + resume(): Phaser.Physics.Arcade.World; + + /** + * Creates a new Collider object and adds it to the simulation. + * + * A Collider is a way to automatically perform collision checks between two objects, + * calling the collide and process callbacks if they occur. + * + * Colliders are run as part of the World update, after all of the Bodies have updated. + * + * By creating a Collider you don't need then call `World.collide` in your `update` loop, + * as it will be handled for you automatically. + * @param object1 The first object to check for collision. + * @param object2 The second object to check for collision. + * @param collideCallback The callback to invoke when the two objects collide. + * @param processCallback The callback to invoke when the two objects collide. Must return a boolean. + * @param callbackContext The scope in which to call the callbacks. + */ + addCollider(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): Phaser.Physics.Arcade.Collider; + + /** + * Creates a new Overlap Collider object and adds it to the simulation. + * + * A Collider is a way to automatically perform overlap checks between two objects, + * calling the collide and process callbacks if they occur. + * + * Colliders are run as part of the World update, after all of the Bodies have updated. + * + * By creating a Collider you don't need then call `World.overlap` in your `update` loop, + * as it will be handled for you automatically. + * @param object1 The first object to check for overlap. + * @param object2 The second object to check for overlap. + * @param collideCallback The callback to invoke when the two objects overlap. + * @param processCallback The callback to invoke when the two objects overlap. Must return a boolean. + * @param callbackContext The scope in which to call the callbacks. + */ + addOverlap(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): Phaser.Physics.Arcade.Collider; + + /** + * Removes a Collider from the simulation so it is no longer processed. + * + * This method does not destroy the Collider. If you wish to add it back at a later stage you can call + * `World.colliders.add(Collider)`. + * + * If you no longer need the Collider you can call the `Collider.destroy` method instead, which will + * automatically clear all of its references and then remove it from the World. If you call destroy on + * a Collider you _don't_ need to pass it to this method too. + * @param collider The Collider to remove from the simulation. + */ + removeCollider(collider: Phaser.Physics.Arcade.Collider): Phaser.Physics.Arcade.World; + + /** + * Sets the frame rate to run the simulation at. + * + * The frame rate value is used to simulate a fixed update time step. This fixed + * time step allows for a straightforward implementation of a deterministic game state. + * + * This frame rate is independent of the frequency at which the game is rendering. The + * higher you set the fps, the more physics simulation steps will occur per game step. + * Conversely, the lower you set it, the less will take place. + * + * You can optionally advance the simulation directly yourself by calling the `step` method. + * @param framerate The frame rate to advance the simulation at. + */ + setFPS(framerate: number): this; + + /** + * Advances the simulation based on the elapsed time and fps rate. + * + * This is called automatically by your Scene and does not need to be invoked directly. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Advances the simulation by a time increment. + * @param delta The delta time amount, in seconds, by which to advance the simulation. + */ + step(delta: number): void; + + /** + * Advances the simulation by a single step. + */ + singleStep(): void; + + /** + * Updates bodies, draws the debug display, and handles pending queue operations. + */ + postUpdate(): void; + + /** + * Calculates a Body's velocity and updates its position. + * @param body The Body to be updated. + * @param delta The delta value to be used in the motion calculations, in seconds. + */ + updateMotion(body: Phaser.Physics.Arcade.Body, delta: number): void; + + /** + * Calculates a Body's angular velocity. + * @param body The Body to compute the velocity for. + * @param delta The delta value to be used in the calculation, in seconds. + */ + computeAngularVelocity(body: Phaser.Physics.Arcade.Body, delta: number): void; + + /** + * Calculates a Body's per-axis velocity. + * @param body The Body to compute the velocity for. + * @param delta The delta value to be used in the calculation, in seconds. + */ + computeVelocity(body: Phaser.Physics.Arcade.Body, delta: number): void; + + /** + * Separates two Bodies. + * @param body1 The first Body to be separated. + * @param body2 The second Body to be separated. + * @param processCallback The process callback. + * @param callbackContext The context in which to invoke the callback. + * @param overlapOnly If this a collide or overlap check? + */ + separate(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any, overlapOnly?: boolean): boolean; + + /** + * Separates two Bodies, when both are circular. + * @param body1 The first Body to be separated. + * @param body2 The second Body to be separated. + * @param overlapOnly If this a collide or overlap check? + */ + separateCircle(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body, overlapOnly?: boolean): boolean; + + /** + * Checks to see if two Bodies intersect at all. + * @param body1 The first body to check. + * @param body2 The second body to check. + */ + intersects(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body): boolean; + + /** + * Tests if a circular Body intersects with another Body. + * @param circle The circular body to test. + * @param body The rectangular body to test. + */ + circleBodyIntersects(circle: Phaser.Physics.Arcade.Body, body: Phaser.Physics.Arcade.Body): boolean; + + /** + * Tests if Game Objects overlap. + * + * See details in {@link Phaser.Physics.Arcade.World#collide}. + * @param object1 The first object or array of objects to check. + * @param object2 The second object or array of objects to check, or `undefined`. + * @param overlapCallback An optional callback function that is called if the objects overlap. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they overlap. If this is set then `overlapCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + overlap(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2?: Phaser.Types.Physics.Arcade.ArcadeColliderType, overlapCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * Performs a collision check and separation between the two physics enabled objects given, which can be single + * Game Objects, arrays of Game Objects, Physics Groups, arrays of Physics Groups or normal Groups. + * + * If you don't require separation then use {@link Phaser.Physics.Arcade.World#overlap} instead. + * + * If two Groups or arrays are passed, each member of one will be tested against each member of the other. + * + * If **only** one Group is passed (as `object1`), each member of the Group will be collided against the other members. + * + * If **only** one Array is passed, the array is iterated and every element in it is tested against the others. + * + * Two callbacks can be provided; they receive the colliding game objects as arguments. + * If an overlap is detected, the `processCallback` is called first. It can cancel the collision by returning false. + * Next the objects are separated and `collideCallback` is invoked. + * + * Arcade Physics uses the Projection Method of collision resolution and separation. While it's fast and suitable + * for 'arcade' style games it lacks stability when multiple objects are in close proximity or resting upon each other. + * The separation that stops two objects penetrating may create a new penetration against a different object. If you + * require a high level of stability please consider using an alternative physics system, such as Matter.js. + * @param object1 The first object or array of objects to check. + * @param object2 The second object or array of objects to check, or `undefined`. + * @param collideCallback An optional callback function that is called if the objects collide. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + collide(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2?: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * Checks if the two given Arcade Physics bodies will collide, or not, + * based on their collision mask and collision categories. + * @param body1 The first body to check. + * @param body2 The second body to check. + */ + canCollide(body1: Phaser.Types.Physics.Arcade.ArcadeCollider, body2: Phaser.Types.Physics.Arcade.ArcadeCollider): boolean; + + /** + * This advanced method is specifically for testing for collision between a single Sprite and an array of Tile objects. + * + * You should generally use the `collide` method instead, with a Sprite vs. a Tilemap Layer, as that will perform + * tile filtering and culling for you, as well as handle the interesting face collision automatically. + * + * This method is offered for those who would like to check for collision with specific Tiles in a layer, without + * having to set any collision attributes on the tiles in question. This allows you to perform quick dynamic collisions + * on small sets of Tiles. As such, no culling or checks are made to the array of Tiles given to this method, + * you should filter them before passing them to this method. + * + * Important: Use of this method skips the `interesting faces` system that Tilemap Layers use. This means if you have + * say a row or column of tiles, and you jump into, or walk over them, it's possible to get stuck on the edges of the + * tiles as the interesting face calculations are skipped. However, for quick-fire small collision set tests on + * dynamic maps, this method can prove very useful. + * + * This method does not factor in the Collision Mask or Category. + * @param sprite The first object to check for collision. + * @param tiles An array of Tiles to check for collision against. + * @param collideCallback An optional callback function that is called if the objects collide. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + collideTiles(sprite: Phaser.GameObjects.GameObject, tiles: Phaser.Tilemaps.Tile[], collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * This advanced method is specifically for testing for overlaps between a single Sprite and an array of Tile objects. + * + * You should generally use the `overlap` method instead, with a Sprite vs. a Tilemap Layer, as that will perform + * tile filtering and culling for you, as well as handle the interesting face collision automatically. + * + * This method is offered for those who would like to check for overlaps with specific Tiles in a layer, without + * having to set any collision attributes on the tiles in question. This allows you to perform quick dynamic overlap + * tests on small sets of Tiles. As such, no culling or checks are made to the array of Tiles given to this method, + * you should filter them before passing them to this method. + * + * This method does not factor in the Collision Mask or Category. + * @param sprite The first object to check for collision. + * @param tiles An array of Tiles to check for collision against. + * @param collideCallback An optional callback function that is called if the objects overlap. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + overlapTiles(sprite: Phaser.GameObjects.GameObject, tiles: Phaser.Tilemaps.Tile[], collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * Internal handler for Sprite vs. Tilemap collisions. + * Please use Phaser.Physics.Arcade.World#collide instead. + * @param sprite The first object to check for collision. + * @param tilemapLayer The second object to check for collision. + * @param collideCallback An optional callback function that is called if the objects collide. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + * @param overlapOnly Whether this is a collision or overlap check. + */ + collideSpriteVsTilemapLayer(sprite: Phaser.GameObjects.GameObject, tilemapLayer: Phaser.Tilemaps.TilemapLayer, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any, overlapOnly?: boolean): boolean; + + /** + * Wrap an object's coordinates (or several objects' coordinates) within {@link Phaser.Physics.Arcade.World#bounds}. + * + * If the object is outside any boundary edge (left, top, right, bottom), it will be moved to the same offset from the opposite edge (the interior). + * @param object A Game Object, a Group, an object with `x` and `y` coordinates, or an array of such objects. + * @param padding An amount added to each boundary edge during the operation. Default 0. + */ + wrap(object: any, padding?: number): void; + + /** + * Wrap each object's coordinates within {@link Phaser.Physics.Arcade.World#bounds}. + * @param objects An array of objects to be wrapped. + * @param padding An amount added to the boundary. Default 0. + */ + wrapArray(objects: any[], padding?: number): void; + + /** + * Wrap an object's coordinates within {@link Phaser.Physics.Arcade.World#bounds}. + * @param object A Game Object, a Physics Body, or any object with `x` and `y` coordinates + * @param padding An amount added to the boundary. Default 0. + */ + wrapObject(object: any, padding?: number): void; + + /** + * Shuts down the simulation, clearing physics data and removing listeners. + */ + shutdown(): void; + + /** + * Shuts down the simulation and disconnects it from the current scene. + */ + destroy(): void; + + } + + } + + namespace Matter { + /** + * The Body Bounds class contains methods to help you extract the world coordinates from various points around + * the bounds of a Matter Body. Because Matter bodies are positioned based on their center of mass, and not a + * dimension based center, you often need to get the bounds coordinates in order to properly align them in the world. + * + * You can access this class via the MatterPhysics class from a Scene, i.e.: + * + * ```javascript + * this.matter.bodyBounds.getTopLeft(body); + * ``` + * + * See also the `MatterPhysics.alignBody` method. + */ + class BodyBounds { + /** + * A Vector2 that stores the temporary bounds center value during calculations by methods in this class. + */ + boundsCenter: Phaser.Math.Vector2; + + /** + * A Vector2 that stores the temporary center diff values during calculations by methods in this class. + */ + centerDiff: Phaser.Math.Vector2; + + /** + * Parses the given body to get the bounds diff values from it. + * + * They're stored in this class in the temporary properties `boundsCenter` and `centerDiff`. + * + * This method is called automatically by all other methods in this class. + * @param body The Body to get the bounds position from. + */ + parseBody(body: Phaser.Types.Physics.Matter.MatterBody): boolean; + + /** + * Takes a Body and returns the world coordinates of the top-left of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getTopLeft(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the top-center of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getTopCenter(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the top-right of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getTopRight(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the left-center of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getLeftCenter(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the center of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getCenter(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the right-center of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getRightCenter(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the bottom-left of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getBottomLeft(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the bottom-center of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getBottomCenter(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the bottom-right of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getBottomRight(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + } + + namespace Components { + /** + * A component to set restitution on objects. + */ + interface Bounce { + /** + * Sets the restitution on the physics object. + * @param value A Number that defines the restitution (elasticity) of the body. The value is always positive and is in the range (0, 1). A value of 0 means collisions may be perfectly inelastic and no bouncing may occur. A value of 0.8 means the body may bounce back with approximately 80% of its kinetic energy. Note that collision response is based on pairs of bodies, and that restitution values are combined with the following formula: `Math.max(bodyA.restitution, bodyB.restitution)` + */ + setBounce(value: number): this; + } + + /** + * Contains methods for changing the collision filter of a Matter Body. Should be used as a mixin and not called directly. + */ + interface Collision { + /** + * Sets the collision category of this Game Object's Matter Body. This number must be a power of two between 2^0 (= 1) and 2^31. + * Two bodies with different collision groups (see {@link #setCollisionGroup}) will only collide if their collision + * categories are included in their collision masks (see {@link #setCollidesWith}). + * @param value Unique category bitfield. + */ + setCollisionCategory(value: number): this; + /** + * Sets the collision group of this Game Object's Matter Body. If this is zero or two Matter Bodies have different values, + * they will collide according to the usual rules (see {@link #setCollisionCategory} and {@link #setCollisionGroup}). + * If two Matter Bodies have the same positive value, they will always collide; if they have the same negative value, + * they will never collide. + * @param value Unique group index. + */ + setCollisionGroup(value: number): this; + /** + * Sets the collision mask for this Game Object's Matter Body. Two Matter Bodies with different collision groups will only + * collide if each one includes the other's category in its mask based on a bitwise AND, i.e. `(categoryA & maskB) !== 0` + * and `(categoryB & maskA) !== 0` are both true. + * @param categories A unique category bitfield, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body starts colliding with another. + */ + setOnCollide(callback: Function): this; + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body stops colliding with another. + */ + setOnCollideEnd(callback: Function): this; + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke for the duration of this body colliding with another. + */ + setOnCollideActive(callback: Function): this; + /** + * The callback is sent a reference to the other body, along with a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param body The body, or an array of bodies, to test for collisions with. + * @param callback The callback to invoke when this body collides with the given body or bodies. + */ + setOnCollideWith(body: MatterJS.Body | MatterJS.Body[], callback: Function): this; + } + + /** + * A component to apply force to Matter.js bodies. + */ + interface Force { + /** + * Applies a force to a body. + * @param force A Vector that specifies the force to apply. + */ + applyForce(force: Phaser.Math.Vector2): this; + /** + * Applies a force to a body from a given position. + * @param position The position in which the force comes from. + * @param force A Vector that specifies the force to apply. + */ + applyForceFrom(position: Phaser.Math.Vector2, force: Phaser.Math.Vector2): this; + /** + * Apply thrust to the forward position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrust(speed: number): this; + /** + * Apply thrust to the left position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustLeft(speed: number): this; + /** + * Apply thrust to the right position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustRight(speed: number): this; + /** + * Apply thrust to the back position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustBack(speed: number): this; + } + + /** + * Contains methods for changing the friction of a Game Object's Matter Body. Should be used a mixin, not called directly. + */ + interface Friction { + /** + * Sets new friction values for this Game Object's Matter Body. + * @param value The new friction of the body, between 0 and 1, where 0 allows the Body to slide indefinitely, while 1 allows it to stop almost immediately after a force is applied. + * @param air If provided, the new air resistance of the Body. The higher the value, the faster the Body will slow as it moves through space. 0 means the body has no air resistance. + * @param fstatic If provided, the new static friction of the Body. The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. 0 means the body will never "stick" when it is nearly stationary. + */ + setFriction(value: number, air?: number, fstatic?: number): this; + /** + * Sets a new air resistance for this Game Object's Matter Body. + * A value of 0 means the Body will never slow as it moves through space. + * The higher the value, the faster a Body slows when moving through space. + * @param value The new air resistance for the Body. + */ + setFrictionAir(value: number): this; + /** + * Sets a new static friction for this Game Object's Matter Body. + * A value of 0 means the Body will never "stick" when it is nearly stationary. + * The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. + * @param value The new static friction for the Body. + */ + setFrictionStatic(value: number): this; + } + + /** + * A component to manipulate world gravity for Matter.js bodies. + */ + interface Gravity { + /** + * A togglable function for ignoring world gravity in real-time on the current body. + * @param value Set to true to ignore the effect of world gravity, or false to not ignore it. + */ + setIgnoreGravity(value: boolean): this; + } + + /** + * Allows accessing the mass, density, and center of mass of a Matter-enabled Game Object. Should be used as a mixin and not directly. + */ + interface Mass { + /** + * Sets the mass of the Game Object's Matter Body. + * @param value The new mass of the body. + */ + setMass(value: number): this; + /** + * Sets density of the body. + * @param value The new density of the body. + */ + setDensity(value: number): this; + /** + * The body's center of mass. + * + * Calling this creates a new `Vector2 each time to avoid mutation. + * + * If you only need to read the value and won't change it, you can get it from `GameObject.body.centerOfMass`. + */ + readonly centerOfMass: Phaser.Math.Vector2; + } + + /** + * Enables a Matter-enabled Game Object to be a sensor. Should be used as a mixin and not directly. + */ + interface Sensor { + /** + * Set the body belonging to this Game Object to be a sensor. + * Sensors trigger collision events, but don't react with colliding body physically. + * @param value `true` to set the body as a sensor, or `false` to disable it. + */ + setSensor(value: boolean): this; + /** + * Is the body belonging to this Game Object a sensor or not? + */ + isSensor(): boolean; + } + + /** + * Enables a Matter-enabled Game Object to set its Body. Should be used as a mixin and not directly. + */ + interface SetBody { + /** + * Set this Game Objects Matter physics body to be a rectangle shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param width Width of the rectangle. + * @param height Height of the rectangle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setRectangle(width: number, height: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + /** + * Set this Game Objects Matter physics body to be a circle shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param radius The radius of the circle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setCircle(radius: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + /** + * Set this Game Objects Matter physics body to be a polygon shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param radius The "radius" of the polygon, i.e. the distance from its center to any vertex. This is also the radius of its circumcircle. + * @param sides The number of sides the polygon will have. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setPolygon(radius: number, sides: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + /** + * Set this Game Objects Matter physics body to be a trapezoid shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param width The width of the trapezoid Body. + * @param height The height of the trapezoid Body. + * @param slope The slope of the trapezoid. 0 creates a rectangle, while 1 creates a triangle. Positive values make the top side shorter, while negative values make the bottom side shorter. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setTrapezoid(width: number, height: number, slope: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + /** + * Set this Game Object to use the given existing Matter Body. + * + * The body is first removed from the world before being added to this Game Object. + * @param body The Body this Game Object should use. + * @param addToWorld Should the body be immediately added to the World? Default true. + */ + setExistingBody(body: MatterJS.BodyType, addToWorld?: boolean): this; + /** + * Set this Game Object to create and use a new Body based on the configuration object given. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param config Either a string, such as `circle`, or a Matter Set Body Configuration object. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setBody(config: string | Phaser.Types.Physics.Matter.MatterSetBodyConfig, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + } + + /** + * Enables a Matter-enabled Game Object to be able to go to sleep. Should be used as a mixin and not directly. + */ + interface Sleep { + /** + * Sets this Body to sleep. + */ + setToSleep(): this; + /** + * Wakes this Body if asleep. + */ + setAwake(): this; + /** + * Sets the number of updates in which this body must have near-zero velocity before it is set as sleeping (if sleeping is enabled by the engine). + * @param value A `Number` that defines the number of updates in which this body must have near-zero velocity before it is set as sleeping. Default 60. + */ + setSleepThreshold(value?: number): this; + /** + * Enable sleep and wake events for this body. + * + * By default when a body goes to sleep, or wakes up, it will not emit any events. + * + * The events are emitted by the Matter World instance and can be listened to via + * the `SLEEP_START` and `SLEEP_END` events. + * @param start `true` if you want the sleep start event to be emitted for this body. + * @param end `true` if you want the sleep end event to be emitted for this body. + */ + setSleepEvents(start: boolean, end: boolean): this; + /** + * Enables or disables the Sleep Start event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepStartEvent(value: boolean): this; + /** + * Enables or disables the Sleep End event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepEndEvent(value: boolean): this; + } + + /** + * Provides methods used for getting and setting the static state of a physics body. + */ + interface Static { + /** + * Changes the physics body to be either static `true` or dynamic `false`. + * @param value `true` to set the body as being static, or `false` to make it dynamic. + */ + setStatic(value: boolean): this; + /** + * Returns `true` if the body is static, otherwise `false` for a dynamic body. + */ + isStatic(): boolean; + } + + /** + * Provides methods used for getting and setting the position, scale and rotation of a Game Object. + */ + interface Transform { + /** + * The x position of this Game Object. + */ + x: number; + /** + * The y position of this Game Object. + */ + y: number; + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + /** + * Use `angle` to set or get rotation of the physics body associated to this GameObject. + * Unlike rotation, when using set the value can be in degrees, which will be converted to radians internally. + */ + angle: number; + /** + * Use `rotation` to set or get the rotation of the physics body associated with this GameObject. + * The value when set must be in radians. + */ + rotation: number; + /** + * Sets the position of the physics body along x and y axes. + * Both the parameters to this function are optional and if not passed any they default to 0. + * Velocity, angle, force etc. are unchanged. + * @param x The horizontal position of the body. Default 0. + * @param y The vertical position of the body. Default x. + */ + setPosition(x?: number, y?: number): this; + /** + * Immediately sets the angle of the Body. + * Angular velocity, position, force etc. are unchanged. + * @param radians The angle of the body, in radians. Default 0. + */ + setRotation(radians?: number): this; + /** + * Setting fixed rotation sets the Body inertia to Infinity, which stops it + * from being able to rotate when forces are applied to it. + */ + setFixedRotation(): this; + /** + * Immediately sets the angle of the Body. + * Angular velocity, position, force etc. are unchanged. + * @param degrees The angle to set, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the x value. Default x. + * @param point The point (Vector2) from which scaling will occur. + */ + setScale(x?: number, y?: number, point?: Phaser.Math.Vector2): this; + } + + /** + * Contains methods for changing the velocity of a Matter Body. Should be used as a mixin and not called directly. + */ + interface Velocity { + /** + * Sets the horizontal velocity of the physics body. + * @param x The horizontal velocity value. + */ + setVelocityX(x: number): this; + /** + * Sets vertical velocity of the physics body. + * @param y The vertical velocity value. + */ + setVelocityY(y: number): this; + /** + * Sets both the horizontal and vertical velocity of the physics body. + * @param x The horizontal velocity value. + * @param y The vertical velocity value, it can be either positive or negative. If not given, it will be the same as the `x` value. Default x. + */ + setVelocity(x: number, y?: number): this; + /** + * Gets the current linear velocity of the physics body. + */ + getVelocity(): Phaser.Types.Math.Vector2Like; + /** + * Sets the angular velocity of the body instantly. + * Position, angle, force etc. are unchanged. + * @param velocity The angular velocity. + */ + setAngularVelocity(velocity: number): this; + /** + * Gets the current rotational velocity of the body. + */ + getAngularVelocity(): number; + /** + * Sets the current rotational speed of the body. + * Direction is maintained. Affects body angular velocity. + * @param speed The angular speed. + */ + setAngularSpeed(speed: number): this; + /** + * Gets the current rotational speed of the body. + * Equivalent to the magnitude of its angular velocity. + */ + getAngularSpeed(): number; + } + + } + + namespace Matter { + } + + namespace Events { + type AfterAddEvent = { + /** + * An array of the object(s) that have been added. May be a single body, constraint, composite or a mixture of these. + */ + object: any[]; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics After Add Event. + * + * This event is dispatched by a Matter Physics World instance at the end of the process when a new Body + * or Constraint has just been added to the world. + * + * Listen to it from a Scene using: `this.matter.world.on('afteradd', listener)`. + */ + const AFTER_ADD: string; + + type AfterRemoveEvent = { + /** + * An array of the object(s) that were removed. May be a single body, constraint, composite or a mixture of these. + */ + object: any[]; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics After Remove Event. + * + * This event is dispatched by a Matter Physics World instance at the end of the process when a + * Body or Constraint was removed from the world. + * + * Listen to it from a Scene using: `this.matter.world.on('afterremove', listener)`. + */ + const AFTER_REMOVE: string; + + type AfterUpdateEvent = { + /** + * The Matter Engine `timing.timestamp` value for the event. + */ + timestamp: number; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics After Update Event. + * + * This event is dispatched by a Matter Physics World instance after the engine has updated and all collision events have resolved. + * + * Listen to it from a Scene using: `this.matter.world.on('afterupdate', listener)`. + */ + const AFTER_UPDATE: string; + + type BeforeAddEvent = { + /** + * An array of the object(s) to be added. May be a single body, constraint, composite or a mixture of these. + */ + object: any[]; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Before Add Event. + * + * This event is dispatched by a Matter Physics World instance at the start of the process when a new Body + * or Constraint is being added to the world. + * + * Listen to it from a Scene using: `this.matter.world.on('beforeadd', listener)`. + */ + const BEFORE_ADD: string; + + type BeforeRemoveEvent = { + /** + * An array of the object(s) to be removed. May be a single body, constraint, composite or a mixture of these. + */ + object: any[]; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Before Remove Event. + * + * This event is dispatched by a Matter Physics World instance at the start of the process when a + * Body or Constraint is being removed from the world. + * + * Listen to it from a Scene using: `this.matter.world.on('beforeremove', listener)`. + */ + const BEFORE_REMOVE: string; + + type BeforeUpdateEvent = { + /** + * The Matter Engine `timing.timestamp` value for the event. + */ + timestamp: number; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Before Update Event. + * + * This event is dispatched by a Matter Physics World instance right before all the collision processing takes place. + * + * Listen to it from a Scene using: `this.matter.world.on('beforeupdate', listener)`. + */ + const BEFORE_UPDATE: string; + + type CollisionActiveEvent = { + /** + * A list of all affected pairs in the collision. + */ + pairs: Phaser.Types.Physics.Matter.MatterCollisionData[]; + /** + * The Matter Engine `timing.timestamp` value for the event. + */ + timestamp: number; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Collision Active Event. + * + * This event is dispatched by a Matter Physics World instance after the engine has updated. + * It provides a list of all pairs that are colliding in the current tick (if any). + * + * Listen to it from a Scene using: `this.matter.world.on('collisionactive', listener)`. + */ + const COLLISION_ACTIVE: string; + + type CollisionEndEvent = { + /** + * A list of all affected pairs in the collision. + */ + pairs: Phaser.Types.Physics.Matter.MatterCollisionData[]; + /** + * The Matter Engine `timing.timestamp` value for the event. + */ + timestamp: number; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Collision End Event. + * + * This event is dispatched by a Matter Physics World instance after the engine has updated. + * It provides a list of all pairs that have finished colliding in the current tick (if any). + * + * Listen to it from a Scene using: `this.matter.world.on('collisionend', listener)`. + */ + const COLLISION_END: string; + + type CollisionStartEvent = { + /** + * A list of all affected pairs in the collision. + */ + pairs: Phaser.Types.Physics.Matter.MatterCollisionData[]; + /** + * The Matter Engine `timing.timestamp` value for the event. + */ + timestamp: number; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Collision Start Event. + * + * This event is dispatched by a Matter Physics World instance after the engine has updated. + * It provides a list of all pairs that have started to collide in the current tick (if any). + * + * Listen to it from a Scene using: `this.matter.world.on('collisionstart', listener)`. + */ + const COLLISION_START: string; + + /** + * The Matter Physics Drag End Event. + * + * This event is dispatched by a Matter Physics World instance when a Pointer Constraint + * stops dragging a body. + * + * Listen to it from a Scene using: `this.matter.world.on('dragend', listener)`. + */ + const DRAG_END: string; + + /** + * The Matter Physics Drag Event. + * + * This event is dispatched by a Matter Physics World instance when a Pointer Constraint + * is actively dragging a body. It is emitted each time the pointer moves. + * + * Listen to it from a Scene using: `this.matter.world.on('drag', listener)`. + */ + const DRAG: string; + + /** + * The Matter Physics Drag Start Event. + * + * This event is dispatched by a Matter Physics World instance when a Pointer Constraint + * starts dragging a body. + * + * Listen to it from a Scene using: `this.matter.world.on('dragstart', listener)`. + */ + const DRAG_START: string; + + /** + * The Matter Physics World Pause Event. + * + * This event is dispatched by an Matter Physics World instance when it is paused. + * + * Listen to it from a Scene using: `this.matter.world.on('pause', listener)`. + */ + const PAUSE: string; + + /** + * The Matter Physics World Resume Event. + * + * This event is dispatched by an Matter Physics World instance when it resumes from a paused state. + * + * Listen to it from a Scene using: `this.matter.world.on('resume', listener)`. + */ + const RESUME: string; + + type SleepEndEvent = { + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Sleep End Event. + * + * This event is dispatched by a Matter Physics World instance when a Body stop sleeping. + * + * Listen to it from a Scene using: `this.matter.world.on('sleepend', listener)`. + */ + const SLEEP_END: string; + + type SleepStartEvent = { + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Sleep Start Event. + * + * This event is dispatched by a Matter Physics World instance when a Body goes to sleep. + * + * Listen to it from a Scene using: `this.matter.world.on('sleepstart', listener)`. + */ + const SLEEP_START: string; + + } + + /** + * The Matter Factory is responsible for quickly creating a variety of different types of + * bodies, constraints and Game Objects and adding them into the physics world. + * + * You access the factory from within a Scene using `add`: + * + * ```javascript + * this.matter.add.rectangle(x, y, width, height); + * ``` + * + * Use of the Factory is optional. All of the objects it creates can also be created + * directly via your own code or constructors. It is provided as a means to keep your + * code concise. + */ + class Factory { + /** + * + * @param world The Matter World which this Factory adds to. + */ + constructor(world: Phaser.Physics.Matter.World); + + /** + * The Matter World which this Factory adds to. + */ + world: Phaser.Physics.Matter.World; + + /** + * The Scene which this Factory's Matter World belongs to. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene.Systems this Matter Physics instance belongs to. + */ + sys: Phaser.Scenes.Systems; + + /** + * Creates a new rigid rectangular Body and adds it to the World. + * @param x The X coordinate of the center of the Body. + * @param y The Y coordinate of the center of the Body. + * @param width The width of the Body. + * @param height The height of the Body. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + rectangle(x: number, y: number, width: number, height: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.BodyType; + + /** + * Creates a new rigid trapezoidal Body and adds it to the World. + * @param x The X coordinate of the center of the Body. + * @param y The Y coordinate of the center of the Body. + * @param width The width of the trapezoid Body. + * @param height The height of the trapezoid Body. + * @param slope The slope of the trapezoid. 0 creates a rectangle, while 1 creates a triangle. Positive values make the top side shorter, while negative values make the bottom side shorter. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + trapezoid(x: number, y: number, width: number, height: number, slope: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.BodyType; + + /** + * Creates a new rigid circular Body and adds it to the World. + * @param x The X coordinate of the center of the Body. + * @param y The Y coordinate of the center of the Body. + * @param radius The radius of the circle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + * @param maxSides The maximum amount of sides to use for the polygon which will approximate this circle. + */ + circle(x: number, y: number, radius: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig, maxSides?: number): MatterJS.BodyType; + + /** + * Creates a new rigid polygonal Body and adds it to the World. + * @param x The X coordinate of the center of the Body. + * @param y The Y coordinate of the center of the Body. + * @param sides The number of sides the polygon will have. + * @param radius The "radius" of the polygon, i.e. the distance from its center to any vertex. This is also the radius of its circumcircle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + polygon(x: number, y: number, sides: number, radius: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.BodyType; + + /** + * Creates a body using the supplied vertices (or an array containing multiple sets of vertices) and adds it to the World. + * If the vertices are convex, they will pass through as supplied. Otherwise, if the vertices are concave, they will be decomposed. Note that this process is not guaranteed to support complex sets of vertices, e.g. ones with holes. + * @param x The X coordinate of the center of the Body. + * @param y The Y coordinate of the center of the Body. + * @param vertexSets The vertices data. Either a path string or an array of vertices. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + * @param flagInternal Flag internal edges (coincident part edges) Default false. + * @param removeCollinear Whether Matter.js will discard collinear edges (to improve performance). Default 0.01. + * @param minimumArea During decomposition discard parts that have an area less than this. Default 10. + */ + fromVertices(x: number, y: number, vertexSets: string | any[], options?: Phaser.Types.Physics.Matter.MatterBodyConfig, flagInternal?: boolean, removeCollinear?: number, minimumArea?: number): MatterJS.BodyType; + + /** + * Creates a body using data exported from the application PhysicsEditor (https://www.codeandweb.com/physicseditor) + * + * The PhysicsEditor file should be loaded as JSON: + * + * ```javascript + * preload () + * { + * this.load.json('vehicles', 'assets/vehicles.json); + * } + * + * create () + * { + * const vehicleShapes = this.cache.json.get('vehicles'); + * this.matter.add.fromPhysicsEditor(400, 300, vehicleShapes.truck); + * } + * ``` + * + * Do not pass the entire JSON file to this method, but instead pass one of the shapes contained within it. + * + * If you pas in an `options` object, any settings in there will override those in the PhysicsEditor config object. + * @param x The horizontal world location of the body. + * @param y The vertical world location of the body. + * @param config The JSON data exported from PhysicsEditor. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + * @param addToWorld Should the newly created body be immediately added to the World? Default true. + */ + fromPhysicsEditor(x: number, y: number, config: any, options?: Phaser.Types.Physics.Matter.MatterBodyConfig, addToWorld?: boolean): MatterJS.BodyType; + + /** + * Creates a body using the path data from an SVG file. + * + * SVG Parsing requires the pathseg polyfill from https://github.com/progers/pathseg + * + * The SVG file should be loaded as XML, as this method requires the ability to extract + * the path data from it. I.e.: + * + * ```javascript + * preload () + * { + * this.load.xml('face', 'assets/face.svg); + * } + * + * create () + * { + * this.matter.add.fromSVG(400, 300, this.cache.xml.get('face')); + * } + * ``` + * @param x The X coordinate of the body. + * @param y The Y coordinate of the body. + * @param xml The SVG Path data. + * @param scale Scale the vertices by this amount after creation. Default 1. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + * @param addToWorld Should the newly created body be immediately added to the World? Default true. + */ + fromSVG(x: number, y: number, xml: object, scale?: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig, addToWorld?: boolean): MatterJS.BodyType; + + /** + * Creates a body using the supplied physics data, as provided by a JSON file. + * + * The data file should be loaded as JSON: + * + * ```javascript + * preload () + * { + * this.load.json('ninjas', 'assets/ninjas.json); + * } + * + * create () + * { + * const ninjaShapes = this.cache.json.get('ninjas'); + * + * this.matter.add.fromJSON(400, 300, ninjaShapes.shinobi); + * } + * ``` + * + * Do not pass the entire JSON file to this method, but instead pass one of the shapes contained within it. + * + * If you pas in an `options` object, any settings in there will override those in the config object. + * + * The structure of the JSON file is as follows: + * + * ```text + * { + * 'generator_info': // The name of the application that created the JSON data + * 'shapeName': { + * 'type': // The type of body + * 'label': // Optional body label + * 'vertices': // An array, or an array of arrays, containing the vertex data in x/y object pairs + * } + * } + * ``` + * + * At the time of writing, only the Phaser Physics Tracer App exports in this format. + * @param x The X coordinate of the body. + * @param y The Y coordinate of the body. + * @param config The JSON physics data. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + * @param addToWorld Should the newly created body be immediately added to the World? Default true. + */ + fromJSON(x: number, y: number, config: any, options?: Phaser.Types.Physics.Matter.MatterBodyConfig, addToWorld?: boolean): MatterJS.BodyType; + + /** + * Create a new composite containing Matter Image objects created in a grid arrangement. + * This function uses the body bounds to prevent overlaps. + * @param key The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. Set to `null` to skip this value. + * @param x The horizontal position of this composite in the world. + * @param y The vertical position of this composite in the world. + * @param columns The number of columns in the grid. + * @param rows The number of rows in the grid. + * @param columnGap The distance between each column. Default 0. + * @param rowGap The distance between each row. Default 0. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + imageStack(key: string, frame: string | number, x: number, y: number, columns: number, rows: number, columnGap?: number, rowGap?: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.CompositeType; + + /** + * Create a new composite containing bodies created in the callback in a grid arrangement. + * + * This function uses the body bounds to prevent overlaps. + * @param x The horizontal position of this composite in the world. + * @param y The vertical position of this composite in the world. + * @param columns The number of columns in the grid. + * @param rows The number of rows in the grid. + * @param columnGap The distance between each column. + * @param rowGap The distance between each row. + * @param callback The callback that creates the stack. + */ + stack(x: number, y: number, columns: number, rows: number, columnGap: number, rowGap: number, callback: Function): MatterJS.CompositeType; + + /** + * Create a new composite containing bodies created in the callback in a pyramid arrangement. + * This function uses the body bounds to prevent overlaps. + * @param x The horizontal position of this composite in the world. + * @param y The vertical position of this composite in the world. + * @param columns The number of columns in the pyramid. + * @param rows The number of rows in the pyramid. + * @param columnGap The distance between each column. + * @param rowGap The distance between each row. + * @param callback The callback function to be invoked. + */ + pyramid(x: number, y: number, columns: number, rows: number, columnGap: number, rowGap: number, callback: Function): MatterJS.CompositeType; + + /** + * Chains all bodies in the given composite together using constraints. + * @param composite The composite in which all bodies will be chained together sequentially. + * @param xOffsetA The horizontal offset of the BodyA constraint. This is a percentage based on the body size, not a world position. + * @param yOffsetA The vertical offset of the BodyA constraint. This is a percentage based on the body size, not a world position. + * @param xOffsetB The horizontal offset of the BodyB constraint. This is a percentage based on the body size, not a world position. + * @param yOffsetB The vertical offset of the BodyB constraint. This is a percentage based on the body size, not a world position. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + chain(composite: MatterJS.CompositeType, xOffsetA: number, yOffsetA: number, xOffsetB: number, yOffsetB: number, options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.CompositeType; + + /** + * Connects bodies in the composite with constraints in a grid pattern, with optional cross braces. + * @param composite The composite in which all bodies will be chained together. + * @param columns The number of columns in the mesh. + * @param rows The number of rows in the mesh. + * @param crossBrace Create cross braces for the mesh as well? + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + mesh(composite: MatterJS.CompositeType, columns: number, rows: number, crossBrace: boolean, options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.CompositeType; + + /** + * Creates a composite with a Newton's Cradle setup of bodies and constraints. + * @param x The horizontal position of the start of the cradle. + * @param y The vertical position of the start of the cradle. + * @param number The number of balls in the cradle. + * @param size The radius of each ball in the cradle. + * @param length The length of the 'string' the balls hang from. + */ + newtonsCradle(x: number, y: number, number: number, size: number, length: number): MatterJS.CompositeType; + + /** + * Creates a composite with simple car setup of bodies and constraints. + * @param x The horizontal position of the car in the world. + * @param y The vertical position of the car in the world. + * @param width The width of the car chasis. + * @param height The height of the car chasis. + * @param wheelSize The radius of the car wheels. + */ + car(x: number, y: number, width: number, height: number, wheelSize: number): MatterJS.CompositeType; + + /** + * Creates a simple soft body like object. + * @param x The horizontal position of this composite in the world. + * @param y The vertical position of this composite in the world. + * @param columns The number of columns in the Composite. + * @param rows The number of rows in the Composite. + * @param columnGap The distance between each column. + * @param rowGap The distance between each row. + * @param crossBrace `true` to create cross braces between the bodies, or `false` to create just straight braces. + * @param particleRadius The radius of this circlular composite. + * @param particleOptions An optional Body configuration object that is used to set initial Body properties on creation. + * @param constraintOptions An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + softBody(x: number, y: number, columns: number, rows: number, columnGap: number, rowGap: number, crossBrace: boolean, particleRadius: number, particleOptions?: Phaser.Types.Physics.Matter.MatterBodyConfig, constraintOptions?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.CompositeType; + + /** + * This method is an alias for `Factory.constraint`. + * + * Constraints (or joints) are used for specifying that a fixed distance must be maintained + * between two bodies, or a body and a fixed world-space position. + * + * The stiffness of constraints can be modified to create springs or elastic. + * + * To simulate a revolute constraint (or pin joint) set `length: 0` and a high `stiffness` + * value (e.g. `0.7` or above). + * + * If the constraint is unstable, try lowering the `stiffness` value and / or increasing + * `constraintIterations` within the Matter Config. + * + * For compound bodies, constraints must be applied to the parent body and not one of its parts. + * @param bodyA The first possible `Body` that this constraint is attached to. + * @param bodyB The second possible `Body` that this constraint is attached to. + * @param length A Number that specifies the target resting length of the constraint. If not given it is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`. + * @param stiffness A Number that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`. A value of `1` means the constraint should be very stiff. A value of `0.2` means the constraint acts as a soft spring. Default 1. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + joint(bodyA: MatterJS.BodyType, bodyB: MatterJS.BodyType, length?: number, stiffness?: number, options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.ConstraintType; + + /** + * This method is an alias for `Factory.constraint`. + * + * Constraints (or joints) are used for specifying that a fixed distance must be maintained + * between two bodies, or a body and a fixed world-space position. + * + * The stiffness of constraints can be modified to create springs or elastic. + * + * To simulate a revolute constraint (or pin joint) set `length: 0` and a high `stiffness` + * value (e.g. `0.7` or above). + * + * If the constraint is unstable, try lowering the `stiffness` value and / or increasing + * `constraintIterations` within the Matter Config. + * + * For compound bodies, constraints must be applied to the parent body and not one of its parts. + * @param bodyA The first possible `Body` that this constraint is attached to. + * @param bodyB The second possible `Body` that this constraint is attached to. + * @param length A Number that specifies the target resting length of the constraint. If not given it is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`. + * @param stiffness A Number that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`. A value of `1` means the constraint should be very stiff. A value of `0.2` means the constraint acts as a soft spring. Default 1. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + spring(bodyA: MatterJS.BodyType, bodyB: MatterJS.BodyType, length?: number, stiffness?: number, options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.ConstraintType; + + /** + * Constraints (or joints) are used for specifying that a fixed distance must be maintained + * between two bodies, or a body and a fixed world-space position. + * + * The stiffness of constraints can be modified to create springs or elastic. + * + * To simulate a revolute constraint (or pin joint) set `length: 0` and a high `stiffness` + * value (e.g. `0.7` or above). + * + * If the constraint is unstable, try lowering the `stiffness` value and / or increasing + * `constraintIterations` within the Matter Config. + * + * For compound bodies, constraints must be applied to the parent body and not one of its parts. + * @param bodyA The first possible `Body` that this constraint is attached to. + * @param bodyB The second possible `Body` that this constraint is attached to. + * @param length A Number that specifies the target resting length of the constraint. If not given it is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`. + * @param stiffness A Number that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`. A value of `1` means the constraint should be very stiff. A value of `0.2` means the constraint acts as a soft spring. Default 1. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + constraint(bodyA: MatterJS.BodyType, bodyB: MatterJS.BodyType, length?: number, stiffness?: number, options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.ConstraintType; + + /** + * Constraints (or joints) are used for specifying that a fixed distance must be maintained + * between two bodies, or a body and a fixed world-space position. + * + * A world constraint has only one body, you should specify a `pointA` position in + * the constraint options parameter to attach the constraint to the world. + * + * The stiffness of constraints can be modified to create springs or elastic. + * + * To simulate a revolute constraint (or pin joint) set `length: 0` and a high `stiffness` + * value (e.g. `0.7` or above). + * + * If the constraint is unstable, try lowering the `stiffness` value and / or increasing + * `constraintIterations` within the Matter Config. + * + * For compound bodies, constraints must be applied to the parent body and not one of its parts. + * @param body The Matter `Body` that this constraint is attached to. + * @param length A number that specifies the target resting length of the constraint. If not given it is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`. + * @param stiffness A Number that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`. A value of `1` means the constraint should be very stiff. A value of `0.2` means the constraint acts as a soft spring. Default 1. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + worldConstraint(body: MatterJS.BodyType, length?: number, stiffness?: number, options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.ConstraintType; + + /** + * This method is an alias for `Factory.pointerConstraint`. + * + * A Pointer Constraint is a special type of constraint that allows you to click + * and drag bodies in a Matter World. It monitors the active Pointers in a Scene, + * and when one is pressed down it checks to see if that hit any part of any active + * body in the world. If it did, and the body has input enabled, it will begin to + * drag it until either released, or you stop it via the `stopDrag` method. + * + * You can adjust the stiffness, length and other properties of the constraint via + * the `options` object on creation. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + mouseSpring(options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.ConstraintType; + + /** + * A Pointer Constraint is a special type of constraint that allows you to click + * and drag bodies in a Matter World. It monitors the active Pointers in a Scene, + * and when one is pressed down it checks to see if that hit any part of any active + * body in the world. If it did, and the body has input enabled, it will begin to + * drag it until either released, or you stop it via the `stopDrag` method. + * + * You can adjust the stiffness, length and other properties of the constraint via + * the `options` object on creation. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + pointerConstraint(options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.ConstraintType; + + /** + * Creates a Matter Physics Image Game Object. + * + * An Image is a light-weight Game Object useful for the display of static images in your game, + * such as logos, backgrounds, scenery or other non-animated elements. Images can have input + * events and physics bodies, or be tweened, tinted or scrolled. The main difference between an + * Image and a Sprite is that you cannot animate an Image as they do not have the Animation component. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param key The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. Set to `null` to skip this value. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + image(x: number, y: number, key: string, frame?: string | number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): Phaser.Physics.Matter.Image; + + /** + * Creates a wrapper around a Tile that provides access to a corresponding Matter body. A tile can only + * have one Matter body associated with it. You can either pass in an existing Matter body for + * the tile or allow the constructor to create the corresponding body for you. If the Tile has a + * collision group (defined in Tiled), those shapes will be used to create the body. If not, the + * tile's rectangle bounding box will be used. + * + * The corresponding body will be accessible on the Tile itself via Tile.physics.matterBody. + * + * Note: not all Tiled collision shapes are supported. See + * Phaser.Physics.Matter.TileBody#setFromTileCollision for more information. + * @param tile The target tile that should have a Matter body. + * @param options Options to be used when creating the Matter body. + */ + tileBody(tile: Phaser.Tilemaps.Tile, options?: Phaser.Types.Physics.Matter.MatterTileOptions): Phaser.Physics.Matter.TileBody; + + /** + * Creates a Matter Physics Sprite Game Object. + * + * A Sprite Game Object is used for the display of both static and animated images in your game. + * Sprites can have input events and physics bodies. They can also be tweened, tinted, scrolled + * and animated. + * + * The main difference between a Sprite and an Image Game Object is that you cannot animate Images. + * As such, Sprites take a fraction longer to process and have a larger API footprint due to the Animation + * Component. If you do not require animation then you can safely use Images to replace Sprites in all cases. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param key The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. Set to `null` to skip this value. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + sprite(x: number, y: number, key: string, frame?: string | number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): Phaser.Physics.Matter.Sprite; + + /** + * Takes an existing Game Object and injects all of the Matter Components into it. + * + * This enables you to use component methods such as `setVelocity` or `isSensor` directly from + * this Game Object. + * + * You can also pass in either a Matter Body Configuration object, or a Matter Body instance + * to link with this Game Object. + * @param gameObject The Game Object to inject the Matter Components in to. + * @param options A Matter Body configuration object, or an instance of a Matter Body. + * @param addToWorld Add this Matter Body to the World? Default true. + */ + gameObject(gameObject: Phaser.GameObjects.GameObject, options?: Phaser.Types.Physics.Matter.MatterBodyConfig | MatterJS.Body, addToWorld?: boolean): Phaser.Physics.Matter.Image | Phaser.Physics.Matter.Sprite | Phaser.GameObjects.GameObject; + + /** + * Destroys this Factory. + */ + destroy(): void; + + } + + /** + * A Matter Game Object is a generic object that allows you to combine any Phaser Game Object, + * including those you have extended or created yourself, with all of the Matter Components. + * + * This enables you to use component methods such as `setVelocity` or `isSensor` directly from + * this Game Object. + * @param world The Matter world to add the body to. + * @param gameObject The Game Object that will have the Matter body applied to it. + * @param options A Matter Body configuration object, or an instance of a Matter Body. + * @param addToWorld Should the newly created body be immediately added to the World? Default true. + */ + function MatterGameObject(world: Phaser.Physics.Matter.World, gameObject: Phaser.GameObjects.GameObject, options?: Phaser.Types.Physics.Matter.MatterBodyConfig | MatterJS.Body, addToWorld?: boolean): Phaser.GameObjects.GameObject; + + /** + * A Matter Physics Image Game Object. + * + * An Image is a light-weight Game Object useful for the display of static images in your game, + * such as logos, backgrounds, scenery or other non-animated elements. Images can have input + * events and physics bodies, or be tweened, tinted or scrolled. The main difference between an + * Image and a Sprite is that you cannot animate an Image as they do not have the Animation component. + */ + class Image extends Phaser.GameObjects.Image implements Phaser.Physics.Matter.Components.Bounce, Phaser.Physics.Matter.Components.Collision, Phaser.Physics.Matter.Components.Force, Phaser.Physics.Matter.Components.Friction, Phaser.Physics.Matter.Components.Gravity, Phaser.Physics.Matter.Components.Mass, Phaser.Physics.Matter.Components.Sensor, Phaser.Physics.Matter.Components.SetBody, Phaser.Physics.Matter.Components.Sleep, Phaser.Physics.Matter.Components.Static, Phaser.Physics.Matter.Components.Transform, Phaser.Physics.Matter.Components.Velocity, Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param world A reference to the Matter.World instance that this body belongs to. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + constructor(world: Phaser.Physics.Matter.World, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig); + + /** + * A reference to the Matter.World instance that this body belongs to. + */ + world: Phaser.Physics.Matter.World; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * Sets the restitution on the physics object. + * @param value A Number that defines the restitution (elasticity) of the body. The value is always positive and is in the range (0, 1). A value of 0 means collisions may be perfectly inelastic and no bouncing may occur. A value of 0.8 means the body may bounce back with approximately 80% of its kinetic energy. Note that collision response is based on pairs of bodies, and that restitution values are combined with the following formula: `Math.max(bodyA.restitution, bodyB.restitution)` + */ + setBounce(value: number): this; + + /** + * Sets the collision category of this Game Object's Matter Body. This number must be a power of two between 2^0 (= 1) and 2^31. + * Two bodies with different collision groups (see {@link #setCollisionGroup}) will only collide if their collision + * categories are included in their collision masks (see {@link #setCollidesWith}). + * @param value Unique category bitfield. + */ + setCollisionCategory(value: number): this; + + /** + * Sets the collision group of this Game Object's Matter Body. If this is zero or two Matter Bodies have different values, + * they will collide according to the usual rules (see {@link #setCollisionCategory} and {@link #setCollisionGroup}). + * If two Matter Bodies have the same positive value, they will always collide; if they have the same negative value, + * they will never collide. + * @param value Unique group index. + */ + setCollisionGroup(value: number): this; + + /** + * Sets the collision mask for this Game Object's Matter Body. Two Matter Bodies with different collision groups will only + * collide if each one includes the other's category in its mask based on a bitwise AND, i.e. `(categoryA & maskB) !== 0` + * and `(categoryB & maskA) !== 0` are both true. + * @param categories A unique category bitfield, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body starts colliding with another. + */ + setOnCollide(callback: Function): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body stops colliding with another. + */ + setOnCollideEnd(callback: Function): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke for the duration of this body colliding with another. + */ + setOnCollideActive(callback: Function): this; + + /** + * The callback is sent a reference to the other body, along with a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param body The body, or an array of bodies, to test for collisions with. + * @param callback The callback to invoke when this body collides with the given body or bodies. + */ + setOnCollideWith(body: MatterJS.Body | MatterJS.Body[], callback: Function): this; + + /** + * Applies a force to a body. + * @param force A Vector that specifies the force to apply. + */ + applyForce(force: Phaser.Math.Vector2): this; + + /** + * Applies a force to a body from a given position. + * @param position The position in which the force comes from. + * @param force A Vector that specifies the force to apply. + */ + applyForceFrom(position: Phaser.Math.Vector2, force: Phaser.Math.Vector2): this; + + /** + * Apply thrust to the forward position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrust(speed: number): this; + + /** + * Apply thrust to the left position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustLeft(speed: number): this; + + /** + * Apply thrust to the right position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustRight(speed: number): this; + + /** + * Apply thrust to the back position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustBack(speed: number): this; + + /** + * Sets new friction values for this Game Object's Matter Body. + * @param value The new friction of the body, between 0 and 1, where 0 allows the Body to slide indefinitely, while 1 allows it to stop almost immediately after a force is applied. + * @param air If provided, the new air resistance of the Body. The higher the value, the faster the Body will slow as it moves through space. 0 means the body has no air resistance. + * @param fstatic If provided, the new static friction of the Body. The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. 0 means the body will never "stick" when it is nearly stationary. + */ + setFriction(value: number, air?: number, fstatic?: number): this; + + /** + * Sets a new air resistance for this Game Object's Matter Body. + * A value of 0 means the Body will never slow as it moves through space. + * The higher the value, the faster a Body slows when moving through space. + * @param value The new air resistance for the Body. + */ + setFrictionAir(value: number): this; + + /** + * Sets a new static friction for this Game Object's Matter Body. + * A value of 0 means the Body will never "stick" when it is nearly stationary. + * The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. + * @param value The new static friction for the Body. + */ + setFrictionStatic(value: number): this; + + /** + * A togglable function for ignoring world gravity in real-time on the current body. + * @param value Set to true to ignore the effect of world gravity, or false to not ignore it. + */ + setIgnoreGravity(value: boolean): this; + + /** + * Sets the mass of the Game Object's Matter Body. + * @param value The new mass of the body. + */ + setMass(value: number): this; + + /** + * Sets density of the body. + * @param value The new density of the body. + */ + setDensity(value: number): this; + + /** + * The body's center of mass. + * + * Calling this creates a new `Vector2 each time to avoid mutation. + * + * If you only need to read the value and won't change it, you can get it from `GameObject.body.centerOfMass`. + */ + readonly centerOfMass: Phaser.Math.Vector2; + + /** + * Set the body belonging to this Game Object to be a sensor. + * Sensors trigger collision events, but don't react with colliding body physically. + * @param value `true` to set the body as a sensor, or `false` to disable it. + */ + setSensor(value: boolean): this; + + /** + * Is the body belonging to this Game Object a sensor or not? + */ + isSensor(): boolean; + + /** + * Set this Game Objects Matter physics body to be a rectangle shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param width Width of the rectangle. + * @param height Height of the rectangle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setRectangle(width: number, height: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Objects Matter physics body to be a circle shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param radius The radius of the circle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setCircle(radius: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Objects Matter physics body to be a polygon shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param radius The "radius" of the polygon, i.e. the distance from its center to any vertex. This is also the radius of its circumcircle. + * @param sides The number of sides the polygon will have. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setPolygon(radius: number, sides: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Objects Matter physics body to be a trapezoid shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param width The width of the trapezoid Body. + * @param height The height of the trapezoid Body. + * @param slope The slope of the trapezoid. 0 creates a rectangle, while 1 creates a triangle. Positive values make the top side shorter, while negative values make the bottom side shorter. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setTrapezoid(width: number, height: number, slope: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Object to use the given existing Matter Body. + * + * The body is first removed from the world before being added to this Game Object. + * @param body The Body this Game Object should use. + * @param addToWorld Should the body be immediately added to the World? Default true. + */ + setExistingBody(body: MatterJS.BodyType, addToWorld?: boolean): this; + + /** + * Set this Game Object to create and use a new Body based on the configuration object given. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param config Either a string, such as `circle`, or a Matter Set Body Configuration object. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setBody(config: string | Phaser.Types.Physics.Matter.MatterSetBodyConfig, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Sets this Body to sleep. + */ + setToSleep(): this; + + /** + * Wakes this Body if asleep. + */ + setAwake(): this; + + /** + * Sets the number of updates in which this body must have near-zero velocity before it is set as sleeping (if sleeping is enabled by the engine). + * @param value A `Number` that defines the number of updates in which this body must have near-zero velocity before it is set as sleeping. Default 60. + */ + setSleepThreshold(value?: number): this; + + /** + * Enable sleep and wake events for this body. + * + * By default when a body goes to sleep, or wakes up, it will not emit any events. + * + * The events are emitted by the Matter World instance and can be listened to via + * the `SLEEP_START` and `SLEEP_END` events. + * @param start `true` if you want the sleep start event to be emitted for this body. + * @param end `true` if you want the sleep end event to be emitted for this body. + */ + setSleepEvents(start: boolean, end: boolean): this; + + /** + * Enables or disables the Sleep Start event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepStartEvent(value: boolean): this; + + /** + * Enables or disables the Sleep End event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepEndEvent(value: boolean): this; + + /** + * Changes the physics body to be either static `true` or dynamic `false`. + * @param value `true` to set the body as being static, or `false` to make it dynamic. + */ + setStatic(value: boolean): this; + + /** + * Returns `true` if the body is static, otherwise `false` for a dynamic body. + */ + isStatic(): boolean; + + /** + * Setting fixed rotation sets the Body inertia to Infinity, which stops it + * from being able to rotate when forces are applied to it. + */ + setFixedRotation(): this; + + /** + * Sets the horizontal velocity of the physics body. + * @param x The horizontal velocity value. + */ + setVelocityX(x: number): this; + + /** + * Sets vertical velocity of the physics body. + * @param y The vertical velocity value. + */ + setVelocityY(y: number): this; + + /** + * Sets both the horizontal and vertical velocity of the physics body. + * @param x The horizontal velocity value. + * @param y The vertical velocity value, it can be either positive or negative. If not given, it will be the same as the `x` value. Default x. + */ + setVelocity(x: number, y?: number): this; + + /** + * Gets the current linear velocity of the physics body. + */ + getVelocity(): Phaser.Types.Math.Vector2Like; + + /** + * Sets the angular velocity of the body instantly. + * Position, angle, force etc. are unchanged. + * @param velocity The angular velocity. + */ + setAngularVelocity(velocity: number): this; + + /** + * Gets the current rotational velocity of the body. + */ + getAngularVelocity(): number; + + /** + * Sets the current rotational speed of the body. + * Direction is maintained. Affects body angular velocity. + * @param speed The angular speed. + */ + setAngularSpeed(speed: number): this; + + /** + * Gets the current rotational speed of the body. + * Equivalent to the magnitude of its angular velocity. + */ + getAngularSpeed(): number; + + } + + /** + * The Phaser Matter plugin provides the ability to use the Matter JS Physics Engine within your Phaser games. + * + * Unlike Arcade Physics, the other physics system provided with Phaser, Matter JS is a full-body physics system. + * It features: + * + * * Rigid bodies + * * Compound bodies + * * Composite bodies + * * Concave and convex hulls + * * Physical properties (mass, area, density etc.) + * * Restitution (elastic and inelastic collisions) + * * Collisions (broad-phase, mid-phase and narrow-phase) + * * Stable stacking and resting + * * Conservation of momentum + * * Friction and resistance + * * Constraints + * * Gravity + * * Sleeping and static bodies + * * Rounded corners (chamfering) + * * Views (translate, zoom) + * * Collision queries (raycasting, region tests) + * * Time scaling (slow-mo, speed-up) + * + * Configuration of Matter is handled via the Matter World Config object, which can be passed in either the + * Phaser Game Config, or Phaser Scene Config. Here is a basic example: + * + * ```js + * physics: { + * default: 'matter', + * matter: { + * enableSleeping: true, + * gravity: { + * y: 0 + * }, + * debug: { + * showBody: true, + * showStaticBody: true + * } + * } + * } + * ``` + * + * This class acts as an interface between a Phaser Scene and a single instance of the Matter Engine. + * + * Use it to access the most common Matter features and helper functions. + * + * You can find details, documentation and examples on the Matter JS website: https://brm.io/matter-js/ + */ + class MatterPhysics { + /** + * + * @param scene The Phaser Scene that owns this Matter Physics instance. + */ + constructor(scene: Phaser.Scene); + + /** + * The Phaser Scene that owns this Matter Physics instance + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene Systems that belong to the Scene owning this Matter Physics instance. + */ + systems: Phaser.Scenes.Systems; + + /** + * The parsed Matter Configuration object. + */ + config: Phaser.Types.Physics.Matter.MatterWorldConfig; + + /** + * An instance of the Matter World class. This class is responsible for the updating of the + * Matter Physics world, as well as handling debug drawing functions. + */ + world: Phaser.Physics.Matter.World; + + /** + * An instance of the Matter Factory. This class provides lots of functions for creating a + * wide variety of physics objects and adds them automatically to the Matter World. + * + * You can use this class to cut-down on the amount of code required in your game, however, + * use of the Factory is entirely optional and should be seen as a development aid. It's + * perfectly possible to create and add components to the Matter world without using it. + */ + add: Phaser.Physics.Matter.Factory; + + /** + * An instance of the Body Bounds class. This class contains functions used for getting the + * world position from various points around the bounds of a physics body. + */ + bodyBounds: Phaser.Physics.Matter.BodyBounds; + + /** + * A reference to the `Matter.Body` module. + * + * The `Matter.Body` module contains methods for creating and manipulating body models. + * A `Matter.Body` is a rigid body that can be simulated by a `Matter.Engine`. + * Factories for commonly used body configurations (such as rectangles, circles and other polygons) can be found in the `Bodies` module. + */ + body: MatterJS.BodyFactory; + + /** + * A reference to the `Matter.Composite` module. + * + * The `Matter.Composite` module contains methods for creating and manipulating composite bodies. + * A composite body is a collection of `Matter.Body`, `Matter.Constraint` and other `Matter.Composite`, therefore composites form a tree structure. + * It is important to use the functions in this module to modify composites, rather than directly modifying their properties. + * Note that the `Matter.World` object is also a type of `Matter.Composite` and as such all composite methods here can also operate on a `Matter.World`. + */ + composite: MatterJS.CompositeFactory; + + /** + * A reference to the `Matter.Collision` module. + * + * The `Matter.Collision` module contains methods for detecting collisions between a given pair of bodies. + * + * For efficient detection between a list of bodies, see `Matter.Detector` and `Matter.Query`. + */ + collision: MatterJS.Collision; + + /** + * A reference to the `Matter.Detector` module. + * + * The `Matter.Detector` module contains methods for detecting collisions given a set of pairs. + */ + detector: MatterJS.DetectorFactory; + + /** + * A reference to the `Matter.Pair` module. + * + * The `Matter.Pair` module contains methods for creating and manipulating collision pairs. + */ + pair: MatterJS.PairFactory; + + /** + * A reference to the `Matter.Pairs` module. + * + * The `Matter.Pairs` module contains methods for creating and manipulating collision pair sets. + */ + pairs: MatterJS.PairsFactory; + + /** + * A reference to the `Matter.Query` module. + * + * The `Matter.Query` module contains methods for performing collision queries. + */ + query: MatterJS.QueryFactory; + + /** + * A reference to the `Matter.Resolver` module. + * + * The `Matter.Resolver` module contains methods for resolving collision pairs. + */ + resolver: MatterJS.ResolverFactory; + + /** + * A reference to the `Matter.Constraint` module. + * + * The `Matter.Constraint` module contains methods for creating and manipulating constraints. + * Constraints are used for specifying that a fixed distance must be maintained between two bodies (or a body and a fixed world-space position). + * The stiffness of constraints can be modified to create springs or elastic. + */ + constraint: MatterJS.ConstraintFactory; + + /** + * A reference to the `Matter.Bodies` module. + * + * The `Matter.Bodies` module contains factory methods for creating rigid bodies + * with commonly used body configurations (such as rectangles, circles and other polygons). + */ + bodies: MatterJS.BodiesFactory; + + /** + * A reference to the `Matter.Composites` module. + * + * The `Matter.Composites` module contains factory methods for creating composite bodies + * with commonly used configurations (such as stacks and chains). + */ + composites: MatterJS.CompositesFactory; + + /** + * A reference to the `Matter.Axes` module. + * + * The `Matter.Axes` module contains methods for creating and manipulating sets of axes. + */ + axes: MatterJS.AxesFactory; + + /** + * A reference to the `Matter.Bounds` module. + * + * The `Matter.Bounds` module contains methods for creating and manipulating axis-aligned bounding boxes (AABB). + */ + bounds: MatterJS.BoundsFactory; + + /** + * A reference to the `Matter.Svg` module. + * + * The `Matter.Svg` module contains methods for converting SVG images into an array of vector points. + * + * To use this module you also need the SVGPathSeg polyfill: https://github.com/progers/pathseg + */ + svg: MatterJS.SvgFactory; + + /** + * A reference to the `Matter.Vector` module. + * + * The `Matter.Vector` module contains methods for creating and manipulating vectors. + * Vectors are the basis of all the geometry related operations in the engine. + * A `Matter.Vector` object is of the form `{ x: 0, y: 0 }`. + */ + vector: MatterJS.VectorFactory; + + /** + * A reference to the `Matter.Vertices` module. + * + * The `Matter.Vertices` module contains methods for creating and manipulating sets of vertices. + * A set of vertices is an array of `Matter.Vector` with additional indexing properties inserted by `Vertices.create`. + * A `Matter.Body` maintains a set of vertices to represent the shape of the object (its convex hull). + */ + vertices: MatterJS.VerticesFactory; + + /** + * A reference to the `Matter.Vertices` module. + * + * The `Matter.Vertices` module contains methods for creating and manipulating sets of vertices. + * A set of vertices is an array of `Matter.Vector` with additional indexing properties inserted by `Vertices.create`. + * A `Matter.Body` maintains a set of vertices to represent the shape of the object (its convex hull). + */ + verts: MatterJS.VerticesFactory; + + /** + * This internal method is called when this class starts and retrieves the final Matter World Config. + */ + getConfig(): Phaser.Types.Physics.Matter.MatterWorldConfig; + + /** + * Enables the Matter Attractors Plugin. + * + * The attractors plugin that makes it easy to apply continual forces on bodies. + * It's possible to simulate effects such as wind, gravity and magnetism. + * + * https://github.com/liabru/matter-attractors + * + * This method is called automatically if `plugins.attractors` is set in the Matter World Config. + * However, you can also call it directly from within your game. + */ + enableAttractorPlugin(): this; + + /** + * Enables the Matter Wrap Plugin. + * + * The coordinate wrapping plugin that automatically wraps the position of bodies such that they always stay + * within the given bounds. Upon crossing a boundary the body will appear on the opposite side of the bounds, + * while maintaining its velocity. + * + * https://github.com/liabru/matter-wrap + * + * This method is called automatically if `plugins.wrap` is set in the Matter World Config. + * However, you can also call it directly from within your game. + */ + enableWrapPlugin(): this; + + /** + * Enables the Matter Collision Events Plugin. + * + * Note that this plugin is enabled by default. So you should only ever need to call this + * method if you have specifically disabled the plugin in your Matter World Config. + * You can disable it by setting `plugins.collisionevents: false` in your Matter World Config. + * + * This plugin triggers three new events on Matter.Body: + * + * 1. `onCollide` + * 2. `onCollideEnd` + * 3. `onCollideActive` + * + * These events correspond to the Matter.js events `collisionStart`, `collisionActive` and `collisionEnd`, respectively. + * You can listen to these events via Matter.Events or they will also be emitted from the Matter World. + * + * This plugin also extends Matter.Body with three convenience functions: + * + * `Matter.Body.setOnCollide(callback)` + * `Matter.Body.setOnCollideEnd(callback)` + * `Matter.Body.setOnCollideActive(callback)` + * + * You can register event callbacks by providing a function of type (pair: Matter.Pair) => void + * + * https://github.com/dxu/matter-collision-events + */ + enableCollisionEventsPlugin(): this; + + /** + * Pauses the Matter World instance and sets `enabled` to `false`. + * + * A paused world will not run any simulations for the duration it is paused. + */ + pause(): Phaser.Physics.Matter.World; + + /** + * Resumes this Matter World instance from a paused state and sets `enabled` to `true`. + */ + resume(): Phaser.Physics.Matter.World; + + /** + * Sets the Matter Engine to run at fixed timestep of 60Hz and enables `autoUpdate`. + * If you have set a custom `getDelta` function then this will override it. + */ + set60Hz(): this; + + /** + * Sets the Matter Engine to run at fixed timestep of 30Hz and enables `autoUpdate`. + * If you have set a custom `getDelta` function then this will override it. + */ + set30Hz(): this; + + /** + * Manually advances the physics simulation by one iteration. + * + * You can optionally pass in the `delta` and `correction` values to be used by Engine.update. + * If undefined they use the Matter defaults of 60Hz and no correction. + * + * Calling `step` directly bypasses any checks of `enabled` or `autoUpdate`. + * + * It also ignores any custom `getDelta` functions, as you should be passing the delta + * value in to this call. + * + * You can adjust the number of iterations that Engine.update performs internally. + * Use the Scene Matter Physics config object to set the following properties: + * + * positionIterations (defaults to 6) + * velocityIterations (defaults to 4) + * constraintIterations (defaults to 2) + * + * Adjusting these values can help performance in certain situations, depending on the physics requirements + * of your game. + * @param delta The delta value. Default 16.666. + * @param correction Optional delta correction value. Default 1. + */ + step(delta?: number, correction?: number): void; + + /** + * Checks if the vertices of the given body, or an array of bodies, contains the given point, or not. + * + * You can pass in either a single body, or an array of bodies to be checked. This method will + * return `true` if _any_ of the bodies in the array contain the point. See the `intersectPoint` method if you need + * to get a list of intersecting bodies. + * + * The point should be transformed into the Matter World coordinate system in advance. This happens by + * default with Input Pointers, but if you wish to use points from another system you may need to + * transform them before passing them. + * @param body The body, or an array of bodies, to check against the point. + * @param x The horizontal coordinate of the point. + * @param y The vertical coordinate of the point. + */ + containsPoint(body: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], x: number, y: number): boolean; + + /** + * Checks the given coordinates to see if any vertices of the given bodies contain it. + * + * If no bodies are provided it will search all bodies in the Matter World, including within Composites. + * + * The coordinates should be transformed into the Matter World coordinate system in advance. This happens by + * default with Input Pointers, but if you wish to use coordinates from another system you may need to + * transform them before passing them. + * @param x The horizontal coordinate of the point. + * @param y The vertical coordinate of the point. + * @param bodies An array of bodies to check. If not provided it will search all bodies in the world. + */ + intersectPoint(x: number, y: number, bodies?: Phaser.Types.Physics.Matter.MatterBody[]): Phaser.Types.Physics.Matter.MatterBody[]; + + /** + * Checks the given rectangular area to see if any vertices of the given bodies intersect with it. + * Or, if the `outside` parameter is set to `true`, it checks to see which bodies do not + * intersect with it. + * + * If no bodies are provided it will search all bodies in the Matter World, including within Composites. + * @param x The horizontal coordinate of the top-left of the area. + * @param y The vertical coordinate of the top-left of the area. + * @param width The width of the area. + * @param height The height of the area. + * @param outside If `false` it checks for vertices inside the area, if `true` it checks for vertices outside the area. Default false. + * @param bodies An array of bodies to check. If not provided it will search all bodies in the world. + */ + intersectRect(x: number, y: number, width: number, height: number, outside?: boolean, bodies?: Phaser.Types.Physics.Matter.MatterBody[]): Phaser.Types.Physics.Matter.MatterBody[]; + + /** + * Checks the given ray segment to see if any vertices of the given bodies intersect with it. + * + * If no bodies are provided it will search all bodies in the Matter World. + * + * The width of the ray can be specified via the `rayWidth` parameter. + * @param x1 The horizontal coordinate of the start of the ray segment. + * @param y1 The vertical coordinate of the start of the ray segment. + * @param x2 The horizontal coordinate of the end of the ray segment. + * @param y2 The vertical coordinate of the end of the ray segment. + * @param rayWidth The width of the ray segment. Default 1. + * @param bodies An array of bodies to check. If not provided it will search all bodies in the world. + */ + intersectRay(x1: number, y1: number, x2: number, y2: number, rayWidth?: number, bodies?: Phaser.Types.Physics.Matter.MatterBody[]): Phaser.Types.Physics.Matter.MatterBody[]; + + /** + * Checks the given Matter Body to see if it intersects with any of the given bodies. + * + * If no bodies are provided it will check against all bodies in the Matter World. + * @param body The target body. + * @param bodies An array of bodies to check the target body against. If not provided it will search all bodies in the world. + */ + intersectBody(body: Phaser.Types.Physics.Matter.MatterBody, bodies?: Phaser.Types.Physics.Matter.MatterBody[]): Phaser.Types.Physics.Matter.MatterBody[]; + + /** + * Checks to see if the target body, or an array of target bodies, intersects with any of the given bodies. + * + * If intersection occurs this method will return `true` and, if provided, invoke the callbacks. + * + * If no bodies are provided for the second parameter the target will check against all bodies in the Matter World. + * + * **Note that bodies can only overlap if they are in non-colliding collision groups or categories.** + * + * If you provide a `processCallback` then the two bodies that overlap are sent to it. This callback + * must return a boolean and is used to allow you to perform additional processing tests before a final + * outcome is decided. If it returns `true` then the bodies are finally passed to the `overlapCallback`, if set. + * + * If you provide an `overlapCallback` then the matching pairs of overlapping bodies will be sent to it. + * + * Both callbacks have the following signature: `function (bodyA, bodyB, collisionInfo)` where `bodyA` is always + * the target body. The `collisionInfo` object contains additional data, such as the angle and depth of penetration. + * @param target The target body, or array of target bodies, to check. + * @param bodies The second body, or array of bodies, to check. If falsey it will check against all bodies in the world. + * @param overlapCallback An optional callback function that is called if the bodies overlap. + * @param processCallback An optional callback function that lets you perform additional checks against the two bodies if they overlap. If this is set then `overlapCallback` will only be invoked if this callback returns `true`. + * @param callbackContext The context, or scope, in which to run the callbacks. + */ + overlap(target: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], bodies?: Phaser.Types.Physics.Matter.MatterBody[], overlapCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * Sets the collision filter category of all given Matter Bodies to the given value. + * + * This number must be a power of two between 2^0 (= 1) and 2^31. + * + * Bodies with different collision groups (see {@link #setCollisionGroup}) will only collide if their collision + * categories are included in their collision masks (see {@link #setCollidesWith}). + * @param bodies An array of bodies to update. If falsey it will use all bodies in the world. + * @param value Unique category bitfield. + */ + setCollisionCategory(bodies: Phaser.Types.Physics.Matter.MatterBody[], value: number): this; + + /** + * Sets the collision filter group of all given Matter Bodies to the given value. + * + * If the group value is zero, or if two Matter Bodies have different group values, + * they will collide according to the usual collision filter rules (see {@link #setCollisionCategory} and {@link #setCollisionGroup}). + * + * If two Matter Bodies have the same positive group value, they will always collide; + * if they have the same negative group value they will never collide. + * @param bodies An array of bodies to update. If falsey it will use all bodies in the world. + * @param value Unique group index. + */ + setCollisionGroup(bodies: Phaser.Types.Physics.Matter.MatterBody[], value: number): this; + + /** + * Sets the collision filter mask of all given Matter Bodies to the given value. + * + * Two Matter Bodies with different collision groups will only collide if each one includes the others + * category in its mask based on a bitwise AND operation: `(categoryA & maskB) !== 0` and + * `(categoryB & maskA) !== 0` are both true. + * @param bodies An array of bodies to update. If falsey it will use all bodies in the world. + * @param categories A unique category bitfield, or an array of them. + */ + setCollidesWith(bodies: Phaser.Types.Physics.Matter.MatterBody[], categories: number | number[]): this; + + /** + * Takes an array and returns a new array made from all of the Matter Bodies found in the original array. + * + * For example, passing in Matter Game Objects, such as a bunch of Matter Sprites, to this method, would + * return an array containing all of their native Matter Body objects. + * + * If the `bodies` argument is falsey, it will return all bodies in the world. + * @param bodies An array of objects to extract the bodies from. If falsey, it will return all bodies in the world. + */ + getMatterBodies(bodies?: any[]): MatterJS.BodyType[]; + + /** + * Sets both the horizontal and vertical linear velocity of the physics bodies. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param x The horizontal linear velocity value. + * @param y The vertical linear velocity value. + */ + setVelocity(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], x: number, y: number): this; + + /** + * Sets just the horizontal linear velocity of the physics bodies. + * The vertical velocity of the body is unchanged. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param x The horizontal linear velocity value. + */ + setVelocityX(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], x: number): this; + + /** + * Sets just the vertical linear velocity of the physics bodies. + * The horizontal velocity of the body is unchanged. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param y The vertical linear velocity value. + */ + setVelocityY(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], y: number): this; + + /** + * Sets the angular velocity of the bodies instantly. + * Position, angle, force etc. are unchanged. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param value The angular velocity. + */ + setAngularVelocity(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], value: number): this; + + /** + * Applies a force to a body, at the bodies current position, including resulting torque. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param force A Vector that specifies the force to apply. + */ + applyForce(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], force: Phaser.Types.Math.Vector2Like): this; + + /** + * Applies a force to a body, from the given world position, including resulting torque. + * If no angle is given, the current body angle is used. + * + * Use very small speed values, such as 0.1, depending on the mass and required velocity. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param position A Vector that specifies the world-space position to apply the force at. + * @param speed A speed value to be applied to a directional force. + * @param angle The angle, in radians, to apply the force from. Leave undefined to use the current body angle. + */ + applyForceFromPosition(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], position: Phaser.Types.Math.Vector2Like, speed: number, angle?: number): this; + + /** + * Apply a force to a body based on the given angle and speed. + * If no angle is given, the current body angle is used. + * + * Use very small speed values, such as 0.1, depending on the mass and required velocity. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param speed A speed value to be applied to a directional force. + * @param angle The angle, in radians, to apply the force from. Leave undefined to use the current body angle. + */ + applyForceFromAngle(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], speed: number, angle?: number): this; + + /** + * Returns the length of the given constraint, which is the distance between the two points. + * @param constraint The constraint to get the length from. + */ + getConstraintLength(constraint: MatterJS.ConstraintType): number; + + /** + * Aligns a Body, or Matter Game Object, against the given coordinates. + * + * The alignment takes place using the body bounds, which take into consideration things + * like body scale and rotation. + * + * Although a Body has a `position` property, it is based on the center of mass for the body, + * not a dimension based center. This makes aligning bodies difficult, especially if they have + * rotated or scaled. This method will derive the correct position based on the body bounds and + * its center of mass offset, in order to align the body with the given coordinate. + * + * For example, if you wanted to align a body so it sat in the bottom-center of the + * Scene, and the world was 800 x 600 in size: + * + * ```javascript + * this.matter.alignBody(body, 400, 600, Phaser.Display.Align.BOTTOM_CENTER); + * ``` + * + * You pass in 400 for the x coordinate, because that is the center of the world, and 600 for + * the y coordinate, as that is the base of the world. + * @param body The Body to align. + * @param x The horizontal position to align the body to. + * @param y The vertical position to align the body to. + * @param align One of the `Phaser.Display.Align` constants, such as `Phaser.Display.Align.TOP_LEFT`. + */ + alignBody(body: Phaser.Types.Physics.Matter.MatterBody, x: number, y: number, align: number): this; + + } + + /** + * A Matter Physics Sprite Game Object. + * + * A Sprite Game Object is used for the display of both static and animated images in your game. + * Sprites can have input events and physics bodies. They can also be tweened, tinted, scrolled + * and animated. + * + * The main difference between a Sprite and an Image Game Object is that you cannot animate Images. + * As such, Sprites take a fraction longer to process and have a larger API footprint due to the Animation + * Component. If you do not require animation then you can safely use Images to replace Sprites in all cases. + */ + class Sprite extends Phaser.GameObjects.Sprite implements Phaser.Physics.Matter.Components.Bounce, Phaser.Physics.Matter.Components.Collision, Phaser.Physics.Matter.Components.Force, Phaser.Physics.Matter.Components.Friction, Phaser.Physics.Matter.Components.Gravity, Phaser.Physics.Matter.Components.Mass, Phaser.Physics.Matter.Components.Sensor, Phaser.Physics.Matter.Components.SetBody, Phaser.Physics.Matter.Components.Sleep, Phaser.Physics.Matter.Components.Static, Phaser.Physics.Matter.Components.Transform, Phaser.Physics.Matter.Components.Velocity, Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param world A reference to the Matter.World instance that this body belongs to. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + constructor(world: Phaser.Physics.Matter.World, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig); + + /** + * A reference to the Matter.World instance that this body belongs to. + */ + world: Phaser.Physics.Matter.World; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * Sets the restitution on the physics object. + * @param value A Number that defines the restitution (elasticity) of the body. The value is always positive and is in the range (0, 1). A value of 0 means collisions may be perfectly inelastic and no bouncing may occur. A value of 0.8 means the body may bounce back with approximately 80% of its kinetic energy. Note that collision response is based on pairs of bodies, and that restitution values are combined with the following formula: `Math.max(bodyA.restitution, bodyB.restitution)` + */ + setBounce(value: number): this; + + /** + * Sets the collision category of this Game Object's Matter Body. This number must be a power of two between 2^0 (= 1) and 2^31. + * Two bodies with different collision groups (see {@link #setCollisionGroup}) will only collide if their collision + * categories are included in their collision masks (see {@link #setCollidesWith}). + * @param value Unique category bitfield. + */ + setCollisionCategory(value: number): this; + + /** + * Sets the collision group of this Game Object's Matter Body. If this is zero or two Matter Bodies have different values, + * they will collide according to the usual rules (see {@link #setCollisionCategory} and {@link #setCollisionGroup}). + * If two Matter Bodies have the same positive value, they will always collide; if they have the same negative value, + * they will never collide. + * @param value Unique group index. + */ + setCollisionGroup(value: number): this; + + /** + * Sets the collision mask for this Game Object's Matter Body. Two Matter Bodies with different collision groups will only + * collide if each one includes the other's category in its mask based on a bitwise AND, i.e. `(categoryA & maskB) !== 0` + * and `(categoryB & maskA) !== 0` are both true. + * @param categories A unique category bitfield, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body starts colliding with another. + */ + setOnCollide(callback: Function): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body stops colliding with another. + */ + setOnCollideEnd(callback: Function): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke for the duration of this body colliding with another. + */ + setOnCollideActive(callback: Function): this; + + /** + * The callback is sent a reference to the other body, along with a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param body The body, or an array of bodies, to test for collisions with. + * @param callback The callback to invoke when this body collides with the given body or bodies. + */ + setOnCollideWith(body: MatterJS.Body | MatterJS.Body[], callback: Function): this; + + /** + * Applies a force to a body. + * @param force A Vector that specifies the force to apply. + */ + applyForce(force: Phaser.Math.Vector2): this; + + /** + * Applies a force to a body from a given position. + * @param position The position in which the force comes from. + * @param force A Vector that specifies the force to apply. + */ + applyForceFrom(position: Phaser.Math.Vector2, force: Phaser.Math.Vector2): this; + + /** + * Apply thrust to the forward position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrust(speed: number): this; + + /** + * Apply thrust to the left position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustLeft(speed: number): this; + + /** + * Apply thrust to the right position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustRight(speed: number): this; + + /** + * Apply thrust to the back position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustBack(speed: number): this; + + /** + * Sets new friction values for this Game Object's Matter Body. + * @param value The new friction of the body, between 0 and 1, where 0 allows the Body to slide indefinitely, while 1 allows it to stop almost immediately after a force is applied. + * @param air If provided, the new air resistance of the Body. The higher the value, the faster the Body will slow as it moves through space. 0 means the body has no air resistance. + * @param fstatic If provided, the new static friction of the Body. The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. 0 means the body will never "stick" when it is nearly stationary. + */ + setFriction(value: number, air?: number, fstatic?: number): this; + + /** + * Sets a new air resistance for this Game Object's Matter Body. + * A value of 0 means the Body will never slow as it moves through space. + * The higher the value, the faster a Body slows when moving through space. + * @param value The new air resistance for the Body. + */ + setFrictionAir(value: number): this; + + /** + * Sets a new static friction for this Game Object's Matter Body. + * A value of 0 means the Body will never "stick" when it is nearly stationary. + * The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. + * @param value The new static friction for the Body. + */ + setFrictionStatic(value: number): this; + + /** + * A togglable function for ignoring world gravity in real-time on the current body. + * @param value Set to true to ignore the effect of world gravity, or false to not ignore it. + */ + setIgnoreGravity(value: boolean): this; + + /** + * Sets the mass of the Game Object's Matter Body. + * @param value The new mass of the body. + */ + setMass(value: number): this; + + /** + * Sets density of the body. + * @param value The new density of the body. + */ + setDensity(value: number): this; + + /** + * The body's center of mass. + * + * Calling this creates a new `Vector2 each time to avoid mutation. + * + * If you only need to read the value and won't change it, you can get it from `GameObject.body.centerOfMass`. + */ + readonly centerOfMass: Phaser.Math.Vector2; + + /** + * Set the body belonging to this Game Object to be a sensor. + * Sensors trigger collision events, but don't react with colliding body physically. + * @param value `true` to set the body as a sensor, or `false` to disable it. + */ + setSensor(value: boolean): this; + + /** + * Is the body belonging to this Game Object a sensor or not? + */ + isSensor(): boolean; + + /** + * Set this Game Objects Matter physics body to be a rectangle shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param width Width of the rectangle. + * @param height Height of the rectangle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setRectangle(width: number, height: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Objects Matter physics body to be a circle shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param radius The radius of the circle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setCircle(radius: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Objects Matter physics body to be a polygon shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param radius The "radius" of the polygon, i.e. the distance from its center to any vertex. This is also the radius of its circumcircle. + * @param sides The number of sides the polygon will have. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setPolygon(radius: number, sides: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Objects Matter physics body to be a trapezoid shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param width The width of the trapezoid Body. + * @param height The height of the trapezoid Body. + * @param slope The slope of the trapezoid. 0 creates a rectangle, while 1 creates a triangle. Positive values make the top side shorter, while negative values make the bottom side shorter. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setTrapezoid(width: number, height: number, slope: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Object to use the given existing Matter Body. + * + * The body is first removed from the world before being added to this Game Object. + * @param body The Body this Game Object should use. + * @param addToWorld Should the body be immediately added to the World? Default true. + */ + setExistingBody(body: MatterJS.BodyType, addToWorld?: boolean): this; + + /** + * Set this Game Object to create and use a new Body based on the configuration object given. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param config Either a string, such as `circle`, or a Matter Set Body Configuration object. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setBody(config: string | Phaser.Types.Physics.Matter.MatterSetBodyConfig, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Sets this Body to sleep. + */ + setToSleep(): this; + + /** + * Wakes this Body if asleep. + */ + setAwake(): this; + + /** + * Sets the number of updates in which this body must have near-zero velocity before it is set as sleeping (if sleeping is enabled by the engine). + * @param value A `Number` that defines the number of updates in which this body must have near-zero velocity before it is set as sleeping. Default 60. + */ + setSleepThreshold(value?: number): this; + + /** + * Enable sleep and wake events for this body. + * + * By default when a body goes to sleep, or wakes up, it will not emit any events. + * + * The events are emitted by the Matter World instance and can be listened to via + * the `SLEEP_START` and `SLEEP_END` events. + * @param start `true` if you want the sleep start event to be emitted for this body. + * @param end `true` if you want the sleep end event to be emitted for this body. + */ + setSleepEvents(start: boolean, end: boolean): this; + + /** + * Enables or disables the Sleep Start event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepStartEvent(value: boolean): this; + + /** + * Enables or disables the Sleep End event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepEndEvent(value: boolean): this; + + /** + * Changes the physics body to be either static `true` or dynamic `false`. + * @param value `true` to set the body as being static, or `false` to make it dynamic. + */ + setStatic(value: boolean): this; + + /** + * Returns `true` if the body is static, otherwise `false` for a dynamic body. + */ + isStatic(): boolean; + + /** + * Setting fixed rotation sets the Body inertia to Infinity, which stops it + * from being able to rotate when forces are applied to it. + */ + setFixedRotation(): this; + + /** + * Sets the horizontal velocity of the physics body. + * @param x The horizontal velocity value. + */ + setVelocityX(x: number): this; + + /** + * Sets vertical velocity of the physics body. + * @param y The vertical velocity value. + */ + setVelocityY(y: number): this; + + /** + * Sets both the horizontal and vertical velocity of the physics body. + * @param x The horizontal velocity value. + * @param y The vertical velocity value, it can be either positive or negative. If not given, it will be the same as the `x` value. Default x. + */ + setVelocity(x: number, y?: number): this; + + /** + * Gets the current linear velocity of the physics body. + */ + getVelocity(): Phaser.Types.Math.Vector2Like; + + /** + * Sets the angular velocity of the body instantly. + * Position, angle, force etc. are unchanged. + * @param velocity The angular velocity. + */ + setAngularVelocity(velocity: number): this; + + /** + * Gets the current rotational velocity of the body. + */ + getAngularVelocity(): number; + + /** + * Sets the current rotational speed of the body. + * Direction is maintained. Affects body angular velocity. + * @param speed The angular speed. + */ + setAngularSpeed(speed: number): this; + + /** + * Gets the current rotational speed of the body. + * Equivalent to the magnitude of its angular velocity. + */ + getAngularSpeed(): number; + + } + + /** + * A wrapper around a Tile that provides access to a corresponding Matter body. A tile can only + * have one Matter body associated with it. You can either pass in an existing Matter body for + * the tile or allow the constructor to create the corresponding body for you. If the Tile has a + * collision group (defined in Tiled), those shapes will be used to create the body. If not, the + * tile's rectangle bounding box will be used. + * + * The corresponding body will be accessible on the Tile itself via Tile.physics.matterBody. + * + * Note: not all Tiled collision shapes are supported. See + * Phaser.Physics.Matter.TileBody#setFromTileCollision for more information. + */ + class TileBody extends Phaser.Events.EventEmitter implements Phaser.Physics.Matter.Components.Bounce, Phaser.Physics.Matter.Components.Collision, Phaser.Physics.Matter.Components.Friction, Phaser.Physics.Matter.Components.Gravity, Phaser.Physics.Matter.Components.Mass, Phaser.Physics.Matter.Components.Sensor, Phaser.Physics.Matter.Components.Sleep, Phaser.Physics.Matter.Components.Static { + /** + * + * @param world The Matter world instance this body belongs to. + * @param tile The target tile that should have a Matter body. + * @param options Options to be used when creating the Matter body. + */ + constructor(world: Phaser.Physics.Matter.World, tile: Phaser.Tilemaps.Tile, options?: Phaser.Types.Physics.Matter.MatterTileOptions); + + /** + * The tile object the body is associated with. + */ + tile: Phaser.Tilemaps.Tile; + + /** + * The Matter world the body exists within. + */ + world: Phaser.Physics.Matter.World; + + /** + * Sets the current body to a rectangle that matches the bounds of the tile. + * @param options Options to be used when creating the Matter body. See MatterJS.Body for a list of what Matter accepts. + */ + setFromTileRectangle(options?: Phaser.Types.Physics.Matter.MatterBodyTileOptions): Phaser.Physics.Matter.TileBody; + + /** + * Sets the current body from the collision group associated with the Tile. This is typically + * set up in Tiled's collision editor. + * + * Note: Matter doesn't support all shapes from Tiled. Rectangles and polygons are directly + * supported. Ellipses are converted into circle bodies. Polylines are treated as if they are + * closed polygons. If a tile has multiple shapes, a multi-part body will be created. Concave + * shapes are supported if poly-decomp library is included. Decomposition is not guaranteed to + * work for complex shapes (e.g. holes), so it's often best to manually decompose a concave + * polygon into multiple convex polygons yourself. + * @param options Options to be used when creating the Matter body. See MatterJS.Body for a list of what Matter accepts. + */ + setFromTileCollision(options?: Phaser.Types.Physics.Matter.MatterBodyTileOptions): Phaser.Physics.Matter.TileBody; + + /** + * Sets the current body to the given body. This will remove the previous body, if one already + * exists. + * @param body The new Matter body to use. + * @param addToWorld Whether or not to add the body to the Matter world. Default true. + */ + setBody(body: MatterJS.BodyType, addToWorld?: boolean): Phaser.Physics.Matter.TileBody; + + /** + * Removes the current body from the TileBody and from the Matter world + */ + removeBody(): Phaser.Physics.Matter.TileBody; + + /** + * Removes the current body from the tile and the world. + */ + destroy(): Phaser.Physics.Matter.TileBody; + + /** + * Sets the restitution on the physics object. + * @param value A Number that defines the restitution (elasticity) of the body. The value is always positive and is in the range (0, 1). A value of 0 means collisions may be perfectly inelastic and no bouncing may occur. A value of 0.8 means the body may bounce back with approximately 80% of its kinetic energy. Note that collision response is based on pairs of bodies, and that restitution values are combined with the following formula: `Math.max(bodyA.restitution, bodyB.restitution)` + */ + setBounce(value: number): this; + + /** + * Sets the collision category of this Game Object's Matter Body. This number must be a power of two between 2^0 (= 1) and 2^31. + * Two bodies with different collision groups (see {@link #setCollisionGroup}) will only collide if their collision + * categories are included in their collision masks (see {@link #setCollidesWith}). + * @param value Unique category bitfield. + */ + setCollisionCategory(value: number): this; + + /** + * Sets the collision group of this Game Object's Matter Body. If this is zero or two Matter Bodies have different values, + * they will collide according to the usual rules (see {@link #setCollisionCategory} and {@link #setCollisionGroup}). + * If two Matter Bodies have the same positive value, they will always collide; if they have the same negative value, + * they will never collide. + * @param value Unique group index. + */ + setCollisionGroup(value: number): this; + + /** + * Sets the collision mask for this Game Object's Matter Body. Two Matter Bodies with different collision groups will only + * collide if each one includes the other's category in its mask based on a bitwise AND, i.e. `(categoryA & maskB) !== 0` + * and `(categoryB & maskA) !== 0` are both true. + * @param categories A unique category bitfield, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body starts colliding with another. + */ + setOnCollide(callback: Function): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body stops colliding with another. + */ + setOnCollideEnd(callback: Function): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke for the duration of this body colliding with another. + */ + setOnCollideActive(callback: Function): this; + + /** + * The callback is sent a reference to the other body, along with a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param body The body, or an array of bodies, to test for collisions with. + * @param callback The callback to invoke when this body collides with the given body or bodies. + */ + setOnCollideWith(body: MatterJS.Body | MatterJS.Body[], callback: Function): this; + + /** + * Sets new friction values for this Game Object's Matter Body. + * @param value The new friction of the body, between 0 and 1, where 0 allows the Body to slide indefinitely, while 1 allows it to stop almost immediately after a force is applied. + * @param air If provided, the new air resistance of the Body. The higher the value, the faster the Body will slow as it moves through space. 0 means the body has no air resistance. + * @param fstatic If provided, the new static friction of the Body. The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. 0 means the body will never "stick" when it is nearly stationary. + */ + setFriction(value: number, air?: number, fstatic?: number): this; + + /** + * Sets a new air resistance for this Game Object's Matter Body. + * A value of 0 means the Body will never slow as it moves through space. + * The higher the value, the faster a Body slows when moving through space. + * @param value The new air resistance for the Body. + */ + setFrictionAir(value: number): this; + + /** + * Sets a new static friction for this Game Object's Matter Body. + * A value of 0 means the Body will never "stick" when it is nearly stationary. + * The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. + * @param value The new static friction for the Body. + */ + setFrictionStatic(value: number): this; + + /** + * A togglable function for ignoring world gravity in real-time on the current body. + * @param value Set to true to ignore the effect of world gravity, or false to not ignore it. + */ + setIgnoreGravity(value: boolean): this; + + /** + * Sets the mass of the Game Object's Matter Body. + * @param value The new mass of the body. + */ + setMass(value: number): this; + + /** + * Sets density of the body. + * @param value The new density of the body. + */ + setDensity(value: number): this; + + /** + * The body's center of mass. + * + * Calling this creates a new `Vector2 each time to avoid mutation. + * + * If you only need to read the value and won't change it, you can get it from `GameObject.body.centerOfMass`. + */ + readonly centerOfMass: Phaser.Math.Vector2; + + /** + * Set the body belonging to this Game Object to be a sensor. + * Sensors trigger collision events, but don't react with colliding body physically. + * @param value `true` to set the body as a sensor, or `false` to disable it. + */ + setSensor(value: boolean): this; + + /** + * Is the body belonging to this Game Object a sensor or not? + */ + isSensor(): boolean; + + /** + * Sets this Body to sleep. + */ + setToSleep(): this; + + /** + * Wakes this Body if asleep. + */ + setAwake(): this; + + /** + * Sets the number of updates in which this body must have near-zero velocity before it is set as sleeping (if sleeping is enabled by the engine). + * @param value A `Number` that defines the number of updates in which this body must have near-zero velocity before it is set as sleeping. Default 60. + */ + setSleepThreshold(value?: number): this; + + /** + * Enable sleep and wake events for this body. + * + * By default when a body goes to sleep, or wakes up, it will not emit any events. + * + * The events are emitted by the Matter World instance and can be listened to via + * the `SLEEP_START` and `SLEEP_END` events. + * @param start `true` if you want the sleep start event to be emitted for this body. + * @param end `true` if you want the sleep end event to be emitted for this body. + */ + setSleepEvents(start: boolean, end: boolean): this; + + /** + * Enables or disables the Sleep Start event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepStartEvent(value: boolean): this; + + /** + * Enables or disables the Sleep End event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepEndEvent(value: boolean): this; + + /** + * Changes the physics body to be either static `true` or dynamic `false`. + * @param value `true` to set the body as being static, or `false` to make it dynamic. + */ + setStatic(value: boolean): this; + + /** + * Returns `true` if the body is static, otherwise `false` for a dynamic body. + */ + isStatic(): boolean; + + } + + /** + * Use PhysicsEditorParser.parseBody() to build a Matter body object, based on a physics data file + * created and exported with PhysicsEditor (https://www.codeandweb.com/physicseditor). + */ + namespace PhysicsEditorParser { + /** + * Parses a body element exported by PhysicsEditor. + * @param x The horizontal world location of the body. + * @param y The vertical world location of the body. + * @param config The body configuration and fixture (child body) definitions, as exported by PhysicsEditor. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + function parseBody(x: number, y: number, config: object, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.BodyType; + + /** + * Parses an element of the "fixtures" list exported by PhysicsEditor + * @param fixtureConfig The fixture object to parse. + */ + function parseFixture(fixtureConfig: object): MatterJS.BodyType[]; + + /** + * Parses the "vertices" lists exported by PhysicsEditor. + * @param vertexSets The vertex lists to parse. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + function parseVertices(vertexSets: any[], options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.BodyType[]; + + } + + /** + * Creates a body using the supplied physics data, as provided by a JSON file. + * + * The data file should be loaded as JSON: + * + * ```javascript + * preload () + * { + * this.load.json('ninjas', 'assets/ninjas.json); + * } + * + * create () + * { + * const ninjaShapes = this.cache.json.get('ninjas'); + * + * this.matter.add.fromJSON(400, 300, ninjaShapes.shinobi); + * } + * ``` + * + * Do not pass the entire JSON file to this method, but instead pass one of the shapes contained within it. + * + * If you pas in an `options` object, any settings in there will override those in the config object. + * + * The structure of the JSON file is as follows: + * + * ```text + * { + * 'generator_info': // The name of the application that created the JSON data + * 'shapeName': { + * 'type': // The type of body + * 'label': // Optional body label + * 'vertices': // An array, or an array of arrays, containing the vertex data in x/y object pairs + * } + * } + * ``` + * + * At the time of writing, only the Phaser Physics Tracer App exports in this format. + */ + namespace PhysicsJSONParser { + /** + * Parses a body element from the given JSON data. + * @param x The horizontal world location of the body. + * @param y The vertical world location of the body. + * @param config The body configuration data. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + function parseBody(x: number, y: number, config: object, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.BodyType; + + } + + /** + * A Pointer Constraint is a special type of constraint that allows you to click + * and drag bodies in a Matter World. It monitors the active Pointers in a Scene, + * and when one is pressed down it checks to see if that hit any part of any active + * body in the world. If it did, and the body has input enabled, it will begin to + * drag it until either released, or you stop it via the `stopDrag` method. + * + * You can adjust the stiffness, length and other properties of the constraint via + * the `options` object on creation. + */ + class PointerConstraint { + /** + * + * @param scene A reference to the Scene to which this Pointer Constraint belongs. + * @param world A reference to the Matter World instance to which this Constraint belongs. + * @param options A Constraint configuration object. + */ + constructor(scene: Phaser.Scene, world: Phaser.Physics.Matter.World, options?: object); + + /** + * A reference to the Scene to which this Pointer Constraint belongs. + * This is the same Scene as the Matter World instance. + */ + scene: Phaser.Scene; + + /** + * A reference to the Matter World instance to which this Constraint belongs. + */ + world: Phaser.Physics.Matter.World; + + /** + * The Camera the Pointer was interacting with when the input + * down event was processed. + */ + camera: Phaser.Cameras.Scene2D.Camera; + + /** + * A reference to the Input Pointer that activated this Constraint. + * This is set in the `onDown` handler. + */ + pointer: Phaser.Input.Pointer; + + /** + * Is this Constraint active or not? + * + * An active constraint will be processed each update. An inactive one will be skipped. + * Use this to toggle a Pointer Constraint on and off. + */ + active: boolean; + + /** + * The internal transformed position. + */ + position: Phaser.Math.Vector2; + + /** + * The body that is currently being dragged, if any. + */ + body: MatterJS.BodyType | null; + + /** + * The part of the body that was clicked on to start the drag. + */ + part: MatterJS.BodyType | null; + + /** + * The native Matter Constraint that is used to attach to bodies. + */ + constraint: MatterJS.ConstraintType; + + /** + * A Pointer has been pressed down onto the Scene. + * + * If this Constraint doesn't have an active Pointer then a hit test is set to + * run against all active bodies in the world during the _next_ call to `update`. + * If a body is found, it is bound to this constraint and the drag begins. + * @param pointer A reference to the Pointer that was pressed. + */ + onDown(pointer: Phaser.Input.Pointer): void; + + /** + * A Pointer has been released from the Scene. If it was the one this constraint was using, it's cleared. + * @param pointer A reference to the Pointer that was pressed. + */ + onUp(pointer: Phaser.Input.Pointer): void; + + /** + * Scans all active bodies in the current Matter World to see if any of them + * are hit by the Pointer. The _first one_ found to hit is set as the active contraint + * body. + */ + getBody(): boolean; + + /** + * Scans the current body to determine if a part of it was clicked on. + * If a part is found the body is set as the `constraint.bodyB` property, + * as well as the `body` property of this class. The part is also set. + * @param body The Matter Body to check. + * @param position A translated hit test position. + */ + hitTestBody(body: MatterJS.BodyType, position: Phaser.Math.Vector2): boolean; + + /** + * Internal update handler. Called in the Matter BEFORE_UPDATE step. + */ + update(): void; + + /** + * Stops the Pointer Constraint from dragging the body any further. + * + * This is called automatically if the Pointer is released while actively + * dragging a body. Or, you can call it manually to release a body from a + * constraint without having to first release the pointer. + */ + stopDrag(): void; + + /** + * Destroys this Pointer Constraint instance and all of its references. + */ + destroy(): void; + + } + + /** + * The Matter World class is responsible for managing one single instance of a Matter Physics World for Phaser. + * + * Access this via `this.matter.world` from within a Scene. + * + * This class creates a Matter JS World Composite along with the Matter JS Engine during instantiation. It also + * handles delta timing, bounds, body and constraint creation and debug drawing. + * + * If you wish to access the Matter JS World object directly, see the `localWorld` property. + * If you wish to access the Matter Engine directly, see the `engine` property. + * + * This class is an Event Emitter and will proxy _all_ Matter JS events, as they are received. + */ + class World extends Phaser.Events.EventEmitter { + /** + * + * @param scene The Scene to which this Matter World instance belongs. + * @param config The Matter World configuration object. + */ + constructor(scene: Phaser.Scene, config: Phaser.Types.Physics.Matter.MatterWorldConfig); + + /** + * The Scene to which this Matter World instance belongs. + */ + scene: Phaser.Scene; + + /** + * An instance of the MatterJS Engine. + */ + engine: MatterJS.Engine; + + /** + * A `World` composite object that will contain all simulated bodies and constraints. + */ + localWorld: MatterJS.World; + + /** + * An object containing the 4 wall bodies that bound the physics world. + */ + walls: Phaser.Types.Physics.Matter.MatterWalls; + + /** + * A flag that toggles if the world is enabled or not. + */ + enabled: boolean; + + /** + * This function is called every time the core game loop steps, which is bound to the + * Request Animation Frame frequency unless otherwise modified. + * + * The function is passed two values: `time` and `delta`, both of which come from the game step values. + * + * It must return a number. This number is used as the delta value passed to Matter.Engine.update. + * + * You can override this function with your own to define your own timestep. + * + * If you need to update the Engine multiple times in a single game step then call + * `World.update` as many times as required. Each call will trigger the `getDelta` function. + * If you wish to have full control over when the Engine updates then see the property `autoUpdate`. + * + * You can also adjust the number of iterations that Engine.update performs. + * Use the Scene Matter Physics config object to set the following properties: + * + * positionIterations (defaults to 6) + * velocityIterations (defaults to 4) + * constraintIterations (defaults to 2) + * + * Adjusting these values can help performance in certain situations, depending on the physics requirements + * of your game. + */ + getDelta: Function; + + /** + * The Matter JS Runner Configuration object. + * + * This object is populated via the Matter Configuration object's `runner` property and is + * updated constantly during the game step. + */ + runner: Phaser.Types.Physics.Matter.MatterRunnerConfig; + + /** + * Automatically call Engine.update every time the game steps. + * If you disable this then you are responsible for calling `World.step` directly from your game. + * If you call `set60Hz` or `set30Hz` then `autoUpdate` is reset to `true`. + */ + autoUpdate: boolean; + + /** + * A flag that controls if the debug graphics will be drawn to or not. + */ + drawDebug: boolean; + + /** + * An instance of the Graphics object the debug bodies are drawn to, if enabled. + */ + debugGraphic: Phaser.GameObjects.Graphics; + + /** + * The debug configuration object. + * + * The values stored in this object are read from the Matter World Config `debug` property. + * + * When a new Body or Constraint is _added to the World_, they are given the values stored in this object, + * unless they have their own `render` object set that will override them. + * + * Note that while you can modify the values of properties in this object at run-time, it will not change + * any of the Matter objects _already added_. It will only impact objects newly added to the world, or one + * that is removed and then re-added at a later time. + */ + debugConfig: Phaser.Types.Physics.Matter.MatterDebugConfig; + + /** + * Sets the debug render style for the children of the given Matter Composite. + * + * Composites themselves do not render, but they can contain bodies, constraints and other composites that may do. + * So the children of this composite are passed to the `setBodyRenderStyle`, `setCompositeRenderStyle` and + * `setConstraintRenderStyle` methods accordingly. + * @param composite The Matter Composite to set the render style on. + */ + setCompositeRenderStyle(composite: MatterJS.CompositeType): this; + + /** + * Sets the debug render style for the given Matter Body. + * + * If you are using this on a Phaser Game Object, such as a Matter Sprite, then pass in the body property + * to this method, not the Game Object itself. + * + * If you wish to skip a parameter, so it retains its current value, pass `false` for it. + * + * If you wish to reset the Body render colors to the defaults found in the World Debug Config, then call + * this method with just the `body` parameter provided and no others. + * @param body The Matter Body to set the render style on. + * @param lineColor The line color. If `null` it will use the World Debug Config value. + * @param lineOpacity The line opacity, between 0 and 1. If `null` it will use the World Debug Config value. + * @param lineThickness The line thickness. If `null` it will use the World Debug Config value. + * @param fillColor The fill color. If `null` it will use the World Debug Config value. + * @param fillOpacity The fill opacity, between 0 and 1. If `null` it will use the World Debug Config value. + */ + setBodyRenderStyle(body: MatterJS.BodyType, lineColor?: number, lineOpacity?: number, lineThickness?: number, fillColor?: number, fillOpacity?: number): this; + + /** + * Sets the debug render style for the given Matter Constraint. + * + * If you are using this on a Phaser Game Object, then pass in the body property + * to this method, not the Game Object itself. + * + * If you wish to skip a parameter, so it retains its current value, pass `false` for it. + * + * If you wish to reset the Constraint render colors to the defaults found in the World Debug Config, then call + * this method with just the `constraint` parameter provided and no others. + * @param constraint The Matter Constraint to set the render style on. + * @param lineColor The line color. If `null` it will use the World Debug Config value. + * @param lineOpacity The line opacity, between 0 and 1. If `null` it will use the World Debug Config value. + * @param lineThickness The line thickness. If `null` it will use the World Debug Config value. + * @param pinSize If this constraint is a pin, this sets the size of the pin circle. If `null` it will use the World Debug Config value. + * @param anchorColor The color used when rendering this constraints anchors. If `null` it will use the World Debug Config value. + * @param anchorSize The size of the anchor circle, if this constraint has anchors. If `null` it will use the World Debug Config value. + */ + setConstraintRenderStyle(constraint: MatterJS.ConstraintType, lineColor?: number, lineOpacity?: number, lineThickness?: number, pinSize?: number, anchorColor?: number, anchorSize?: number): this; + + /** + * This internal method acts as a proxy between all of the Matter JS events and then re-emits them + * via this class. + */ + setEventsProxy(): void; + + /** + * Sets the bounds of the Physics world to match the given world pixel dimensions. + * + * You can optionally set which 'walls' to create: left, right, top or bottom. + * If none of the walls are given it will default to use the walls settings it had previously. + * I.e. if you previously told it to not have the left or right walls, and you then adjust the world size + * the newly created bounds will also not have the left and right walls. + * Explicitly state them in the parameters to override this. + * @param x The x coordinate of the top-left corner of the bounds. Default 0. + * @param y The y coordinate of the top-left corner of the bounds. Default 0. + * @param width The width of the bounds. + * @param height The height of the bounds. + * @param thickness The thickness of each wall, in pixels. Default 64. + * @param left If true will create the left bounds wall. Default true. + * @param right If true will create the right bounds wall. Default true. + * @param top If true will create the top bounds wall. Default true. + * @param bottom If true will create the bottom bounds wall. Default true. + */ + setBounds(x?: number, y?: number, width?: number, height?: number, thickness?: number, left?: boolean, right?: boolean, top?: boolean, bottom?: boolean): Phaser.Physics.Matter.World; + + /** + * Updates the 4 rectangle bodies that were created, if `setBounds` was set in the Matter config, to use + * the new positions and sizes. This method is usually only called internally via the `setBounds` method. + * @param add `true` if the walls are being added or updated, `false` to remove them from the world. + * @param position Either `left`, `right`, `top` or `bottom`. Only optional if `add` is `false`. + * @param x The horizontal position to place the walls at. Only optional if `add` is `false`. + * @param y The vertical position to place the walls at. Only optional if `add` is `false`. + * @param width The width of the walls, in pixels. Only optional if `add` is `false`. + * @param height The height of the walls, in pixels. Only optional if `add` is `false`. + */ + updateWall(add: boolean, position?: string, x?: number, y?: number, width?: number, height?: number): void; + + /** + * Creates a Phaser.GameObjects.Graphics object that is used to render all of the debug bodies and joints to. + * + * This method is called automatically by the constructor, if debugging has been enabled. + * + * The created Graphics object is automatically added to the Scene at 0x0 and given a depth of `Number.MAX_VALUE`, + * so it renders above all else in the Scene. + * + * The Graphics object is assigned to the `debugGraphic` property of this class and `drawDebug` is enabled. + */ + createDebugGraphic(): Phaser.GameObjects.Graphics; + + /** + * Sets the world gravity and gravity scale to 0. + */ + disableGravity(): this; + + /** + * Sets the worlds gravity to the values given. + * + * Gravity effects all bodies in the world, unless they have the `ignoreGravity` flag set. + * @param x The world gravity x component. Default 0. + * @param y The world gravity y component. Default 1. + * @param scale The gravity scale factor. Default 0.001. + */ + setGravity(x?: number, y?: number, scale?: number): this; + + /** + * Creates a rectangle Matter body and adds it to the world. + * @param x The horizontal position of the body in the world. + * @param y The vertical position of the body in the world. + * @param width The width of the body. + * @param height The height of the body. + * @param options Optional Matter configuration object. + */ + create(x: number, y: number, width: number, height: number, options: object): MatterJS.BodyType; + + /** + * Adds a Matter JS object, or array of objects, to the world. + * + * The objects should be valid Matter JS entities, such as a Body, Composite or Constraint. + * + * Triggers `beforeAdd` and `afterAdd` events. + * @param object Can be single object, or an array, and can be a body, composite or constraint. + */ + add(object: object | object[]): this; + + /** + * Removes a Matter JS object, or array of objects, from the world. + * + * The objects should be valid Matter JS entities, such as a Body, Composite or Constraint. + * + * Triggers `beforeRemove` and `afterRemove` events. + * @param object Can be single object, or an array, and can be a body, composite or constraint. + * @param deep Optionally search the objects children and recursively remove those as well. Default false. + */ + remove(object: object | object[], deep?: boolean): this; + + /** + * Removes a Matter JS constraint, or array of constraints, from the world. + * + * Triggers `beforeRemove` and `afterRemove` events. + * @param constraint A Matter JS Constraint, or an array of constraints, to be removed. + * @param deep Optionally search the objects children and recursively remove those as well. Default false. + */ + removeConstraint(constraint: MatterJS.ConstraintType | MatterJS.ConstraintType[], deep?: boolean): this; + + /** + * Adds `MatterTileBody` instances for all the colliding tiles within the given tilemap layer. + * + * Set the appropriate tiles in your layer to collide before calling this method! + * + * If you modify the map after calling this method, i.e. via a function like `putTileAt` then + * you should call the `Phaser.Physics.Matter.World.convertTiles` function directly, passing + * it an array of the tiles you've added to your map. + * @param tilemapLayer An array of tiles. + * @param options Options to be passed to the MatterTileBody constructor. {@see Phaser.Physics.Matter.TileBody} + */ + convertTilemapLayer(tilemapLayer: Phaser.Tilemaps.TilemapLayer, options?: object): this; + + /** + * Creates `MatterTileBody` instances for all of the given tiles. This creates bodies regardless of whether the + * tiles are set to collide or not, or if they have a body already, or not. + * + * If you wish to pass an array of tiles that may already have bodies, you should filter the array before hand. + * @param tiles An array of tiles. + * @param options Options to be passed to the MatterTileBody constructor. {@see Phaser.Physics.Matter.TileBody} + */ + convertTiles(tiles: Phaser.Tilemaps.Tile[], options?: object): this; + + /** + * Returns the next unique group index for which bodies will collide. + * If `isNonColliding` is `true`, returns the next unique group index for which bodies will not collide. + * @param isNonColliding If `true`, returns the next unique group index for which bodies will _not_ collide. Default false. + */ + nextGroup(isNonColliding?: boolean): number; + + /** + * Returns the next unique category bitfield (starting after the initial default category 0x0001). + * There are 32 available. + */ + nextCategory(): number; + + /** + * Pauses this Matter World instance and sets `enabled` to `false`. + * + * A paused world will not run any simulations for the duration it is paused. + */ + pause(): this; + + /** + * Resumes this Matter World instance from a paused state and sets `enabled` to `true`. + */ + resume(): this; + + /** + * The internal update method. This is called automatically by the parent Scene. + * + * Moves the simulation forward in time by delta ms. Uses `World.correction` value as an optional number that + * specifies the time correction factor to apply to the update. This can help improve the accuracy of the + * simulation in cases where delta is changing between updates. The value of correction is defined as `delta / lastDelta`, + * i.e. the percentage change of delta over the last step. Therefore the value is always 1 (no correction) when + * delta is constant (or when no correction is desired, which is the default). + * See the paper on Time Corrected Verlet for more information. + * + * Triggers `beforeUpdate` and `afterUpdate` events. Triggers `collisionStart`, `collisionActive` and `collisionEnd` events. + * + * If the World is paused, `update` is still run, but exits early and does not update the Matter Engine. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(time: number, delta: number): void; + + /** + * Manually advances the physics simulation by one iteration. + * + * You can optionally pass in the `delta` and `correction` values to be used by Engine.update. + * If undefined they use the Matter defaults of 60Hz and no correction. + * + * Calling `step` directly bypasses any checks of `enabled` or `autoUpdate`. + * + * It also ignores any custom `getDelta` functions, as you should be passing the delta + * value in to this call. + * + * You can adjust the number of iterations that Engine.update performs internally. + * Use the Scene Matter Physics config object to set the following properties: + * + * positionIterations (defaults to 6) + * velocityIterations (defaults to 4) + * constraintIterations (defaults to 2) + * + * Adjusting these values can help performance in certain situations, depending on the physics requirements + * of your game. + * @param delta The delta value. Default 16.666. + */ + step(delta?: number): void; + + /** + * Runs the Matter Engine.update at a fixed timestep of 60Hz. + */ + update60Hz(): number; + + /** + * Runs the Matter Engine.update at a fixed timestep of 30Hz. + */ + update30Hz(): number; + + /** + * Returns `true` if the given body can be found within the World. + * @param body The Matter Body, or Game Object, to search for within the world. + */ + has(body: MatterJS.Body | Phaser.GameObjects.GameObject): MatterJS.BodyType[]; + + /** + * Returns all the bodies in the Matter World, including all bodies in children, recursively. + */ + getAllBodies(): MatterJS.BodyType[]; + + /** + * Returns all the constraints in the Matter World, including all constraints in children, recursively. + */ + getAllConstraints(): MatterJS.ConstraintType[]; + + /** + * Returns all the composites in the Matter World, including all composites in children, recursively. + */ + getAllComposites(): MatterJS.CompositeType[]; + + /** + * Renders the Engine Broadphase Controller Grid to the given Graphics instance. + * + * The debug renderer calls this method if the `showBroadphase` config value is set. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render the Grid to your own Graphics instance. + * @param grid The Matter Grid to be rendered. + * @param graphics The Graphics object to render to. + * @param lineColor The line color. + * @param lineOpacity The line opacity, between 0 and 1. + */ + renderGrid(grid: MatterJS.Grid, graphics: Phaser.GameObjects.Graphics, lineColor: number, lineOpacity: number): this; + + /** + * Renders the list of Pair separations to the given Graphics instance. + * + * The debug renderer calls this method if the `showSeparations` config value is set. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render the Grid to your own Graphics instance. + * @param pairs An array of Matter Pairs to be rendered. + * @param graphics The Graphics object to render to. + * @param lineColor The line color. + */ + renderSeparations(pairs: MatterJS.Pair[], graphics: Phaser.GameObjects.Graphics, lineColor: number): this; + + /** + * Renders the list of collision points and normals to the given Graphics instance. + * + * The debug renderer calls this method if the `showCollisions` config value is set. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render the Grid to your own Graphics instance. + * @param pairs An array of Matter Pairs to be rendered. + * @param graphics The Graphics object to render to. + * @param lineColor The line color. + */ + renderCollisions(pairs: MatterJS.Pair[], graphics: Phaser.GameObjects.Graphics, lineColor: number): this; + + /** + * Renders the bounds of an array of Bodies to the given Graphics instance. + * + * If the body is a compound body, it will render the bounds for the parent compound. + * + * The debug renderer calls this method if the `showBounds` config value is set. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render bounds to your own Graphics instance. + * @param bodies An array of bodies from the localWorld. + * @param graphics The Graphics object to render to. + * @param lineColor The line color. + * @param lineOpacity The line opacity, between 0 and 1. + */ + renderBodyBounds(bodies: any[], graphics: Phaser.GameObjects.Graphics, lineColor: number, lineOpacity: number): void; + + /** + * Renders either all axes, or a single axis indicator, for an array of Bodies, to the given Graphics instance. + * + * The debug renderer calls this method if the `showAxes` or `showAngleIndicator` config values are set. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render bounds to your own Graphics instance. + * @param bodies An array of bodies from the localWorld. + * @param graphics The Graphics object to render to. + * @param showAxes If `true` it will render all body axes. If `false` it will render a single axis indicator. + * @param lineColor The line color. + * @param lineOpacity The line opacity, between 0 and 1. + */ + renderBodyAxes(bodies: any[], graphics: Phaser.GameObjects.Graphics, showAxes: boolean, lineColor: number, lineOpacity: number): void; + + /** + * Renders a velocity indicator for an array of Bodies, to the given Graphics instance. + * + * The debug renderer calls this method if the `showVelocity` config value is set. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render bounds to your own Graphics instance. + * @param bodies An array of bodies from the localWorld. + * @param graphics The Graphics object to render to. + * @param lineColor The line color. + * @param lineOpacity The line opacity, between 0 and 1. + * @param lineThickness The line thickness. + */ + renderBodyVelocity(bodies: any[], graphics: Phaser.GameObjects.Graphics, lineColor: number, lineOpacity: number, lineThickness: number): void; + + /** + * Renders a single Matter Body to the given Phaser Graphics Game Object. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render a Body to your own Graphics instance. + * + * If you don't wish to render a line around the body, set the `lineColor` parameter to `null`. + * Equally, if you don't wish to render a fill, set the `fillColor` parameter to `null`. + * @param body The Matter Body to be rendered. + * @param graphics The Graphics object to render to. + * @param showInternalEdges Render internal edges of the polygon? + * @param lineColor The line color. + * @param lineOpacity The line opacity, between 0 and 1. + * @param lineThickness The line thickness. Default 1. + * @param fillColor The fill color. + * @param fillOpacity The fill opacity, between 0 and 1. + */ + renderBody(body: MatterJS.BodyType, graphics: Phaser.GameObjects.Graphics, showInternalEdges: boolean, lineColor?: number, lineOpacity?: number, lineThickness?: number, fillColor?: number, fillOpacity?: number): this; + + /** + * Renders the Convex Hull for a single Matter Body to the given Phaser Graphics Game Object. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render a Body hull to your own Graphics instance. + * @param body The Matter Body to be rendered. + * @param graphics The Graphics object to render to. + * @param hullColor The color used to render the hull. + * @param lineThickness The hull line thickness. Default 1. + */ + renderConvexHull(body: MatterJS.BodyType, graphics: Phaser.GameObjects.Graphics, hullColor: number, lineThickness?: number): this; + + /** + * Renders a single Matter Constraint, such as a Pin or a Spring, to the given Phaser Graphics Game Object. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render a Constraint to your own Graphics instance. + * @param constraint The Matter Constraint to render. + * @param graphics The Graphics object to render to. + * @param lineColor The line color. + * @param lineOpacity The line opacity, between 0 and 1. + * @param lineThickness The line thickness. + * @param pinSize If this constraint is a pin, this sets the size of the pin circle. + * @param anchorColor The color used when rendering this constraints anchors. Set to `null` to not render anchors. + * @param anchorSize The size of the anchor circle, if this constraint has anchors and is rendering them. + */ + renderConstraint(constraint: MatterJS.ConstraintType, graphics: Phaser.GameObjects.Graphics, lineColor: number, lineOpacity: number, lineThickness: number, pinSize: number, anchorColor: number, anchorSize: number): this; + + /** + * Resets the internal collision IDs that Matter.JS uses for Body collision groups. + * + * You should call this before destroying your game if you need to restart the game + * again on the same page, without first reloading the page. Or, if you wish to + * consistently destroy a Scene that contains Matter.js and then run it again + * later in the same game. + */ + resetCollisionIDs(): void; + + /** + * Will remove all Matter physics event listeners and clear the matter physics world, + * engine and any debug graphics, if any. + */ + shutdown(): void; + + /** + * Will remove all Matter physics event listeners and clear the matter physics world, + * engine and any debug graphics, if any. + * + * After destroying the world it cannot be re-used again. + */ + destroy(): void; + + } + + } + + } + + namespace Plugins { + /** + * A Global Plugin is installed just once into the Game owned Plugin Manager. + * It can listen for Game events and respond to them. + */ + class BasePlugin { + /** + * + * @param pluginManager A reference to the Plugin Manager. + */ + constructor(pluginManager: Phaser.Plugins.PluginManager); + + /** + * A handy reference to the Plugin Manager that is responsible for this plugin. + * Can be used as a route to gain access to game systems and events. + */ + protected pluginManager: Phaser.Plugins.PluginManager; + + /** + * A reference to the Game instance this plugin is running under. + */ + protected game: Phaser.Game; + + /** + * The PluginManager calls this method on a Global Plugin when the plugin is first instantiated. + * It will never be called again on this instance. + * In here you can set-up whatever you need for this plugin to run. + * If a plugin is set to automatically start then `BasePlugin.start` will be called immediately after this. + * On a Scene Plugin, this method is never called. Use {@link Phaser.Plugins.ScenePlugin#boot} instead. + * @param data A value specified by the user, if any, from the `data` property of the plugin's configuration object (if started at game boot) or passed in the PluginManager's `install` method (if started manually). + */ + init(data?: any | undefined): void; + + /** + * The PluginManager calls this method on a Global Plugin when the plugin is started. + * If a plugin is stopped, and then started again, this will get called again. + * Typically called immediately after `BasePlugin.init`. + * On a Scene Plugin, this method is never called. + */ + start(): void; + + /** + * The PluginManager calls this method on a Global Plugin when the plugin is stopped. + * The game code has requested that your plugin stop doing whatever it does. + * It is now considered as 'inactive' by the PluginManager. + * Handle that process here (i.e. stop listening for events, etc) + * If the plugin is started again then `BasePlugin.start` will be called again. + * On a Scene Plugin, this method is never called. + */ + stop(): void; + + /** + * Game instance has been destroyed. + * You must release everything in here, all references, all objects, free it all up. + */ + destroy(): void; + + } + + /** + * The Default Plugins. + */ + namespace DefaultPlugins { + /** + * These are the Global Managers that are created by the Phaser.Game instance. + * They are referenced from Scene.Systems so that plugins can use them. + */ + var Global: any[]; + + /** + * These are the core plugins that are installed into every Scene.Systems instance, no matter what. + * They are optionally exposed in the Scene as well (see the InjectionMap for details) + * + * They are created in the order in which they appear in this array and EventEmitter is always first. + */ + var CoreScene: any[]; + + /** + * These plugins are created in Scene.Systems in addition to the CoreScenePlugins. + * + * You can elect not to have these plugins by either creating a DefaultPlugins object as part + * of the Game Config, by creating a Plugins object as part of a Scene Config, or by modifying this array + * and building your own bundle. + * + * They are optionally exposed in the Scene as well (see the InjectionMap for details) + * + * They are always created in the order in which they appear in the array. + */ + var DefaultScene: any[]; + + } + + namespace PluginCache { + /** + * Static method called directly by the Core internal Plugins. + * Key is a reference used to get the plugin from the plugins object (i.e. InputPlugin) + * Plugin is the object to instantiate to create the plugin + * Mapping is what the plugin is injected into the Scene.Systems as (i.e. input) + * @param key A reference used to get this plugin from the plugin cache. + * @param plugin The plugin to be stored. Should be the core object, not instantiated. + * @param mapping If this plugin is to be injected into the Scene Systems, this is the property key map used. + * @param custom Core Scene plugin or a Custom Scene plugin? Default false. + */ + function register(key: string, plugin: Function, mapping: string, custom?: boolean): void; + + /** + * Stores a custom plugin in the global plugin cache. + * The key must be unique, within the scope of the cache. + * @param key A reference used to get this plugin from the plugin cache. + * @param plugin The plugin to be stored. Should be the core object, not instantiated. + * @param mapping If this plugin is to be injected into the Scene Systems, this is the property key map used. + * @param data A value to be passed to the plugin's `init` method. + */ + function registerCustom(key: string, plugin: Function, mapping: string, data: any | undefined): void; + + /** + * Checks if the given key is already being used in the core plugin cache. + * @param key The key to check for. + */ + function hasCore(key: string): boolean; + + /** + * Checks if the given key is already being used in the custom plugin cache. + * @param key The key to check for. + */ + function hasCustom(key: string): boolean; + + /** + * Returns the core plugin object from the cache based on the given key. + * @param key The key of the core plugin to get. + */ + function getCore(key: string): Phaser.Types.Plugins.CorePluginContainer; + + /** + * Returns the custom plugin object from the cache based on the given key. + * @param key The key of the custom plugin to get. + */ + function getCustom(key: string): Phaser.Types.Plugins.CustomPluginContainer; + + /** + * Returns an object from the custom cache based on the given key that can be instantiated. + * @param key The key of the custom plugin to get. + */ + function getCustomClass(key: string): Function; + + /** + * Removes a core plugin based on the given key. + * @param key The key of the core plugin to remove. + */ + function remove(key: string): void; + + /** + * Removes a custom plugin based on the given key. + * @param key The key of the custom plugin to remove. + */ + function removeCustom(key: string): void; + + /** + * Removes all Core Plugins. + * + * This includes all of the internal system plugins that Phaser needs, like the Input Plugin and Loader Plugin. + * So be sure you only call this if you do not wish to run Phaser again. + */ + function destroyCorePlugins(): void; + + /** + * Removes all Custom Plugins. + */ + function destroyCustomPlugins(): void; + + } + + /** + * The PluginManager is responsible for installing and adding plugins to Phaser. + * + * It is a global system and therefore belongs to the Game instance, not a specific Scene. + * + * It works in conjunction with the PluginCache. Core internal plugins automatically register themselves + * with the Cache, but it's the Plugin Manager that is responsible for injecting them into the Scenes. + * + * There are two types of plugin: + * + * 1. A Global Plugin + * 2. A Scene Plugin + * + * A Global Plugin is a plugin that lives within the Plugin Manager rather than a Scene. You can get + * access to it by calling `PluginManager.get` and providing a key. Any Scene that requests a plugin in + * this way will all get access to the same plugin instance, allowing you to use a single plugin across + * multiple Scenes. + * + * A Scene Plugin is a plugin dedicated to running within a Scene. These are different to Global Plugins + * in that their instances do not live within the Plugin Manager, but within the Scene Systems class instead. + * And that every Scene created is given its own unique instance of a Scene Plugin. Examples of core Scene + * Plugins include the Input Plugin, the Tween Plugin and the physics Plugins. + * + * You can add a plugin to Phaser in three different ways: + * + * 1. Preload it + * 2. Include it in your source code and install it via the Game Config + * 3. Include it in your source code and install it within a Scene + * + * For examples of all of these approaches please see the Phaser 3 Examples Repo `plugins` folder. + * + * For information on creating your own plugin please see the Phaser 3 Plugin Template. + */ + class PluginManager { + /** + * + * @param game The game instance that owns this Plugin Manager. + */ + constructor(game: Phaser.Game); + + /** + * The game instance that owns this Plugin Manager. + */ + game: Phaser.Game; + + /** + * The global plugins currently running and managed by this Plugin Manager. + * A plugin must have been started at least once in order to appear in this list. + */ + plugins: Phaser.Types.Plugins.GlobalPlugin[]; + + /** + * A list of plugin keys that should be installed into Scenes as well as the Core Plugins. + */ + scenePlugins: string[]; + + /** + * Run once the game has booted and installs all of the plugins configured in the Game Config. + */ + protected boot(): void; + + /** + * Called by the Scene Systems class. Tells the plugin manager to install all Scene plugins into it. + * + * First it will install global references, i.e. references from the Game systems into the Scene Systems (and Scene if mapped.) + * Then it will install Core Scene Plugins followed by Scene Plugins registered with the PluginManager. + * Finally it will install any references to Global Plugins that have a Scene mapping property into the Scene itself. + * @param sys The Scene Systems class to install all the plugins in to. + * @param globalPlugins An array of global plugins to install. + * @param scenePlugins An array of scene plugins to install. + */ + protected addToScene(sys: Phaser.Scenes.Systems, globalPlugins: any[], scenePlugins: any[]): void; + + /** + * Called by the Scene Systems class. Returns a list of plugins to be installed. + */ + protected getDefaultScenePlugins(): string[]; + + /** + * Installs a new Scene Plugin into the Plugin Manager and optionally adds it + * to the given Scene as well. A Scene Plugin added to the manager in this way + * will be automatically installed into all new Scenes using the key and mapping given. + * + * The `key` property is what the plugin is injected into Scene.Systems as. + * The `mapping` property is optional, and if specified is what the plugin is installed into + * the Scene as. For example: + * + * ```javascript + * this.plugins.installScenePlugin('powerupsPlugin', pluginCode, 'powerups'); + * + * // and from within the scene: + * this.sys.powerupsPlugin; // key value + * this.powerups; // mapping value + * ``` + * + * This method is called automatically by Phaser if you install your plugins using either the + * Game Configuration object, or by preloading them via the Loader. + * @param key The property key that will be used to add this plugin to Scene.Systems. + * @param plugin The plugin code. This should be the non-instantiated version. + * @param mapping If this plugin is injected into the Phaser.Scene class, this is the property key to use. + * @param addToScene Optionally automatically add this plugin to the given Scene. + * @param fromLoader Is this being called by the Loader? Default false. + */ + installScenePlugin(key: string, plugin: Function, mapping?: string, addToScene?: Phaser.Scene, fromLoader?: boolean): void; + + /** + * Installs a new Global Plugin into the Plugin Manager and optionally starts it running. + * A global plugin belongs to the Plugin Manager, rather than a specific Scene, and can be accessed + * and used by all Scenes in your game. + * + * The `key` property is what you use to access this plugin from the Plugin Manager. + * + * ```javascript + * this.plugins.install('powerupsPlugin', pluginCode); + * + * // and from within the scene: + * this.plugins.get('powerupsPlugin'); + * ``` + * + * This method is called automatically by Phaser if you install your plugins using either the + * Game Configuration object, or by preloading them via the Loader. + * + * The same plugin can be installed multiple times into the Plugin Manager by simply giving each + * instance its own unique key. + * @param key The unique handle given to this plugin within the Plugin Manager. + * @param plugin The plugin code. This should be the non-instantiated version. + * @param start Automatically start the plugin running? This is always `true` if you provide a mapping value. Default false. + * @param mapping If this plugin is injected into the Phaser.Scene class, this is the property key to use. + * @param data A value passed to the plugin's `init` method. + */ + install(key: string, plugin: Function, start?: boolean, mapping?: string, data?: any): Phaser.Plugins.BasePlugin | null; + + /** + * Gets an index of a global plugin based on the given key. + * @param key The unique plugin key. + */ + protected getIndex(key: string): number; + + /** + * Gets a global plugin based on the given key. + * @param key The unique plugin key. + */ + protected getEntry(key: string): Phaser.Types.Plugins.GlobalPlugin; + + /** + * Checks if the given global plugin, based on its key, is active or not. + * @param key The unique plugin key. + */ + isActive(key: string): boolean; + + /** + * Starts a global plugin running. + * + * If the plugin was previously active then calling `start` will reset it to an active state and then + * call its `start` method. + * + * If the plugin has never been run before a new instance of it will be created within the Plugin Manager, + * its active state set and then both of its `init` and `start` methods called, in that order. + * + * If the plugin is already running under the given key then nothing happens. + * @param key The key of the plugin to start. + * @param runAs Run the plugin under a new key. This allows you to run one plugin multiple times. + */ + start(key: string, runAs?: string): Phaser.Plugins.BasePlugin | null; + + /** + * Stops a global plugin from running. + * + * If the plugin is active then its active state will be set to false and the plugins `stop` method + * will be called. + * + * If the plugin is not already running, nothing will happen. + * @param key The key of the plugin to stop. + */ + stop(key: string): this; + + /** + * Gets a global plugin from the Plugin Manager based on the given key and returns it. + * + * If it cannot find an active plugin based on the key, but there is one in the Plugin Cache with the same key, + * then it will create a new instance of the cached plugin and return that. + * @param key The key of the plugin to get. + * @param autoStart Automatically start a new instance of the plugin if found in the cache, but not actively running. Default true. + */ + get(key: string, autoStart?: boolean): Phaser.Plugins.BasePlugin | Function | null; + + /** + * Returns the plugin class from the cache. + * Used internally by the Plugin Manager. + * @param key The key of the plugin to get. + */ + getClass(key: string): Phaser.Plugins.BasePlugin; + + /** + * Removes a global plugin from the Plugin Manager and Plugin Cache. + * + * It is up to you to remove all references to this plugin that you may hold within your game code. + * @param key The key of the plugin to remove. + */ + removeGlobalPlugin(key: string): void; + + /** + * Removes a scene plugin from the Plugin Manager and Plugin Cache. + * + * This will not remove the plugin from any active Scenes that are already using it. + * + * It is up to you to remove all references to this plugin that you may hold within your game code. + * @param key The key of the plugin to remove. + */ + removeScenePlugin(key: string): void; + + /** + * Registers a new type of Game Object with the global Game Object Factory and / or Creator. + * This is usually called from within your Plugin code and is a helpful short-cut for creating + * new Game Objects. + * + * The key is the property that will be injected into the factories and used to create the + * Game Object. For example: + * + * ```javascript + * this.plugins.registerGameObject('clown', clownFactoryCallback, clownCreatorCallback); + * // later in your game code: + * this.add.clown(); + * this.make.clown(); + * ``` + * + * The callbacks are what are called when the factories try to create a Game Object + * matching the given key. It's important to understand that the callbacks are invoked within + * the context of the GameObjectFactory. In this context there are several properties available + * to use: + * + * this.scene - A reference to the Scene that owns the GameObjectFactory. + * this.displayList - A reference to the Display List the Scene owns. + * this.updateList - A reference to the Update List the Scene owns. + * + * See the GameObjectFactory and GameObjectCreator classes for more details. + * Any public property or method listed is available from your callbacks under `this`. + * @param key The key of the Game Object that the given callbacks will create, i.e. `image`, `sprite`. + * @param factoryCallback The callback to invoke when the Game Object Factory is called. + * @param creatorCallback The callback to invoke when the Game Object Creator is called. + */ + registerGameObject(key: string, factoryCallback?: Function, creatorCallback?: Function): void; + + /** + * Removes a previously registered Game Object from the global Game Object Factory and / or Creator. + * This is usually called from within your Plugin destruction code to help clean-up after your plugin has been removed. + * @param key The key of the Game Object to be removed from the factories. + * @param removeFromFactory Should the Game Object be removed from the Game Object Factory? Default true. + * @param removeFromCreator Should the Game Object be removed from the Game Object Creator? Default true. + */ + removeGameObject(key: string, removeFromFactory?: boolean, removeFromCreator?: boolean): void; + + /** + * Registers a new file type with the global File Types Manager, making it available to all Loader + * Plugins created after this. + * + * This is usually called from within your Plugin code and is a helpful short-cut for creating + * new loader file types. + * + * The key is the property that will be injected into the Loader Plugin and used to load the + * files. For example: + * + * ```javascript + * this.plugins.registerFileType('wad', doomWadLoaderCallback); + * // later in your preload code: + * this.load.wad(); + * ``` + * + * The callback is what is called when the loader tries to load a file matching the given key. + * It's important to understand that the callback is invoked within + * the context of the LoaderPlugin. In this context there are several properties / methods available + * to use: + * + * this.addFile - A method to add the new file to the load queue. + * this.scene - The Scene that owns the Loader Plugin instance. + * + * See the LoaderPlugin class for more details. Any public property or method listed is available from + * your callback under `this`. + * @param key The key of the Game Object that the given callbacks will create, i.e. `image`, `sprite`. + * @param callback The callback to invoke when the Game Object Factory is called. + * @param addToScene Optionally add this file type into the Loader Plugin owned by the given Scene. + */ + registerFileType(key: string, callback: Function, addToScene?: Phaser.Scene): void; + + /** + * Destroys this Plugin Manager and all associated plugins. + * It will iterate all plugins found and call their `destroy` methods. + * + * The PluginCache will remove all custom plugins. + */ + destroy(): void; + + } + + /** + * A Scene Level Plugin is installed into every Scene and belongs to that Scene. + * It can listen for Scene events and respond to them. + * It can map itself to a Scene property, or into the Scene Systems, or both. + */ + class ScenePlugin extends Phaser.Plugins.BasePlugin { + /** + * + * @param scene A reference to the Scene that has installed this plugin. + * @param pluginManager A reference to the Plugin Manager. + * @param pluginKey The key under which this plugin has been installed into the Scene Systems. + */ + constructor(scene: Phaser.Scene, pluginManager: Phaser.Plugins.PluginManager, pluginKey: string); + + /** + * A reference to the Scene that has installed this plugin. + * Only set if it's a Scene Plugin, otherwise `null`. + * This property is only set when the plugin is instantiated and added to the Scene, not before. + * You can use it during the `boot` method. + */ + protected scene: Phaser.Scene | null; + + /** + * A reference to the Scene Systems of the Scene that has installed this plugin. + * Only set if it's a Scene Plugin, otherwise `null`. + * This property is only set when the plugin is instantiated and added to the Scene, not before. + * You can use it during the `boot` method. + */ + protected systems: Phaser.Scenes.Systems | null; + + /** + * The key under which this plugin was installed into the Scene Systems. + * + * This property is only set when the plugin is instantiated and added to the Scene, not before. + * You can use it during the `boot` method. + */ + readonly pluginKey: string; + + /** + * This method is called when the Scene boots. It is only ever called once. + * + * By this point the plugin properties `scene` and `systems` will have already been set. + * + * In here you can listen for {@link Phaser.Scenes.Events Scene events} and set-up whatever you need for this plugin to run. + * Here are the Scene events you can listen to: + * + * - start + * - ready + * - preupdate + * - update + * - postupdate + * - resize + * - pause + * - resume + * - sleep + * - wake + * - transitioninit + * - transitionstart + * - transitioncomplete + * - transitionout + * - shutdown + * - destroy + * + * At the very least you should offer a destroy handler for when the Scene closes down, i.e: + * + * ```javascript + * var eventEmitter = this.systems.events; + * eventEmitter.once('destroy', this.sceneDestroy, this); + * ``` + */ + boot(): void; + + /** + * Game instance has been destroyed. + * + * You must release everything in here, all references, all objects, free it all up. + */ + destroy(): void; + + } + + } + + /** + * Phaser Blend Modes. + */ + enum BlendModes { + /** + * Skips the Blend Mode check in the renderer. + */ + SKIP_CHECK, + /** + * Normal blend mode. For Canvas and WebGL. + * This is the default setting and draws new shapes on top of the existing canvas content. + */ + NORMAL, + /** + * Add blend mode. For Canvas and WebGL. + * Where both shapes overlap the color is determined by adding color values. + */ + ADD, + /** + * Multiply blend mode. For Canvas and WebGL. + * The pixels are of the top layer are multiplied with the corresponding pixel of the bottom layer. A darker picture is the result. + */ + MULTIPLY, + /** + * Screen blend mode. For Canvas and WebGL. + * The pixels are inverted, multiplied, and inverted again. A lighter picture is the result (opposite of multiply) + */ + SCREEN, + /** + * Overlay blend mode. For Canvas only. + * A combination of multiply and screen. Dark parts on the base layer become darker, and light parts become lighter. + */ + OVERLAY, + /** + * Darken blend mode. For Canvas only. + * Retains the darkest pixels of both layers. + */ + DARKEN, + /** + * Lighten blend mode. For Canvas only. + * Retains the lightest pixels of both layers. + */ + LIGHTEN, + /** + * Color Dodge blend mode. For Canvas only. + * Divides the bottom layer by the inverted top layer. + */ + COLOR_DODGE, + /** + * Color Burn blend mode. For Canvas only. + * Divides the inverted bottom layer by the top layer, and then inverts the result. + */ + COLOR_BURN, + /** + * Hard Light blend mode. For Canvas only. + * A combination of multiply and screen like overlay, but with top and bottom layer swapped. + */ + HARD_LIGHT, + /** + * Soft Light blend mode. For Canvas only. + * A softer version of hard-light. Pure black or white does not result in pure black or white. + */ + SOFT_LIGHT, + /** + * Difference blend mode. For Canvas only. + * Subtracts the bottom layer from the top layer or the other way round to always get a positive value. + */ + DIFFERENCE, + /** + * Exclusion blend mode. For Canvas only. + * Like difference, but with lower contrast. + */ + EXCLUSION, + /** + * Hue blend mode. For Canvas only. + * Preserves the luma and chroma of the bottom layer, while adopting the hue of the top layer. + */ + HUE, + /** + * Saturation blend mode. For Canvas only. + * Preserves the luma and hue of the bottom layer, while adopting the chroma of the top layer. + */ + SATURATION, + /** + * Color blend mode. For Canvas only. + * Preserves the luma of the bottom layer, while adopting the hue and chroma of the top layer. + */ + COLOR, + /** + * Luminosity blend mode. For Canvas only. + * Preserves the hue and chroma of the bottom layer, while adopting the luma of the top layer. + */ + LUMINOSITY, + /** + * Alpha erase blend mode. For Canvas and WebGL. + */ + ERASE, + /** + * Source-in blend mode. For Canvas only. + * The new shape is drawn only where both the new shape and the destination canvas overlap. Everything else is made transparent. + */ + SOURCE_IN, + /** + * Source-out blend mode. For Canvas only. + * The new shape is drawn where it doesn't overlap the existing canvas content. + */ + SOURCE_OUT, + /** + * Source-out blend mode. For Canvas only. + * The new shape is only drawn where it overlaps the existing canvas content. + */ + SOURCE_ATOP, + /** + * Destination-over blend mode. For Canvas only. + * New shapes are drawn behind the existing canvas content. + */ + DESTINATION_OVER, + /** + * Destination-in blend mode. For Canvas only. + * The existing canvas content is kept where both the new shape and existing canvas content overlap. Everything else is made transparent. + */ + DESTINATION_IN, + /** + * Destination-out blend mode. For Canvas only. + * The existing content is kept where it doesn't overlap the new shape. + */ + DESTINATION_OUT, + /** + * Destination-out blend mode. For Canvas only. + * The existing canvas is only kept where it overlaps the new shape. The new shape is drawn behind the canvas content. + */ + DESTINATION_ATOP, + /** + * Lighten blend mode. For Canvas only. + * Where both shapes overlap the color is determined by adding color values. + */ + LIGHTER, + /** + * Copy blend mode. For Canvas only. + * Only the new shape is shown. + */ + COPY, + /** + * Xor blend mode. For Canvas only. + * Shapes are made transparent where both overlap and drawn normal everywhere else. + */ + XOR, + } + + namespace Renderer { + namespace Canvas { + /** + * The Canvas Renderer is responsible for managing 2D canvas rendering contexts, + * including the one used by the Games canvas. It tracks the internal state of a + * given context and can renderer textured Game Objects to it, taking into + * account alpha, blending, and scaling. + */ + class CanvasRenderer extends Phaser.Events.EventEmitter { + /** + * + * @param game The Phaser Game instance that owns this renderer. + */ + constructor(game: Phaser.Game); + + /** + * The local configuration settings of the CanvasRenderer. + */ + config: object; + + /** + * The Phaser Game instance that owns this renderer. + */ + game: Phaser.Game; + + /** + * A constant which allows the renderer to be easily identified as a Canvas Renderer. + */ + type: number; + + /** + * The total number of Game Objects which were rendered in a frame. + */ + drawCount: number; + + /** + * The width of the canvas being rendered to. + */ + width: number; + + /** + * The height of the canvas being rendered to. + */ + height: number; + + /** + * The canvas element which the Game uses. + */ + gameCanvas: HTMLCanvasElement; + + /** + * The canvas context used to render all Cameras in all Scenes during the game loop. + */ + gameContext: CanvasRenderingContext2D; + + /** + * The canvas context currently used by the CanvasRenderer for all rendering operations. + */ + currentContext: CanvasRenderingContext2D; + + /** + * Should the Canvas use Image Smoothing or not when drawing Sprites? + */ + antialias: boolean; + + /** + * The blend modes supported by the Canvas Renderer. + * + * This object maps the {@link Phaser.BlendModes} to canvas compositing operations. + */ + blendModes: any[]; + + /** + * Details about the currently scheduled snapshot. + * + * If a non-null `callback` is set in this object, a snapshot of the canvas will be taken after the current frame is fully rendered. + */ + snapshotState: Phaser.Types.Renderer.Snapshot.SnapshotState; + + /** + * Has this renderer fully booted yet? + */ + isBooted: boolean; + + /** + * Prepares the game canvas for rendering. + */ + init(): void; + + /** + * The event handler that manages the `resize` event dispatched by the Scale Manager. + * @param gameSize The default Game Size object. This is the un-modified game dimensions. + * @param baseSize The base Size object. The game dimensions multiplied by the resolution. The canvas width / height values match this. + */ + onResize(gameSize: Phaser.Structs.Size, baseSize: Phaser.Structs.Size): void; + + /** + * Resize the main game canvas. + * @param width The new width of the renderer. + * @param height The new height of the renderer. + */ + resize(width?: number, height?: number): void; + + /** + * Resets the transformation matrix of the current context to the identity matrix, thus resetting any transformation. + */ + resetTransform(): void; + + /** + * Sets the blend mode (compositing operation) of the current context. + * @param blendMode The new blend mode which should be used. + */ + setBlendMode(blendMode: string): this; + + /** + * Changes the Canvas Rendering Context that all draw operations are performed against. + * @param ctx The new Canvas Rendering Context to draw everything to. Leave empty to reset to the Game Canvas. + */ + setContext(ctx?: CanvasRenderingContext2D | undefined): this; + + /** + * Sets the global alpha of the current context. + * @param alpha The new alpha to use, where 0 is fully transparent and 1 is fully opaque. + */ + setAlpha(alpha: number): this; + + /** + * Called at the start of the render loop. + */ + preRender(): void; + + /** + * The core render step for a Scene Camera. + * + * Iterates through the given array of Game Objects and renders them with the given Camera. + * + * This is called by the `CameraManager.render` method. The Camera Manager instance belongs to a Scene, and is invoked + * by the Scene Systems.render method. + * + * This method is not called if `Camera.visible` is `false`, or `Camera.alpha` is zero. + * @param scene The Scene to render. + * @param children An array of filtered Game Objects that can be rendered by the given Camera. + * @param camera The Scene Camera to render with. + */ + render(scene: Phaser.Scene, children: Phaser.GameObjects.GameObject[], camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Restores the game context's global settings and takes a snapshot if one is scheduled. + * + * The post-render step happens after all Cameras in all Scenes have been rendered. + */ + postRender(): void; + + /** + * Takes a snapshot of the given area of the given canvas. + * + * Unlike the other snapshot methods, this one is processed immediately and doesn't wait for the next render. + * + * Snapshots work by creating an Image object from the canvas data, this is a blocking process, which gets + * more expensive the larger the canvas size gets, so please be careful how you employ this in your game. + * @param canvas The canvas to grab from. + * @param callback The Function to invoke after the snapshot image is created. + * @param getPixel Grab a single pixel as a Color object, or an area as an Image object? Default false. + * @param x The x coordinate to grab from. Default 0. + * @param y The y coordinate to grab from. Default 0. + * @param width The width of the area to grab. Default canvas.width. + * @param height The height of the area to grab. Default canvas.height. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshotCanvas(canvas: HTMLCanvasElement, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, getPixel?: boolean, x?: number, y?: number, width?: number, height?: number, type?: string, encoderOptions?: number): this; + + /** + * Schedules a snapshot of the entire game viewport to be taken after the current frame is rendered. + * + * To capture a specific area see the `snapshotArea` method. To capture a specific pixel, see `snapshotPixel`. + * + * Only one snapshot can be active _per frame_. If you have already called `snapshotPixel`, for example, then + * calling this method will override it. + * + * Snapshots work by creating an Image object from the canvas data, this is a blocking process, which gets + * more expensive the larger the canvas size gets, so please be careful how you employ this in your game. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshot(callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Schedules a snapshot of the given area of the game viewport to be taken after the current frame is rendered. + * + * To capture the whole game viewport see the `snapshot` method. To capture a specific pixel, see `snapshotPixel`. + * + * Only one snapshot can be active _per frame_. If you have already called `snapshotPixel`, for example, then + * calling this method will override it. + * + * Snapshots work by creating an Image object from the canvas data, this is a blocking process, which gets + * more expensive the larger the canvas size gets, so please be careful how you employ this in your game. + * @param x The x coordinate to grab from. + * @param y The y coordinate to grab from. + * @param width The width of the area to grab. + * @param height The height of the area to grab. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshotArea(x: number, y: number, width: number, height: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Schedules a snapshot of the given pixel from the game viewport to be taken after the current frame is rendered. + * + * To capture the whole game viewport see the `snapshot` method. To capture a specific area, see `snapshotArea`. + * + * Only one snapshot can be active _per frame_. If you have already called `snapshotArea`, for example, then + * calling this method will override it. + * + * Unlike the other two snapshot methods, this one will return a `Color` object containing the color data for + * the requested pixel. It doesn't need to create an internal Canvas or Image object, so is a lot faster to execute, + * using less memory. + * @param x The x coordinate of the pixel to get. + * @param y The y coordinate of the pixel to get. + * @param callback The Function to invoke after the snapshot pixel data is extracted. + */ + snapshotPixel(x: number, y: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback): this; + + /** + * Takes a Sprite Game Object, or any object that extends it, and draws it to the current context. + * @param sprite The texture based Game Object to draw. + * @param frame The frame to draw, doesn't have to be that owned by the Game Object. + * @param camera The Camera to use for the rendering transform. + * @param parentTransformMatrix The transform matrix of the parent container, if set. + */ + batchSprite(sprite: Phaser.GameObjects.GameObject, frame: Phaser.Textures.Frame, camera: Phaser.Cameras.Scene2D.Camera, parentTransformMatrix?: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Destroys all object references in the Canvas Renderer. + */ + destroy(): void; + + } + + /** + * Returns an array which maps the default blend modes to supported Canvas blend modes. + * + * If the browser doesn't support a blend mode, it will default to the normal `source-over` blend mode. + */ + function GetBlendModes(): any[]; + + /** + * Takes a reference to the Canvas Renderer, a Canvas Rendering Context, a Game Object, a Camera and a parent matrix + * and then performs the following steps: + * + * 1. Checks the alpha of the source combined with the Camera alpha. If 0 or less it aborts. + * 2. Takes the Camera and Game Object matrix and multiplies them, combined with the parent matrix if given. + * 3. Sets the blend mode of the context to be that used by the Game Object. + * 4. Sets the alpha value of the context to be that used by the Game Object combined with the Camera. + * 5. Saves the context state. + * 6. Sets the final matrix values into the context via setTransform. + * 7. If the Game Object has a texture frame, imageSmoothingEnabled is set based on frame.source.scaleMode. + * 8. If the Game Object does not have a texture frame, imageSmoothingEnabled is set based on Renderer.antialias. + * + * This function is only meant to be used internally. Most of the Canvas Renderer classes use it. + * @param renderer A reference to the current active Canvas renderer. + * @param ctx The canvas context to set the transform on. + * @param src The Game Object being rendered. Can be any type that extends the base class. + * @param camera The Camera that is rendering the Game Object. + * @param parentMatrix A parent transform matrix to apply to the Game Object before rendering. + */ + function SetTransform(renderer: Phaser.Renderer.Canvas.CanvasRenderer, ctx: CanvasRenderingContext2D, src: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): boolean; + + } + + namespace Events { + /** + * The Lose WebGL Event. + * + * This event is dispatched by the WebGLRenderer when the WebGL context + * is lost. + * + * Context can be lost for a variety of reasons, like leaving the browser tab. + * The game canvas DOM object will dispatch `webglcontextlost`. + * All WebGL resources get wiped, and the context is reset. + * + * While WebGL is lost, the game will continue to run, but all WebGL resources + * are lost, and new ones cannot be created. + * + * Once the context is restored and the renderer has automatically restored + * the state, the renderer will emit a `RESTORE_WEBGL` event. At that point, + * it is safe to continue. + */ + const LOSE_WEBGL: string; + + /** + * The Post-Render Event. + * + * This event is dispatched by the Renderer when all rendering, for all cameras in all Scenes, + * has completed, but before any pending snap shots have been taken. + */ + const POST_RENDER: string; + + /** + * The Pre-Render Event. + * + * This event is dispatched by the Phaser Renderer. This happens right at the start of the render + * process, after the context has been cleared, the scissors enabled (WebGL only) and everything has been + * reset ready for the render. + */ + const PRE_RENDER: string; + + /** + * The Render Event. + * + * This event is dispatched by the Phaser Renderer for every camera in every Scene. + * + * It is dispatched before any of the children in the Scene have been rendered. + */ + const RENDER: string; + + /** + * The Renderer Resize Event. + * + * This event is dispatched by the Phaser Renderer when it is resized, usually as a result + * of the Scale Manager resizing. + */ + const RESIZE: string; + + /** + * The Restore WebGL Event. + * + * This event is dispatched by the WebGLRenderer when the WebGL context + * is restored. + * + * It is dispatched after all WebGL resources have been recreated. + * Most resources should come back automatically, but you will need to redraw + * dynamic textures that were GPU bound. + * Listen to this event to know when you can safely do that. + * + * Context can be lost for a variety of reasons, like leaving the browser tab. + * The game canvas DOM object will dispatch `webglcontextlost`. + * All WebGL resources get wiped, and the context is reset. + * + * Once the context is restored, the canvas will dispatch + * `webglcontextrestored`. Phaser uses this to re-create necessary resources. + * Please wait for Phaser to dispatch the `RESTORE_WEBGL` event before + * re-creating any resources of your own. + */ + const RESTORE_WEBGL: string; + + } + + namespace Snapshot { + /** + * Takes a snapshot of an area from the current frame displayed by a canvas. + * + * This is then copied to an Image object. When this loads, the results are sent + * to the callback provided in the Snapshot Configuration object. + * @param sourceCanvas The canvas to take a snapshot of. + * @param config The snapshot configuration object. + */ + function Canvas(sourceCanvas: HTMLCanvasElement, config: Phaser.Types.Renderer.Snapshot.SnapshotState): void; + + /** + * Takes a snapshot of an area from the current frame displayed by a WebGL canvas. + * + * This is then copied to an Image object. When this loads, the results are sent + * to the callback provided in the Snapshot Configuration object. + * @param sourceContext The WebGL context to take a snapshot of. + * @param config The snapshot configuration object. + */ + function WebGL(sourceContext: WebGLRenderingContext, config: Phaser.Types.Renderer.Snapshot.SnapshotState): void; + + } + + namespace WebGL { + /** + * 8-bit twos complement signed integer. + */ + var BYTE: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * 8-bit twos complement unsigned integer. + */ + var UNSIGNED_BYTE: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * 16-bit twos complement signed integer. + */ + var SHORT: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * 16-bit twos complement unsigned integer. + */ + var UNSIGNED_SHORT: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * 32-bit twos complement signed integer. + */ + var INT: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * 32-bit twos complement unsigned integer. + */ + var UNSIGNED_INT: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * 32-bit IEEE floating point number. + */ + var FLOAT: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * The Pipeline Manager is responsible for the creation, activation, running and destruction + * of WebGL Pipelines and Post FX Pipelines in Phaser 3. + * + * The `WebGLRenderer` owns a single instance of the Pipeline Manager, which you can access + * via the `WebGLRenderer.pipelines` property. + * + * By default, there are 9 pipelines installed into the Pipeline Manager when Phaser boots: + * + * 1. The Multi Pipeline. Responsible for all multi-texture rendering, i.e. Sprites and Tilemaps. + * 2. The Rope Pipeline. Responsible for rendering the Rope Game Object. + * 3. The Light Pipeline. Responsible for rendering the Light Game Object. + * 4. The Point Light Pipeline. Responsible for rendering the Point Light Game Object. + * 5. The Single Pipeline. Responsible for rendering Game Objects that explicitly require one bound texture. + * 6. The Bitmap Mask Pipeline. Responsible for Bitmap Mask rendering. + * 7. The Utility Pipeline. Responsible for providing lots of handy texture manipulation functions. + * 8. The Mobile Pipeline. Responsible for rendering on mobile with single-bound textures. + * 9. The FX Pipeline. Responsible for rendering Game Objects with special FX applied to them. + * + * You can add your own custom pipeline via the `PipelineManager.add` method. Pipelines are + * identified by unique string-based keys. + */ + class PipelineManager { + /** + * + * @param renderer A reference to the WebGL Renderer that owns this Pipeline Manager. + */ + constructor(renderer: Phaser.Renderer.WebGL.WebGLRenderer); + + /** + * A reference to the Game instance. + */ + game: Phaser.Game; + + /** + * A reference to the WebGL Renderer instance. + */ + renderer: Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * This map stores all pipeline classes available in this manager. + * + * The Utility Class must always come first. + */ + classes: Phaser.Structs.Map; + + /** + * This map stores all Post FX Pipeline classes available in this manager. + * + * As of v3.60 this is now populated by default with the following + * Post FX Pipelines: + * + * * Barrel + * * Bloom + * * Blur + * * Bokeh / TiltShift + * * Circle + * * ColorMatrix + * * Displacement + * * Glow + * * Gradient + * * Pixelate + * * Shadow + * * Shine + * * Vignette + * * Wipe + * + * These are added as part of the boot process. + * + * If you do not wish to add them, specify `disableFX: true` in your game config. + * + * See the FX Controller class for more details about each FX. + */ + postPipelineClasses: Phaser.Structs.Map; + + /** + * This map stores all pipeline instances in this manager. + * + * This is populated with the default pipelines in the `boot` method. + */ + pipelines: Phaser.Structs.Map; + + /** + * An array of all post-pipelines that are created by this manager. + */ + postPipelineInstances: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * The default Game Object pipeline. + */ + default: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * Current pipeline in use by the WebGLRenderer. + */ + current: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The previous WebGLPipeline that was in use. + * + * This is set when `clearPipeline` is called and restored in `rebindPipeline` if none is given. + */ + previous: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * A constant-style reference to the Multi Pipeline Instance. + * + * This is the default Phaser 3 pipeline and is used by the WebGL Renderer to manage + * camera effects and more. This property is set during the `boot` method. + */ + MULTI_PIPELINE: Phaser.Renderer.WebGL.Pipelines.MultiPipeline; + + /** + * A constant-style reference to the Bitmap Mask Pipeline Instance. + * + * This is the default Phaser 3 mask pipeline and is used Game Objects using + * a Bitmap Mask. This property is set during the `boot` method. + */ + BITMAPMASK_PIPELINE: Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline; + + /** + * A constant-style reference to the Utility Pipeline Instance. + */ + UTILITY_PIPELINE: Phaser.Renderer.WebGL.Pipelines.UtilityPipeline; + + /** + * A constant-style reference to the Mobile Pipeline Instance. + * + * This is the default Phaser 3 mobile pipeline and is used by the WebGL Renderer to manage + * camera effects and more on mobile devices. This property is set during the `boot` method. + */ + MOBILE_PIPELINE: Phaser.Renderer.WebGL.Pipelines.MobilePipeline; + + /** + * A constant-style reference to the FX Pipeline Instance. + * + * This is the default Phaser 3 FX pipeline and is used by the WebGL Renderer to manage + * Game Objects with special effects enabled. This property is set during the `boot` method. + */ + FX_PIPELINE: Phaser.Renderer.WebGL.Pipelines.FXPipeline; + + /** + * A reference to the Full Frame 1 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is the full size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + fullFrame1: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Full Frame 2 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is the full size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + fullFrame2: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Half Frame 1 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is half the size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + halfFrame1: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Half Frame 2 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is half the size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + halfFrame2: Phaser.Renderer.WebGL.RenderTarget; + + /** + * An array of RenderTarget instances that belong to this pipeline. + */ + renderTargets: Phaser.Renderer.WebGL.RenderTarget[]; + + /** + * The largest render target dimension before we just use a full-screen target. + */ + maxDimension: number; + + /** + * The amount in which each target frame will increase. + * + * Defaults to 32px but can be overridden in the config. + */ + frameInc: number; + + /** + * The Render Target index. Used internally by the methods + * in this class. Do not modify directly. + */ + targetIndex: number; + + /** + * Internal boot handler, called by the WebGLRenderer durings its boot process. + * + * Adds all of the default pipelines, based on the game config, and then calls + * the `boot` method on each one of them. + * + * Finally, the default pipeline is set. + * @param pipelineConfig The pipeline configuration object as set in the Game Config. + * @param defaultPipeline The name of the default Game Object pipeline, as set in the Game Config + * @param autoMobilePipeline Automatically set the default pipeline to mobile if non-desktop detected? + */ + boot(pipelineConfig: Phaser.Types.Core.PipelineConfig, defaultPipeline: string, autoMobilePipeline: boolean): void; + + /** + * Sets the default pipeline being used by Game Objects. + * + * If no instance, or matching name, exists in this manager, it returns `undefined`. + * + * You can use this to override the default pipeline, for example by forcing + * the Mobile or Multi Tint Pipelines, which is especially useful for development + * testing. + * + * Make sure you call this method _before_ creating any Game Objects, as it will + * only impact Game Objects created after you call it. + * @param pipeline Either the string-based name of the pipeline to get, or a pipeline instance to look-up. + */ + setDefaultPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline): Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * Adds a pipeline instance to this Pipeline Manager. + * + * The name of the instance must be unique within this manager. + * + * Make sure to pass an instance to this method, not a base class. + * + * For example, you should pass it like this: + * + * ```javascript + * this.add('yourName', new CustomPipeline(game));` + * ``` + * + * and **not** like this: + * + * ```javascript + * this.add('yourName', CustomPipeline);` + * ``` + * + * To add a **Post Pipeline**, see `addPostPipeline` instead. + * @param name A unique string-based key for the pipeline within the manager. + * @param pipeline A pipeline _instance_ which must extend `WebGLPipeline`. + */ + add(name: string, pipeline: Phaser.Renderer.WebGL.WebGLPipeline): Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * Adds a Post Pipeline to this Pipeline Manager. + * + * Make sure to pass a base class to this method, not an instance. + * + * For example, you should pass it like this: + * + * ```javascript + * this.addPostPipeline('yourName', CustomPipeline);` + * ``` + * + * and **not** like this: + * + * ```javascript + * this.addPostPipeline('yourName', new CustomPipeline());` + * ``` + * + * To add a regular pipeline, see the `add` method instead. + * @param name A unique string-based key for the pipeline within the manager. + * @param pipeline A pipeline class which must extend `PostFXPipeline`. + */ + addPostPipeline(name: string, pipeline: Function): this; + + /** + * Flushes the current pipeline, if one is bound. + */ + flush(): void; + + /** + * Checks if a pipeline is present in this Pipeline Manager. + * @param pipeline Either the string-based name of the pipeline to get, or a pipeline instance to look-up. + */ + has(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Returns the pipeline instance based on the given name, or instance. + * + * If no instance, or matching name, exists in this manager, it returns `undefined`. + * @param pipeline Either the string-based name of the pipeline to get, or a pipeline instance to look-up. + */ + get(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline): Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * Returns a _new instance_ of the post pipeline based on the given name, or class. + * + * If no instance, or matching name, exists in this manager, it returns `undefined`. + * @param pipeline Either the string-based name of the pipeline to get, or a pipeline instance, or class to look-up. + * @param gameObject If this post pipeline is being installed into a Game Object or Camera, this is a reference to it. + * @param config Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline, gameObject?: Phaser.GameObjects.GameObject, config?: object): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline; + + /** + * Removes a PostFXPipeline instance from this Pipeline Manager. + * + * Note that the pipeline will not be flushed or destroyed, it's simply removed from + * this manager. + * @param pipeline The pipeline instance to be removed. + */ + removePostPipeline(pipeline: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): void; + + /** + * Removes a pipeline instance based on the given name. + * + * If no pipeline matches the name, this method does nothing. + * + * Note that the pipeline will not be flushed or destroyed, it's simply removed from + * this manager. + * @param name The name of the pipeline to be removed. + * @param removeClass Remove the pipeline class as well as the instance? Default true. + * @param removePostPipelineClass Remove the post pipeline class as well as the instance? Default true. + */ + remove(name: string, removeClass?: boolean, removePostPipelineClass?: boolean): void; + + /** + * Sets the current pipeline to be used by the `WebGLRenderer`. + * + * This method accepts a pipeline instance as its parameter, not the name. + * + * If the pipeline isn't already the current one it will call `WebGLPipeline.bind` and then `onBind`. + * + * You cannot set Post FX Pipelines using this method. To use a Post FX Pipeline, you should + * apply it to either a Camera, Container or other supporting Game Object. + * @param pipeline The pipeline instance to be set as current. + * @param gameObject The Game Object that invoked this pipeline, if any. + * @param currentShader The shader to set as being current. + */ + set(pipeline: Phaser.Renderer.WebGL.WebGLPipeline, gameObject?: Phaser.GameObjects.GameObject, currentShader?: Phaser.Renderer.WebGL.WebGLShader): Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * This method is called by the `WebGLPipeline.batchQuad` method, right before a quad + * belonging to a Game Object is about to be added to the batch. + * + * It is also called directly bu custom Game Objects, such as Nine Slice or Mesh, + * from their render methods. + * + * It causes a batch flush, then calls the `preBatch` method on the Post FX Pipelines + * belonging to the Game Object. + * + * It should be followed by a call to `postBatch` to complete the process. + * @param gameObject The Game Object about to be batched. + */ + preBatch(gameObject: Phaser.GameObjects.GameObject): void; + + /** + * This method is called by the `WebGLPipeline.batchQuad` method, right after a quad + * belonging to a Game Object has been added to the batch. + * + * It is also called directly bu custom Game Objects, such as Nine Slice or Mesh, + * from their render methods. + * + * It causes a batch flush, then calls the `postBatch` method on the Post FX Pipelines + * belonging to the Game Object. + * + * It should be preceeded by a call to `preBatch` to start the process. + * @param gameObject The Game Object that was just added to the batch. + */ + postBatch(gameObject: Phaser.GameObjects.GameObject): void; + + /** + * Called at the start of the `WebGLRenderer.preRenderCamera` method. + * + * If the Camera has post pipelines set, it will flush the batch and then call the + * `preBatch` method on the post-fx pipelines belonging to the Camera. + * @param camera The Camera about to be rendered. + */ + preBatchCamera(camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Called at the end of the `WebGLRenderer.postRenderCamera` method. + * + * If the Camera has post pipelines set, it will flush the batch and then call the + * `postBatch` method on the post-fx pipelines belonging to the Camera. + * @param camera The Camera that was just rendered. + */ + postBatchCamera(camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Checks to see if the given pipeline is already the active pipeline, both within this + * Pipeline Manager and also has the same shader set in the Renderer. + * @param pipeline The pipeline instance to be checked. + * @param currentShader The shader to set as being current. + */ + isCurrent(pipeline: Phaser.Renderer.WebGL.WebGLPipeline, currentShader?: Phaser.Renderer.WebGL.WebGLShader): boolean; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * You can optionally set the brightness factor of the copy. + * + * The difference between this method and `drawFrame` is that this method + * uses a faster copy shader, where only the brightness can be modified. + * If you need color level manipulation, see `drawFrame` instead. + * + * The copy itself is handled by the Utility Pipeline. + * @param source The source Render Target. + * @param target The target Render Target. + * @param brightness The brightness value applied to the frame copy. Default 1. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + copyFrame(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, brightness?: number, clear?: boolean, clearAlpha?: boolean): this; + + /** + * Pops the framebuffer from the renderers FBO stack and sets that as the active target, + * then draws the `source` Render Target to it. It then resets the renderer textures. + * + * This should be done when you need to draw the _final_ results of a pipeline to the game + * canvas, or the next framebuffer in line on the FBO stack. You should only call this once + * in the `onDraw` handler and it should be the final thing called. Be careful not to call + * this if you need to actually use the pipeline shader, instead of the copy shader. In + * those cases, use the `bindAndDraw` method. + * @param source The Render Target to draw from. + */ + copyToGame(source: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Copy the `source` Render Target to the `target` Render Target, using the + * given Color Matrix. + * + * The difference between this method and `copyFrame` is that this method + * uses a color matrix shader, where you have full control over the luminance + * values used during the copy. If you don't need this, you can use the faster + * `copyFrame` method instead. + * + * The copy itself is handled by the Utility Pipeline. + * @param source The source Render Target. + * @param target The target Render Target. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param colorMatrix The Color Matrix to use when performing the draw. + */ + drawFrame(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, clearAlpha?: boolean, colorMatrix?: Phaser.Display.ColorMatrix): this; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using a linear blend effect, which is controlled by the `strength` parameter. + * + * The draw itself is handled by the Utility Pipeline. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFrames(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): this; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using an additive blend effect, which is controlled by the `strength` parameter. + * + * The draw itself is handled by the Utility Pipeline. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFramesAdditive(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): this; + + /** + * Clears the given Render Target. + * @param target The Render Target to clear. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + clearFrame(target: Phaser.Renderer.WebGL.RenderTarget, clearAlpha?: boolean): this; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * The difference with this copy is that no resizing takes place. If the `source` + * Render Target is larger than the `target` then only a portion the same size as + * the `target` dimensions is copied across. + * + * You can optionally set the brightness factor of the copy. + * @param source The source Render Target. + * @param target The target Render Target. + * @param brightness The brightness value applied to the frame copy. Default 1. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param eraseMode Erase source from target using ERASE Blend Mode? Default false. + */ + blitFrame(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, brightness?: number, clear?: boolean, clearAlpha?: boolean, eraseMode?: boolean): this; + + /** + * Binds the `source` Render Target and then copies a section of it to the `target` Render Target. + * + * This method is extremely fast because it uses `gl.copyTexSubImage2D` and doesn't + * require the use of any shaders. Remember the coordinates are given in standard WebGL format, + * where x and y specify the lower-left corner of the section, not the top-left. Also, the + * copy entirely replaces the contents of the target texture, no 'merging' or 'blending' takes + * place. + * @param source The source Render Target. + * @param target The target Render Target. + * @param x The x coordinate of the lower left corner where to start copying. + * @param y The y coordinate of the lower left corner where to start copying. + * @param width The width of the texture. + * @param height The height of the texture. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + copyFrameRect(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, x: number, y: number, width: number, height: number, clear?: boolean, clearAlpha?: boolean): this; + + /** + * Returns `true` if the current pipeline is forced to use texture unit zero. + */ + forceZero(): boolean; + + /** + * Sets the Multi Pipeline to be the currently bound pipeline. + * + * This is the default Phaser 3 rendering pipeline. + */ + setMulti(): Phaser.Renderer.WebGL.Pipelines.MultiPipeline; + + /** + * Sets the Utility Pipeline to be the currently bound pipeline. + * @param currentShader The shader to set as being current. + */ + setUtility(currentShader?: Phaser.Renderer.WebGL.WebGLShader): Phaser.Renderer.WebGL.Pipelines.UtilityPipeline; + + /** + * Sets the FX Pipeline to be the currently bound pipeline. + */ + setFX(): Phaser.Renderer.WebGL.Pipelines.FXPipeline; + + /** + * Restore WebGL resources after context was lost. + * + * Calls `rebind` on this Pipeline Manager. + * Then calls `restoreContext` on each pipeline in turn. + */ + restoreContext(): void; + + /** + * Use this to reset the gl context to the state that Phaser requires to continue rendering. + * + * Calling this will: + * + * * Disable `DEPTH_TEST`, `CULL_FACE` and `STENCIL_TEST`. + * * Clear the depth buffer and stencil buffers. + * * Reset the viewport size. + * * Reset the blend mode. + * * Bind a blank texture as the active texture on texture unit zero. + * * Rebinds the given pipeline instance. + * + * You should call this if you have previously called `clear`, and then wish to return + * rendering control to Phaser again. + * @param pipeline The pipeline instance to be rebound. If not given, the previous pipeline will be bound. + */ + rebind(pipeline?: Phaser.Renderer.WebGL.WebGLPipeline): void; + + /** + * Flushes the current pipeline being used and then clears it, along with the + * the current shader program and vertex buffer from the `WebGLRenderer`. + * + * Then resets the blend mode to NORMAL. + * + * Call this before jumping to your own gl context handler, and then call `rebind` when + * you wish to return control to Phaser again. + */ + clear(): void; + + /** + * Gets a Render Target the right size to render the Sprite on. + * + * If the Sprite exceeds the size of the renderer, the Render Target will only ever be the maximum + * size of the renderer. + * @param size The maximum dimension required. + */ + getRenderTarget(size: number): Phaser.Renderer.WebGL.RenderTarget; + + /** + * Gets a matching Render Target, the same size as the one the Sprite was drawn to, + * useful for double-buffer style effects such as blurs. + */ + getSwapRenderTarget(): Phaser.Renderer.WebGL.RenderTarget; + + /** + * Gets a matching Render Target, the same size as the one the Sprite was drawn to, + * useful for double-buffer style effects such as blurs. + */ + getAltSwapRenderTarget(): Phaser.Renderer.WebGL.RenderTarget; + + /** + * Destroy the Pipeline Manager, cleaning up all related resources and references. + */ + destroy(): void; + + } + + namespace Pipelines { + /** + * The Bitmap Mask Pipeline handles all of the bitmap mask rendering in WebGL for applying + * alpha masks to Game Objects. It works by sampling two texture on the fragment shader and + * using the fragments alpha to clip the region. + * + * The fragment shader it uses can be found in `shaders/src/BitmapMask.frag`. + * The vertex shader it uses can be found in `shaders/src/BitmapMask.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * + * The default shader uniforms for this pipeline are: + * + * `uResolution` (vec2) + * `uMainSampler` (sampler2D) + * `uMaskSampler` (sampler2D) + * `uInvertMaskAlpha` (bool) + */ + class BitmapMaskPipeline extends Phaser.Renderer.WebGL.WebGLPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * Binds necessary resources and renders the mask to a separated framebuffer. + * The framebuffer for the masked object is also bound for further use. + * @param mask The BitmapMask instance that called beginMask. + * @param maskedObject GameObject masked by the mask GameObject. + * @param camera The camera rendering the current mask. + */ + beginMask(mask: Phaser.Display.Masks.BitmapMask, maskedObject: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * The masked game objects framebuffer is unbound and its texture + * is bound together with the mask texture and the mask shader and + * a draw call with a single quad is processed. Here is where the + * masking effect is applied. + * @param mask The BitmapMask instance that called endMask. + * @param camera The Camera to render to. + * @param renderTarget Optional WebGL RenderTarget. + */ + endMask(mask: Phaser.Display.Masks.BitmapMask, camera: Phaser.Cameras.Scene2D.Camera, renderTarget?: Phaser.Renderer.WebGL.RenderTarget): void; + + } + + /** + * The Bitmap Mask Pipeline. + */ + const BITMAPMASK_PIPELINE: string; + + /** + * The Light 2D Pipeline. + */ + const LIGHT_PIPELINE: string; + + /** + * The Point Light Pipeline. + */ + const POINTLIGHT_PIPELINE: string; + + /** + * The Single Texture Pipeline. + */ + const SINGLE_PIPELINE: string; + + /** + * The Multi Texture Pipeline. + */ + const MULTI_PIPELINE: string; + + /** + * The Rope Pipeline. + */ + const ROPE_PIPELINE: string; + + /** + * The Graphics and Shapes Pipeline. + */ + const GRAPHICS_PIPELINE: string; + + /** + * The Post FX Pipeline. + */ + const POSTFX_PIPELINE: string; + + /** + * The Utility Pipeline. + */ + const UTILITY_PIPELINE: string; + + /** + * The Mobile Texture Pipeline. + */ + const MOBILE_PIPELINE: string; + + /** + * The Special FX Pipeline. + */ + const FX_PIPELINE: string; + + namespace Events { + /** + * The WebGLPipeline After Flush Event. + * + * This event is dispatched by a WebGLPipeline right after it has issued a drawArrays command + * and cleared its vertex count. + */ + const AFTER_FLUSH: any; + + /** + * The WebGLPipeline Before Flush Event. + * + * This event is dispatched by a WebGLPipeline right before it is about to + * flush and issue a bufferData and drawArrays command. + */ + const BEFORE_FLUSH: any; + + /** + * The WebGLPipeline Bind Event. + * + * This event is dispatched by a WebGLPipeline when it is bound by the Pipeline Manager. + */ + const BIND: any; + + /** + * The WebGLPipeline Boot Event. + * + * This event is dispatched by a WebGLPipeline when it has completed its `boot` phase. + */ + const BOOT: any; + + /** + * The WebGLPipeline Destroy Event. + * + * This event is dispatched by a WebGLPipeline when it is starting its destroy process. + */ + const DESTROY: any; + + /** + * The WebGLPipeline ReBind Event. + * + * This event is dispatched by a WebGLPipeline when it is re-bound by the Pipeline Manager. + */ + const REBIND: any; + + /** + * The WebGLPipeline Resize Event. + * + * This event is dispatched by a WebGLPipeline when it is resized, usually as a result + * of the Renderer resizing. + */ + const RESIZE: any; + + } + + namespace FX { + /** + * The Barrel FX Pipeline. + * + * A barrel effect allows you to apply either a 'pinch' or 'expand' distortion to + * a Game Object. The amount of the effect can be modified in real-time. + * + * A Barrel effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addBarrel(); + * ``` + */ + class BarrelFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The amount of distortion applied to the barrel effect. + * + * Typically keep this within the range 1 (no distortion) to +- 1. + */ + amount: number; + + } + + /** + * The Bloom FX Pipeline. + * + * Bloom is an effect used to reproduce an imaging artifact of real-world cameras. + * The effect produces fringes of light extending from the borders of bright areas in an image, + * contributing to the illusion of an extremely bright light overwhelming the + * camera or eye capturing the scene. + * + * A Bloom effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addBloom(); + * ``` + */ + class BloomFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The number of steps to run the Bloom effect for. + * + * This value should always be an integer. + * + * It defaults to 4. The higher the value, the smoother the Bloom, + * but at the cost of exponentially more gl operations. + * + * Keep this to the lowest possible number you can have it, while + * still looking correct for your game. + */ + steps: number; + + /** + * The horizontal offset of the bloom effect. + */ + offsetX: number; + + /** + * The vertical offset of the bloom effect. + */ + offsetY: number; + + /** + * The strength of the blur process of the bloom effect. + */ + blurStrength: number; + + /** + * The strength of the blend process of the bloom effect. + */ + strength: number; + + /** + * The internal gl color array. + */ + glcolor: number[]; + + } + + /** + * The Blur FX Pipeline. + * + * A Gaussian blur is the result of blurring an image by a Gaussian function. It is a widely used effect, + * typically to reduce image noise and reduce detail. The visual effect of this blurring technique is a + * smooth blur resembling that of viewing the image through a translucent screen, distinctly different + * from the bokeh effect produced by an out-of-focus lens or the shadow of an object under usual illumination. + * + * A Blur effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addBlur(); + * ``` + */ + class BlurFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The horizontal offset of the blur effect. + */ + x: number; + + /** + * The vertical offset of the blur effect. + */ + y: number; + + /** + * The number of steps to run the Blur effect for. + * + * This value should always be an integer. + * + * It defaults to 4. The higher the value, the smoother the blur, + * but at the cost of exponentially more gl operations. + * + * Keep this to the lowest possible number you can have it, while + * still looking correct for your game. + */ + steps: number; + + /** + * The strength of the blur effect. + */ + strength: number; + + /** + * The internal gl color array. + */ + glcolor: number[]; + + /** + * Sets the quality of the blur effect to low. + */ + setQualityLow(): this; + + /** + * Sets the quality of the blur effect to medium. + */ + setQualityMedium(): this; + + /** + * Sets the quality of the blur effect to high. + */ + setQualityHigh(): this; + + } + + /** + * The Bokeh FX Pipeline. + * + * Bokeh refers to a visual effect that mimics the photographic technique of creating a shallow depth of field. + * This effect is used to emphasize the game's main subject or action, by blurring the background or foreground + * elements, resulting in a more immersive and visually appealing experience. It is achieved through rendering + * techniques that simulate the out-of-focus areas, giving a sense of depth and realism to the game's graphics. + * + * This effect can also be used to generate a Tilt Shift effect, which is a technique used to create a miniature + * effect by blurring everything except a small area of the image. This effect is achieved by blurring the + * top and bottom elements, while keeping the center area in focus. + * + * A Bokeh effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addBokeh(); + * ``` + */ + class BokehFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * Is this a Tilt Shift effect or a standard bokeh effect? + */ + isTiltShift: boolean; + + /** + * If a Tilt Shift effect this controls the strength of the blur. + * + * Setting this value on a non-Tilt Shift effect will have no effect. + */ + strength: number; + + /** + * If a Tilt Shift effect this controls the amount of horizontal blur. + * + * Setting this value on a non-Tilt Shift effect will have no effect. + */ + blurX: number; + + /** + * If a Tilt Shift effect this controls the amount of vertical blur. + * + * Setting this value on a non-Tilt Shift effect will have no effect. + */ + blurY: number; + + /** + * The radius of the bokeh effect. + * + * This is a float value, where a radius of 0 will result in no effect being applied, + * and a radius of 1 will result in a strong bokeh. However, you can exceed this value + * for even stronger effects. + */ + radius: number; + + /** + * The amount, or strength, of the bokeh effect. Defaults to 1. + */ + amount: number; + + /** + * The color contrast, or brightness, of the bokeh effect. Defaults to 0.2. + */ + contrast: number; + + } + + /** + * The Circle FX Pipeline. + * + * This effect will draw a circle around the texture of the Game Object, effectively masking off + * any area outside of the circle without the need for an actual mask. You can control the thickness + * of the circle, the color of the circle and the color of the background, should the texture be + * transparent. You can also control the feathering applied to the circle, allowing for a harsh or soft edge. + * + * Please note that adding this effect to a Game Object will not change the input area or physics body of + * the Game Object, should it have one. + * + * A Circle effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addCircle(); + * ``` + */ + class CircleFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The scale of the circle. The default scale is 1, which is a circle + * the full size of the underlying texture. Reduce this value to create + * a smaller circle, or increase it to create a circle that extends off + * the edges of the texture. + */ + scale: number; + + /** + * The amount of feathering to apply to the circle from the ring, + * extending into the middle of the circle. The default is 0.005, + * which is a very low amount of feathering just making sure the ring + * has a smooth edge. Increase this amount to a value such as 0.5 + * or 0.025 for larger amounts of feathering. + */ + feather: number; + + /** + * The width of the circle around the texture, in pixels. This value + * doesn't factor in the feather, which can extend the thickness + * internally depending on its value. + */ + thickness: number; + + /** + * The internal gl color array for the ring color. + */ + glcolor: number[]; + + /** + * The internal gl color array for the background color. + */ + glcolor2: number[]; + + } + + /** + * The ColorMatrix FX Pipeline. + * + * The color matrix effect is a visual technique that involves manipulating the colors of an image + * or scene using a mathematical matrix. This process can adjust hue, saturation, brightness, and contrast, + * allowing developers to create various stylistic appearances or mood settings within the game. + * Common applications include simulating different lighting conditions, applying color filters, + * or achieving a specific visual style. + * + * A ColorMatrix effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addColorMatrix(); + * ``` + */ + class ColorMatrixFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + } + + /** + * The Displacement FX Pipeline. + * + * The displacement effect is a visual technique that alters the position of pixels in an image + * or texture based on the values of a displacement map. This effect is used to create the illusion + * of depth, surface irregularities, or distortion in otherwise flat elements. It can be applied to + * characters, objects, or backgrounds to enhance realism, convey movement, or achieve various + * stylistic appearances. + * + * A Displacement effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addDisplacement(); + * ``` + */ + class DisplacementFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The amount of horizontal displacement to apply. + */ + x: number; + + /** + * The amount of vertical displacement to apply. + */ + y: number; + + /** + * The underlying texture used for displacement. + */ + glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + } + + /** + * The Glow FX Pipeline. + * + * The glow effect is a visual technique that creates a soft, luminous halo around game objects, + * characters, or UI elements. This effect is used to emphasize importance, enhance visual appeal, + * or convey a sense of energy, magic, or otherworldly presence. The effect can also be set on + * the inside of the Game Object. The color and strength of the glow can be modified. + * + * A Glow effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addGlow(); + * ``` + */ + class GlowFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + * @param config The configuration options for this pipeline. + */ + constructor(game: Phaser.Game, config: object); + + /** + * The strength of the glow outward from the edge of the Sprite. + */ + outerStrength: number; + + /** + * The strength of the glow inward from the edge of the Sprite. + */ + innerStrength: number; + + /** + * If `true` only the glow is drawn, not the texture itself. + */ + knockout: number; + + /** + * A 4 element array of gl color values. + */ + glcolor: number[]; + + } + + /** + * The Gradient FX Pipeline. + * + * The gradient overlay effect is a visual technique where a smooth color transition is applied over Game Objects, + * such as sprites or UI components. This effect is used to enhance visual appeal, emphasize depth, or create + * stylistic and atmospheric variations. It can also be utilized to convey information, such as representing + * progress or health status through color changes. + * + * A Gradient effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addGradient(); + * ``` + */ + class GradientFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The alpha value of the gradient effect. + */ + alpha: number; + + /** + * Sets how many 'chunks' the gradient is divided in to, as spread over the + * entire height of the texture. Leave this at zero for a smooth gradient, + * or set to a higher number to split the gradient into that many sections, giving + * a more banded 'retro' effect. + */ + size: number; + + /** + * The horizontal position the gradient will start from. This value is normalized, between 0 and 1 and is not in pixels. + */ + fromX: number; + + /** + * The vertical position the gradient will start from. This value is normalized, between 0 and 1 and is not in pixels. + */ + fromY: number; + + /** + * The horizontal position the gradient will end. This value is normalized, between 0 and 1 and is not in pixels. + */ + toX: number; + + /** + * The vertical position the gradient will end. This value is normalized, between 0 and 1 and is not in pixels. + */ + toY: number; + + /** + * The internal gl color array for the starting color. + */ + glcolor1: number[]; + + /** + * The internal gl color array for the ending color. + */ + glcolor2: number[]; + + } + + /** + * The Pixelate FX Pipeline. + * + * The pixelate effect is a visual technique that deliberately reduces the resolution or detail of an image, + * creating a blocky or mosaic appearance composed of large, visible pixels. This effect can be used for stylistic + * purposes, as a homage to retro gaming, or as a means to obscure certain elements within the game, such as + * during a transition or to censor specific content. + * + * A Pixelate effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addPixelate(); + * ``` + */ + class PixelateFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The amount of pixelation to apply. + */ + amount: number; + + } + + /** + * The Shadow FX Pipeline. + * + * The shadow effect is a visual technique used to create the illusion of depth and realism by adding darker, + * offset silhouettes or shapes beneath game objects, characters, or environments. These simulated shadows + * help to enhance the visual appeal and immersion, making the 2D game world appear more dynamic and three-dimensional. + * + * A Shadow effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addShadow(); + * ``` + */ + class ShadowFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The horizontal offset of the shadow effect. + */ + x: number; + + /** + * The vertical offset of the shadow effect. + */ + y: number; + + /** + * The amount of decay for the shadow effect. + */ + decay: number; + + /** + * The power of the shadow effect. + */ + power: number; + + /** + * The internal gl color array. + */ + glcolor: number[]; + + /** + * The number of samples that the shadow effect will run for. + * + * This should be an integer with a minimum value of 1 and a maximum of 12. + */ + samples: number; + + /** + * The intensity of the shadow effect. + */ + intensity: number; + + } + + /** + * The Shine FX Pipeline. + * + * The shine effect is a visual technique that simulates the appearance of reflective + * or glossy surfaces by passing a light beam across a Game Object. This effect is used to + * enhance visual appeal, emphasize certain features, and create a sense of depth or + * material properties. + * + * A Shine effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addShine(); + * ``` + */ + class ShineFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The speed of the Shine effect. + */ + speed: number; + + /** + * The line width of the Shine effect. + */ + lineWidth: number; + + /** + * The gradient of the Shine effect. + */ + gradient: number; + + /** + * Does this Shine effect reveal or get added to its target? + */ + reveal: boolean; + + } + + /** + * The Vignette FX Pipeline. + * + * The vignette effect is a visual technique where the edges of the screen, or a Game Object, gradually darken or blur, + * creating a frame-like appearance. This effect is used to draw the player's focus towards the central action or subject, + * enhance immersion, and provide a cinematic or artistic quality to the game's visuals. + * + * A Vignette effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addVignette(); + * ``` + */ + class VignetteFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The horizontal offset of the vignette effect. This value is normalized to the range 0 to 1. + */ + x: number; + + /** + * The vertical offset of the vignette effect. This value is normalized to the range 0 to 1. + */ + y: number; + + /** + * The radius of the vignette effect. This value is normalized to the range 0 to 1. + */ + radius: number; + + /** + * The strength of the vignette effect. + */ + strength: number; + + } + + /** + * The Wipe FX Pipeline. + * + * The wipe or reveal effect is a visual technique that gradually uncovers or conceals elements + * in the game, such as images, text, or scene transitions. This effect is often used to create + * a sense of progression, reveal hidden content, or provide a smooth and visually appealing transition + * between game states. + * + * You can set both the direction and the axis of the wipe effect. The following combinations are possible: + * + * * left to right: direction 0, axis 0 + * * right to left: direction 1, axis 0 + * * top to bottom: direction 1, axis 1 + * * bottom to top: direction 1, axis 0 + * + * It is up to you to set the `progress` value yourself, i.e. via a Tween, in order to transition the effect. + * + * A Wipe effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addWipe(); + * sprite.postFX.addReveal(); + * ``` + */ + class WipeFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The progress of the Wipe effect. This value is normalized to the range 0 to 1. + * + * Adjust this value to make the wipe transition (i.e. via a Tween) + */ + progress: number; + + /** + * The width of the wipe effect. This value is normalized in the range 0 to 1. + */ + wipeWidth: number; + + /** + * The direction of the wipe effect. Either 0 or 1. Set in conjunction with the axis property. + */ + direction: number; + + /** + * The axis of the wipe effect. Either 0 or 1. Set in conjunction with the direction property. + */ + axis: number; + + /** + * Is this a reveal (true) or a fade (false) effect? + */ + reveal: boolean; + + } + + } + + /** + * The FXPipeline is a built-in pipeline that controls the application of FX Controllers during + * the rendering process. It maintains all of the FX shaders, instances of Post FX Pipelines and + * is responsible for rendering. + * + * You should rarely interact with this pipeline directly. Instead, use the FX Controllers that + * is part of the Game Object class in order to manage the effects. + */ + class FXPipeline extends Phaser.Renderer.WebGL.Pipelines.PreFXPipeline { + /** + * + * @param game A reference to the Phaser game instance. + */ + constructor(game: Phaser.Game); + + /** + * An instance of the Glow Post FX Pipeline. + */ + glow: Phaser.Renderer.WebGL.Pipelines.FX.GlowFXPipeline; + + /** + * An instance of the Shadow Post FX Pipeline. + */ + shadow: Phaser.Renderer.WebGL.Pipelines.FX.ShadowFXPipeline; + + /** + * An instance of the Pixelate Post FX Pipeline. + */ + pixelate: Phaser.Renderer.WebGL.Pipelines.FX.PixelateFXPipeline; + + /** + * An instance of the Vignette Post FX Pipeline. + */ + vignette: Phaser.Renderer.WebGL.Pipelines.FX.VignetteFXPipeline; + + /** + * An instance of the Shine Post FX Pipeline. + */ + shine: Phaser.Renderer.WebGL.Pipelines.FX.ShineFXPipeline; + + /** + * An instance of the Gradient Post FX Pipeline. + */ + gradient: Phaser.Renderer.WebGL.Pipelines.FX.GradientFXPipeline; + + /** + * An instance of the Circle Post FX Pipeline. + */ + circle: Phaser.Renderer.WebGL.Pipelines.FX.CircleFXPipeline; + + /** + * An instance of the Barrel Post FX Pipeline. + */ + barrel: Phaser.Renderer.WebGL.Pipelines.FX.BarrelFXPipeline; + + /** + * An instance of the Wipe Post FX Pipeline. + */ + wipe: Phaser.Renderer.WebGL.Pipelines.FX.WipeFXPipeline; + + /** + * An instance of the Bokeh Post FX Pipeline. + */ + bokeh: Phaser.Renderer.WebGL.Pipelines.FX.BokehFXPipeline; + + /** + * An array containing references to the methods that map to the FX CONSTs. + * + * This array is intentionally sparse. Do not adjust. + */ + fxHandlers: Function[]; + + /** + * The source Render Target. + */ + source: Phaser.Renderer.WebGL.RenderTarget; + + /** + * The target Render Target. + */ + target: Phaser.Renderer.WebGL.RenderTarget; + + /** + * The swap Render Target. + */ + swap: Phaser.Renderer.WebGL.RenderTarget; + + /** + * Takes the currently bound Game Object and runs all of its pre-render effects, + * using the given Render Target as the source. + * + * Finally calls `drawToGame` to copy the result to the Game Canvas. + * @param target1 The source Render Target. + * @param target2 The target Render Target. + * @param target3 The swap Render Target. + */ + onDraw(target1: Phaser.Renderer.WebGL.RenderTarget, target2: Phaser.Renderer.WebGL.RenderTarget, target3: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Takes the source and target and runs a copy from source to target. + * + * This will use the current shader and pipeline. + */ + runDraw(): void; + + /** + * Runs the Glow FX controller. + * @param config The Glow FX controller. + * @param width The width of the target. + * @param height The height of the target. + */ + onGlow(config: Phaser.FX.Glow, width: number, height: number): void; + + /** + * Runs the Shadow FX controller. + * @param config The Shadow FX controller. + */ + onShadow(config: Phaser.FX.Shadow): void; + + /** + * Runs the Pixelate FX controller. + * @param config The Pixelate FX controller. + * @param width The width of the target. + * @param height The height of the target. + */ + onPixelate(config: Phaser.FX.Pixelate, width: number, height: number): void; + + /** + * Runs the Vignette FX controller. + * @param config The Vignette FX controller. + */ + onVignette(config: Phaser.FX.Vignette): void; + + /** + * Runs the Shine FX controller. + * @param config The Shine FX controller. + * @param width The width of the target. + * @param height The height of the target. + */ + onShine(config: Phaser.FX.Shine, width: number, height: number): void; + + /** + * Runs the Blur FX controller. + * @param config The Blur FX controller. + * @param width The width of the target. + * @param height The height of the target. + */ + onBlur(config: Phaser.FX.Blur, width: number, height: number): void; + + /** + * Runs the Gradient FX controller. + * @param config The Gradient FX controller. + */ + onGradient(config: Phaser.FX.Gradient): void; + + /** + * Runs the Bloom FX controller. + * @param config The Bloom FX controller. + * @param width The width of the target. + * @param height The height of the target. + */ + onBloom(config: Phaser.FX.Bloom, width: number, height: number): void; + + /** + * Runs the ColorMatrix FX controller. + * @param config The ColorMatrix FX controller. + */ + onColorMatrix(config: Phaser.FX.ColorMatrix): void; + + /** + * Runs the Circle FX controller. + * @param config The Circle FX controller. + * @param width The width of the target. + * @param height The height of the target. + */ + onCircle(config: Phaser.FX.Circle, width: number, height: number): void; + + /** + * Runs the Barrel FX controller. + * @param config The Barrel FX controller. + */ + onBarrel(config: Phaser.FX.Barrel): void; + + /** + * Runs the Displacement FX controller. + * @param config The Displacement FX controller. + */ + onDisplacement(config: Phaser.FX.Displacement): void; + + /** + * Runs the Wipe FX controller. + * @param config The Wipe FX controller. + */ + onWipe(config: Phaser.FX.Wipe): void; + + /** + * Runs the Bokeh FX controller. + * @param config The Bokeh FX controller. + */ + onBokeh(config: Phaser.FX.Bokeh): void; + + /** + * Destroys all shader instances, removes all object references and nulls all external references. + */ + destroy(): this; + + } + + /** + * The Light Pipeline is an extension of the Multi Pipeline and uses a custom shader + * designed to handle forward diffused rendering of 2D lights in a Scene. + * + * The shader works in tandem with Light Game Objects, and optionally texture normal maps, + * to provide an ambient illumination effect. + * + * If you wish to provide your own shader, you can use the `%LIGHT_COUNT%` declaration in the source, + * and it will be automatically replaced at run-time with the total number of configured lights. + * + * The maximum number of lights can be set in the Render Config `maxLights` property and defaults to 10. + * + * Prior to Phaser v3.50 this pipeline was called the `ForwardDiffuseLightPipeline`. + * + * The fragment shader it uses can be found in `shaders/src/Light.frag`. + * The vertex shader it uses can be found in `shaders/src/Multi.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * `inTexId` (float, offset 16) + * `inTintEffect` (float, offset 20) + * `inTint` (vec4, offset 24, normalized) + * + * The default shader uniforms for this pipeline are those from the Multi Pipeline, plus: + * + * `uMainSampler` (sampler2D) + * `uNormSampler` (sampler2D) + * `uCamera` (vec4) + * `uResolution` (vec2) + * `uAmbientLightColor` (vec3) + * `uInverseRotationMatrix` (mat3) + * `uLights` (Light struct) + */ + class LightPipeline extends Phaser.Renderer.WebGL.Pipelines.MultiPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * The currently bound normal map texture at texture unit one, if any. + */ + "currentNormalMap;": Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * A boolean that is set automatically during `onRender` that determines + * if the Scene LightManager is active, or not. + */ + readonly lightsActive: boolean; + + /** + * A persistent calculation vector used when processing the lights. + */ + tempVec2: Phaser.Math.Vector2; + + /** + * Called when the Game has fully booted and the Renderer has finished setting up. + * + * By this stage all Game level systems are now in place and you can perform any final + * tasks that the pipeline may need that relied on game systems such as the Texture Manager. + */ + boot(): void; + + /** + * Rotates the normal map vectors inversely by the given angle. + * Only works in 2D space. + * @param rotation The angle of rotation in radians. + */ + setNormalMapRotation(rotation: number): void; + + /** + * Returns the normal map WebGLTextureWrapper from the given Game Object. + * If the Game Object doesn't have one, it returns the default normal map from this pipeline instead. + * @param gameObject The Game Object to get the normal map from. + */ + getNormalMap(gameObject?: Phaser.GameObjects.GameObject): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Takes a Sprite Game Object, or any object that extends it, and adds it to the batch. + * @param gameObject The texture based Game Object to add to the batch. + * @param camera The Camera to use for the rendering transform. + * @param parentTransformMatrix The transform matrix of the parent container, if set. + */ + batchSprite(gameObject: Phaser.GameObjects.Image | Phaser.GameObjects.Sprite, camera: Phaser.Cameras.Scene2D.Camera, parentTransformMatrix?: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Generic function for batching a textured quad using argument values instead of a Game Object. + * @param gameObject Source GameObject. + * @param texture Texture associated with the quad. + * @param textureWidth Real texture width. + * @param textureHeight Real texture height. + * @param srcX X coordinate of the quad. + * @param srcY Y coordinate of the quad. + * @param srcWidth Width of the quad. + * @param srcHeight Height of the quad. + * @param scaleX X component of scale. + * @param scaleY Y component of scale. + * @param rotation Rotation of the quad. + * @param flipX Indicates if the quad is horizontally flipped. + * @param flipY Indicates if the quad is vertically flipped. + * @param scrollFactorX By which factor is the quad affected by the camera horizontal scroll. + * @param scrollFactorY By which factor is the quad effected by the camera vertical scroll. + * @param displayOriginX Horizontal origin in pixels. + * @param displayOriginY Vertical origin in pixels. + * @param frameX X coordinate of the texture frame. + * @param frameY Y coordinate of the texture frame. + * @param frameWidth Width of the texture frame. + * @param frameHeight Height of the texture frame. + * @param tintTL Tint for top left. + * @param tintTR Tint for top right. + * @param tintBL Tint for bottom left. + * @param tintBR Tint for bottom right. + * @param tintEffect The tint effect. + * @param uOffset Horizontal offset on texture coordinate. + * @param vOffset Vertical offset on texture coordinate. + * @param camera Current used camera. + * @param parentTransformMatrix Parent container. + * @param skipFlip Skip the renderTexture check. Default false. + * @param textureUnit Use the currently bound texture unit? + */ + batchTexture(gameObject: Phaser.GameObjects.GameObject, texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, textureWidth: number, textureHeight: number, srcX: number, srcY: number, srcWidth: number, srcHeight: number, scaleX: number, scaleY: number, rotation: number, flipX: boolean, flipY: boolean, scrollFactorX: number, scrollFactorY: number, displayOriginX: number, displayOriginY: number, frameX: number, frameY: number, frameWidth: number, frameHeight: number, tintTL: number, tintTR: number, tintBL: number, tintBR: number, tintEffect: number, uOffset: number, vOffset: number, camera: Phaser.Cameras.Scene2D.Camera, parentTransformMatrix: Phaser.GameObjects.Components.TransformMatrix, skipFlip?: boolean, textureUnit?: number): void; + + /** + * Adds a Texture Frame into the batch for rendering. + * @param frame The Texture Frame to be rendered. + * @param x The horizontal position to render the texture at. + * @param y The vertical position to render the texture at. + * @param tint The tint color. + * @param alpha The alpha value. + * @param transformMatrix The Transform Matrix to use for the texture. + * @param parentTransformMatrix A parent Transform Matrix. + */ + batchTextureFrame(frame: Phaser.Textures.Frame, x: number, y: number, tint: number, alpha: number, transformMatrix: Phaser.GameObjects.Components.TransformMatrix, parentTransformMatrix?: Phaser.GameObjects.Components.TransformMatrix): void; + + } + + /** + * The Mobile Pipeline is the core 2D texture rendering pipeline used by Phaser in WebGL + * when the device running the game is detected to be a mobile. + * + * You can control the use of this pipeline by setting the Game Configuration + * property `autoMobilePipeline`. If set to `false` then all devices will use + * the Multi Tint Pipeline. You can also call the `PipelineManager.setDefaultPipeline` + * method at run-time, rather than boot-time, to modify the default Game Object + * pipeline. + * + * Virtually all Game Objects use this pipeline by default, including Sprites, Graphics + * and Tilemaps. It handles the batching of quads and tris, as well as methods for + * drawing and batching geometry data. + * + * The fragment shader it uses can be found in `shaders/src/Mobile.frag`. + * The vertex shader it uses can be found in `shaders/src/Mobile.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * `inTexId` (float, offset 16) + * `inTintEffect` (float, offset 20) + * `inTint` (vec4, offset 24, normalized) + * + * Note that `inTexId` isn't used in the shader, it's just kept to allow us + * to piggy-back on the Multi Tint Pipeline functions. + * + * The default shader uniforms for this pipeline are: + * + * `uProjectionMatrix` (mat4) + * `uRoundPixels` (int) + * `uResolution` (vec2) + * `uMainSampler` (sampler2D, or sampler2D array) + */ + class MobilePipeline extends Phaser.Renderer.WebGL.Pipelines.MultiPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * Called when the Game has fully booted and the Renderer has finished setting up. + * + * By this stage all Game level systems are now in place and you can perform any final + * tasks that the pipeline may need that relied on game systems such as the Texture Manager. + */ + boot(): void; + + } + + /** + * The Multi Pipeline is the core 2D texture rendering pipeline used by Phaser in WebGL. + * Virtually all Game Objects use this pipeline by default, including Sprites, Graphics + * and Tilemaps. It handles the batching of quads and tris, as well as methods for + * drawing and batching geometry data. + * + * Prior to Phaser v3.50 this pipeline was called the `TextureTintPipeline`. + * + * In previous versions of Phaser only one single texture unit was supported at any one time. + * The Multi Pipeline is an evolution of the old Texture Tint Pipeline, updated to support + * multi-textures for increased performance. + * + * The fragment shader it uses can be found in `shaders/src/Multi.frag`. + * The vertex shader it uses can be found in `shaders/src/Multi.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * `inTexId` (float, offset 16) + * `inTintEffect` (float, offset 20) + * `inTint` (vec4, offset 24, normalized) + * + * The default shader uniforms for this pipeline are: + * + * `uProjectionMatrix` (mat4) + * `uRoundPixels` (int) + * `uResolution` (vec2) + * `uMainSampler` (sampler2D, or sampler2D array) + * + * If you wish to create a custom pipeline extending from this one, you can use two string + * declarations in your fragment shader source: `%count%` and `%forloop%`, where `count` is + * used to set the number of `sampler2Ds` available, and `forloop` is a block of GLSL code + * that will get the currently bound texture unit. + * + * This pipeline will automatically inject that code for you, should those values exist + * in your shader source. If you wish to handle this yourself, you can also use the + * function `Utils.parseFragmentShaderMaxTextures`. + * + * The following fragment shader shows how to use the two variables: + * + * ```glsl + * #define SHADER_NAME PHASER_MULTI_FS + * + * #ifdef GL_FRAGMENT_PRECISION_HIGH + * precision highp float; + * #else + * precision mediump float; + * #endif + * + * uniform sampler2D uMainSampler[%count%]; + * + * varying vec2 outTexCoord; + * varying float outTexId; + * varying float outTintEffect; + * varying vec4 outTint; + * + * void main () + * { + * vec4 texture; + * + * %forloop% + * + * vec4 texel = vec4(outTint.bgr * outTint.a, outTint.a); + * + * // Multiply texture tint + * vec4 color = texture * texel; + * + * if (outTintEffect == 1.0) + * { + * // Solid color + texture alpha + * color.rgb = mix(texture.rgb, outTint.bgr * outTint.a, texture.a); + * } + * else if (outTintEffect == 2.0) + * { + * // Solid color, no texture + * color = texel; + * } + * + * gl_FragColor = color; + * } + * ``` + * + * If you wish to create a pipeline that works from a single texture, or that doesn't have + * internal texture iteration, please see the `SinglePipeline` instead. If you wish to create + * a special effect, especially one that can impact the pixels around a texture (i.e. such as + * a glitch effect) then you should use the PreFX and PostFX Pipelines for this task. + */ + class MultiPipeline extends Phaser.Renderer.WebGL.WebGLPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * A temporary Transform Matrix, re-used internally during batching by the + * Shape Game Objects. + */ + calcMatrix: Phaser.GameObjects.Components.TransformMatrix; + + /** + * Called every time the pipeline is bound by the renderer. + * Sets the shader program, vertex buffer and other resources. + * Should only be called when changing pipeline. + */ + boot(): void; + + /** + * Takes a Sprite Game Object, or any object that extends it, and adds it to the batch. + * @param gameObject The texture based Game Object to add to the batch. + * @param camera The Camera to use for the rendering transform. + * @param parentTransformMatrix The transform matrix of the parent container, if set. + */ + batchSprite(gameObject: Phaser.GameObjects.Image | Phaser.GameObjects.Sprite, camera: Phaser.Cameras.Scene2D.Camera, parentTransformMatrix?: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Generic function for batching a textured quad using argument values instead of a Game Object. + * @param gameObject Source GameObject. + * @param texture Texture associated with the quad. + * @param textureWidth Real texture width. + * @param textureHeight Real texture height. + * @param srcX X coordinate of the quad. + * @param srcY Y coordinate of the quad. + * @param srcWidth Width of the quad. + * @param srcHeight Height of the quad. + * @param scaleX X component of scale. + * @param scaleY Y component of scale. + * @param rotation Rotation of the quad. + * @param flipX Indicates if the quad is horizontally flipped. + * @param flipY Indicates if the quad is vertically flipped. + * @param scrollFactorX By which factor is the quad affected by the camera horizontal scroll. + * @param scrollFactorY By which factor is the quad effected by the camera vertical scroll. + * @param displayOriginX Horizontal origin in pixels. + * @param displayOriginY Vertical origin in pixels. + * @param frameX X coordinate of the texture frame. + * @param frameY Y coordinate of the texture frame. + * @param frameWidth Width of the texture frame. + * @param frameHeight Height of the texture frame. + * @param tintTL Tint for top left. + * @param tintTR Tint for top right. + * @param tintBL Tint for bottom left. + * @param tintBR Tint for bottom right. + * @param tintEffect The tint effect. + * @param uOffset Horizontal offset on texture coordinate. + * @param vOffset Vertical offset on texture coordinate. + * @param camera Current used camera. + * @param parentTransformMatrix Parent container. + * @param skipFlip Skip the renderTexture check. Default false. + * @param textureUnit The texture unit to set (defaults to currently bound if undefined or null) + * @param skipPrePost Skip the pre and post manager calls? Default false. + */ + batchTexture(gameObject: Phaser.GameObjects.GameObject, texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, textureWidth: number, textureHeight: number, srcX: number, srcY: number, srcWidth: number, srcHeight: number, scaleX: number, scaleY: number, rotation: number, flipX: boolean, flipY: boolean, scrollFactorX: number, scrollFactorY: number, displayOriginX: number, displayOriginY: number, frameX: number, frameY: number, frameWidth: number, frameHeight: number, tintTL: number, tintTR: number, tintBL: number, tintBR: number, tintEffect: number, uOffset: number, vOffset: number, camera: Phaser.Cameras.Scene2D.Camera, parentTransformMatrix: Phaser.GameObjects.Components.TransformMatrix, skipFlip?: boolean, textureUnit?: number, skipPrePost?: boolean): void; + + /** + * Adds a Texture Frame into the batch for rendering. + * @param frame The Texture Frame to be rendered. + * @param x The horizontal position to render the texture at. + * @param y The vertical position to render the texture at. + * @param tint The tint color. + * @param alpha The alpha value. + * @param transformMatrix The Transform Matrix to use for the texture. + * @param parentTransformMatrix A parent Transform Matrix. + */ + batchTextureFrame(frame: Phaser.Textures.Frame, x: number, y: number, tint: number, alpha: number, transformMatrix: Phaser.GameObjects.Components.TransformMatrix, parentTransformMatrix?: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Pushes a filled rectangle into the vertex batch. + * + * Rectangle factors in the given transform matrices before adding to the batch. + * @param x Horizontal top left coordinate of the rectangle. + * @param y Vertical top left coordinate of the rectangle. + * @param width Width of the rectangle. + * @param height Height of the rectangle. + * @param currentMatrix The current transform. + * @param parentMatrix The parent transform. + */ + batchFillRect(x: number, y: number, width: number, height: number, currentMatrix: Phaser.GameObjects.Components.TransformMatrix, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Pushes a filled triangle into the vertex batch. + * + * Triangle factors in the given transform matrices before adding to the batch. + * @param x0 Point 0 x coordinate. + * @param y0 Point 0 y coordinate. + * @param x1 Point 1 x coordinate. + * @param y1 Point 1 y coordinate. + * @param x2 Point 2 x coordinate. + * @param y2 Point 2 y coordinate. + * @param currentMatrix The current transform. + * @param parentMatrix The parent transform. + */ + batchFillTriangle(x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, currentMatrix: Phaser.GameObjects.Components.TransformMatrix, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Pushes a stroked triangle into the vertex batch. + * + * Triangle factors in the given transform matrices before adding to the batch. + * + * The triangle is created from 3 lines and drawn using the `batchStrokePath` method. + * @param x0 Point 0 x coordinate. + * @param y0 Point 0 y coordinate. + * @param x1 Point 1 x coordinate. + * @param y1 Point 1 y coordinate. + * @param x2 Point 2 x coordinate. + * @param y2 Point 2 y coordinate. + * @param lineWidth The width of the line in pixels. + * @param currentMatrix The current transform. + * @param parentMatrix The parent transform. + */ + batchStrokeTriangle(x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, lineWidth: number, currentMatrix: Phaser.GameObjects.Components.TransformMatrix, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Adds the given path to the vertex batch for rendering. + * + * It works by taking the array of path data and then passing it through Earcut, which + * creates a list of polygons. Each polygon is then added to the batch. + * + * The path is always automatically closed because it's filled. + * @param path Collection of points that represent the path. + * @param currentMatrix The current transform. + * @param parentMatrix The parent transform. + */ + batchFillPath(path: Phaser.Types.Math.Vector2Like[], currentMatrix: Phaser.GameObjects.Components.TransformMatrix, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Adds the given path to the vertex batch for rendering. + * + * It works by taking the array of path data and calling `batchLine` for each section + * of the path. + * + * The path is optionally closed at the end. + * @param path Collection of points that represent the path. + * @param lineWidth The width of the line segments in pixels. + * @param pathOpen Indicates if the path should be closed or left open. + * @param currentMatrix The current transform. + * @param parentMatrix The parent transform. + */ + batchStrokePath(path: Phaser.Types.Math.Vector2Like[], lineWidth: number, pathOpen: boolean, currentMatrix: Phaser.GameObjects.Components.TransformMatrix, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Creates a line out of 4 quads and adds it to the vertex batch based on the given line values. + * @param ax x coordinate of the start of the line. + * @param ay y coordinate of the start of the line. + * @param bx x coordinate of the end of the line. + * @param by y coordinate of the end of the line. + * @param aLineWidth Width of the start of the line. + * @param bLineWidth Width of the end of the line. + * @param index If this line is part of a multi-line draw, the index of the line in the draw. + * @param closePath Does this line close a multi-line path? + * @param currentMatrix The current transform. + * @param parentMatrix The parent transform. + */ + batchLine(ax: number, ay: number, bx: number, by: number, aLineWidth: number, bLineWidth: number, index: number, closePath: boolean, currentMatrix: Phaser.GameObjects.Components.TransformMatrix, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Destroys all shader instances, removes all object references and nulls all external references. + */ + destroy(): this; + + } + + /** + * The Point Light Pipeline handles rendering the Point Light Game Objects in WebGL. + * + * The fragment shader it uses can be found in `shaders/src/PointLight.frag`. + * The vertex shader it uses can be found in `shaders/src/PointLight.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2) + * `inLightPosition` (vec2) + * `inLightRadius` (float) + * `inLightAttenuation` (float) + * `inLightColor` (vec4) + * + * The default shader uniforms for this pipeline are: + * + * `uProjectionMatrix` (mat4) + * `uResolution` (vec2) + * `uCameraZoom` (sampler2D) + */ + class PointLightPipeline extends Phaser.Renderer.WebGL.WebGLPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * Adds a Point Light Game Object to the batch, flushing if required. + * @param light The Point Light Game Object. + * @param camera The camera rendering the Point Light. + * @param x0 The top-left x position. + * @param y0 The top-left y position. + * @param x1 The bottom-left x position. + * @param y1 The bottom-left y position. + * @param x2 The bottom-right x position. + * @param y2 The bottom-right y position. + * @param x3 The top-right x position. + * @param y3 The top-right y position. + * @param lightX The horizontal center of the light. + * @param lightY The vertical center of the light. + */ + batchPointLight(light: Phaser.GameObjects.PointLight, camera: Phaser.Cameras.Scene2D.Camera, x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, lightX: number, lightY: number): void; + + /** + * Adds a single Point Light vertex to the current vertex buffer and increments the + * `vertexCount` property by 1. + * + * This method is called directly by `batchPointLight`. + * @param x The vertex x position. + * @param y The vertex y position. + * @param lightX The horizontal center of the light. + * @param lightY The vertical center of the light. + * @param radius The radius of the light. + * @param attenuation The attenuation of the light. + * @param r The red color channel of the light. + * @param g The green color channel of the light. + * @param b The blue color channel of the light. + * @param a The alpha color channel of the light. + */ + batchLightVert(x: number, y: number, lightX: number, lightY: number, radius: number, attenuation: number, r: number, g: number, b: number, a: number): void; + + } + + /** + * The Post FX Pipeline is a special kind of pipeline specifically for handling post + * processing effects. Where-as a standard Pipeline allows you to control the process + * of rendering Game Objects by configuring the shaders and attributes used to draw them, + * a Post FX Pipeline is designed to allow you to apply processing _after_ the Game Object/s + * have been rendered. Typical examples of post processing effects are bloom filters, + * blurs, light effects and color manipulation. + * + * The pipeline works by creating a tiny vertex buffer with just one single hard-coded quad + * in it. Game Objects can have a Post Pipeline set on them. Those objects are then rendered + * using their standard pipeline, but are redirected to the Render Targets owned by the + * post pipeline, which can then apply their own shaders and effects, before passing them + * back to the main renderer. + * + * Please see the Phaser 3 examples for further details on this extensive subject. + * + * The default fragment shader it uses can be found in `shaders/src/PostFX.frag`. + * The default vertex shader it uses can be found in `shaders/src/Quad.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * + * The vertices array layout is: + * + * -1, 1 B----C 1, 1 + * 0, 1 | /| 1, 1 + * | / | + * | / | + * |/ | + * -1, -1 A----D 1, -1 + * 0, 0 1, 0 + * + * A = -1, -1 (pos) and 0, 0 (uv) + * B = -1, 1 (pos) and 0, 1 (uv) + * C = 1, 1 (pos) and 1, 1 (uv) + * D = 1, -1 (pos) and 1, 0 (uv) + * + * First tri: A, B, C + * Second tri: A, C, D + * + * Array index: + * + * 0 = Tri 1 - Vert A - x pos + * 1 = Tri 1 - Vert A - y pos + * 2 = Tri 1 - Vert A - uv u + * 3 = Tri 1 - Vert A - uv v + * + * 4 = Tri 1 - Vert B - x pos + * 5 = Tri 1 - Vert B - y pos + * 6 = Tri 1 - Vert B - uv u + * 7 = Tri 1 - Vert B - uv v + * + * 8 = Tri 1 - Vert C - x pos + * 9 = Tri 1 - Vert C - y pos + * 10 = Tri 1 - Vert C - uv u + * 11 = Tri 1 - Vert C - uv v + * + * 12 = Tri 2 - Vert A - x pos + * 13 = Tri 2 - Vert A - y pos + * 14 = Tri 2 - Vert A - uv u + * 15 = Tri 2 - Vert A - uv v + * + * 16 = Tri 2 - Vert C - x pos + * 17 = Tri 2 - Vert C - y pos + * 18 = Tri 2 - Vert C - uv u + * 19 = Tri 2 - Vert C - uv v + * + * 20 = Tri 2 - Vert D - x pos + * 21 = Tri 2 - Vert D - y pos + * 22 = Tri 2 - Vert D - uv u + * 23 = Tri 2 - Vert D - uv v + */ + class PostFXPipeline extends Phaser.Renderer.WebGL.WebGLPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * If this Post Pipeline belongs to a Game Object or Camera, + * this property contains a reference to it. + */ + gameObject: Phaser.GameObjects.GameObject | Phaser.Cameras.Scene2D.Camera; + + /** + * If this Post Pipeline belongs to an FX Controller, this is a + * reference to it. + */ + controller: Phaser.FX.Controller; + + /** + * A Color Matrix instance belonging to this pipeline. + * + * Used during calls to the `drawFrame` method. + */ + colorMatrix: Phaser.Display.ColorMatrix; + + /** + * A reference to the Full Frame 1 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is the full size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + fullFrame1: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Full Frame 2 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is the full size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + fullFrame2: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Half Frame 1 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is half the size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + halfFrame1: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Half Frame 2 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is half the size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + halfFrame2: Phaser.Renderer.WebGL.RenderTarget; + + /** + * This method is called once, when this Post FX Pipeline needs to be used. + * + * Normally, pipelines will boot automatically, ready for instant-use, but Post FX + * Pipelines create quite a lot of internal resources, such as Render Targets, so + * they don't boot until they are told to do so by the Pipeline Manager, when an + * actual Game Object needs to use them. + */ + bootFX(): void; + + /** + * This method is called as a result of the `WebGLPipeline.batchQuad` method, right after a quad + * belonging to a Game Object has been added to the batch. When this is called, the + * renderer has just performed a flush. + * + * It calls the `onDraw` hook followed by the `onPostBatch` hook, which can be used to perform + * additional Post FX Pipeline processing. + * + * It is also called as part of the `PipelineManager.postBatch` method when processing Post FX Pipelines. + * @param gameObject The Game Object or Camera that invoked this pipeline, if any. + */ + postBatch(gameObject?: Phaser.GameObjects.GameObject | Phaser.Cameras.Scene2D.Camera): this; + + /** + * Returns the FX Controller for this Post FX Pipeline. + * + * This is called internally and not typically required outside. + * @param controller An FX Controller, or undefined. + */ + getController(controller?: Phaser.FX.Controller): Phaser.FX.Controller | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * This method does _not_ bind a shader. It uses whatever shader + * is currently bound in this pipeline. It also does _not_ clear + * the frame buffers after use. You should take care of both of + * these things if you call this method directly. + * @param source The source Render Target. + * @param target The target Render Target. + */ + copySprite(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * You can optionally set the brightness factor of the copy. + * + * The difference between this method and `drawFrame` is that this method + * uses a faster copy shader, where only the brightness can be modified. + * If you need color level manipulation, see `drawFrame` instead. + * @param source The source Render Target. + * @param target The target Render Target. + * @param brightness The brightness value applied to the frame copy. Default 1. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + copyFrame(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, brightness?: number, clear?: boolean, clearAlpha?: boolean): void; + + /** + * Pops the framebuffer from the renderers FBO stack and sets that as the active target, + * then draws the `source` Render Target to it. It then resets the renderer textures. + * + * This should be done when you need to draw the _final_ results of a pipeline to the game + * canvas, or the next framebuffer in line on the FBO stack. You should only call this once + * in the `onDraw` handler and it should be the final thing called. Be careful not to call + * this if you need to actually use the pipeline shader, instead of the copy shader. In + * those cases, use the `bindAndDraw` method. + * @param source The Render Target to draw from. + */ + copyToGame(source: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Copy the `source` Render Target to the `target` Render Target, using this pipelines + * Color Matrix. + * + * The difference between this method and `copyFrame` is that this method + * uses a color matrix shader, where you have full control over the luminance + * values used during the copy. If you don't need this, you can use the faster + * `copyFrame` method instead. + * @param source The source Render Target. + * @param target The target Render Target. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + drawFrame(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, clearAlpha?: boolean): void; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using a linear blend effect, which is controlled by the `strength` parameter. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFrames(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): void; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using an additive blend effect, which is controlled by the `strength` parameter. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFramesAdditive(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): void; + + /** + * Clears the given Render Target. + * @param target The Render Target to clear. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + clearFrame(target: Phaser.Renderer.WebGL.RenderTarget, clearAlpha?: boolean): void; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * The difference with this copy is that no resizing takes place. If the `source` + * Render Target is larger than the `target` then only a portion the same size as + * the `target` dimensions is copied across. + * + * You can optionally set the brightness factor of the copy. + * @param source The source Render Target. + * @param target The target Render Target. + * @param brightness The brightness value applied to the frame copy. Default 1. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param eraseMode Erase source from target using ERASE Blend Mode? Default false. + */ + blitFrame(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, brightness?: number, clear?: boolean, clearAlpha?: boolean, eraseMode?: boolean): void; + + /** + * Binds the `source` Render Target and then copies a section of it to the `target` Render Target. + * + * This method is extremely fast because it uses `gl.copyTexSubImage2D` and doesn't + * require the use of any shaders. Remember the coordinates are given in standard WebGL format, + * where x and y specify the lower-left corner of the section, not the top-left. Also, the + * copy entirely replaces the contents of the target texture, no 'merging' or 'blending' takes + * place. + * @param source The source Render Target. + * @param target The target Render Target. + * @param x The x coordinate of the lower left corner where to start copying. + * @param y The y coordinate of the lower left corner where to start copying. + * @param width The width of the texture. + * @param height The height of the texture. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + copyFrameRect(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, x: number, y: number, width: number, height: number, clear?: boolean, clearAlpha?: boolean): void; + + /** + * Binds this pipeline and draws the `source` Render Target to the `target` Render Target. + * + * If no `target` is specified, it will pop the framebuffer from the Renderers FBO stack + * and use that instead, which should be done when you need to draw the final results of + * this pipeline to the game canvas. + * + * You can optionally set the shader to be used for the draw here, if this is a multi-shader + * pipeline. By default `currentShader` will be used. If you need to set a shader but not + * a target, just pass `null` as the `target` parameter. + * @param source The Render Target to draw from. + * @param target The Render Target to draw to. If not set, it will pop the fbo from the stack. + * @param clear Clear the target before copying? Only used if `target` parameter is set. Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param currentShader The shader to use during the draw. + */ + bindAndDraw(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, clear?: boolean, clearAlpha?: boolean, currentShader?: Phaser.Renderer.WebGL.WebGLShader): void; + + /** + * Destroys all shader instances, removes all object references and nulls all external references. + */ + destroy(): this; + + } + + /** + * The Pre FX Pipeline is a special kind of pipeline designed specifically for applying + * special effects to Game Objects before they are rendered. Where-as the Post FX Pipeline applies an effect _after_ the + * object has been rendered, the Pre FX Pipeline allows you to control the rendering of + * the object itself - passing it off to its own texture, where multi-buffer compositing + * can take place. + * + * You can only use the PreFX Pipeline on the following types of Game Objects, or those + * that extend from them: + * + * Sprite + * Image + * Text + * TileSprite + * RenderTexture + * Video + */ + class PreFXPipeline extends Phaser.Renderer.WebGL.WebGLPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * A reference to the Draw Sprite Shader belonging to this Pipeline. + * + * This shader is used when the sprite is drawn to this fbo (or to the game if drawToFrame is false) + * + * This property is set during the `boot` method. + */ + drawSpriteShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Copy Shader belonging to this Pipeline. + * + * This shader is used when you call the `copySprite` method. + * + * This property is set during the `boot` method. + */ + copyShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Game Draw Shader belonging to this Pipeline. + * + * This shader draws the fbo to the game. + * + * This property is set during the `boot` method. + */ + gameShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Color Matrix Shader belonging to this Pipeline. + * + * This property is set during the `boot` method. + */ + colorMatrixShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * Raw byte buffer of vertices used specifically during the copySprite method. + */ + readonly quadVertexData: ArrayBuffer; + + /** + * The WebGLBuffer that holds the quadVertexData. + */ + readonly quadVertexBuffer: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper; + + /** + * Float32 view of the quad array buffer. + */ + quadVertexViewF32: Float32Array; + + /** + * The full-screen Render Target that the sprite is first drawn to. + */ + fsTarget: Phaser.Renderer.WebGL.RenderTarget; + + /** + * Handles the resizing of the quad vertex data. + * @param width The new width of the quad. + * @param height The new height of the quad. + */ + onResize(width: number, height: number): void; + + /** + * Adds the vertices data into the batch and flushes if full. + * + * Assumes 6 vertices in the following arrangement: + * + * ``` + * 0----3 + * |\ B| + * | \ | + * | \ | + * | A \| + * | \ + * 1----2 + * ``` + * + * Where x0 / y0 = 0, x1 / y1 = 1, x2 / y2 = 2 and x3 / y3 = 3 + * @param gameObject The Game Object, if any, drawing this quad. + * @param x0 The top-left x position. + * @param y0 The top-left y position. + * @param x1 The bottom-left x position. + * @param y1 The bottom-left y position. + * @param x2 The bottom-right x position. + * @param y2 The bottom-right y position. + * @param x3 The top-right x position. + * @param y3 The top-right y position. + * @param u0 UV u0 value. + * @param v0 UV v0 value. + * @param u1 UV u1 value. + * @param v1 UV v1 value. + * @param tintTL The top-left tint color value. + * @param tintTR The top-right tint color value. + * @param tintBL The bottom-left tint color value. + * @param tintBR The bottom-right tint color value. + * @param tintEffect The tint effect for the shader to use. + * @param texture Texture that will be assigned to the current batch if a flush occurs. + */ + batchQuad(gameObject: Phaser.GameObjects.GameObject | null, x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, u0: number, v0: number, u1: number, v1: number, tintTL: number, tintTR: number, tintBL: number, tintBR: number, tintEffect: number | boolean, texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): boolean; + + /** + * This callback is invoked when a sprite is drawn by this pipeline. + * + * It will fire after the shader has been set, but before the sprite has been drawn, + * so use it to set any additional uniforms you may need. + * + * Note: Manipulating the Sprite during this callback will _not_ change how it is drawn to the Render Target. + * @param gameObject The Sprite being drawn. + * @param target The Render Target the Sprite will be drawn to. + */ + onDrawSprite(gameObject: Phaser.GameObjects.Sprite, target: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * This callback is invoked when you call the `copySprite` method. + * + * It will fire after the shader has been set, but before the source target has been copied, + * so use it to set any additional uniforms you may need. + * + * Note: Manipulating the Sprite during this callback will _not_ change the Render Targets. + * @param source The source Render Target being copied from. + * @param target The target Render Target that will be copied to. + * @param gameObject The Sprite being copied. + */ + onCopySprite(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, gameObject: Phaser.GameObjects.Sprite): void; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * No target resizing takes place. If the `source` Render Target is larger than the `target`, + * then only a portion the same size as the `target` dimensions is copied across. + * + * Calling this method will invoke the `onCopySprite` handler and will also call + * the `onFXCopy` callback on the Sprite. Both of these happen prior to the copy, allowing you + * to use them to set shader uniforms and other values. + * + * You can optionally pass in a ColorMatrix. If so, it will use the ColorMatrix shader + * during the copy, allowing you to manipulate the colors to a fine degree. + * See the `ColorMatrix` class for more details. + * @param source The source Render Target being copied from. + * @param target The target Render Target that will be copied to. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param eraseMode Erase source from target using ERASE Blend Mode? Default false. + * @param colorMatrix Optional ColorMatrix to use when copying the Sprite. + * @param shader The shader to use to copy the target. Defaults to the `copyShader`. + */ + copySprite(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, clear?: boolean, clearAlpha?: boolean, eraseMode?: boolean, colorMatrix?: Phaser.Display.ColorMatrix, shader?: Phaser.Renderer.WebGL.WebGLShader): void; + + /** + * Draws the `source` Render Target to the `target` Render Target. + * + * This is done using whatever the currently bound shader is. This method does + * not set a shader. All it does is bind the source texture, set the viewport and UVs + * then bind the target framebuffer, clears it and draws the source to it. + * + * At the end a null framebuffer is bound. No other clearing-up takes place, so + * use this method carefully. + * @param source The source Render Target. + * @param target The target Render Target. + */ + copy(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using a linear blend effect, which is controlled by the `strength` parameter. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFrames(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): void; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using an additive blend effect, which is controlled by the `strength` parameter. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFramesAdditive(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): void; + + /** + * This method will copy the given Render Target to the game canvas using the `copyShader`. + * + * This applies the results of the copy shader during the draw. + * + * If you wish to copy the target without any effects see the `copyToGame` method instead. + * + * This method should be the final thing called in your pipeline. + * @param source The Render Target to draw to the game. + */ + drawToGame(source: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * This method will copy the given Render Target to the game canvas using the `gameShader`. + * + * Unless you've changed it, the `gameShader` copies the target without modifying it, just + * ensuring it is placed in the correct location on the canvas. + * + * If you wish to draw the target with and apply the fragment shader at the same time, + * see the `drawToGame` method instead. + * + * This method should be the final thing called in your pipeline. + * @param source The Render Target to copy to the game. + */ + copyToGame(source: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * This method is called by `drawToGame` and `copyToGame`. It takes the source Render Target + * and copies it back to the game canvas, or the next frame buffer in the stack, and should + * be considered the very last thing this pipeline does. + * + * You don't normally need to call this method, or override it, however it is left public + * should you wish to do so. + * + * Note that it does _not_ set a shader. You should do this yourself if invoking this. + * @param source The Render Target to draw to the game. + */ + bindAndDraw(source: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * This method is called every time the `batchSprite` method is called and is passed a + * reference to the current render target. + * + * If you override this method, then it should make sure it calls either the + * `drawToGame` or `copyToGame` methods as the final thing it does. However, you can do as + * much additional processing as you like prior to this. + * @param target The Render Target to draw to the game. + * @param swapTarget The Swap Render Target, useful for double-buffer effects. + * @param altSwapTarget The Swap Render Target, useful for double-buffer effects. + */ + onDraw(target: Phaser.Renderer.WebGL.RenderTarget, swapTarget?: Phaser.Renderer.WebGL.RenderTarget, altSwapTarget?: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Set the UV values for the 6 vertices that make up the quad used by the copy shader. + * + * Be sure to call `resetUVs` once you have finished manipulating the UV coordinates. + * @param uA The u value of vertex A. + * @param vA The v value of vertex A. + * @param uB The u value of vertex B. + * @param vB The v value of vertex B. + * @param uC The u value of vertex C. + * @param vC The v value of vertex C. + * @param uD The u value of vertex D. + * @param vD The v value of vertex D. + */ + setUVs(uA: number, vA: number, uB: number, vB: number, uC: number, vC: number, uD: number, vD: number): void; + + /** + * Sets the vertex UV coordinates of the quad used by the copy shaders + * so that they correctly adjust the texture coordinates for a blit frame effect. + * + * Be sure to call `resetUVs` once you have finished manipulating the UV coordinates. + * @param source The source Render Target. + * @param target The target Render Target. + */ + setTargetUVs(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Resets the quad vertice UV values to their default settings. + * + * The quad is used by the copy shader in this pipeline. + */ + resetUVs(): void; + + /** + * Destroys all shader instances, removes all object references and nulls all external references. + */ + destroy(): this; + + } + + /** + * The Rope Pipeline is a variation of the Multi Pipeline that uses a `TRIANGLE_STRIP` for + * its topology, instead of TRIANGLES. This is primarily used by the Rope Game Object, + * or anything that extends it. + * + * Prior to Phaser v3.50 this pipeline was called the `TextureTintStripPipeline`. + * + * The fragment shader it uses can be found in `shaders/src/Multi.frag`. + * The vertex shader it uses can be found in `shaders/src/Multi.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * `inTexId` (float, offset 16) + * `inTintEffect` (float, offset 20) + * `inTint` (vec4, offset 24, normalized) + * + * The default shader uniforms for this pipeline are: + * + * `uProjectionMatrix` (mat4) + * `uRoundPixels` (int) + * `uResolution` (vec2) + * `uMainSampler` (sampler2D, or sampler2D array) + * + * The pipeline is structurally identical to the Multi Pipeline and should be treated as such. + */ + class RopePipeline extends Phaser.Renderer.WebGL.Pipelines.MultiPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + } + + /** + * The Single Pipeline is a special version of the Multi Pipeline that only ever + * uses one texture, bound to texture unit zero. Although not as efficient as the + * Multi Pipeline, it provides an easier way to create custom pipelines that only require + * a single bound texture. + * + * Prior to Phaser v3.50 this pipeline didn't exist, but could be compared to the old `TextureTintPipeline`. + * + * The fragment shader it uses can be found in `shaders/src/Single.frag`. + * The vertex shader it uses can be found in `shaders/src/Single.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * `inTexId` (float, offset 16) - this value is always zero in the Single Pipeline + * `inTintEffect` (float, offset 20) + * `inTint` (vec4, offset 24, normalized) + * + * The default shader uniforms for this pipeline are: + * + * `uProjectionMatrix` (mat4) + * `uRoundPixels` (int) + * `uResolution` (vec2) + * `uMainSampler` (sampler2D, or sampler2D array) + */ + class SinglePipeline extends Phaser.Renderer.WebGL.Pipelines.MultiPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + } + + /** + * The Utility Pipeline is a special-use pipeline that belongs to the Pipeline Manager. + * + * It provides 4 shaders and handy associated methods: + * + * 1) Copy Shader. A fast texture to texture copy shader with optional brightness setting. + * 2) Additive Blend Mode Shader. Blends two textures using an additive blend mode. + * 3) Linear Blend Mode Shader. Blends two textures using a linear blend mode. + * 4) Color Matrix Copy Shader. Draws a texture to a target using a Color Matrix. + * + * You do not extend this pipeline, but instead get a reference to it from the Pipeline + * Manager via the `setUtility` method. You can also access methods such as `copyFrame` + * directly from the Pipeline Manager. + * + * This pipeline provides methods for manipulating framebuffer backed textures, such as + * copying or blending one texture to another, copying a portion of a texture, additively + * blending two textures, flipping textures and more. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * + * This pipeline has a hard-coded batch size of 1 and a hard coded set of vertices. + */ + class UtilityPipeline extends Phaser.Renderer.WebGL.WebGLPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * A default Color Matrix, used by the Color Matrix Shader when one + * isn't provided. + */ + colorMatrix: Phaser.Display.ColorMatrix; + + /** + * A reference to the Copy Shader belonging to this Utility Pipeline. + * + * This property is set during the `boot` method. + */ + copyShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Additive Blend Shader belonging to this Utility Pipeline. + * + * This property is set during the `boot` method. + */ + addShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Linear Blend Shader belonging to this Utility Pipeline. + * + * This property is set during the `boot` method. + */ + linearShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Color Matrix Shader belonging to this Utility Pipeline. + * + * This property is set during the `boot` method. + */ + colorMatrixShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Full Frame 1 Render Target. + * + * This property is set during the `boot` method. + * + * This Render Target is the full size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + fullFrame1: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Full Frame 2 Render Target. + * + * This property is set during the `boot` method. + * + * This Render Target is the full size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + fullFrame2: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Half Frame 1 Render Target. + * + * This property is set during the `boot` method. + * + * This Render Target is half the size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + halfFrame1: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Half Frame 2 Render Target. + * + * This property is set during the `boot` method. + * + * This Render Target is half the size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + halfFrame2: Phaser.Renderer.WebGL.RenderTarget; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * You can optionally set the brightness factor of the copy. + * + * The difference between this method and `drawFrame` is that this method + * uses a faster copy shader, where only the brightness can be modified. + * If you need color level manipulation, see `drawFrame` instead. + * @param source The source Render Target. + * @param target The target Render Target. + * @param brightness The brightness value applied to the frame copy. Default 1. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + copyFrame(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, brightness?: number, clear?: boolean, clearAlpha?: boolean): void; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * The difference with this copy is that no resizing takes place. If the `source` + * Render Target is larger than the `target` then only a portion the same size as + * the `target` dimensions is copied across. + * + * You can optionally set the brightness factor of the copy. + * @param source The source Render Target. + * @param target The target Render Target. + * @param brightness The brightness value applied to the frame copy. Default 1. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param eraseMode Erase source from target using ERASE Blend Mode? Default false. + * @param flipY Flip the UV on the Y axis before drawing? Default false. + */ + blitFrame(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, brightness?: number, clear?: boolean, clearAlpha?: boolean, eraseMode?: boolean, flipY?: boolean): void; + + /** + * Binds the `source` Render Target and then copies a section of it to the `target` Render Target. + * + * This method is extremely fast because it uses `gl.copyTexSubImage2D` and doesn't + * require the use of any shaders. Remember the coordinates are given in standard WebGL format, + * where x and y specify the lower-left corner of the section, not the top-left. Also, the + * copy entirely replaces the contents of the target texture, no 'merging' or 'blending' takes + * place. + * @param source The source Render Target. + * @param target The target Render Target. + * @param x The x coordinate of the lower left corner where to start copying. + * @param y The y coordinate of the lower left corner where to start copying. + * @param width The width of the texture. + * @param height The height of the texture. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + copyFrameRect(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, x: number, y: number, width: number, height: number, clear?: boolean, clearAlpha?: boolean): void; + + /** + * Pops the framebuffer from the renderers FBO stack and sets that as the active target, + * then draws the `source` Render Target to it. It then resets the renderer textures. + * + * This should be done when you need to draw the _final_ results of a pipeline to the game + * canvas, or the next framebuffer in line on the FBO stack. You should only call this once + * in the `onDraw` handler and it should be the final thing called. Be careful not to call + * this if you need to actually use the pipeline shader, instead of the copy shader. In + * those cases, use the `bindAndDraw` method. + * @param source The Render Target to draw from. + */ + copyToGame(source: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Copy the `source` Render Target to the `target` Render Target, using the + * given Color Matrix. + * + * The difference between this method and `copyFrame` is that this method + * uses a color matrix shader, where you have full control over the luminance + * values used during the copy. If you don't need this, you can use the faster + * `copyFrame` method instead. + * @param source The source Render Target. + * @param target The target Render Target. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param colorMatrix The Color Matrix to use when performing the draw. + */ + drawFrame(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, clearAlpha?: boolean, colorMatrix?: Phaser.Display.ColorMatrix): void; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using a linear blend effect, which is controlled by the `strength` parameter. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param blendShader The shader to use during the blend copy. + */ + blendFrames(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean, blendShader?: Phaser.Renderer.WebGL.WebGLShader): void; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using an additive blend effect, which is controlled by the `strength` parameter. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFramesAdditive(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): void; + + /** + * Clears the given Render Target. + * @param target The Render Target to clear. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + clearFrame(target: Phaser.Renderer.WebGL.RenderTarget, clearAlpha?: boolean): void; + + /** + * Set the UV values for the 6 vertices that make up the quad used by the shaders + * in the Utility Pipeline. + * + * Be sure to call `resetUVs` once you have finished manipulating the UV coordinates. + * @param uA The u value of vertex A. + * @param vA The v value of vertex A. + * @param uB The u value of vertex B. + * @param vB The v value of vertex B. + * @param uC The u value of vertex C. + * @param vC The v value of vertex C. + * @param uD The u value of vertex D. + * @param vD The v value of vertex D. + */ + setUVs(uA: number, vA: number, uB: number, vB: number, uC: number, vC: number, uD: number, vD: number): void; + + /** + * Sets the vertex UV coordinates of the quad used by the shaders in the Utility Pipeline + * so that they correctly adjust the texture coordinates for a blit frame effect. + * + * Be sure to call `resetUVs` once you have finished manipulating the UV coordinates. + * @param source The source Render Target. + * @param target The target Render Target. + */ + setTargetUVs(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Horizontally flips the UV coordinates of the quad used by the shaders in this + * Utility Pipeline. + * + * Be sure to call `resetUVs` once you have finished manipulating the UV coordinates. + */ + flipX(): void; + + /** + * Vertically flips the UV coordinates of the quad used by the shaders in this + * Utility Pipeline. + * + * Be sure to call `resetUVs` once you have finished manipulating the UV coordinates. + */ + flipY(): void; + + /** + * Resets the quad vertice UV values to their default settings. + * + * The quad is used by all shaders of the Utility Pipeline. + */ + resetUVs(): void; + + } + + } + + /** + * A Render Target encapsulates a WebGL framebuffer and the WebGL Texture that displays it. + * + * Instances of this class are typically created by, and belong to WebGL Pipelines, however + * other Game Objects and classes can take advantage of Render Targets as well. + */ + class RenderTarget { + /** + * + * @param renderer A reference to the WebGLRenderer. + * @param width The width of this Render Target. + * @param height The height of this Render Target. + * @param scale A value between 0 and 1. Controls the size of this Render Target in relation to the Renderer. Default 1. + * @param minFilter The minFilter mode of the texture when created. 0 is `LINEAR`, 1 is `NEAREST`. Default 0. + * @param autoClear Automatically clear this framebuffer when bound? Default true. + * @param autoResize Automatically resize this Render Target if the WebGL Renderer resizes? Default false. + * @param addDepthBuffer Add a DEPTH_STENCIL and attachment to this Render Target? Default true. + * @param forceClamp Force the texture to use the CLAMP_TO_EDGE wrap mode, even if a power of two? Default true. + */ + constructor(renderer: Phaser.Renderer.WebGL.WebGLRenderer, width: number, height: number, scale?: number, minFilter?: number, autoClear?: boolean, autoResize?: boolean, addDepthBuffer?: boolean, forceClamp?: boolean); + + /** + * A reference to the WebGLRenderer instance. + */ + renderer: Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The Framebuffer of this Render Target. + * + * This is created in the `RenderTarget.resize` method. + */ + framebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper; + + /** + * The WebGLTextureWrapper of this Render Target. + * + * This is created in the `RenderTarget.resize` method. + */ + texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * The width of the texture. + */ + readonly width: number; + + /** + * The height of the texture. + */ + readonly height: number; + + /** + * A value between 0 and 1. Controls the size of this Render Target in relation to the Renderer. + * + * A value of 1 matches it. 0.5 makes the Render Target half the size of the renderer, etc. + */ + scale: number; + + /** + * The minFilter mode of the texture. 0 is `LINEAR`, 1 is `NEAREST`. + */ + minFilter: number; + + /** + * Controls if this Render Target is automatically cleared (via `gl.COLOR_BUFFER_BIT`) + * during the `RenderTarget.bind` method. + * + * If you need more control over how, or if, the target is cleared, you can disable + * this via the config on creation, or even toggle it directly at runtime. + */ + autoClear: boolean; + + /** + * Does this Render Target automatically resize when the WebGL Renderer does? + * + * Modify this property via the `setAutoResize` method. + */ + readonly autoResize: boolean; + + /** + * Does this Render Target have a Depth Buffer? + */ + readonly hasDepthBuffer: boolean; + + /** + * Force the WebGL Texture to use the CLAMP_TO_EDGE wrap mode, even if a power of two? + * + * If `false` it will use `gl.REPEAT` instead, which may be required for some effects, such + * as using this Render Target as a texture for a Shader. + */ + forceClamp: boolean; + + /** + * Sets if this Render Target should automatically resize when the WebGL Renderer + * emits a resize event. + * @param autoResize Automatically resize this Render Target when the WebGL Renderer resizes? + */ + setAutoResize(autoResize: boolean): this; + + /** + * Resizes this Render Target. + * + * Deletes both the frame buffer and texture, if they exist and then re-creates + * them using the new sizes. + * + * This method is called automatically by the pipeline during its resize handler. + * @param width The new width of this Render Target. + * @param height The new height of this Render Target. + */ + resize(width: number, height: number): this; + + /** + * Checks if this Render Target will resize, or not, if given the new + * width and height values. + * @param width The new width of this Render Target. + * @param height The new height of this Render Target. + */ + willResize(width: number, height: number): boolean; + + /** + * Pushes this Render Target as the current frame buffer of the renderer. + * + * If `autoClear` is set, then clears the texture. + * + * If `adjustViewport` is `true` then it will flush the renderer and then adjust the GL viewport. + * @param adjustViewport Adjust the GL viewport by calling `RenderTarget.adjustViewport` ? Default false. + * @param width Optional new width of this Render Target. + * @param height Optional new height of this Render Target. + */ + bind(adjustViewport?: boolean, width?: number, height?: number): void; + + /** + * Adjusts the GL viewport to match the width and height of this Render Target. + * + * Also disables `SCISSOR_TEST`. + */ + adjustViewport(): void; + + /** + * Clears this Render Target. + */ + clear(): void; + + /** + * Unbinds this Render Target and optionally flushes the WebGL Renderer first. + */ + unbind: any; + + /** + * Removes all external references from this class and deletes the + * WebGL framebuffer and texture instances. + * + * Does not remove this Render Target from the parent pipeline. + */ + destroy: any; + + } + + namespace Shaders { + } + + namespace Utils { + /** + * Packs four floats on a range from 0.0 to 1.0 into a single Uint32 + * @param r Red component in a range from 0.0 to 1.0 + * @param g Green component in a range from 0.0 to 1.0 + * @param b Blue component in a range from 0.0 to 1.0 + * @param a Alpha component in a range from 0.0 to 1.0 + */ + function getTintFromFloats(r: number, g: number, b: number, a: number): number; + + /** + * Packs a Uint24, representing RGB components, with a Float32, representing + * the alpha component, with a range between 0.0 and 1.0 and return a Uint32 + * @param rgb Uint24 representing RGB components + * @param a Float32 representing Alpha component + */ + function getTintAppendFloatAlpha(rgb: number, a: number): number; + + /** + * Packs a Uint24, representing RGB components, with a Float32, representing + * the alpha component, with a range between 0.0 and 1.0 and return a + * swizzled Uint32 + * @param rgb Uint24 representing RGB components + * @param a Float32 representing Alpha component + */ + function getTintAppendFloatAlphaAndSwap(rgb: number, a: number): number; + + /** + * Unpacks a Uint24 RGB into an array of floats of ranges of 0.0 and 1.0 + * @param rgb RGB packed as a Uint24 + */ + function getFloatsFromUintRGB(rgb: number): any[]; + + /** + * Check to see how many texture units the GPU supports in a fragment shader + * and if the value specific in the game config is allowed. + * + * This value is hard-clamped to 16 for performance reasons on Android devices. + * @param gl The WebGLContext used to create the shaders. + * @param maxTextures The Game Config maxTextures value. + */ + function checkShaderMax(gl: WebGLRenderingContext, maxTextures: number): number; + + /** + * Checks the given Fragment Shader Source for `%count%` and `%forloop%` declarations and + * replaces those with GLSL code for setting `texture = texture2D(uMainSampler[i], outTexCoord)`. + * @param fragmentShaderSource The Fragment Shader source code to operate on. + * @param maxTextures The number of maxTextures value. + */ + function parseFragmentShaderMaxTextures(fragmentShaderSource: string, maxTextures: number): string; + + /** + * Takes the Glow FX Shader source and parses out the __SIZE__ and __DIST__ + * consts with the configuration values. + * @param shader The Fragment Shader source code to operate on. + * @param game The Phaser Game instance. + * @param quality The quality of the glow (defaults to 0.1) + * @param distance The distance of the glow (defaults to 10) + */ + function setGlowQuality(shader: string, game: Phaser.Game, quality?: number, distance?: number): string; + + } + + /** + * The `WebGLPipeline` is a base class used by all of the core Phaser pipelines. + * + * It describes the way elements will be rendered in WebGL. Internally, it handles + * compiling the shaders, creating vertex buffers, assigning primitive topology and + * binding vertex attributes, all based on the given configuration data. + * + * The pipeline is configured by passing in a `WebGLPipelineConfig` object. Please + * see the documentation for this type to fully understand the configuration options + * available to you. + * + * Usually, you would not extend from this class directly, but would instead extend + * from one of the core pipelines, such as the Multi Pipeline. + * + * The pipeline flow per render-step is as follows: + * + * 1) onPreRender - called once at the start of the render step + * 2) onRender - call for each Scene Camera that needs to render (so can be multiple times per render step) + * 3) Internal flow: + * 3a) bind (only called if a Game Object is using this pipeline and it's not currently active) + * 3b) onBind (called for every Game Object that uses this pipeline) + * 3c) flush (can be called by a Game Object, internal method or from outside by changing pipeline) + * 4) onPostRender - called once at the end of the render step + */ + class WebGLPipeline extends Phaser.Events.EventEmitter { + /** + * + * @param config The configuration object for this WebGL Pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * Name of the pipeline. Used for identification and setting from Game Objects. + */ + name: string; + + /** + * The Phaser Game instance to which this pipeline is bound. + */ + game: Phaser.Game; + + /** + * The WebGL Renderer instance to which this pipeline is bound. + */ + renderer: Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * A reference to the WebGL Pipeline Manager. + * + * This is initially undefined and only set when this pipeline is added + * to the manager. + */ + manager: Phaser.Renderer.WebGL.PipelineManager | null; + + /** + * The WebGL context this WebGL Pipeline uses. + */ + gl: WebGLRenderingContext; + + /** + * The canvas which this WebGL Pipeline renders to. + */ + view: HTMLCanvasElement; + + /** + * Width of the current viewport. + */ + width: number; + + /** + * Height of the current viewport. + */ + height: number; + + /** + * The current number of vertices that have been added to the pipeline batch. + */ + vertexCount: number; + + /** + * The total number of vertices that this pipeline batch can hold before it will flush. + * + * This defaults to `renderer batchSize * 6`, where `batchSize` is defined in the Renderer Game Config. + */ + vertexCapacity: number; + + /** + * Raw byte buffer of vertices. + * + * Either set via the config object `vertices` property, or generates a new Array Buffer of + * size `vertexCapacity * vertexSize`. + */ + readonly vertexData: ArrayBuffer; + + /** + * The WebGLBuffer that holds the vertex data. + * + * Created from the `vertexData` ArrayBuffer. If `vertices` are set in the config, a `STATIC_DRAW` buffer + * is created. If not, a `DYNAMIC_DRAW` buffer is created. + */ + readonly vertexBuffer: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper; + + /** + * The currently active WebGLBuffer. + */ + activeBuffer: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper; + + /** + * The primitive topology which the pipeline will use to submit draw calls. + * + * Defaults to GL_TRIANGLES if not otherwise set in the config. + */ + topology: GLenum; + + /** + * Uint8 view to the `vertexData` ArrayBuffer. Used for uploading vertex buffer resources to the GPU. + */ + bytes: Uint8Array; + + /** + * Float32 view of the array buffer containing the pipeline's vertices. + */ + vertexViewF32: Float32Array; + + /** + * Uint32 view of the array buffer containing the pipeline's vertices. + */ + vertexViewU32: Uint32Array; + + /** + * Indicates if the current pipeline is active, or not. + * + * Toggle this property to enable or disable a pipeline from rendering anything. + */ + active: boolean; + + /** + * Some pipelines require the forced use of texture zero (like the light pipeline). + * + * This property should be set when that is the case. + */ + forceZero: boolean; + + /** + * Indicates if this pipeline has booted or not. + * + * A pipeline boots only when the Game instance itself, and all associated systems, is + * fully ready. + */ + readonly hasBooted: boolean; + + /** + * Indicates if this is a Post FX Pipeline, or not. + */ + readonly isPostFX: boolean; + + /** + * Indicates if this is a Pre FX Pipeline, or not. + */ + readonly isPreFX: boolean; + + /** + * An array of RenderTarget instances that belong to this pipeline. + */ + renderTargets: Phaser.Renderer.WebGL.RenderTarget[]; + + /** + * A reference to the currently bound Render Target instance from the `WebGLPipeline.renderTargets` array. + */ + currentRenderTarget: Phaser.Renderer.WebGL.RenderTarget; + + /** + * An array of all the WebGLShader instances that belong to this pipeline. + * + * Shaders manage their own attributes and uniforms, but share the same vertex data buffer, + * which belongs to this pipeline. + * + * Shaders are set in a call to the `setShadersFromConfig` method, which happens automatically, + * but can also be called at any point in your game. See the method documentation for details. + */ + shaders: Phaser.Renderer.WebGL.WebGLShader[]; + + /** + * A reference to the currently bound WebGLShader instance from the `WebGLPipeline.shaders` array. + * + * For lots of pipelines, this is the only shader, so it is a quick way to reference it without + * an array look-up. + */ + currentShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * The Projection matrix, used by shaders as 'uProjectionMatrix' uniform. + */ + projectionMatrix: Phaser.Math.Matrix4; + + /** + * The cached width of the Projection matrix. + */ + projectionWidth: number; + + /** + * The cached height of the Projection matrix. + */ + projectionHeight: number; + + /** + * The configuration object that was used to create this pipeline. + * + * Treat this object as 'read only', because changing it post-creation will not + * impact this pipeline in any way. However, it is used internally for cloning + * and post-boot set-up. + */ + config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig; + + /** + * Has the GL Context been reset to the Phaser defaults since the last time + * this pipeline was bound? This is set automatically when the Pipeline Manager + * resets itself, usually after handing off to a 3rd party renderer like Spine. + * + * You should treat this property as read-only. + */ + glReset: boolean; + + /** + * The temporary Pipeline batch. This array contains the batch entries for + * the current frame, which is a package of textures and vertex offsets used + * for drawing. This package is built dynamically as the frame is built + * and cleared during the flush method. + * + * Treat this array and all of its contents as read-only. + */ + batch: Phaser.Types.Renderer.WebGL.WebGLPipelineBatchEntry[]; + + /** + * The most recently created Pipeline batch entry. + * + * Reset to null as part of the flush method. + * + * Treat this value as read-only. + */ + currentBatch: Phaser.Types.Renderer.WebGL.WebGLPipelineBatchEntry | null; + + /** + * The most recently bound texture, used as part of the batch process. + * + * Reset to null as part of the flush method. + * + * Treat this value as read-only. + */ + currentTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * Holds the most recently assigned texture unit. + * + * Treat this value as read-only. + */ + currentUnit: number; + + /** + * The currently active WebGLTextures, used as part of the batch process. + * + * Reset to empty as part of the bind method. + * + * Treat this array as read-only. + */ + activeTextures: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper[]; + + /** + * If the WebGL Renderer changes size, this uniform will be set with the new width and height values + * as part of the pipeline resize method. Various built-in pipelines, such as the MultiPipeline, set + * this property automatically to `uResolution`. + */ + resizeUniform: string; + + /** + * Called when the Game has fully booted and the Renderer has finished setting up. + * + * By this stage all Game level systems are now in place. You can perform any final tasks that the + * pipeline may need, that relies on game systems such as the Texture Manager being ready. + */ + boot(): void; + + /** + * This method is called once when this pipeline has finished being set-up + * at the end of the boot process. By the time this method is called, all + * of the shaders are ready and configured. + */ + onBoot(): void; + + /** + * This method is called once when this pipeline has finished being set-up + * at the end of the boot process. By the time this method is called, all + * of the shaders are ready and configured. It's also called if the renderer + * changes size. + * @param width The new width of this WebGL Pipeline. + * @param height The new height of this WebGL Pipeline. + */ + onResize(width: number, height: number): void; + + /** + * Sets the currently active shader within this pipeline. + * @param shader The shader to set as being current. + * @param setAttributes Should the vertex attribute pointers be set? Default false. + * @param vertexBuffer The vertex buffer to be set before the shader is bound. Defaults to the one owned by this pipeline. + */ + setShader(shader: Phaser.Renderer.WebGL.WebGLShader, setAttributes?: boolean, vertexBuffer?: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper): this; + + /** + * Searches all shaders in this pipeline for one matching the given name, then returns it. + * @param name The index of the shader to set. + */ + getShaderByName(name: string): Phaser.Renderer.WebGL.WebGLShader; + + /** + * Destroys all shaders currently set in the `WebGLPipeline.shaders` array and then parses the given + * `config` object, extracting the shaders from it, creating `WebGLShader` instances and finally + * setting them into the `shaders` array of this pipeline. + * + * This is a destructive process. Be very careful when you call it, should you need to. + * @param config The configuration object for this WebGL Pipeline. + */ + setShadersFromConfig(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig): this; + + /** + * Creates a new WebGL Pipeline Batch Entry, sets the texture unit as zero + * and pushes the entry into the batch. + * @param texture The texture assigned to this batch entry. + */ + createBatch(texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): number; + + /** + * Adds the given texture to the current WebGL Pipeline Batch Entry and + * increases the batch entry unit and maxUnit values by 1. + * @param texture The texture assigned to this batch entry. + */ + addTextureToBatch(texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): void; + + /** + * Takes the given WebGLTextureWrapper and determines what to do with it. + * + * If there is no current batch (i.e. after a flush) it will create a new + * batch from it. + * + * If the texture is already bound, it will return the current texture unit. + * + * If the texture already exists in the current batch, the unit gets reset + * to match it. + * + * If the texture cannot be found in the current batch, and it supports + * multiple textures, it's added into the batch and the unit indexes are + * advanced. + * @param texture The texture assigned to this batch entry. + */ + pushBatch(texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): number; + + /** + * Custom pipelines can use this method in order to perform any required pre-batch tasks + * for the given Game Object. It must return the texture unit the Game Object was assigned. + * @param gameObject The Game Object being rendered or added to the batch. + * @param frame Optional frame to use. Can override that of the Game Object. + */ + setGameObject(gameObject: Phaser.GameObjects.GameObject, frame?: Phaser.Textures.Frame): number; + + /** + * Check if the current batch of vertices is full. + * + * You can optionally provide an `amount` parameter. If given, it will check if the batch + * needs to flush _if_ the `amount` is added to it. This allows you to test if you should + * flush before populating the batch. + * @param amount Will the batch need to flush if this many vertices are added to it? Default 0. + */ + shouldFlush(amount?: number): boolean; + + /** + * Returns the number of vertices that can be added to the current batch before + * it will trigger a flush to happen. + */ + vertexAvailable(): number; + + /** + * Resizes the properties used to describe the viewport. + * + * This method is called automatically by the renderer during its resize handler. + * @param width The new width of this WebGL Pipeline. + * @param height The new height of this WebGL Pipeline. + */ + resize(width: number, height: number): this; + + /** + * Adjusts this pipelines ortho Projection Matrix to use the given dimensions + * and resets the `uProjectionMatrix` uniform on all bound shaders. + * + * This method is called automatically by the renderer during its resize handler. + * @param width The new width of this WebGL Pipeline. + * @param height The new height of this WebGL Pipeline. + */ + setProjectionMatrix(width: number, height: number): this; + + /** + * Adjusts this pipelines ortho Projection Matrix to flip the y + * and bottom values. Call with 'false' as the parameter to flip + * them back again. + * @param flipY Flip the y and bottom values? Default true. + */ + flipProjectionMatrix(flipY?: boolean): void; + + /** + * Adjusts this pipelines ortho Projection Matrix to match that of the global + * WebGL Renderer Projection Matrix. + * + * This method is called automatically by the Pipeline Manager when this + * pipeline is set. + */ + updateProjectionMatrix(): void; + + /** + * This method is called every time the Pipeline Manager makes this pipeline the currently active one. + * + * It binds the resources and shader needed for this pipeline, including setting the vertex buffer + * and attribute pointers. + * @param currentShader The shader to set as being current. + */ + bind(currentShader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * This method is called every time the Pipeline Manager rebinds this pipeline. + * + * It resets all shaders this pipeline uses, setting their attributes again. + * @param currentShader The shader to set as being current. + */ + rebind(currentShader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * This method is called if the WebGL context is lost and restored. + * It ensures that uniforms are synced back to the GPU + * for all shaders in this pipeline. + */ + restoreContext(): void; + + /** + * Binds the vertex buffer to be the active ARRAY_BUFFER on the WebGL context. + * + * It first checks to see if it's already set as the active buffer and only + * binds itself if not. + * @param buffer The Vertex Buffer to be bound. Defaults to the one owned by this pipeline. + */ + setVertexBuffer(buffer?: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper): boolean; + + /** + * This method is called as a result of the `WebGLPipeline.batchQuad` method, right before a quad + * belonging to a Game Object is about to be added to the batch. When this is called, the + * renderer has just performed a flush. It will bind the current render target, if any are set + * and finally call the `onPreBatch` hook. + * + * It is also called as part of the `PipelineManager.preBatch` method when processing Post FX Pipelines. + * @param gameObject The Game Object or Camera that invoked this pipeline, if any. + */ + preBatch(gameObject?: Phaser.GameObjects.GameObject | Phaser.Cameras.Scene2D.Camera): this; + + /** + * This method is called as a result of the `WebGLPipeline.batchQuad` method, right after a quad + * belonging to a Game Object has been added to the batch. When this is called, the + * renderer has just performed a flush. + * + * It calls the `onDraw` hook followed by the `onPostBatch` hook, which can be used to perform + * additional Post FX Pipeline processing. + * + * It is also called as part of the `PipelineManager.postBatch` method when processing Post FX Pipelines. + * @param gameObject The Game Object or Camera that invoked this pipeline, if any. + */ + postBatch(gameObject?: Phaser.GameObjects.GameObject | Phaser.Cameras.Scene2D.Camera): this; + + /** + * This method is only used by Sprite FX and Post FX Pipelines and those that extend from them. + * + * This method is called every time the `postBatch` method is called and is passed a + * reference to the current render target. + * + * At the very least a Post FX Pipeline should call `this.bindAndDraw(renderTarget)`, + * however, you can do as much additional processing as you like in this method if + * you override it from within your own pipelines. + * @param renderTarget The Render Target. + * @param swapTarget A Swap Render Target, useful for double-buffer effects. Only set by SpriteFX Pipelines. + */ + onDraw(renderTarget: Phaser.Renderer.WebGL.RenderTarget, swapTarget?: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * This method is called every time the Pipeline Manager deactivates this pipeline, swapping from + * it to another one. This happens after a call to `flush` and before the new pipeline is bound. + */ + unbind(): void; + + /** + * Uploads the vertex data and emits a draw call for the current batch of vertices. + * @param isPostFlush Was this flush invoked as part of a post-process, or not? Default false. + */ + flush(isPostFlush?: boolean): this; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called every time the Pipeline Manager makes this the active pipeline. It is called + * at the end of the `WebGLPipeline.bind` method, after the current shader has been set. The current + * shader is passed to this hook. + * + * For example, if a display list has 3 Sprites in it that all use the same pipeline, this hook will + * only be called for the first one, as the 2nd and 3rd Sprites do not cause the pipeline to be changed. + * + * If you need to listen for that event instead, use the `onBind` hook. + * @param currentShader The shader that was set as current. + */ + onActive(currentShader: Phaser.Renderer.WebGL.WebGLShader): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called every time a **Game Object** asks the Pipeline Manager to use this pipeline, + * even if the pipeline is already active. + * + * Unlike the `onActive` method, which is only called when the Pipeline Manager makes this pipeline + * active, this hook is called for every Game Object that requests use of this pipeline, allowing you to + * perform per-object set-up, such as loading shader uniform data. + * @param gameObject The Game Object that invoked this pipeline, if any. + */ + onBind(gameObject?: Phaser.GameObjects.GameObject): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called when the Pipeline Manager needs to rebind this pipeline. This happens after a + * pipeline has been cleared, usually when passing control over to a 3rd party WebGL library, like Spine, + * and then returing to Phaser again. + */ + onRebind(): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called every time the `batchQuad` or `batchTri` methods are called. If this was + * as a result of a Game Object, then the Game Object reference is passed to this hook too. + * + * This hook is called _after_ the quad (or tri) has been added to the batch, so you can safely + * call 'flush' from within this. + * + * Note that Game Objects may call `batchQuad` or `batchTri` multiple times for a single draw, + * for example the Graphics Game Object. + * @param gameObject The Game Object that invoked this pipeline, if any. + */ + onBatch(gameObject?: Phaser.GameObjects.GameObject): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called immediately before a **Game Object** is about to add itself to the batch. + * @param gameObject The Game Object that invoked this pipeline, if any. + */ + onPreBatch(gameObject?: Phaser.GameObjects.GameObject): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called immediately after a **Game Object** has been added to the batch. + * @param gameObject The Game Object that invoked this pipeline, if any. + */ + onPostBatch(gameObject?: Phaser.GameObjects.GameObject): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called once per frame, right before anything has been rendered, but after the canvas + * has been cleared. If this pipeline has a render target, it will also have been cleared by this point. + */ + onPreRender(): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called _once per frame_, by every Camera in a Scene that wants to render. + * + * It is called at the start of the rendering process, before anything has been drawn to the Camera. + * @param scene The Scene being rendered. + * @param camera The Scene Camera being rendered with. + */ + onRender(scene: Phaser.Scene, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called _once per frame_, after all rendering has happened and snapshots have been taken. + * + * It is called at the very end of the rendering process, once all Cameras, for all Scenes, have + * been rendered. + */ + onPostRender(): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called every time this pipeline is asked to flush its batch. + * + * It is called immediately before the `gl.bufferData` and `gl.drawArrays` calls are made, so you can + * perform any final pre-render modifications. To apply changes post-render, see `onAfterFlush`. + * @param isPostFlush Was this flush invoked as part of a post-process, or not? Default false. + */ + onBeforeFlush(isPostFlush?: boolean): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called immediately after this pipeline has finished flushing its batch. + * + * It is called after the `gl.drawArrays` call. + * + * You can perform additional post-render effects, but be careful not to call `flush` + * on this pipeline from within this method, or you'll cause an infinite loop. + * + * To apply changes pre-render, see `onBeforeFlush`. + * @param isPostFlush Was this flush invoked as part of a post-process, or not? Default false. + */ + onAfterFlush(isPostFlush?: boolean): void; + + /** + * Adds a single vertex to the current vertex buffer and increments the + * `vertexCount` property by 1. + * + * This method is called directly by `batchTri` and `batchQuad`. + * + * It does not perform any batch limit checking itself, so if you need to call + * this method directly, do so in the same way that `batchQuad` does, for example. + * @param x The vertex x position. + * @param y The vertex y position. + * @param u UV u value. + * @param v UV v value. + * @param unit Texture unit to which the texture needs to be bound. + * @param tintEffect The tint effect for the shader to use. + * @param tint The tint color value. + */ + batchVert(x: number, y: number, u: number, v: number, unit: number, tintEffect: number | boolean, tint: number): void; + + /** + * Adds the vertices data into the batch and flushes if full. + * + * Assumes 6 vertices in the following arrangement: + * + * ``` + * 0----3 + * |\ B| + * | \ | + * | \ | + * | A \| + * | \ + * 1----2 + * ``` + * + * Where tx0/ty0 = 0, tx1/ty1 = 1, tx2/ty2 = 2 and tx3/ty3 = 3 + * @param gameObject The Game Object, if any, drawing this quad. + * @param x0 The top-left x position. + * @param y0 The top-left y position. + * @param x1 The bottom-left x position. + * @param y1 The bottom-left y position. + * @param x2 The bottom-right x position. + * @param y2 The bottom-right y position. + * @param x3 The top-right x position. + * @param y3 The top-right y position. + * @param u0 UV u0 value. + * @param v0 UV v0 value. + * @param u1 UV u1 value. + * @param v1 UV v1 value. + * @param tintTL The top-left tint color value. + * @param tintTR The top-right tint color value. + * @param tintBL The bottom-left tint color value. + * @param tintBR The bottom-right tint color value. + * @param tintEffect The tint effect for the shader to use. + * @param texture Texture that will be assigned to the current batch if a flush occurs. + * @param unit Texture unit to which the texture needs to be bound. Default 0. + */ + batchQuad(gameObject: Phaser.GameObjects.GameObject | null, x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, u0: number, v0: number, u1: number, v1: number, tintTL: number, tintTR: number, tintBL: number, tintBR: number, tintEffect: number | boolean, texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, unit?: number): boolean; + + /** + * Adds the vertices data into the batch and flushes if full. + * + * Assumes 3 vertices in the following arrangement: + * + * ``` + * 0 + * |\ + * | \ + * | \ + * | \ + * | \ + * 1-----2 + * ``` + * @param gameObject The Game Object, if any, drawing this quad. + * @param x1 The bottom-left x position. + * @param y1 The bottom-left y position. + * @param x2 The bottom-right x position. + * @param y2 The bottom-right y position. + * @param x3 The top-right x position. + * @param y3 The top-right y position. + * @param u0 UV u0 value. + * @param v0 UV v0 value. + * @param u1 UV u1 value. + * @param v1 UV v1 value. + * @param tintTL The top-left tint color value. + * @param tintTR The top-right tint color value. + * @param tintBL The bottom-left tint color value. + * @param tintEffect The tint effect for the shader to use. + * @param texture Texture that will be assigned to the current batch if a flush occurs. + * @param unit Texture unit to which the texture needs to be bound. Default 0. + */ + batchTri(gameObject: Phaser.GameObjects.GameObject | null, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, u0: number, v0: number, u1: number, v1: number, tintTL: number, tintTR: number, tintBL: number, tintEffect: number | boolean, texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, unit?: number): boolean; + + /** + * Pushes a filled rectangle into the vertex batch. + * + * The dimensions are run through `Math.floor` before the quad is generated. + * + * Rectangle has no transform values and isn't transformed into the local space. + * + * Used for directly batching untransformed rectangles, such as Camera background colors. + * @param x Horizontal top left coordinate of the rectangle. + * @param y Vertical top left coordinate of the rectangle. + * @param width Width of the rectangle. + * @param height Height of the rectangle. + * @param color Color of the rectangle to draw. + * @param alpha Alpha value of the rectangle to draw. + * @param texture texture that will be assigned to the current batch if a flush occurs. + * @param flipUV Flip the vertical UV coordinates of the texture before rendering? Default true. + */ + drawFillRect(x: number, y: number, width: number, height: number, color: number, alpha: number, texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, flipUV?: boolean): void; + + /** + * Sets the texture to be bound to the next available texture unit and returns + * the unit id. + * @param texture Texture that will be assigned to the current batch. If not given uses `whiteTexture`. + */ + setTexture2D(texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): number; + + /** + * Activates the given WebGL Texture and binds it to the requested texture slot. + * @param target Texture to activate and bind. + * @param unit The WebGL texture ID to activate. Defaults to `gl.TEXTURE0`. Default 0. + */ + bindTexture(target?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, unit?: number): this; + + /** + * Activates the given Render Target texture and binds it to the + * requested WebGL texture slot. + * @param target The Render Target to activate and bind. + * @param unit The WebGL texture ID to activate. Defaults to `gl.TEXTURE0`. Default 0. + */ + bindRenderTarget(target?: Phaser.Renderer.WebGL.RenderTarget, unit?: number): this; + + /** + * Sets the current duration into a 1f uniform value based on the given name. + * + * This can be used for mapping time uniform values, such as `iTime`. + * @param name The name of the uniform to set. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + setTime(name: string, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a boolean uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param value The new value of the `boolean` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + setBoolean(name: string, value: boolean, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 1f uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x The new value of the `float` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set1f(name: string, x: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 2f uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x The new X component of the `vec2` uniform. + * @param y The new Y component of the `vec2` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set2f(name: string, x: number, y: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 3f uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x The new X component of the `vec3` uniform. + * @param y The new Y component of the `vec3` uniform. + * @param z The new Z component of the `vec3` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set3f(name: string, x: number, y: number, z: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 4f uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x X component of the uniform + * @param y Y component of the uniform + * @param z Z component of the uniform + * @param w W component of the uniform + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set4f(name: string, x: number, y: number, z: number, w: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 1fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set1fv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 2fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set2fv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 3fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set3fv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 4fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set4fv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 1iv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set1iv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 2iv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set2iv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 3iv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set3iv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 4iv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set4iv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 1i uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x The new value of the `int` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set1i(name: string, x: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 2i uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x The new X component of the `ivec2` uniform. + * @param y The new Y component of the `ivec2` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set2i(name: string, x: number, y: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 3i uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x The new X component of the `ivec3` uniform. + * @param y The new Y component of the `ivec3` uniform. + * @param z The new Z component of the `ivec3` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set3i(name: string, x: number, y: number, z: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 4i uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x X component of the uniform. + * @param y Y component of the uniform. + * @param z Z component of the uniform. + * @param w W component of the uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set4i(name: string, x: number, y: number, z: number, w: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a matrix 2fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param transpose Whether to transpose the matrix. Should be `false`. + * @param matrix The new values for the `mat2` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + setMatrix2fv(name: string, transpose: boolean, matrix: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a matrix 3fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param transpose Whether to transpose the matrix. Should be `false`. + * @param matrix The new values for the `mat3` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + setMatrix3fv(name: string, transpose: boolean, matrix: Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a matrix 4fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param transpose Whether to transpose the matrix. Should be `false`. + * @param matrix The matrix data. If using a Matrix4 this should be the `Matrix4.val` property. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + setMatrix4fv(name: string, transpose: boolean, matrix: Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Destroys all shader instances, removes all object references and nulls all external references. + */ + destroy(): this; + + } + + /** + * WebGLRenderer is a class that contains the needed functionality to keep the + * WebGLRenderingContext state clean. The main idea of the WebGLRenderer is to keep track of + * any context change that happens for WebGL rendering inside of Phaser. This means + * if raw webgl functions are called outside the WebGLRenderer of the Phaser WebGL + * rendering ecosystem they might pollute the current WebGLRenderingContext state producing + * unexpected behavior. It's recommended that WebGL interaction is done through + * WebGLRenderer and/or WebGLPipeline. + */ + class WebGLRenderer extends Phaser.Events.EventEmitter { + /** + * + * @param game The Game instance which owns this WebGL Renderer. + */ + constructor(game: Phaser.Game); + + /** + * Checks to see if the given diffuse and normal map textures are already bound, or not. + * @param texture The diffuse texture. + * @param normalMap The normal map texture. + */ + isNewNormalMap(texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, normalMap: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): boolean; + + /** + * The local configuration settings of this WebGL Renderer. + */ + config: object; + + /** + * The Game instance which owns this WebGL Renderer. + */ + game: Phaser.Game; + + /** + * A constant which allows the renderer to be easily identified as a WebGL Renderer. + */ + type: number; + + /** + * An instance of the Pipeline Manager class, that handles all WebGL Pipelines. + * + * Use this to manage all of your interactions with pipelines, such as adding, getting, + * setting and rendering them. + * + * The Pipeline Manager class is created in the `init` method and then populated + * with pipelines during the `boot` method. + * + * Prior to Phaser v3.50.0 this was just a plain JavaScript object, not a class. + */ + pipelines: Phaser.Renderer.WebGL.PipelineManager; + + /** + * The width of the canvas being rendered to. + * This is populated in the onResize event handler. + */ + width: number; + + /** + * The height of the canvas being rendered to. + * This is populated in the onResize event handler. + */ + height: number; + + /** + * The canvas which this WebGL Renderer draws to. + */ + canvas: HTMLCanvasElement; + + /** + * An array of blend modes supported by the WebGL Renderer. + * + * This array includes the default blend modes as well as any custom blend modes added through {@link #addBlendMode}. + */ + blendModes: any[]; + + /** + * This property is set to `true` if the WebGL context of the renderer is lost. + */ + contextLost: boolean; + + /** + * Details about the currently scheduled snapshot. + * + * If a non-null `callback` is set in this object, a snapshot of the canvas will be taken after the current frame is fully rendered. + */ + snapshotState: Phaser.Types.Renderer.Snapshot.SnapshotState; + + /** + * The maximum number of textures the GPU can handle. The minimum under the WebGL1 spec is 8. + * This is set via the Game Config `maxTextures` property and should never be changed after boot. + */ + maxTextures: number; + + /** + * An array of the available WebGL texture units, used to populate the uSampler uniforms. + * + * This array is populated during the init phase and should never be changed after boot. + */ + textureIndexes: any[]; + + /** + * A list of all WebGLBufferWrappers that have been created by this renderer. + */ + glBufferWrappers: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper[]; + + /** + * A list of all WebGLProgramWrappers that have been created by this renderer. + */ + glProgramWrappers: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper[]; + + /** + * A list of all WebGLTextureWrappers that have been created by this renderer. + */ + glTextureWrappers: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper[]; + + /** + * A list of all WebGLFramebufferWrappers that have been created by this renderer. + */ + glFramebufferWrappers: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper[]; + + /** + * A list of all WebGLAttribLocationWrappers that have been created by this renderer. + */ + glAttribLocationWrappers: Phaser.Renderer.WebGL.Wrappers.WebGLAttribLocationWrapper[]; + + /** + * A list of all WebGLUniformLocationWrappers that have been created by this renderer. + */ + glUniformLocationWrappers: Phaser.Renderer.WebGL.Wrappers.WebGLUniformLocationWrapper[]; + + /** + * The currently bound framebuffer in use. + */ + currentFramebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper; + + /** + * A stack into which the frame buffer objects are pushed and popped. + */ + fboStack: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper[]; + + /** + * Current WebGLProgram in use. + */ + currentProgram: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper; + + /** + * Current blend mode in use + */ + currentBlendMode: number; + + /** + * Indicates if the the scissor state is enabled in WebGLRenderingContext + */ + currentScissorEnabled: boolean; + + /** + * Stores the current scissor data + */ + currentScissor: Uint32Array; + + /** + * Stack of scissor data + */ + scissorStack: Uint32Array; + + /** + * The handler to invoke when the context is lost. + * This should not be changed and is set in the boot method. + */ + contextLostHandler: Function; + + /** + * The handler to invoke when the context is restored. + * This should not be changed and is set in the boot method. + */ + contextRestoredHandler: Function; + + /** + * The underlying WebGL context of the renderer. + */ + gl: WebGLRenderingContext; + + /** + * Array of strings that indicate which WebGL extensions are supported by the browser. + * This is populated in the `boot` method. + */ + supportedExtensions: string[]; + + /** + * If the browser supports the `ANGLE_instanced_arrays` extension, this property will hold + * a reference to the glExtension for it. + */ + instancedArraysExtension: ANGLE_instanced_arrays; + + /** + * If the browser supports the `OES_vertex_array_object` extension, this property will hold + * a reference to the glExtension for it. + */ + vaoExtension: OES_vertex_array_object; + + /** + * The WebGL Extensions loaded into the current context. + */ + extensions: object; + + /** + * Stores the current WebGL component formats for further use. + * + * This array is populated in the `init` method. + */ + glFormats: any[]; + + /** + * Stores the WebGL texture compression formats that this device and browser supports. + * + * Support for using compressed texture formats was added in Phaser version 3.60. + */ + compression: Phaser.Types.Renderer.WebGL.WebGLTextureCompression; + + /** + * Cached drawing buffer height to reduce gl calls. + */ + readonly drawingBufferHeight: number; + + /** + * A blank 32x32 transparent texture, as used by the Graphics system where needed. + * This is set in the `boot` method. + */ + readonly blankTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * A blank 1x1 #7f7fff texture, a flat normal map, + * as used by the Graphics system where needed. + * This is set in the `boot` method. + */ + readonly normalTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * A pure white 4x4 texture, as used by the Graphics system where needed. + * This is set in the `boot` method. + */ + readonly whiteTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * The total number of masks currently stacked. + */ + maskCount: number; + + /** + * The mask stack. + */ + maskStack: Phaser.Display.Masks.GeometryMask[]; + + /** + * Internal property that tracks the currently set mask. + */ + currentMask: any; + + /** + * Internal property that tracks the currently set camera mask. + */ + currentCameraMask: any; + + /** + * Internal gl function mapping for uniform look-up. + * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/uniform + */ + glFuncMap: any; + + /** + * The `type` of the Game Object being currently rendered. + * This can be used by advanced render functions for batching look-ahead. + */ + currentType: string; + + /** + * Is the `type` of the Game Object being currently rendered different than the + * type of the object before it in the display list? I.e. it's a 'new' type. + */ + newType: boolean; + + /** + * Does the `type` of the next Game Object in the display list match that + * of the object being currently rendered? + */ + nextTypeMatch: boolean; + + /** + * Is the Game Object being currently rendered the final one in the list? + */ + finalType: boolean; + + /** + * The mipmap magFilter to be used when creating textures. + * + * You can specify this as a string in the game config, i.e.: + * + * `render: { mipmapFilter: 'NEAREST_MIPMAP_LINEAR' }` + * + * The 6 options for WebGL1 are, in order from least to most computationally expensive: + * + * NEAREST (for pixel art) + * LINEAR (the default) + * NEAREST_MIPMAP_NEAREST + * LINEAR_MIPMAP_NEAREST + * NEAREST_MIPMAP_LINEAR + * LINEAR_MIPMAP_LINEAR + * + * Mipmaps only work with textures that are fully power-of-two in size. + * + * For more details see https://webglfundamentals.org/webgl/lessons/webgl-3d-textures.html + * + * As of v3.60 no mipmaps will be generated unless a string is given in + * the game config. This saves on VRAM use when it may not be required. + * To obtain the previous result set the property to `LINEAR` in the config. + */ + mipmapFilter: GLenum; + + /** + * Has this renderer fully booted yet? + */ + isBooted: boolean; + + /** + * A Render Target you can use to capture the current state of the Renderer. + * + * A Render Target encapsulates a framebuffer and texture for the WebGL Renderer. + */ + renderTarget: Phaser.Renderer.WebGL.RenderTarget; + + /** + * The global game Projection matrix, used by shaders as 'uProjectionMatrix' uniform. + */ + projectionMatrix: Phaser.Math.Matrix4; + + /** + * The cached width of the Projection matrix. + */ + projectionWidth: number; + + /** + * The cached height of the Projection matrix. + */ + projectionHeight: number; + + /** + * A RenderTarget used by the BitmapMask Pipeline. + * + * This is the source, i.e. the masked Game Object itself. + */ + maskSource: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A RenderTarget used by the BitmapMask Pipeline. + * + * This is the target, i.e. the framebuffer the masked objects are drawn to. + */ + maskTarget: Phaser.Renderer.WebGL.RenderTarget; + + /** + * An instance of SpectorJS used for WebGL Debugging. + * + * Only available in the Phaser Debug build. + */ + spector: Function; + + /** + * Creates a new WebGLRenderingContext and initializes all internal state. + * @param config The configuration object for the renderer. + */ + init(config: object): this; + + /** + * This method is only available in the Debug Build of Phaser, or a build with the + * `WEBGL_DEBUG` flag set in the Webpack Config. + * + * Phaser v3.60 Debug has a build of Spector.js embedded in it, which is a WebGL inspector + * that allows for live inspection of your WebGL calls. Although it's easy to add the Spector + * extension to a desktop browsr, by embedding it in Phaser we can make it available in mobile + * browsers too, making it a powerful tool for debugging WebGL games on mobile devices where + * extensions are not permitted. + * + * See https://github.com/BabylonJS/Spector.js for more details. + * + * This method will capture the current WebGL frame and send it to the Spector.js tool for inspection. + * @param quickCapture If `true` thumbnails are not captured in order to speed up the capture. Default false. + * @param fullCapture If `true` all details are captured. Default false. + */ + captureFrame(quickCapture?: boolean, fullCapture?: boolean): void; + + /** + * This method is only available in the Debug Build of Phaser, or a build with the + * `WEBGL_DEBUG` flag set in the Webpack Config. + * + * Phaser v3.60 Debug has a build of Spector.js embedded in it, which is a WebGL inspector + * that allows for live inspection of your WebGL calls. Although it's easy to add the Spector + * extension to a desktop browsr, by embedding it in Phaser we can make it available in mobile + * browsers too, making it a powerful tool for debugging WebGL games on mobile devices where + * extensions are not permitted. + * + * See https://github.com/BabylonJS/Spector.js for more details. + * + * This method will capture the next WebGL frame and send it to the Spector.js tool for inspection. + */ + captureNextFrame(): void; + + /** + * This method is only available in the Debug Build of Phaser, or a build with the + * `WEBGL_DEBUG` flag set in the Webpack Config. + * + * Phaser v3.60 Debug has a build of Spector.js embedded in it, which is a WebGL inspector + * that allows for live inspection of your WebGL calls. Although it's easy to add the Spector + * extension to a desktop browsr, by embedding it in Phaser we can make it available in mobile + * browsers too, making it a powerful tool for debugging WebGL games on mobile devices where + * extensions are not permitted. + * + * See https://github.com/BabylonJS/Spector.js for more details. + * + * This method will return the current FPS of the WebGL canvas. + */ + getFps(): number; + + /** + * This method is only available in the Debug Build of Phaser, or a build with the + * `WEBGL_DEBUG` flag set in the Webpack Config. + * + * Phaser v3.60 Debug has a build of Spector.js embedded in it, which is a WebGL inspector + * that allows for live inspection of your WebGL calls. Although it's easy to add the Spector + * extension to a desktop browsr, by embedding it in Phaser we can make it available in mobile + * browsers too, making it a powerful tool for debugging WebGL games on mobile devices where + * extensions are not permitted. + * + * See https://github.com/BabylonJS/Spector.js for more details. + * + * This method adds a command with the name value in the list. This can be filtered in the search. + * All logs can be filtered searching for "LOG". + * @param arguments The arguments to log to Spector. + */ + log(...arguments: any[]): string; + + /** + * This method is only available in the Debug Build of Phaser, or a build with the + * `WEBGL_DEBUG` flag set in the Webpack Config. + * + * Phaser v3.60 Debug has a build of Spector.js embedded in it, which is a WebGL inspector + * that allows for live inspection of your WebGL calls. Although it's easy to add the Spector + * extension to a desktop browsr, by embedding it in Phaser we can make it available in mobile + * browsers too, making it a powerful tool for debugging WebGL games on mobile devices where + * extensions are not permitted. + * + * See https://github.com/BabylonJS/Spector.js for more details. + * + * This method will start a capture on the Phaser canvas. The capture will stop once it reaches + * the number of commands specified as a parameter, or after 10 seconds. If quick capture is true, + * the thumbnails are not captured in order to speed up the capture. + * @param commandCount The number of commands to capture. If zero it will capture for 10 seconds. Default 0. + * @param quickCapture If `true` thumbnails are not captured in order to speed up the capture. Default false. + * @param fullCapture If `true` all details are captured. Default false. + */ + startCapture(commandCount?: number, quickCapture?: boolean, fullCapture?: boolean): void; + + /** + * This method is only available in the Debug Build of Phaser, or a build with the + * `WEBGL_DEBUG` flag set in the Webpack Config. + * + * Phaser v3.60 Debug has a build of Spector.js embedded in it, which is a WebGL inspector + * that allows for live inspection of your WebGL calls. Although it's easy to add the Spector + * extension to a desktop browsr, by embedding it in Phaser we can make it available in mobile + * browsers too, making it a powerful tool for debugging WebGL games on mobile devices where + * extensions are not permitted. + * + * See https://github.com/BabylonJS/Spector.js for more details. + * + * This method will stop the current capture and returns the result in JSON. It displays the + * result if the UI has been displayed. This returns undefined if the capture has not been completed + * or did not find any commands. + */ + stopCapture(): object; + + /** + * The event handler that manages the `resize` event dispatched by the Scale Manager. + * @param gameSize The default Game Size object. This is the un-modified game dimensions. + * @param baseSize The base Size object. The game dimensions. The canvas width / height values match this. + */ + onResize(gameSize: Phaser.Structs.Size, baseSize: Phaser.Structs.Size): void; + + /** + * Binds the WebGL Renderers Render Target, so all drawn content is now redirected to it. + * + * Make sure to call `endCapture` when you are finished. + * @param width Optional new width of the Render Target. + * @param height Optional new height of the Render Target. + */ + beginCapture(width?: number, height?: number): void; + + /** + * Unbinds the WebGL Renderers Render Target and returns it, stopping any further content being drawn to it. + * + * If the viewport or scissors were modified during the capture, you should reset them by calling + * `resetViewport` and `resetScissor` accordingly. + */ + endCapture(): Phaser.Renderer.WebGL.RenderTarget; + + /** + * Resizes the drawing buffer to match that required by the Scale Manager. + * @param width The new width of the renderer. + * @param height The new height of the renderer. + */ + resize(width?: number, height?: number): this; + + /** + * Determines which compressed texture formats this browser and device supports. + * + * Called automatically as part of the WebGL Renderer init process. If you need to investigate + * which formats it supports, see the `Phaser.Renderer.WebGL.WebGLRenderer#compression` property instead. + */ + getCompressedTextures(): Phaser.Types.Renderer.WebGL.WebGLTextureCompression; + + /** + * Returns a compressed texture format GLenum name based on the given format. + * @param baseFormat The Base Format to check. + * @param format An optional GLenum format to check within the base format. + */ + getCompressedTextureName(baseFormat: string, format?: GLenum): string; + + /** + * Checks if the given compressed texture format is supported, or not. + * @param baseFormat The Base Format to check. + * @param format An optional GLenum format to check within the base format. + */ + supportsCompressedTexture(baseFormat: string, format?: GLenum): boolean; + + /** + * Gets the aspect ratio of the WebGLRenderer dimensions. + */ + getAspectRatio(): number; + + /** + * Sets the Projection Matrix of this renderer to the given dimensions. + * @param width The new width of the Projection Matrix. + * @param height The new height of the Projection Matrix. + */ + setProjectionMatrix(width: number, height: number): this; + + /** + * Resets the Projection Matrix back to this renderers width and height. + * + * This is called during `endCapture`, should the matrix have been changed + * as a result of the capture process. + */ + resetProjectionMatrix(): this; + + /** + * Checks if a WebGL extension is supported + * @param extensionName Name of the WebGL extension + */ + hasExtension(extensionName: string): boolean; + + /** + * Loads a WebGL extension + * @param extensionName The name of the extension to load. + */ + getExtension(extensionName: string): object; + + /** + * Flushes the current pipeline if the pipeline is bound + */ + flush(): void; + + /** + * Pushes a new scissor state. This is used to set nested scissor states. + * @param x The x position of the scissor. + * @param y The y position of the scissor. + * @param width The width of the scissor. + * @param height The height of the scissor. + * @param drawingBufferHeight Optional drawingBufferHeight override value. + */ + pushScissor(x: number, y: number, width: number, height: number, drawingBufferHeight?: number): number[]; + + /** + * Sets the current scissor state. + * @param x The x position of the scissor. + * @param y The y position of the scissor. + * @param width The width of the scissor. + * @param height The height of the scissor. + * @param drawingBufferHeight Optional drawingBufferHeight override value. + */ + setScissor(x: number, y: number, width: number, height: number, drawingBufferHeight?: number): void; + + /** + * Resets the gl scissor state to be whatever the current scissor is, if there is one, without + * modifying the scissor stack. + */ + resetScissor(): void; + + /** + * Pops the last scissor state and sets it. + */ + popScissor(): void; + + /** + * Is there an active stencil mask? + */ + hasActiveStencilMask(): boolean; + + /** + * Resets the gl viewport to the current renderer dimensions. + */ + resetViewport(): void; + + /** + * Sets the blend mode to the value given. + * + * If the current blend mode is different from the one given, the pipeline is flushed and the new + * blend mode is enabled. + * @param blendModeId The blend mode to be set. Can be a `BlendModes` const or an integer value. + * @param force Force the blend mode to be set, regardless of the currently set blend mode. Default false. + */ + setBlendMode(blendModeId: number, force?: boolean): boolean; + + /** + * Creates a new custom blend mode for the renderer. + * + * See https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants#Blending_modes + * @param func An array containing the WebGL functions to use for the source and the destination blending factors, respectively. See the possible constants for {@link WebGLRenderingContext#blendFunc()}. + * @param equation The equation to use for combining the RGB and alpha components of a new pixel with a rendered one. See the possible constants for {@link WebGLRenderingContext#blendEquation()}. + */ + addBlendMode(func: GLenum[], equation: GLenum): number; + + /** + * Updates the function bound to a given custom blend mode. + * @param index The index of the custom blend mode. + * @param func The function to use for the blend mode. + * @param equation The equation to use for the blend mode. + */ + updateBlendMode(index: number, func: Function, equation: Function): this; + + /** + * Removes a custom blend mode from the renderer. + * Any Game Objects still using this blend mode will error, so be sure to clear them first. + * @param index The index of the custom blend mode to be removed. + */ + removeBlendMode(index: number): this; + + /** + * Pushes a new framebuffer onto the FBO stack and makes it the currently bound framebuffer. + * + * If there was another framebuffer already bound it will force a pipeline flush. + * + * Call `popFramebuffer` to remove it again. + * @param framebuffer The framebuffer that needs to be bound. + * @param updateScissor Set the gl scissor to match the frame buffer size? Or, if `null` given, pop the scissor from the stack. Default false. + * @param setViewport Should the WebGL viewport be set? Default true. + * @param texture Bind the given frame buffer texture? Default null. + * @param clear Clear the frame buffer after binding? Default false. + */ + pushFramebuffer(framebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper, updateScissor?: boolean, setViewport?: boolean, texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, clear?: boolean): this; + + /** + * Sets the given framebuffer as the active and currently bound framebuffer. + * + * If there was another framebuffer already bound it will force a pipeline flush. + * + * Typically, you should call `pushFramebuffer` instead of this method. + * @param framebuffer The framebuffer that needs to be bound, or `null` to bind back to the default framebuffer. + * @param updateScissor If a framebuffer is given, set the gl scissor to match the frame buffer size? Or, if `null` given, pop the scissor from the stack. Default false. + * @param setViewport Should the WebGL viewport be set? Default true. + * @param texture Bind the given frame buffer texture? Default null. + * @param clear Clear the frame buffer after binding? Default false. + */ + setFramebuffer(framebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper | null, updateScissor?: boolean, setViewport?: boolean, texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, clear?: boolean): this; + + /** + * Pops the previous framebuffer from the fbo stack and sets it. + * @param updateScissor If a framebuffer is given, set the gl scissor to match the frame buffer size? Or, if `null` given, pop the scissor from the stack. Default false. + * @param setViewport Should the WebGL viewport be set? Default true. + */ + popFramebuffer(updateScissor?: boolean, setViewport?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper; + + /** + * Restores the previous framebuffer from the fbo stack and sets it. + * @param updateScissor If a framebuffer is given, set the gl scissor to match the frame buffer size? Or, if `null` given, pop the scissor from the stack. Default false. + * @param setViewport Should the WebGL viewport be set? Default true. + */ + restoreFramebuffer(updateScissor?: boolean, setViewport?: boolean): void; + + /** + * Binds a shader program. + * + * If there was a different program already bound it will force a pipeline flush first. + * + * If the same program given to this method is already set as the current program, no change + * will take place and this method will return `false`. + * @param program The program that needs to be bound. + */ + setProgram(program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper): boolean; + + /** + * Rebinds whatever program `WebGLRenderer.currentProgram` is set as, without + * changing anything, or flushing. + */ + resetProgram(): this; + + /** + * Creates a texture from an image source. If the source is not valid it creates an empty texture. + * @param source The source of the texture. + * @param width The width of the texture. + * @param height The height of the texture. + * @param scaleMode The scale mode to be used by the texture. + * @param forceClamp Force the texture to use the CLAMP_TO_EDGE wrap mode, even if a power of two? Default false. + */ + createTextureFromSource(source: object, width: number, height: number, scaleMode: number, forceClamp?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * A wrapper for creating a WebGLTextureWrapper. If no pixel data is passed it will create an empty texture. + * @param mipLevel Mip level of the texture. + * @param minFilter Filtering of the texture. + * @param magFilter Filtering of the texture. + * @param wrapT Wrapping mode of the texture. + * @param wrapS Wrapping mode of the texture. + * @param format Which format does the texture use. + * @param pixels pixel data. + * @param width Width of the texture in pixels. If not supplied, it must be derived from `pixels`. + * @param height Height of the texture in pixels. If not supplied, it must be derived from `pixels`. + * @param pma Does the texture have premultiplied alpha? Default true. + * @param forceSize If `true` it will use the width and height passed to this method, regardless of the pixels dimension. Default false. + * @param flipY Sets the `UNPACK_FLIP_Y_WEBGL` flag the WebGL Texture uses during upload. Default false. + */ + createTexture2D(mipLevel: number, minFilter: number, magFilter: number, wrapT: number, wrapS: number, format: number, pixels: object | undefined, width: number | undefined, height: number | undefined, pma?: boolean, forceSize?: boolean, flipY?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Creates a WebGL Framebuffer object and optionally binds a depth stencil render buffer. + * + * This will unbind any currently bound framebuffer. + * @param width If `addDepthStencilBuffer` is true, this controls the width of the depth stencil. + * @param height If `addDepthStencilBuffer` is true, this controls the height of the depth stencil. + * @param renderTexture The color texture where the color pixels are written. + * @param addDepthStencilBuffer Create a Renderbuffer for the depth stencil? Default false. + */ + createFramebuffer(width: number, height: number, renderTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, addDepthStencilBuffer?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper; + + /** + * Binds necessary resources and renders the mask to a separated framebuffer. + * The framebuffer for the masked object is also bound for further use. + * @param mask The BitmapMask instance that called beginMask. + * @param camera The camera rendering the current mask. + */ + beginBitmapMask(mask: Phaser.Display.Masks.BitmapMask, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Binds necessary resources and renders the mask to a separated framebuffer. + * The framebuffer for the masked object is also bound for further use. + * @param mask The BitmapMask instance that called beginMask. + * @param camera The camera rendering the current mask. + * @param bitmapMaskPipeline The BitmapMask Pipeline instance that is requesting the draw. + */ + drawBitmapMask(mask: Phaser.Display.Masks.BitmapMask, camera: Phaser.Cameras.Scene2D.Camera, bitmapMaskPipeline: Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline): void; + + /** + * Creates a WebGLProgram instance based on the given vertex and fragment shader source. + * + * Then compiles, attaches and links the program before wrapping and returning it. + * @param vertexShader The vertex shader source code as a single string. + * @param fragmentShader The fragment shader source code as a single string. + */ + createProgram(vertexShader: string, fragmentShader: string): Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper; + + /** + * Wrapper for creating a vertex buffer. + * @param initialDataOrSize It's either ArrayBuffer or an integer indicating the size of the vbo + * @param bufferUsage How the buffer is used. gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW + */ + createVertexBuffer(initialDataOrSize: ArrayBuffer, bufferUsage: number): Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper; + + /** + * Creates a WebGLAttribLocationWrapper instance based on the given WebGLProgramWrapper and attribute name. + * @param program The WebGLProgramWrapper instance. + * @param name The name of the attribute. + */ + createAttribLocation(program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper, name: string): void; + + /** + * Creates a WebGLUniformLocationWrapper instance based on the given WebGLProgramWrapper and uniform name. + * @param program The WebGLProgramWrapper instance. + * @param name The name of the uniform. + */ + createUniformLocation(program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper, name: string): void; + + /** + * Wrapper for creating a vertex buffer. + * @param initialDataOrSize Either ArrayBuffer or an integer indicating the size of the vbo. + * @param bufferUsage How the buffer is used. gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW. + */ + createIndexBuffer(initialDataOrSize: ArrayBuffer, bufferUsage: number): Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper; + + /** + * Removes a texture from the GPU. + * @param texture The WebGL Texture to be deleted. + */ + deleteTexture(texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): this; + + /** + * Deletes a Framebuffer from the GL instance. + * @param framebuffer The Framebuffer to be deleted. + */ + deleteFramebuffer(framebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper | null): this; + + /** + * Deletes a WebGLProgram from the GL instance. + * @param program The shader program to be deleted. + */ + deleteProgram(program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper): this; + + /** + * Deletes a WebGLAttribLocation from the GL instance. + * @param attrib The attrib location to be deleted. + */ + deleteAttribLocation(attrib: Phaser.Renderer.WebGL.Wrappers.WebGLAttribLocationWrapper): void; + + /** + * Deletes a WebGLUniformLocation from the GL instance. + * @param uniform The uniform location to be deleted. + */ + deleteUniformLocation(uniform: Phaser.Renderer.WebGL.Wrappers.WebGLUniformLocationWrapper): void; + + /** + * Deletes a WebGLBuffer from the GL instance. + * @param vertexBuffer The WebGLBuffer to be deleted. + */ + deleteBuffer(vertexBuffer: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper): this; + + /** + * Controls the pre-render operations for the given camera. + * Handles any clipping needed by the camera and renders the background color if a color is visible. + * @param camera The Camera to pre-render. + */ + preRenderCamera(camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Controls the post-render operations for the given camera. + * + * Renders the foreground camera effects like flash and fading, then resets the current scissor state. + * @param camera The Camera to post-render. + */ + postRenderCamera(camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Clears the current vertex buffer and updates pipelines. + */ + preRender(): void; + + /** + * The core render step for a Scene Camera. + * + * Iterates through the given array of Game Objects and renders them with the given Camera. + * + * This is called by the `CameraManager.render` method. The Camera Manager instance belongs to a Scene, and is invoked + * by the Scene Systems.render method. + * + * This method is not called if `Camera.visible` is `false`, or `Camera.alpha` is zero. + * @param scene The Scene to render. + * @param children An array of filtered Game Objects that can be rendered by the given Camera. + * @param camera The Scene Camera to render with. + */ + render(scene: Phaser.Scene, children: Phaser.GameObjects.GameObject[], camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * The post-render step happens after all Cameras in all Scenes have been rendered. + */ + postRender(): void; + + /** + * Disables the STENCIL_TEST but does not change the status + * of the current stencil mask. + */ + clearStencilMask(): void; + + /** + * Restores the current stencil function to the one that was in place + * before `clearStencilMask` was called. + */ + restoreStencilMask(): void; + + /** + * Schedules a snapshot of the entire game viewport to be taken after the current frame is rendered. + * + * To capture a specific area see the `snapshotArea` method. To capture a specific pixel, see `snapshotPixel`. + * + * Only one snapshot can be active _per frame_. If you have already called `snapshotPixel`, for example, then + * calling this method will override it. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer into an ArrayBufferView. + * It then parses this, copying the contents to a temporary Canvas and finally creating an Image object from it, + * which is the image returned to the callback provided. All in all, this is a computationally expensive and blocking process, + * which gets more expensive the larger the canvas size gets, so please be careful how you employ this in your game. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshot(callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Schedules a snapshot of the given area of the game viewport to be taken after the current frame is rendered. + * + * To capture the whole game viewport see the `snapshot` method. To capture a specific pixel, see `snapshotPixel`. + * + * Only one snapshot can be active _per frame_. If you have already called `snapshotPixel`, for example, then + * calling this method will override it. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer into an ArrayBufferView. + * It then parses this, copying the contents to a temporary Canvas and finally creating an Image object from it, + * which is the image returned to the callback provided. All in all, this is a computationally expensive and blocking process, + * which gets more expensive the larger the canvas size gets, so please be careful how you employ this in your game. + * @param x The x coordinate to grab from. This is based on the game viewport, not the world. + * @param y The y coordinate to grab from. This is based on the game viewport, not the world. + * @param width The width of the area to grab. + * @param height The height of the area to grab. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshotArea(x: number, y: number, width: number, height: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Schedules a snapshot of the given pixel from the game viewport to be taken after the current frame is rendered. + * + * To capture the whole game viewport see the `snapshot` method. To capture a specific area, see `snapshotArea`. + * + * Only one snapshot can be active _per frame_. If you have already called `snapshotArea`, for example, then + * calling this method will override it. + * + * Unlike the other two snapshot methods, this one will return a `Color` object containing the color data for + * the requested pixel. It doesn't need to create an internal Canvas or Image object, so is a lot faster to execute, + * using less memory. + * @param x The x coordinate of the pixel to get. This is based on the game viewport, not the world. + * @param y The y coordinate of the pixel to get. This is based on the game viewport, not the world. + * @param callback The Function to invoke after the snapshot pixel data is extracted. + */ + snapshotPixel(x: number, y: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback): this; + + /** + * Takes a snapshot of the given area of the given frame buffer. + * + * Unlike the other snapshot methods, this one is processed immediately and doesn't wait for the next render. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer into an ArrayBufferView. + * It then parses this, copying the contents to a temporary Canvas and finally creating an Image object from it, + * which is the image returned to the callback provided. All in all, this is a computationally expensive and blocking process, + * which gets more expensive the larger the canvas size gets, so please be careful how you employ this in your game. + * @param framebuffer The framebuffer to grab from. + * @param bufferWidth The width of the framebuffer. + * @param bufferHeight The height of the framebuffer. + * @param callback The Function to invoke after the snapshot image is created. + * @param getPixel Grab a single pixel as a Color object, or an area as an Image object? Default false. + * @param x The x coordinate to grab from. This is based on the framebuffer, not the world. Default 0. + * @param y The y coordinate to grab from. This is based on the framebuffer, not the world. Default 0. + * @param width The width of the area to grab. Default bufferWidth. + * @param height The height of the area to grab. Default bufferHeight. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshotFramebuffer(framebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper, bufferWidth: number, bufferHeight: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, getPixel?: boolean, x?: number, y?: number, width?: number, height?: number, type?: string, encoderOptions?: number): this; + + /** + * Creates a new WebGL Texture based on the given Canvas Element. + * + * If the `dstTexture` parameter is given, the WebGL Texture is updated, rather than created fresh. + * @param srcCanvas The Canvas to create the WebGL Texture from + * @param dstTexture The destination WebGLTextureWrapper to set. + * @param noRepeat Should this canvas be allowed to set `REPEAT` (such as for Text objects?) Default false. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y`? Default false. + */ + canvasToTexture(srcCanvas: HTMLCanvasElement, dstTexture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, noRepeat?: boolean, flipY?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Creates a new WebGL Texture based on the given Canvas Element. + * @param srcCanvas The Canvas to create the WebGL Texture from. + * @param noRepeat Should this canvas be allowed to set `REPEAT` (such as for Text objects?) Default false. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y`? Default false. + */ + createCanvasTexture(srcCanvas: HTMLCanvasElement, noRepeat?: boolean, flipY?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Updates a WebGL Texture based on the given Canvas Element. + * @param srcCanvas The Canvas to update the WebGL Texture from. + * @param dstTexture The destination WebGLTextureWrapper to update. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y`? Default false. + * @param noRepeat Should this canvas be allowed to set `REPEAT` (such as for Text objects?) Default false. + */ + updateCanvasTexture(srcCanvas: HTMLCanvasElement, dstTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, flipY?: boolean, noRepeat?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Creates or updates a WebGL Texture based on the given HTML Video Element. + * + * If the `dstTexture` parameter is given, the WebGL Texture is updated, rather than created fresh. + * @param srcVideo The Video to create the WebGL Texture from + * @param dstTexture The destination WebGLTextureWrapper to set. + * @param noRepeat Should this canvas be allowed to set `REPEAT`? Default false. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y`? Default false. + */ + videoToTexture(srcVideo: HTMLVideoElement, dstTexture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, noRepeat?: boolean, flipY?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Creates a new WebGL Texture based on the given HTML Video Element. + * @param srcVideo The Video to create the WebGL Texture from + * @param noRepeat Should this canvas be allowed to set `REPEAT`? Default false. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y`? Default false. + */ + createVideoTexture(srcVideo: HTMLVideoElement, noRepeat?: boolean, flipY?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Updates a WebGL Texture based on the given HTML Video Element. + * @param srcVideo The Video to update the WebGL Texture with. + * @param dstTexture The destination WebGLTextureWrapper to update. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y`? Default false. + * @param noRepeat Should this canvas be allowed to set `REPEAT`? Default false. + */ + updateVideoTexture(srcVideo: HTMLVideoElement, dstTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, flipY?: boolean, noRepeat?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Create a WebGLTexture from a Uint8Array. + * + * The Uint8Array is assumed to be RGBA values, one byte per color component. + * + * The texture will be filtered with `gl.NEAREST` and will not be mipped. + * @param data The Uint8Array to create the texture from. + * @param width The width of the texture. + * @param height The height of the texture. + */ + createUint8ArrayTexture(data: Uint8Array, width: number, height: number): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Sets the minification and magnification filter for a texture. + * @param texture The texture to set the filter for. + * @param filter The filter to set. 0 for linear filtering, 1 for nearest neighbor (blocky) filtering. + */ + setTextureFilter(texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, filter: number): this; + + /** + * Returns the largest texture size (either width or height) that can be created. + * Note that VRAM may not allow a texture of any given size, it just expresses + * hardware / driver support for a given size. + */ + getMaxTextureSize(): number; + + /** + * Destroy this WebGLRenderer, cleaning up all related resources such as pipelines, native textures, etc. + */ + destroy(): void; + + } + + /** + * Instances of the WebGLShader class belong to the WebGL Pipeline classes. When the pipeline is + * created it will create an instance of this class for each one of its shaders, as defined in + * the pipeline configuration. + * + * This class encapsulates everything needed to manage a shader in a pipeline, including the + * shader attributes and uniforms, as well as lots of handy methods such as `set2f`, for setting + * uniform values on this shader. + * + * Typically, you do not create an instance of this class directly, as it works in unison with + * the pipeline to which it belongs. You can gain access to this class via a pipeline's `shaders` + * array, post-creation. + */ + class WebGLShader { + /** + * + * @param pipeline The WebGLPipeline to which this Shader belongs. + * @param name The name of this Shader. + * @param vertexShader The vertex shader source code as a single string. + * @param fragmentShader The fragment shader source code as a single string. + * @param attributes An array of attributes. + */ + constructor(pipeline: Phaser.Renderer.WebGL.WebGLPipeline, name: string, vertexShader: string, fragmentShader: string, attributes: Phaser.Types.Renderer.WebGL.WebGLPipelineAttributeConfig[]); + + /** + * A reference to the WebGLPipeline that owns this Shader. + * + * A Shader class can only belong to a single pipeline. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The name of this shader. + */ + name: string; + + /** + * A reference to the WebGLRenderer instance. + */ + renderer: Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * A reference to the WebGL Rendering Context the WebGL Renderer is using. + */ + gl: WebGLRenderingContext; + + /** + * The fragment shader source code. + */ + fragSrc: string; + + /** + * The vertex shader source code. + */ + vertSrc: string; + + /** + * The WebGLProgram created from the vertex and fragment shaders. + */ + program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper; + + /** + * Array of objects that describe the vertex attributes. + */ + attributes: Phaser.Types.Renderer.WebGL.WebGLPipelineAttribute[]; + + /** + * The amount of vertex attribute components of 32 bit length. + */ + vertexComponentCount: number; + + /** + * The size, in bytes, of a single vertex. + * + * This is derived by adding together all of the vertex attributes. + * + * For example, the Multi Pipeline has the following attributes: + * + * inPosition - (size 2 x gl.FLOAT) = 8 + * inTexCoord - (size 2 x gl.FLOAT) = 8 + * inTexId - (size 1 x gl.FLOAT) = 4 + * inTintEffect - (size 1 x gl.FLOAT) = 4 + * inTint - (size 4 x gl.UNSIGNED_BYTE) = 4 + * + * The total, in this case, is 8 + 8 + 4 + 4 + 4 = 28. + * + * This is calculated automatically during the `createAttributes` method. + */ + readonly vertexSize: number; + + /** + * The active uniforms that this shader has. + * + * This is an object that maps the uniform names to their WebGL location and cached values. + * + * It is populated automatically via the `createUniforms` method. + */ + uniforms: Phaser.Types.Renderer.WebGL.WebGLPipelineUniformsConfig; + + /** + * Takes the vertex attributes config and parses it, creating the resulting array that is stored + * in this shaders `attributes` property, calculating the offset, normalization and location + * in the process. + * + * Calling this method resets `WebGLShader.attributes`, `WebGLShader.vertexSize` and + * `WebGLShader.vertexComponentCount`. + * + * It is called automatically when this class is created, but can be called manually if required. + * @param attributes An array of attributes configs. + */ + createAttributes(attributes: Phaser.Types.Renderer.WebGL.WebGLPipelineAttributeConfig[]): void; + + /** + * Sets the program this shader uses as being the active shader in the WebGL Renderer. + * + * This method is called every time the parent pipeline is made the current active pipeline. + * @param setAttributes Should the vertex attribute pointers be set? Default false. + * @param flush Flush the pipeline before binding this shader? Default false. + */ + bind(setAttributes?: boolean, flush?: boolean): this; + + /** + * Sets the program this shader uses as being the active shader in the WebGL Renderer. + * + * Then resets all of the attribute pointers. + */ + rebind(): this; + + /** + * Sets the vertex attribute pointers. + * + * This should only be called after the vertex buffer has been bound. + * + * It is called automatically during the `bind` method. + * @param reset Reset the vertex attribute locations? Default false. + */ + setAttribPointers(reset?: boolean): this; + + /** + * Sets up the `WebGLShader.uniforms` object, populating it with the names + * and locations of the shader uniforms this shader requires. + * + * It works by first calling `gl.getProgramParameter(program.webGLProgram, gl.ACTIVE_UNIFORMS)` to + * find out how many active uniforms this shader has. It then iterates through them, + * calling `gl.getActiveUniform` to get the WebGL Active Info from each one. Finally, + * the name and location are stored in the local array. + * + * This method is called automatically when this class is created. + */ + createUniforms(): this; + + /** + * Repopulate uniforms on the GPU. + * + * This is called automatically by the pipeline when the context is + * lost and then recovered. By the time this method is called, + * the WebGL resources are already recreated, so we just need to + * re-populate them. + */ + syncUniforms(): void; + + /** + * Checks to see if the given uniform name exists and is active in this shader. + * @param name The name of the uniform to check for. + */ + hasUniform(name: string): boolean; + + /** + * Resets the cached values of the given uniform. + * @param name The name of the uniform to reset. + */ + resetUniform(name: string): this; + + /** + * Sets the given uniform value/s based on the name and GL function. + * + * This method is called internally by other methods such as `set1f` and `set3iv`. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param setter The GL function to call. + * @param name The name of the uniform to set. + * @param value1 The new value of the uniform. + * @param skipCheck Skip the value comparison? Default false. + */ + setUniform1(setter: Function, name: string, value1: boolean | number | number[] | Float32Array, skipCheck?: boolean): this; + + /** + * Sets the given uniform value/s based on the name and GL function. + * + * This method is called internally by other methods such as `set1f` and `set3iv`. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param setter The GL function to call. + * @param name The name of the uniform to set. + * @param value1 The new value of the uniform. + * @param value2 The new value of the uniform. + * @param skipCheck Skip the value comparison? Default false. + */ + setUniform2(setter: Function, name: string, value1: boolean | number | number[] | Float32Array, value2: boolean | number | number[] | Float32Array, skipCheck?: boolean): this; + + /** + * Sets the given uniform value/s based on the name and GL function. + * + * This method is called internally by other methods such as `set1f` and `set3iv`. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param setter The GL function to call. + * @param name The name of the uniform to set. + * @param value1 The new value of the uniform. + * @param value2 The new value of the uniform. + * @param value3 The new value of the uniform. + * @param skipCheck Skip the value comparison? Default false. + */ + setUniform3(setter: Function, name: string, value1: boolean | number | number[] | Float32Array, value2: boolean | number | number[] | Float32Array, value3: boolean | number | number[] | Float32Array, skipCheck?: boolean): this; + + /** + * Sets the given uniform value/s based on the name and GL function. + * + * This method is called internally by other methods such as `set1f` and `set3iv`. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param setter The GL function to call. + * @param name The name of the uniform to set. + * @param value1 The new value of the uniform. + * @param value2 The new value of the uniform. + * @param value3 The new value of the uniform. + * @param value4 The new value of the uniform. + * @param skipCheck Skip the value comparison? Default false. + */ + setUniform4(setter: Function, name: string, value1: boolean | number | number[] | Float32Array, value2: boolean | number | number[] | Float32Array, value3: boolean | number | number[] | Float32Array, value4: boolean | number | number[] | Float32Array, skipCheck?: boolean): this; + + /** + * Sets a boolean uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param value The new value of the `boolean` uniform. + */ + setBoolean(name: string, value: boolean): this; + + /** + * Sets a 1f uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x The new value of the `float` uniform. + */ + set1f(name: string, x: number): this; + + /** + * Sets a 2f uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x The new X component of the `vec2` uniform. + * @param y The new Y component of the `vec2` uniform. + */ + set2f(name: string, x: number, y: number): this; + + /** + * Sets a 3f uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x The new X component of the `vec3` uniform. + * @param y The new Y component of the `vec3` uniform. + * @param z The new Z component of the `vec3` uniform. + */ + set3f(name: string, x: number, y: number, z: number): this; + + /** + * Sets a 4f uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x X component of the uniform + * @param y Y component of the uniform + * @param z Z component of the uniform + * @param w W component of the uniform + */ + set4f(name: string, x: number, y: number, z: number, w: number): this; + + /** + * Sets a 1fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set1fv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 2fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set2fv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 3fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set3fv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 4fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set4fv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 1iv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set1iv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 2iv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set2iv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 3iv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set3iv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 4iv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set4iv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 1i uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x The new value of the `int` uniform. + */ + set1i(name: string, x: number): this; + + /** + * Sets a 2i uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x The new X component of the `ivec2` uniform. + * @param y The new Y component of the `ivec2` uniform. + */ + set2i(name: string, x: number, y: number): this; + + /** + * Sets a 3i uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x The new X component of the `ivec3` uniform. + * @param y The new Y component of the `ivec3` uniform. + * @param z The new Z component of the `ivec3` uniform. + */ + set3i(name: string, x: number, y: number, z: number): this; + + /** + * Sets a 4i uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x X component of the uniform + * @param y Y component of the uniform + * @param z Z component of the uniform + * @param w W component of the uniform + */ + set4i(name: string, x: number, y: number, z: number, w: number): this; + + /** + * Sets a matrix 2fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param transpose Whether to transpose the matrix. Should be `false`. + * @param matrix The new values for the `mat2` uniform. + */ + setMatrix2fv(name: string, transpose: boolean, matrix: number[] | Float32Array): this; + + /** + * Sets a matrix 3fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param transpose Whether to transpose the matrix. Should be `false`. + * @param matrix The new values for the `mat3` uniform. + */ + setMatrix3fv(name: string, transpose: boolean, matrix: Float32Array): this; + + /** + * Sets a matrix 4fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param transpose Should the matrix be transpose + * @param matrix Matrix data + */ + setMatrix4fv(name: string, transpose: boolean, matrix: Float32Array): this; + + /** + * This method will create the Shader Program on the current GL context. + * + * If a program already exists, it will be destroyed and the new one will take its place. + * + * After the program is created the uniforms will be reset and + * this shader will be rebound. + * + * This is a very expensive process and if your shader is referenced elsewhere in + * your game those references may then be lost, so be sure to use this carefully. + * + * However, if you need to update say the fragment shader source, then you can pass + * the new source into this method and it'll rebuild the program using it. If you + * don't want to change the vertex shader src, pass `undefined` as the parameter. + * @param vertSrc The source code of the vertex shader. If not given, uses the source already defined in this Shader. + * @param fragSrc The source code of the fragment shader. If not given, uses the source already defined in this Shader. + */ + createProgram(vertSrc?: string, fragSrc?: string): this; + + /** + * Removes all external references from this class and deletes the WebGL program from the WebGL context. + * + * Does not remove this shader from the parent pipeline. + */ + destroy(): void; + + } + + namespace Wrappers { + /** + * Wrapper for a WebGL attribute location, containing all the information that was used to create it. + * + * A WebGLAttribLocation should never be exposed outside the WebGLRenderer, + * so the WebGLRenderer can handle context loss and other events without other systems having to be aware of it. + * Always use WebGLAttribLocationWrapper instead. + */ + class WebGLAttribLocationWrapper { + /** + * + * @param gl The WebGLRenderingContext to create the WebGLAttribLocation for. + * @param program The WebGLProgram that this location refers to. This must be created first. + * @param name The name of this location, as defined in the shader source code. + */ + constructor(gl: WebGLRenderingContext, program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper, name: string); + + /** + * The WebGLAttribLocation being wrapped by this class. + * + * This property could change at any time. + * Therefore, you should never store a reference to this value. + * It should only be passed directly to the WebGL API for drawing. + */ + webGLAttribLocation: GLint; + + /** + * The WebGLRenderingContext that owns this location. + */ + gl: WebGLRenderingContext; + + /** + * The WebGLProgram that this location refers to. + */ + program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper; + + /** + * The name of this location, as defined in the shader source code. + */ + name: string; + + /** + * Creates the WebGLAttribLocation. + */ + createResource(): void; + + /** + * Destroys this WebGLAttribLocationWrapper. + */ + destroy(): void; + + } + + /** + * Wrapper for a WebGL buffer, containing all the information that was used + * to create it. This can be a VertexBuffer or IndexBuffer. + * + * A WebGLBuffer should never be exposed outside the WebGLRenderer, so the + * WebGLRenderer can handle context loss and other events without other + * systems having to be aware of it. Always use WebGLBufferWrapper instead. + */ + class WebGLBufferWrapper { + /** + * + * @param gl The WebGLRenderingContext to create the WebGLBuffer for. + * @param initialDataOrSize Either an ArrayBuffer of data, or the size of the buffer to create. + * @param bufferType The type of the buffer being created. + * @param bufferUsage The usage of the buffer being created. gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW. + */ + constructor(gl: WebGLRenderingContext, initialDataOrSize: ArrayBuffer | number, bufferType: GLenum, bufferUsage: GLenum); + + /** + * The WebGLBuffer being wrapped by this class. + * + * This property could change at any time. + * Therefore, you should never store a reference to this value. + * It should only be passed directly to the WebGL API for drawing. + */ + webGLBuffer: WebGLBuffer | null; + + /** + * The WebGLRenderingContext that owns this WebGLBuffer. + */ + gl: WebGLRenderingContext; + + /** + * The initial data or size of the buffer. + * + * Note that this will be used to recreate the buffer if the WebGL context is lost. + */ + initialDataOrSize: ArrayBuffer | number; + + /** + * The type of the buffer. + */ + bufferType: GLenum; + + /** + * The usage of the buffer. gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW. + */ + bufferUsage: GLenum; + + /** + * Creates a WebGLBuffer for this WebGLBufferWrapper. + * + * This is called automatically by the constructor. It may also be + * called again if the WebGLBuffer needs re-creating. + */ + createResource(): void; + + /** + * Remove this WebGLBufferWrapper from the GL context. + */ + destroy(): void; + + } + + /** + * Wrapper for a WebGL frame buffer, + * containing all the information that was used to create it. + * + * A WebGLFramebuffer should never be exposed outside the WebGLRenderer, + * so the WebGLRenderer can handle context loss and other events + * without other systems having to be aware of it. + * Always use WebGLFramebufferWrapper instead. + */ + class WebGLFramebufferWrapper { + /** + * + * @param gl The WebGLRenderingContext to create the WebGLFramebuffer for. + * @param width If `addDepthStencilBuffer` is true, this controls the width of the depth stencil. + * @param height If `addDepthStencilBuffer` is true, this controls the height of the depth stencil. + * @param renderTexture The color texture where the color pixels are written. + * @param addDepthStencilBuffer Create a Renderbuffer for the depth stencil? Default false. + */ + constructor(gl: WebGLRenderingContext, width: number, height: number, renderTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, addDepthStencilBuffer?: boolean); + + /** + * The WebGLFramebuffer being wrapped by this class. + * + * This property could change at any time. + * Therefore, you should never store a reference to this value. + * It should only be passed directly to the WebGL API for drawing. + */ + webGLFramebuffer: WebGLFramebuffer | null; + + /** + * The WebGL context this WebGLFramebuffer belongs to. + */ + gl: WebGLRenderingContext; + + /** + * Width of the depth stencil. + */ + width: number; + + /** + * Height of the depth stencil. + */ + height: number; + + /** + * The color texture where the color pixels are written. + */ + renderTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Create a Renderbuffer for the depth stencil? + */ + addDepthStencilBuffer: boolean; + + /** + * Creates a WebGLFramebuffer from the given parameters. + * + * This is called automatically by the constructor. It may also be + * called again if the WebGLFramebuffer needs re-creating. + */ + createResource(): void; + + /** + * Destroys this WebGLFramebufferWrapper. + */ + destroy(): void; + + } + + /** + * Wrapper for a WebGL program, containing all the information that was used to create it. + * + * A WebGLProgram should never be exposed outside the WebGLRenderer, so the WebGLRenderer + * can handle context loss and other events without other systems having to be aware of it. + * Always use WebGLProgramWrapper instead. + */ + class WebGLProgramWrapper { + /** + * + * @param gl The WebGLRenderingContext to create the WebGLProgram for. + * @param vertexSource The vertex shader source code as a string. + * @param fragmentShader The fragment shader source code as a string. + */ + constructor(gl: WebGLRenderingContext, vertexSource: string, fragmentShader: string); + + /** + * The WebGLProgram being wrapped by this class. + * + * This property could change at any time. + * Therefore, you should never store a reference to this value. + * It should only be passed directly to the WebGL API for drawing. + */ + webGLProgram: WebGLProgram | null; + + /** + * The WebGLRenderingContext that owns this WebGLProgram. + */ + gl: WebGLRenderingContext; + + /** + * The vertex shader source code as a string. + */ + vertexSource: string; + + /** + * The fragment shader source code as a string. + */ + fragmentSource: string; + + /** + * Creates a WebGLProgram from the given vertex and fragment shaders. + * + * This is called automatically by the constructor. It may also be + * called again if the WebGLProgram needs re-creating. + */ + createResource(): void; + + /** + * Remove this WebGLProgram from the GL context. + */ + destroy(): void; + + } + + /** + * Wrapper for a WebGL texture, containing all the information that was used + * to create it. + * + * A WebGLTexture should never be exposed outside the WebGLRenderer, + * so the WebGLRenderer can handle context loss and other events + * without other systems having to be aware of it. + * Always use WebGLTextureWrapper instead. + */ + class WebGLTextureWrapper { + /** + * + * @param gl WebGL context the texture belongs to. + * @param mipLevel Mip level of the texture. + * @param minFilter Filtering of the texture. + * @param magFilter Filtering of the texture. + * @param wrapT Wrapping mode of the texture. + * @param wrapS Wrapping mode of the texture. + * @param format Which format does the texture use. + * @param pixels pixel data. + * @param width Width of the texture in pixels. + * @param height Height of the texture in pixels. + * @param pma Does the texture have premultiplied alpha? Default true. + * @param forceSize If `true` it will use the width and height passed to this method, regardless of the pixels dimension. Default false. + * @param flipY Sets the `UNPACK_FLIP_Y_WEBGL` flag the WebGL Texture uses during upload. Default false. + */ + constructor(gl: WebGLRenderingContext, mipLevel: number, minFilter: number, magFilter: number, wrapT: number, wrapS: number, format: number, pixels: object | undefined, width: number, height: number, pma?: boolean, forceSize?: boolean, flipY?: boolean); + + /** + * The WebGLTexture that this wrapper is wrapping. + * + * This property could change at any time. + * Therefore, you should never store a reference to this value. + * It should only be passed directly to the WebGL API for drawing. + */ + webGLTexture: WebGLTexture | null; + + /** + * Whether this is used as a RenderTexture. + */ + isRenderTexture: boolean; + + /** + * The WebGL context this WebGLTexture belongs to. + */ + gl: WebGLRenderingContext; + + /** + * Mip level of the texture. + */ + mipLevel: number; + + /** + * Filtering of the texture. + */ + minFilter: number; + + /** + * Filtering of the texture. + */ + magFilter: number; + + /** + * Wrapping mode of the texture. + */ + wrapT: number; + + /** + * Wrapping mode of the texture. + */ + wrapS: number; + + /** + * Which format does the texture use. + */ + format: number; + + /** + * Pixel data. This is the source data used to create the WebGLTexture. + */ + pixels: object | null; + + /** + * Width of the texture in pixels. + */ + width: number; + + /** + * Height of the texture in pixels. + */ + height: number; + + /** + * Does the texture have premultiplied alpha? + */ + pma: boolean; + + /** + * Whether to use the width and height properties, regardless of pixel dimensions. + */ + forceSize: boolean; + + /** + * Sets the `UNPACK_FLIP_Y_WEBGL` flag the WebGL Texture uses during upload. + */ + flipY: boolean; + + /** + * Creates a WebGLTexture from the given parameters. + * + * This is called automatically by the constructor. It may also be + * called again if the WebGLTexture needs re-creating. + */ + createResource(): void; + + /** + * Updates the WebGLTexture from an updated source. + * + * This should only be used when the source is a Canvas or Video element. + * @param source The source to update the WebGLTexture with. + * @param width The new width of the WebGLTexture. + * @param height The new height of the WebGLTexture. + * @param flipY Should the WebGLTexture set `UNPACK_MULTIPLY_FLIP_Y`? + * @param wrapS The new wrapping mode for the WebGLTexture. + * @param wrapT The new wrapping mode for the WebGLTexture. + * @param minFilter The new minification filter for the WebGLTexture. + * @param magFilter The new magnification filter for the WebGLTexture. + * @param format The new format for the WebGLTexture. + */ + update(source: object | undefined, width: number, height: number, flipY: boolean, wrapS: number, wrapT: number, minFilter: number, magFilter: number, format: number): void; + + /** + * The `__SPECTOR_Metadata` property of the `WebGLTexture`, + * used to add extra data to the debug SpectorJS integration. + */ + spectorMetadata: object; + + /** + * Deletes the WebGLTexture from the GPU, if it has not been already. + */ + destroy(): void; + + } + + /** + * Wrapper for a WebGL uniform location, containing all the information that was used to create it. + * + * A WebGLUniformLocation should never be exposed outside the WebGLRenderer, + * so the WebGLRenderer can handle context loss and other events without other systems having to be aware of it. + * Always use WebGLUniformLocationWrapper instead. + */ + class WebGLUniformLocationWrapper { + /** + * + * @param gl The WebGLRenderingContext to create the WebGLUniformLocation for. + * @param program The WebGLProgram that this location refers to. This must be created first. + * @param name The name of this location, as defined in the shader source code. + */ + constructor(gl: WebGLRenderingContext, program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper, name: string); + + /** + * The WebGLUniformLocation being wrapped by this class. + * + * This property could change at any time. + * Therefore, you should never store a reference to this value. + * It should only be passed directly to the WebGL API for drawing. + */ + webGLUniformLocation: WebGLUniformLocation | null; + + /** + * The WebGLRenderingContext that owns this location. + */ + gl: WebGLRenderingContext; + + /** + * The WebGLProgram that this location refers to. + */ + program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper; + + /** + * The name of this location, as defined in the shader source code. + */ + name: string; + + /** + * Creates the WebGLUniformLocation. + */ + createResource(): void; + + /** + * Destroys this WebGLUniformLocationWrapper. + */ + destroy(): void; + + } + + } + + } + + } + + /** + * Phaser Scale Modes. + */ + enum ScaleModes { + /** + * Default Scale Mode (Linear). + */ + DEFAULT, + /** + * Linear Scale Mode. + */ + LINEAR, + /** + * Nearest Scale Mode. + */ + NEAREST, + } + + namespace Scale { + /** + * Phaser Scale Manager constants for centering the game canvas. + */ + enum Center { + /** + * The game canvas is not centered within the parent by Phaser. + * You can still center it yourself via CSS. + */ + NO_CENTER, + /** + * The game canvas is centered both horizontally and vertically within the parent. + * To do this, the parent has to have a bounds that can be calculated and not be empty. + * + * Centering is achieved by setting the margin left and top properties of the + * game canvas, and does not factor in any other CSS styles you may have applied. + */ + CENTER_BOTH, + /** + * The game canvas is centered horizontally within the parent. + * To do this, the parent has to have a bounds that can be calculated and not be empty. + * + * Centering is achieved by setting the margin left and top properties of the + * game canvas, and does not factor in any other CSS styles you may have applied. + */ + CENTER_HORIZONTALLY, + /** + * The game canvas is centered both vertically within the parent. + * To do this, the parent has to have a bounds that can be calculated and not be empty. + * + * Centering is achieved by setting the margin left and top properties of the + * game canvas, and does not factor in any other CSS styles you may have applied. + */ + CENTER_VERTICALLY, + } + + /** + * Phaser Scale Manager constants for centering the game canvas. + * + * To find out what each mode does please see [Phaser.Scale.Center]{@link Phaser.Scale.Center}. + */ + type CenterType = Phaser.Scale.Center; + + /** + * Phaser Scale Manager constants for orientation. + */ + enum Orientation { + /** + * A landscape orientation. + */ + LANDSCAPE, + /** + * A portrait orientation. + */ + PORTRAIT, + } + + /** + * Phaser Scale Manager constants for orientation. + * + * To find out what each mode does please see [Phaser.Scale.Orientation]{@link Phaser.Scale.Orientation}. + */ + type OrientationType = Phaser.Scale.Orientation; + + /** + * Phaser Scale Manager constants for the different scale modes available. + */ + enum ScaleModes { + /** + * No scaling happens at all. The canvas is set to the size given in the game config and Phaser doesn't change it + * again from that point on. If you change the canvas size, either via CSS, or directly via code, then you need + * to call the Scale Managers `resize` method to give the new dimensions, or input events will stop working. + */ + NONE, + /** + * The height is automatically adjusted based on the width. + */ + WIDTH_CONTROLS_HEIGHT, + /** + * The width is automatically adjusted based on the height. + */ + HEIGHT_CONTROLS_WIDTH, + /** + * The width and height are automatically adjusted to fit inside the given target area, + * while keeping the aspect ratio. Depending on the aspect ratio there may be some space + * inside the area which is not covered. + */ + FIT, + /** + * The width and height are automatically adjusted to make the size cover the entire target + * area while keeping the aspect ratio. This may extend further out than the target size. + */ + ENVELOP, + /** + * The Canvas is resized to fit all available _parent_ space, regardless of aspect ratio. + */ + RESIZE, + /** + * The Canvas's visible area is resized to fit all available _parent_ space like RESIZE mode, + * and scale canvas size to fit inside the visible area like FIT mode. + */ + EXPAND, + } + + /** + * Phaser Scale Manager constants for the different scale modes available. + * + * To find out what each mode does please see [Phaser.Scale.ScaleModes]{@link Phaser.Scale.ScaleModes}. + */ + type ScaleModeType = Phaser.Scale.ScaleModes; + + /** + * Phaser Scale Manager constants for zoom modes. + */ + enum Zoom { + /** + * The game canvas will not be zoomed by Phaser. + */ + NO_ZOOM, + /** + * The game canvas will be 2x zoomed by Phaser. + */ + ZOOM_2X, + /** + * The game canvas will be 4x zoomed by Phaser. + */ + ZOOM_4X, + /** + * Calculate the zoom value based on the maximum multiplied game size that will + * fit into the parent, or browser window if no parent is set. + */ + MAX_ZOOM, + } + + /** + * Phaser Scale Manager constants for zoom modes. + * + * To find out what each mode does please see [Phaser.Scale.Zoom]{@link Phaser.Scale.Zoom}. + */ + type ZoomType = Phaser.Scale.Zoom; + + namespace Events { + /** + * The Scale Manager has successfully entered fullscreen mode. + */ + const ENTER_FULLSCREEN: string; + + /** + * The Scale Manager tried to enter fullscreen mode but failed. + */ + const FULLSCREEN_FAILED: string; + + /** + * The Scale Manager tried to enter fullscreen mode, but it is unsupported by the browser. + */ + const FULLSCREEN_UNSUPPORTED: string; + + /** + * The Scale Manager was in fullscreen mode, but has since left, either directly via game code, + * or via a user gestured, such as pressing the ESC key. + */ + const LEAVE_FULLSCREEN: string; + + /** + * The Scale Manager Orientation Change Event. + * + * This event is dispatched whenever the Scale Manager detects an orientation change event from the browser. + */ + const ORIENTATION_CHANGE: string; + + /** + * The Scale Manager Resize Event. + * + * This event is dispatched whenever the Scale Manager detects a resize event from the browser. + * It sends three parameters to the callback, each of them being Size components. You can read + * the `width`, `height`, `aspectRatio` and other properties of these components to help with + * scaling your own game content. + */ + const RESIZE: string; + + } + + /** + * The Scale Manager handles the scaling, resizing and alignment of the game canvas. + * + * The way scaling is handled is by setting the game canvas to a fixed size, which is defined in the + * game configuration. You also define the parent container in the game config. If no parent is given, + * it will default to using the document body. The Scale Manager will then look at the available space + * within the _parent_ and scale the canvas accordingly. Scaling is handled by setting the canvas CSS + * width and height properties, leaving the width and height of the canvas element itself untouched. + * Scaling is therefore achieved by keeping the core canvas the same size and 'stretching' + * it via its CSS properties. This gives the same result and speed as using the `transform-scale` CSS + * property, without the need for browser prefix handling. + * + * The calculations for the scale are heavily influenced by the bounding parent size, which is the computed + * dimensions of the canvas's parent. The CSS rules of the parent element play an important role in the + * operation of the Scale Manager. For example, if the parent has no defined width or height, then actions + * like auto-centering will fail to achieve the required result. The Scale Manager works in tandem with the + * CSS you set-up on the page hosting your game, rather than taking control of it. + * + * #### Parent and Display canvas containment guidelines: + * + * - Style the Parent element (of the game canvas) to control the Parent size and thus the games size and layout. + * + * - The Parent element's CSS styles should _effectively_ apply maximum (and minimum) bounding behavior. + * + * - The Parent element should _not_ apply a padding as this is not accounted for. + * If a padding is required apply it to the Parent's parent or apply a margin to the Parent. + * If you need to add a border, margin or any other CSS around your game container, then use a parent element and + * apply the CSS to this instead, otherwise you'll be constantly resizing the shape of the game container. + * + * - The Display canvas layout CSS styles (i.e. margins, size) should not be altered / specified as + * they may be updated by the Scale Manager. + * + * #### Scale Modes + * + * The way the scaling is handled is determined by the `scaleMode` property. The default is `NONE`, + * which prevents Phaser from scaling or touching the canvas, or its parent, at all. In this mode, you are + * responsible for all scaling. The other scaling modes afford you automatic scaling. + * + * If you wish to scale your game so that it always fits into the available space within the parent, you + * should use the scale mode `FIT`. Look at the documentation for other scale modes to see what options are + * available. Here is a basic config showing how to set this scale mode: + * + * ```javascript + * scale: { + * parent: 'yourgamediv', + * mode: Phaser.Scale.FIT, + * width: 800, + * height: 600 + * } + * ``` + * + * Place the `scale` config object within your game config. + * + * If you wish for the canvas to be resized directly, so that the canvas itself fills the available space + * (i.e. it isn't scaled, it's resized) then use the `RESIZE` scale mode. This will give you a 1:1 mapping + * of canvas pixels to game size. In this mode CSS isn't used to scale the canvas, it's literally adjusted + * to fill all available space within the parent. You should be extremely careful about the size of the + * canvas you're creating when doing this, as the larger the area, the more work the GPU has to do and it's + * very easy to hit fill-rate limits quickly. + * + * For complex, custom-scaling requirements, you should probably consider using the `RESIZE` scale mode, + * with your own limitations in place re: canvas dimensions and managing the scaling with the game scenes + * yourself. For the vast majority of games, however, the `FIT` mode is likely to be the most used. + * + * Please appreciate that the Scale Manager cannot perform miracles. All it does is scale your game canvas + * as best it can, based on what it can infer from its surrounding area. There are all kinds of environments + * where it's up to you to guide and help the canvas position itself, especially when built into rendering + * frameworks like React and Vue. If your page requires meta tags to prevent user scaling gestures, or such + * like, then it's up to you to ensure they are present in the html. + * + * #### Centering + * + * You can also have the game canvas automatically centered. Again, this relies heavily on the parent being + * properly configured and styled, as the centering offsets are based entirely on the available space + * within the parent element. Centering is disabled by default, or can be applied horizontally, vertically, + * or both. Here's an example: + * + * ```javascript + * scale: { + * parent: 'yourgamediv', + * autoCenter: Phaser.Scale.CENTER_BOTH, + * width: 800, + * height: 600 + * } + * ``` + * + * #### Fullscreen API + * + * If the browser supports it, you can send your game into fullscreen mode. In this mode, the game will fill + * the entire display, removing all browser UI and anything else present on the screen. It will remain in this + * mode until your game either disables it, or until the user tabs out or presses ESCape if on desktop. It's a + * great way to achieve a desktop-game like experience from the browser, but it does require a modern browser + * to handle it. Some mobile browsers also support this. + */ + class ScaleManager extends Phaser.Events.EventEmitter { + /** + * + * @param game A reference to the Phaser.Game instance. + */ + constructor(game: Phaser.Game); + + /** + * A reference to the Phaser.Game instance. + */ + readonly game: Phaser.Game; + + /** + * A reference to the HTML Canvas Element that Phaser uses to render the game. + */ + canvas: HTMLCanvasElement; + + /** + * The DOM bounds of the canvas element. + */ + canvasBounds: Phaser.Geom.Rectangle; + + /** + * The parent object of the Canvas. Often a div, or the browser window, or nothing in non-browser environments. + * + * This is set in the Game Config as the `parent` property. If undefined (or just not present), it will default + * to use the document body. If specifically set to `null` Phaser will ignore all parent operations. + */ + parent: any | null; + + /** + * Is the parent element the browser window? + */ + parentIsWindow: boolean; + + /** + * The Parent Size component. + */ + parentSize: Phaser.Structs.Size; + + /** + * The Game Size component. + * + * The un-modified game size, as requested in the game config (the raw width / height), + * as used for world bounds, cameras, etc + */ + gameSize: Phaser.Structs.Size; + + /** + * The Base Size component. + * + * The modified game size, which is the auto-rounded gameSize, used to set the canvas width and height + * (but not the CSS style) + */ + baseSize: Phaser.Structs.Size; + + /** + * The Display Size component. + * + * The size used for the canvas style, factoring in the scale mode, parent and other values. + */ + displaySize: Phaser.Structs.Size; + + /** + * The game scale mode. + */ + scaleMode: Phaser.Scale.ScaleModeType; + + /** + * The game zoom factor. + * + * This value allows you to multiply your games base size by the given zoom factor. + * This is then used when calculating the display size, even in `NONE` situations. + * If you don't want Phaser to touch the canvas style at all, this value should be 1. + * + * Can also be set to `MAX_ZOOM` in which case the zoom value will be derived based + * on the game size and available space within the parent. + */ + zoom: number; + + /** + * Internal flag set when the game zoom factor is modified. + */ + readonly _resetZoom: boolean; + + /** + * The scale factor between the baseSize and the canvasBounds. + */ + displayScale: Phaser.Math.Vector2; + + /** + * If set, the canvas sizes will be automatically passed through Math.floor. + * This results in rounded pixel display values, which is important for performance on legacy + * and low powered devices, but at the cost of not achieving a 'perfect' fit in some browser windows. + */ + autoRound: boolean; + + /** + * Automatically center the canvas within the parent? The different centering modes are: + * + * 1. No centering. + * 2. Center both horizontally and vertically. + * 3. Center horizontally. + * 4. Center vertically. + * + * Please be aware that in order to center the game canvas, you must have specified a parent + * that has a size set, or the canvas parent is the document.body. + */ + autoCenter: Phaser.Scale.CenterType; + + /** + * The current device orientation. + * + * Orientation events are dispatched via the Device Orientation API, typically only on mobile browsers. + */ + orientation: Phaser.Scale.OrientationType; + + /** + * A reference to the Device.Fullscreen object. + */ + fullscreen: Phaser.Device.Fullscreen; + + /** + * The DOM Element which is sent into fullscreen mode. + */ + fullscreenTarget: any | null; + + /** + * The dirty state of the Scale Manager. + * Set if there is a change between the parent size and the current size. + */ + dirty: boolean; + + /** + * How many milliseconds should elapse before checking if the browser size has changed? + * + * Most modern browsers dispatch a 'resize' event, which the Scale Manager will listen for. + * However, older browsers fail to do this, or do it consistently, so we fall back to a + * more traditional 'size check' based on a time interval. You can control how often it is + * checked here. + */ + resizeInterval: number; + + /** + * Called _before_ the canvas object is created and added to the DOM. + */ + protected preBoot(): void; + + /** + * The Boot handler is called by Phaser.Game when it first starts up. + * The renderer is available by now and the canvas has been added to the DOM. + */ + protected boot(): void; + + /** + * Parses the game configuration to set-up the scale defaults. + * @param config The Game configuration object. + */ + protected parseConfig(config: Phaser.Types.Core.GameConfig): void; + + /** + * Determines the parent element of the game canvas, if any, based on the game configuration. + * @param config The Game configuration object. + */ + getParent(config: Phaser.Types.Core.GameConfig): void; + + /** + * Calculates the size of the parent bounds and updates the `parentSize` + * properties, only if the canvas has a dom parent. + */ + getParentBounds(): boolean; + + /** + * Attempts to lock the orientation of the web browser using the Screen Orientation API. + * + * This API is only available on modern mobile browsers. + * See https://developer.mozilla.org/en-US/docs/Web/API/Screen/lockOrientation for details. + * @param orientation The orientation you'd like to lock the browser in. Should be an API string such as 'landscape', 'landscape-primary', 'portrait', etc. + */ + lockOrientation(orientation: string): boolean; + + /** + * This method will set the size of the Parent Size component, which is used in scaling + * and centering calculations. You only need to call this method if you have explicitly + * disabled the use of a parent in your game config, but still wish to take advantage of + * other Scale Manager features. + * @param width The new width of the parent. + * @param height The new height of the parent. + */ + setParentSize(width: number, height: number): this; + + /** + * This method will set a new size for your game. + * + * It should only be used if you're looking to change the base size of your game and are using + * one of the Scale Manager scaling modes, i.e. `FIT`. If you're using `NONE` and wish to + * change the game and canvas size directly, then please use the `resize` method instead. + * @param width The new width of the game. + * @param height The new height of the game. + */ + setGameSize(width: number, height: number): this; + + /** + * Call this to modify the size of the Phaser canvas element directly. + * You should only use this if you are using the `NONE` scale mode, + * it will update all internal components completely. + * + * If all you want to do is change the size of the parent, see the `setParentSize` method. + * + * If all you want is to change the base size of the game, but still have the Scale Manager + * manage all the scaling (i.e. you're **not** using `NONE`), then see the `setGameSize` method. + * + * This method will set the `gameSize`, `baseSize` and `displaySize` components to the given + * dimensions. It will then resize the canvas width and height to the values given, by + * directly setting the properties. Finally, if you have set the Scale Manager zoom value + * to anything other than 1 (the default), it will set the canvas CSS width and height to + * be the given size multiplied by the zoom factor (the canvas pixel size remains untouched). + * + * If you have enabled `autoCenter`, it is then passed to the `updateCenter` method and + * the margins are set, allowing the canvas to be centered based on its parent element + * alone. Finally, the `displayScale` is adjusted and the RESIZE event dispatched. + * @param width The new width of the game. + * @param height The new height of the game. + */ + resize(width: number, height: number): this; + + /** + * Sets the zoom value of the Scale Manager. + * @param value The new zoom value of the game. + */ + setZoom(value: number): this; + + /** + * Sets the zoom to be the maximum possible based on the _current_ parent size. + */ + setMaxZoom(): this; + + /** + * By setting a Snap value, when the browser size is modified, its dimensions will automatically + * be snapped to the nearest grid slice, using floor. For example, if you have snap value of 16, + * and the width changes to 68, then it will snap down to 64 (the closest multiple of 16 when floored) + * + * This mode is best used with the `FIT` scale mode. + * + * Call this method with no arguments to reset the snap values. + * + * Calling this method automatically invokes `ScaleManager.refresh` which emits a `RESIZE` event. + * @param snapWidth The amount to snap the width to. If you don't want to snap the width, pass a value of zero. Default 0. + * @param snapHeight The amount to snap the height to. If not provided it will use the `snapWidth` value. If you don't want to snap the height, pass a value of zero. Default snapWidth. + */ + setSnap(snapWidth?: number, snapHeight?: number): this; + + /** + * Refreshes the internal scale values, bounds sizes and orientation checks. + * + * Once finished, dispatches the resize event. + * + * This is called automatically by the Scale Manager when the browser window size changes, + * as long as it is using a Scale Mode other than 'NONE'. + * @param previousWidth The previous width of the game. Only set if the gameSize has changed. + * @param previousHeight The previous height of the game. Only set if the gameSize has changed. + */ + refresh(previousWidth?: number, previousHeight?: number): this; + + /** + * Internal method that checks the current screen orientation, only if the internal check flag is set. + * + * If the orientation has changed it updates the orientation property and then dispatches the orientation change event. + */ + updateOrientation(): void; + + /** + * Internal method that manages updating the size components based on the scale mode. + */ + updateScale(): void; + + /** + * Calculates and returns the largest possible zoom factor, based on the current + * parent and game sizes. If the parent has no dimensions (i.e. an unstyled div), + * or is smaller than the un-zoomed game, then this will return a value of 1 (no zoom) + */ + getMaxZoom(): number; + + /** + * Calculates and updates the canvas CSS style in order to center it within the + * bounds of its parent. If you have explicitly set parent to be `null` in your + * game config then this method will likely give incorrect results unless you have called the + * `setParentSize` method first. + * + * It works by modifying the canvas CSS `marginLeft` and `marginTop` properties. + * + * If they have already been set by your own style sheet, or code, this will overwrite them. + * + * To prevent the Scale Manager from centering the canvas, either do not set the + * `autoCenter` property in your game config, or make sure it is set to `NO_CENTER`. + */ + updateCenter(): void; + + /** + * Updates the `canvasBounds` rectangle to match the bounding client rectangle of the + * canvas element being used to track input events. + */ + updateBounds(): void; + + /** + * Transforms the pageX value into the scaled coordinate space of the Scale Manager. + * @param pageX The DOM pageX value. + */ + transformX(pageX: number): number; + + /** + * Transforms the pageY value into the scaled coordinate space of the Scale Manager. + * @param pageY The DOM pageY value. + */ + transformY(pageY: number): number; + + /** + * Sends a request to the browser to ask it to go in to full screen mode, using the {@link https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API Fullscreen API}. + * + * If the browser does not support this, a `FULLSCREEN_UNSUPPORTED` event will be emitted. + * + * This method _must_ be called from a `pointerup` user-input gesture (**not** `pointerdown`). You cannot launch + * games fullscreen without this, as most browsers block it. Games within an iframe will also be blocked + * from fullscreen unless the iframe has the `allowfullscreen` attribute. + * + * On touch devices, such as Android and iOS Safari, you should always use `pointerup` and NOT `pointerdown`, + * otherwise the request will fail unless the document in which your game is embedded has already received + * some form of touch input, which you cannot guarantee. Activating fullscreen via `pointerup` circumvents + * this issue. + * + * Performing an action that navigates to another page, or opens another tab, will automatically cancel + * fullscreen mode, as will the user pressing the ESC key. To cancel fullscreen mode directly from your game, + * i.e. by clicking an icon, call the `stopFullscreen` method. + * + * A browser can only send one DOM element into fullscreen. You can control which element this is by + * setting the `fullscreenTarget` property in your game config, or changing the property in the Scale Manager. + * Note that the game canvas _must_ be a child of the target. If you do not give a target, Phaser will + * automatically create a blank `
    ` element and move the canvas into it, before going fullscreen. + * When it leaves fullscreen, the div will be removed. + * @param fullscreenOptions The FullscreenOptions dictionary is used to provide configuration options when entering full screen. + */ + startFullscreen(fullscreenOptions?: object): void; + + /** + * An internal method that gets the target element that is used when entering fullscreen mode. + */ + getFullscreenTarget(): object; + + /** + * Removes the fullscreen target that was added to the DOM. + */ + removeFullscreenTarget(): void; + + /** + * Calling this method will cancel fullscreen mode, if the browser has entered it. + */ + stopFullscreen(): void; + + /** + * Toggles the fullscreen mode. If already in fullscreen, calling this will cancel it. + * If not in fullscreen, this will request the browser to enter fullscreen mode. + * + * If the browser does not support this, a `FULLSCREEN_UNSUPPORTED` event will be emitted. + * + * This method _must_ be called from a user-input gesture, such as `pointerdown`. You cannot launch + * games fullscreen without this, as most browsers block it. Games within an iframe will also be blocked + * from fullscreen unless the iframe has the `allowfullscreen` attribute. + * @param fullscreenOptions The FullscreenOptions dictionary is used to provide configuration options when entering full screen. + */ + toggleFullscreen(fullscreenOptions?: object): void; + + /** + * An internal method that starts the different DOM event listeners running. + */ + startListeners(): void; + + /** + * Triggered when a fullscreenchange event is dispatched by the DOM. + */ + protected onFullScreenChange(): void; + + /** + * Triggered when a fullscreenerror event is dispatched by the DOM. + */ + onFullScreenError(): void; + + /** + * Get Rectange of visible area. + * @param camera The camera this viewport is respond upon. + * @param out The Rectangle of visible area. + */ + getViewPort(camera?: Phaser.Cameras.Scene2D.Camera, out?: Phaser.Geom.Rectangle): Phaser.Geom.Rectangle; + + /** + * Internal method, called automatically by the game step. + * Monitors the elapsed time and resize interval to see if a parent bounds check needs to take place. + * @param time The time value from the most recent Game step. Typically a high-resolution timer value, or Date.now(). + * @param delta The delta value since the last frame. This is smoothed to avoid delta spikes by the TimeStep class. + */ + step(time: number, delta: number): void; + + /** + * Stops all DOM event listeners. + */ + stopListeners(): void; + + /** + * Destroys this Scale Manager, releasing all references to external resources. + * Once destroyed, the Scale Manager cannot be used again. + */ + destroy(): void; + + /** + * Is the browser currently in fullscreen mode or not? + */ + readonly isFullscreen: boolean; + + /** + * The game width. + * + * This is typically the size given in the game configuration. + */ + readonly width: number; + + /** + * The game height. + * + * This is typically the size given in the game configuration. + */ + readonly height: number; + + /** + * Is the device in a portrait orientation as reported by the Orientation API? + * This value is usually only available on mobile devices. + */ + readonly isPortrait: boolean; + + /** + * Is the device in a landscape orientation as reported by the Orientation API? + * This value is usually only available on mobile devices. + */ + readonly isLandscape: boolean; + + /** + * Are the game dimensions portrait? (i.e. taller than they are wide) + * + * This is different to the device itself being in a portrait orientation. + */ + readonly isGamePortrait: boolean; + + /** + * Are the game dimensions landscape? (i.e. wider than they are tall) + * + * This is different to the device itself being in a landscape orientation. + */ + readonly isGameLandscape: boolean; + + } + + /** + * The game canvas is not centered within the parent by Phaser. + * You can still center it yourself via CSS. + */ + const NO_CENTER: number; + + /** + * The game canvas is centered both horizontally and vertically within the parent. + * To do this, the parent has to have a bounds that can be calculated and not be empty. + * + * Centering is achieved by setting the margin left and top properties of the + * game canvas, and does not factor in any other CSS styles you may have applied. + */ + const CENTER_BOTH: number; + + /** + * The game canvas is centered horizontally within the parent. + * To do this, the parent has to have a bounds that can be calculated and not be empty. + * + * Centering is achieved by setting the margin left and top properties of the + * game canvas, and does not factor in any other CSS styles you may have applied. + */ + const CENTER_HORIZONTALLY: number; + + /** + * The game canvas is centered both vertically within the parent. + * To do this, the parent has to have a bounds that can be calculated and not be empty. + * + * Centering is achieved by setting the margin left and top properties of the + * game canvas, and does not factor in any other CSS styles you may have applied. + */ + const CENTER_VERTICALLY: number; + + /** + * A landscape orientation. + */ + const LANDSCAPE: string; + + /** + * A portrait orientation. + */ + const PORTRAIT: string; + + /** + * No scaling happens at all. The canvas is set to the size given in the game config and Phaser doesn't change it + * again from that point on. If you change the canvas size, either via CSS, or directly via code, then you need + * to call the Scale Managers `resize` method to give the new dimensions, or input events will stop working. + */ + const NONE: number; + + /** + * The height is automatically adjusted based on the width. + */ + const WIDTH_CONTROLS_HEIGHT: number; + + /** + * The width is automatically adjusted based on the height. + */ + const HEIGHT_CONTROLS_WIDTH: number; + + /** + * The width and height are automatically adjusted to fit inside the given target area, + * while keeping the aspect ratio. Depending on the aspect ratio there may be some space + * inside the area which is not covered. + */ + const FIT: number; + + /** + * The width and height are automatically adjusted to make the size cover the entire target + * area while keeping the aspect ratio. This may extend further out than the target size. + */ + const ENVELOP: number; + + /** + * The Canvas is resized to fit all available _parent_ space, regardless of aspect ratio. + */ + const RESIZE: number; + + /** + * The game canvas will not be zoomed by Phaser. + */ + const NO_ZOOM: number; + + /** + * The game canvas will be 2x zoomed by Phaser. + */ + const ZOOM_2X: number; + + /** + * The game canvas will be 4x zoomed by Phaser. + */ + const ZOOM_4X: number; + + /** + * Calculate the zoom value based on the maximum multiplied game size that will + * fit into the parent, or browser window if no parent is set. + */ + const MAX_ZOOM: number; + + } + + namespace Scenes { + /** + * Scene state. + */ + var PENDING: number; + + /** + * Scene state. + */ + var INIT: number; + + /** + * Scene state. + */ + var START: number; + + /** + * Scene state. + */ + var LOADING: number; + + /** + * Scene state. + */ + var CREATING: number; + + /** + * Scene state. + */ + var RUNNING: number; + + /** + * Scene state. + */ + var PAUSED: number; + + /** + * Scene state. + */ + var SLEEPING: number; + + /** + * Scene state. + */ + var SHUTDOWN: number; + + /** + * Scene state. + */ + var DESTROYED: number; + + namespace Events { + /** + * The Game Object Added to Scene Event. + * + * This event is dispatched when a Game Object is added to a Scene. + * + * Listen for it from a Scene using `this.events.on('addedtoscene', listener)`. + */ + const ADDED_TO_SCENE: string; + + /** + * The Scene Systems Boot Event. + * + * This event is dispatched by a Scene during the Scene Systems boot process. Primarily used by Scene Plugins. + * + * Listen to it from a Scene using `this.events.on('boot', listener)`. + */ + const BOOT: string; + + /** + * The Scene Create Event. + * + * This event is dispatched by a Scene after it has been created by the Scene Manager. + * + * If a Scene has a `create` method then this event is emitted _after_ that has run. + * + * If there is a transition, this event will be fired after the `TRANSITION_START` event. + * + * Listen to it from a Scene using `this.events.on('create', listener)`. + */ + const CREATE: string; + + /** + * The Scene Systems Destroy Event. + * + * This event is dispatched by a Scene during the Scene Systems destroy process. + * + * Listen to it from a Scene using `this.events.on('destroy', listener)`. + * + * You should destroy any resources that may be in use by your Scene in this event handler. + */ + const DESTROY: string; + + /** + * The Scene Systems Pause Event. + * + * This event is dispatched by a Scene when it is paused, either directly via the `pause` method, or as an + * action from another Scene. + * + * Listen to it from a Scene using `this.events.on('pause', listener)`. + */ + const PAUSE: string; + + /** + * The Scene Systems Post Update Event. + * + * This event is dispatched by a Scene during the main game loop step. + * + * The event flow for a single step of a Scene is as follows: + * + * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE} + * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE} + * 3. The `Scene.update` method is called, if it exists + * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE} + * 5. [PRE_RENDER]{@linkcode Phaser.Scenes.Events#event:PRE_RENDER} + * 6. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER} + * + * Listen to it from a Scene using `this.events.on('postupdate', listener)`. + * + * A Scene will only run its step if it is active. + */ + const POST_UPDATE: string; + + /** + * The Scene Systems Pre-Render Event. + * + * This event is dispatched by a Scene during the main game loop step. + * + * The event flow for a single step of a Scene is as follows: + * + * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE} + * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE} + * 3. The `Scene.update` method is called, if it exists + * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE} + * 5. [PRE_RENDER]{@linkcode Phaser.Scenes.Events#event:PRE_RENDER} + * 6. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER} + * + * Listen to this event from a Scene using `this.events.on('prerender', listener)`. + * + * A Scene will only render if it is visible. + * + * This event is dispatched after the Scene Display List is sorted and before the Scene is rendered. + */ + const PRE_RENDER: string; + + /** + * The Scene Systems Pre Update Event. + * + * This event is dispatched by a Scene during the main game loop step. + * + * The event flow for a single step of a Scene is as follows: + * + * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE} + * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE} + * 3. The `Scene.update` method is called, if it exists + * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE} + * 5. [PRE_RENDER]{@linkcode Phaser.Scenes.Events#event:PRE_RENDER} + * 6. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER} + * + * Listen to it from a Scene using `this.events.on('preupdate', listener)`. + * + * A Scene will only run its step if it is active. + */ + const PRE_UPDATE: string; + + /** + * The Scene Systems Ready Event. + * + * This event is dispatched by a Scene during the Scene Systems start process. + * By this point in the process the Scene is now fully active and rendering. + * This event is meant for your game code to use, as all plugins have responded to the earlier 'start' event. + * + * Listen to it from a Scene using `this.events.on('ready', listener)`. + */ + const READY: string; + + /** + * The Game Object Removed from Scene Event. + * + * This event is dispatched when a Game Object is removed from a Scene. + * + * Listen for it from a Scene using `this.events.on('removedfromscene', listener)`. + */ + const REMOVED_FROM_SCENE: string; + + /** + * The Scene Systems Render Event. + * + * This event is dispatched by a Scene during the main game loop step. + * + * The event flow for a single step of a Scene is as follows: + * + * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE} + * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE} + * 3. The `Scene.update` method is called, if it exists + * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE} + * 5. [PRE_RENDER]{@linkcode Phaser.Scenes.Events#event:PRE_RENDER} + * 6. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER} + * + * Listen to it from a Scene using `this.events.on('render', listener)`. + * + * A Scene will only render if it is visible. + * + * By the time this event is dispatched, the Scene will have already been rendered. + */ + const RENDER: string; + + /** + * The Scene Systems Resume Event. + * + * This event is dispatched by a Scene when it is resumed from a paused state, either directly via the `resume` method, + * or as an action from another Scene. + * + * Listen to it from a Scene using `this.events.on('resume', listener)`. + */ + const RESUME: string; + + /** + * The Scene Systems Shutdown Event. + * + * This event is dispatched by a Scene during the Scene Systems shutdown process. + * + * Listen to it from a Scene using `this.events.on('shutdown', listener)`. + * + * You should free-up any resources that may be in use by your Scene in this event handler, on the understanding + * that the Scene may, at any time, become active again. A shutdown Scene is not 'destroyed', it's simply not + * currently active. Use the [DESTROY]{@linkcode Phaser.Scenes.Events#event:DESTROY} event to completely clear resources. + */ + const SHUTDOWN: string; + + /** + * The Scene Systems Sleep Event. + * + * This event is dispatched by a Scene when it is sent to sleep, either directly via the `sleep` method, + * or as an action from another Scene. + * + * Listen to it from a Scene using `this.events.on('sleep', listener)`. + */ + const SLEEP: string; + + /** + * The Scene Systems Start Event. + * + * This event is dispatched by a Scene during the Scene Systems start process. Primarily used by Scene Plugins. + * + * Listen to it from a Scene using `this.events.on('start', listener)`. + */ + const START: string; + + /** + * The Scene Transition Complete Event. + * + * This event is dispatched by the Target Scene of a transition. + * + * It happens when the transition process has completed. This occurs when the duration timer equals or exceeds the duration + * of the transition. + * + * Listen to it from a Scene using `this.events.on('transitioncomplete', listener)`. + * + * The Scene Transition event flow is as follows: + * + * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event. + * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method. + * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ... + * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to. + * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes. + */ + const TRANSITION_COMPLETE: string; + + /** + * The Scene Transition Init Event. + * + * This event is dispatched by the Target Scene of a transition. + * + * It happens immediately after the `Scene.init` method is called. If the Scene does not have an `init` method, + * this event is not dispatched. + * + * Listen to it from a Scene using `this.events.on('transitioninit', listener)`. + * + * The Scene Transition event flow is as follows: + * + * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event. + * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method. + * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ... + * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to. + * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes. + */ + const TRANSITION_INIT: string; + + /** + * The Scene Transition Out Event. + * + * This event is dispatched by a Scene when it initiates a transition to another Scene. + * + * Listen to it from a Scene using `this.events.on('transitionout', listener)`. + * + * The Scene Transition event flow is as follows: + * + * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event. + * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method. + * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ... + * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to. + * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes. + */ + const TRANSITION_OUT: string; + + /** + * The Scene Transition Start Event. + * + * This event is dispatched by the Target Scene of a transition, only if that Scene was not asleep. + * + * It happens immediately after the `Scene.create` method is called. If the Scene does not have a `create` method, + * this event is dispatched anyway. + * + * If the Target Scene was sleeping then the [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} event is + * dispatched instead of this event. + * + * Listen to it from a Scene using `this.events.on('transitionstart', listener)`. + * + * The Scene Transition event flow is as follows: + * + * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event. + * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method. + * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ... + * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to. + * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes. + */ + const TRANSITION_START: string; + + /** + * The Scene Transition Wake Event. + * + * This event is dispatched by the Target Scene of a transition, only if that Scene was asleep before + * the transition began. If the Scene was not asleep the [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} event is dispatched instead. + * + * Listen to it from a Scene using `this.events.on('transitionwake', listener)`. + * + * The Scene Transition event flow is as follows: + * + * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event. + * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method. + * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ... + * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to. + * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes. + */ + const TRANSITION_WAKE: string; + + /** + * The Scene Systems Update Event. + * + * This event is dispatched by a Scene during the main game loop step. + * + * The event flow for a single step of a Scene is as follows: + * + * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE} + * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE} + * 3. The `Scene.update` method is called, if it exists and the Scene is in a Running state, otherwise this is skipped. + * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE} + * 5. [PRE_RENDER]{@linkcode Phaser.Scenes.Events#event:PRE_RENDER} + * 6. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER} + * + * Listen to it from a Scene using `this.events.on('update', listener)`. + * + * A Scene will only run its step if it is active. + */ + const UPDATE: string; + + /** + * The Scene Systems Wake Event. + * + * This event is dispatched by a Scene when it is woken from sleep, either directly via the `wake` method, + * or as an action from another Scene. + * + * Listen to it from a Scene using `this.events.on('wake', listener)`. + */ + const WAKE: string; + + } + + /** + * Builds an array of which physics plugins should be activated for the given Scene. + * @param sys The scene system to get the physics systems of. + */ + function GetPhysicsPlugins(sys: Phaser.Scenes.Systems): any[]; + + /** + * Builds an array of which plugins (not including physics plugins) should be activated for the given Scene. + * @param sys The Scene Systems object to check for plugins. + */ + function GetScenePlugins(sys: Phaser.Scenes.Systems): any[]; + + /** + * The Scene Manager. + * + * The Scene Manager is a Game level system, responsible for creating, processing and updating all of the + * Scenes in a Game instance. + * + * You should not usually interact directly with the Scene Manager at all. Instead, you should use + * the Scene Plugin, which is available from every Scene in your game via the `this.scene` property. + * + * Using methods in this Scene Manager directly will break queued operations and can cause runtime + * errors. Instead, go via the Scene Plugin. Every feature this Scene Manager provides is also + * available via the Scene Plugin. + */ + class SceneManager { + /** + * + * @param game The Phaser.Game instance this Scene Manager belongs to. + * @param sceneConfig Scene specific configuration settings. + */ + constructor(game: Phaser.Game, sceneConfig: object); + + /** + * The Game that this SceneManager belongs to. + */ + game: Phaser.Game; + + /** + * An object that maps the keys to the scene so we can quickly get a scene from a key without iteration. + */ + keys: Record; + + /** + * The array in which all of the scenes are kept. + */ + scenes: Phaser.Scene[]; + + /** + * Is the Scene Manager actively processing the Scenes list? + */ + readonly isProcessing: boolean; + + /** + * Has the Scene Manager properly started? + */ + readonly isBooted: boolean; + + /** + * Do any of the Cameras in any of the Scenes require a custom viewport? + * If not we can skip scissor tests. + */ + customViewports: number; + + /** + * This system Scene is created during `bootQueue` and is a default + * empty Scene that lives outside of the Scene list, but can be used + * by plugins and managers that need access to a live Scene, without + * being tied to one. + */ + systemScene: Phaser.Scene; + + /** + * Process the Scene operations queue. + */ + processQueue(): void; + + /** + * Adds a new Scene into the SceneManager. + * You must give each Scene a unique key by which you'll identify it. + * + * The `sceneConfig` can be: + * + * * A `Phaser.Scene` object, or an object that extends it. + * * A plain JavaScript object + * * A JavaScript ES6 Class that extends `Phaser.Scene` + * * A JavaScript ES5 prototype based Class + * * A JavaScript function + * + * If a function is given then a new Scene will be created by calling it. + * @param key A unique key used to reference the Scene, i.e. `MainMenu` or `Level1`. + * @param sceneConfig The config for the Scene + * @param autoStart If `true` the Scene will be started immediately after being added. Default false. + * @param data Optional data object. This will be set as `Scene.settings.data` and passed to `Scene.init`, and `Scene.create`. + */ + add(key: string, sceneConfig: Phaser.Types.Scenes.SceneType, autoStart?: boolean, data?: object): Phaser.Scene | null; + + /** + * Removes a Scene from the SceneManager. + * + * The Scene is removed from the local scenes array, it's key is cleared from the keys + * cache and Scene.Systems.destroy is then called on it. + * + * If the SceneManager is processing the Scenes when this method is called it will + * queue the operation for the next update sequence. + * @param key A unique key used to reference the Scene, i.e. `MainMenu` or `Level1`. + */ + remove(key: string): this; + + /** + * Updates the Scenes. + * @param time Time elapsed. + * @param delta Delta time from the last update. + */ + update(time: number, delta: number): void; + + /** + * Renders the Scenes. + * @param renderer The renderer to use. + */ + render(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer): void; + + /** + * Returns an array of all the current Scenes being managed by this Scene Manager. + * + * You can filter the output by the active state of the Scene and choose to have + * the array returned in normal or reversed order. + * @param isActive Only include Scene's that are currently active? Default true. + * @param inReverse Return the array of Scenes in reverse? Default false. + */ + getScenes(isActive?: boolean, inReverse?: boolean): T; + + /** + * Retrieves a Scene based on the given key. + * + * If an actual Scene is passed to this method, it can be used to check if + * its currently within the Scene Manager, or not. + * @param key The key of the Scene to retrieve. + */ + getScene(key: (T|string)): T; + + /** + * Determines whether a Scene is running. + * @param key The Scene to check. + */ + isActive(key: (T|string)): boolean; + + /** + * Determines whether a Scene is paused. + * @param key The Scene to check. + */ + isPaused(key: (T|string)): boolean; + + /** + * Determines whether a Scene is visible. + * @param key The Scene to check. + */ + isVisible(key: (T|string)): boolean; + + /** + * Determines whether a Scene is sleeping. + * @param key The Scene to check. + */ + isSleeping(key: (T|string)): boolean; + + /** + * Pauses the given Scene. + * @param key The Scene to pause. + * @param data An optional data object that will be passed to the Scene and emitted by its pause event. + */ + pause(key: (T|string), data?: object): this; + + /** + * Resumes the given Scene. + * @param key The Scene to resume. + * @param data An optional data object that will be passed to the Scene and emitted by its resume event. + */ + resume(key: (T|string), data?: object): this; + + /** + * Puts the given Scene to sleep. + * @param key The Scene to put to sleep. + * @param data An optional data object that will be passed to the Scene and emitted by its sleep event. + */ + sleep(key: (T|string), data?: object): this; + + /** + * Awakens the given Scene. + * @param key The Scene to wake up. + * @param data An optional data object that will be passed to the Scene and emitted by its wake event. + */ + wake(key: (T|string), data?: object): this; + + /** + * Runs the given Scene. + * + * If the given Scene is paused, it will resume it. If sleeping, it will wake it. + * If not running at all, it will be started. + * + * Use this if you wish to open a modal Scene by calling `pause` on the current + * Scene, then `run` on the modal Scene. + * @param key The Scene to run. + * @param data A data object that will be passed to the Scene on start, wake, or resume. + */ + run(key: (T|string), data?: object): this; + + /** + * Starts the given Scene, if it is not starting, loading, or creating. + * + * If the Scene is running, paused, or sleeping, it will be shutdown and then started. + * @param key The Scene to start. + * @param data Optional data object to pass to `Scene.Settings` and `Scene.init`, and `Scene.create`. + */ + start(key: (T|string), data?: object): this; + + /** + * Stops the given Scene. + * @param key The Scene to stop. + * @param data Optional data object to pass to Scene.shutdown. + */ + stop(key: (T|string), data?: object): this; + + /** + * Sleeps one one Scene and starts the other. + * @param from The Scene to sleep. + * @param to The Scene to start. + */ + switch(from: (T|string), to: (T|string)): this; + + /** + * Retrieves a Scene by numeric index. + * @param index The index of the Scene to retrieve. + */ + getAt(index: number): T; + + /** + * Retrieves the numeric index of a Scene. + * @param key The key of the Scene. + */ + getIndex(key: (T|string)): number; + + /** + * Brings a Scene to the top of the Scenes list. + * + * This means it will render above all other Scenes. + * @param key The Scene to move. + */ + bringToTop(key: (T|string)): this; + + /** + * Sends a Scene to the back of the Scenes list. + * + * This means it will render below all other Scenes. + * @param key The Scene to move. + */ + sendToBack(key: (T|string)): this; + + /** + * Moves a Scene down one position in the Scenes list. + * @param key The Scene to move. + */ + moveDown(key: (T|string)): this; + + /** + * Moves a Scene up one position in the Scenes list. + * @param key The Scene to move. + */ + moveUp(key: (T|string)): this; + + /** + * Moves a Scene so it is immediately above another Scene in the Scenes list. + * + * This means it will render over the top of the other Scene. + * @param keyA The Scene that Scene B will be moved above. + * @param keyB The Scene to be moved. + */ + moveAbove(keyA: (T|string), keyB: (T|string)): this; + + /** + * Moves a Scene so it is immediately below another Scene in the Scenes list. + * + * This means it will render behind the other Scene. + * @param keyA The Scene that Scene B will be moved below. + * @param keyB The Scene to be moved. + */ + moveBelow(keyA: (T|string), keyB: (T|string)): this; + + /** + * Swaps the positions of two Scenes in the Scenes list. + * @param keyA The first Scene to swap. + * @param keyB The second Scene to swap. + */ + swapPosition(keyA: (T|string), keyB: (T|string)): this; + + /** + * Dumps debug information about each Scene to the developer console. + */ + dump(): void; + + /** + * Destroy this Scene Manager and all of its systems. + * + * This process cannot be reversed. + * + * This method is called automatically when a Phaser Game instance is destroyed. + */ + destroy(): void; + + } + + /** + * The Scene Plugin is the main interface to the Scene Manager and allows you to control + * any Scene running in your game. You should always use this plugin. By default, it is + * mapped to the Scene property `this.scene`. Meaning, from within a Scene, you can call + * methods such as `this.scene.start()`. + * + * Note that nearly all methods in this class are run on a queue-basis and not + * immediately. For example, calling `this.scene.launch('SceneB')` will try to + * launch SceneB when the Scene Manager next updates, which is at the start of the game + * step. All operations are queued and run in the order in which they are invoked here. + */ + class ScenePlugin { + /** + * + * @param scene The Scene that this ScenePlugin belongs to. + */ + constructor(scene: Phaser.Scene); + + /** + * The Scene that this ScenePlugin belongs to. + */ + scene: Phaser.Scene; + + /** + * The Scene Systems instance of the Scene that this ScenePlugin belongs to. + */ + systems: Phaser.Scenes.Systems; + + /** + * The settings of the Scene this ScenePlugin belongs to. + */ + settings: Phaser.Types.Scenes.SettingsObject; + + /** + * The key of the Scene this ScenePlugin belongs to. + */ + key: string; + + /** + * The Game's SceneManager. + */ + manager: Phaser.Scenes.SceneManager; + + /** + * If this Scene is currently transitioning to another, this holds + * the current percentage of the transition progress, between 0 and 1. + */ + transitionProgress: number; + + /** + * Shutdown this Scene and run the given one. + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to start. + * @param data The Scene data. If no value is given it will not overwrite any previous data that may exist. + */ + start(key?: (T|string), data?: object): this; + + /** + * Restarts this Scene. + * + * This will happen at the next Scene Manager update, not immediately. + * @param data The Scene data. If no value is given it will not overwrite any previous data that may exist. + */ + restart(data?: object): this; + + /** + * This will start a transition from the current Scene to the target Scene given. + * + * The target Scene cannot be the same as the current Scene. + * + * The transition will last for the duration specified in milliseconds. + * + * You can have the target Scene moved above or below this one in the display list. + * + * You can specify an update callback. This callback will be invoked _every frame_ for the duration + * of the transition. + * + * This Scene can either be sent to sleep at the end of the transition, or stopped. The default is to stop. + * + * There are also 5 transition related events: This scene will emit the event `transitionout` when + * the transition begins, which is typically the frame after calling this method. + * + * The target Scene will emit the event `transitioninit` when that Scene's `init` method is called. + * It will then emit the event `transitionstart` when its `create` method is called. + * If the Scene was sleeping and has been woken up, it will emit the event `transitionwake` instead of these two, + * as the Scenes `init` and `create` methods are not invoked when a Scene wakes up. + * + * When the duration of the transition has elapsed it will emit the event `transitioncomplete`. + * These events are cleared of all listeners when the Scene shuts down, but not if it is sent to sleep. + * + * It's important to understand that the duration of the transition begins the moment you call this method. + * If the Scene you are transitioning to includes delayed processes, such as waiting for files to load, the + * time still counts down even while that is happening. If the game itself pauses, or something else causes + * this Scenes update loop to stop, then the transition will also pause for that duration. There are + * checks in place to prevent you accidentally stopping a transitioning Scene but if you've got code to + * override this understand that until the target Scene completes it might never be unlocked for input events. + * @param config The transition configuration object. + */ + transition(config: Phaser.Types.Scenes.SceneTransitionConfig): boolean; + + /** + * Add the Scene into the Scene Manager and start it if 'autoStart' is true or the Scene config 'active' property is set. + * @param key A unique key used to reference the Scene, i.e. `MainMenu` or `Level1`. + * @param sceneConfig The config for the Scene + * @param autoStart If `true` the Scene will be started immediately after being added. Default false. + * @param data Optional data object. This will be set as `Scene.settings.data` and passed to `Scene.init`, and `Scene.create`. + */ + add(key: string, sceneConfig: Phaser.Types.Scenes.SceneType, autoStart?: boolean, data?: object): Phaser.Scene | null; + + /** + * Launch the given Scene and run it in parallel with this one. + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to launch. + * @param data The Scene data. + */ + launch(key: (T|string), data?: object): this; + + /** + * Runs the given Scene, but does not change the state of this Scene. + * + * This will happen at the next Scene Manager update, not immediately. + * + * If the given Scene is paused, it will resume it. If sleeping, it will wake it. + * If not running at all, it will be started. + * + * Use this if you wish to open a modal Scene by calling `pause` on the current + * Scene, then `run` on the modal Scene. + * @param key The Scene to run. + * @param data A data object that will be passed to the Scene and emitted in its ready, wake, or resume events. + */ + run(key: (T|string), data?: object): this; + + /** + * Pause the Scene - this stops the update step from happening but it still renders. + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to pause. + * @param data An optional data object that will be passed to the Scene and emitted in its pause event. + */ + pause(key?: (T|string), data?: object): this; + + /** + * Resume the Scene - starts the update loop again. + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to resume. + * @param data An optional data object that will be passed to the Scene and emitted in its resume event. + */ + resume(key?: (T|string), data?: object): this; + + /** + * Makes the Scene sleep (no update, no render) but doesn't shutdown. + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to put to sleep. + * @param data An optional data object that will be passed to the Scene and emitted in its sleep event. + */ + sleep(key?: (T|string), data?: object): this; + + /** + * Makes the Scene wake-up (starts update and render) + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to wake up. + * @param data An optional data object that will be passed to the Scene and emitted in its wake event. + */ + wake(key?: (T|string), data?: object): this; + + /** + * Makes this Scene sleep then starts the Scene given. + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to start. + */ + switch(key: (T|string)): this; + + /** + * Shutdown the Scene, clearing display list, timers, etc. + * + * This happens at the next Scene Manager update, not immediately. + * @param key The Scene to stop. + * @param data Optional data object to pass to Scene.Systems.shutdown. + */ + stop(key?: (T|string), data?: any): this; + + /** + * Sets the active state of the given Scene. + * @param value If `true` the Scene will be resumed. If `false` it will be paused. + * @param key The Scene to set the active state of. + * @param data An optional data object that will be passed to the Scene and emitted with its events. + */ + setActive(value: boolean, key?: (T|string), data?: object): this; + + /** + * Sets the visible state of the given Scene. + * @param value The visible value. + * @param key The Scene to set the visible state for. + */ + setVisible(value: boolean, key?: (T|string)): this; + + /** + * Checks if the given Scene is sleeping or not? + * @param key The Scene to check. + */ + isSleeping(key?: (T|string)): boolean; + + /** + * Checks if the given Scene is running or not? + * @param key The Scene to check. + */ + isActive(key?: (T|string)): boolean; + + /** + * Checks if the given Scene is paused or not? + * @param key The Scene to check. + */ + isPaused(key?: (T|string)): boolean; + + /** + * Checks if the given Scene is visible or not? + * @param key The Scene to check. + */ + isVisible(key?: (T|string)): boolean; + + /** + * Swaps the position of two scenes in the Scenes list. + * + * This controls the order in which they are rendered and updated. + * @param keyA The first Scene to swap. + * @param keyB The second Scene to swap. If none is given it defaults to this Scene. + */ + swapPosition(keyA: (T|string), keyB?: (T|string)): this; + + /** + * Swaps the position of two scenes in the Scenes list, so that Scene B is directly above Scene A. + * + * This controls the order in which they are rendered and updated. + * @param keyA The Scene that Scene B will be moved to be above. + * @param keyB The Scene to be moved. If none is given it defaults to this Scene. + */ + moveAbove(keyA: (T|string), keyB?: (T|string)): this; + + /** + * Swaps the position of two scenes in the Scenes list, so that Scene B is directly below Scene A. + * + * This controls the order in which they are rendered and updated. + * @param keyA The Scene that Scene B will be moved to be below. + * @param keyB The Scene to be moved. If none is given it defaults to this Scene. + */ + moveBelow(keyA: (T|string), keyB?: (T|string)): this; + + /** + * Removes a Scene from the SceneManager. + * + * The Scene is removed from the local scenes array, it's key is cleared from the keys + * cache and Scene.Systems.destroy is then called on it. + * + * If the SceneManager is processing the Scenes when this method is called it will + * queue the operation for the next update sequence. + * @param key The Scene to be removed. + */ + remove(key?: (T|string)): this; + + /** + * Moves a Scene up one position in the Scenes list. + * @param key The Scene to move. + */ + moveUp(key?: (T|string)): this; + + /** + * Moves a Scene down one position in the Scenes list. + * @param key The Scene to move. + */ + moveDown(key?: (T|string)): this; + + /** + * Brings a Scene to the top of the Scenes list. + * + * This means it will render above all other Scenes. + * @param key The Scene to move. + */ + bringToTop(key?: (T|string)): this; + + /** + * Sends a Scene to the back of the Scenes list. + * + * This means it will render below all other Scenes. + * @param key The Scene to move. + */ + sendToBack(key?: (T|string)): this; + + /** + * Retrieve a Scene. + * @param key The Scene to retrieve. + */ + get(key: (T|string)): T; + + /** + * Return the status of the Scene. + * @param key The Scene to get the status from. + */ + getStatus(key: (T|string)): number; + + /** + * Retrieves the numeric index of a Scene in the Scenes list. + * @param key The Scene to get the index of. + */ + getIndex(key?: (T|string)): number; + + } + + namespace Settings { + /** + * Takes a Scene configuration object and returns a fully formed System Settings object. + * @param config The Scene configuration object used to create this Scene Settings. + */ + function create(config: string | Phaser.Types.Scenes.SettingsConfig): Phaser.Types.Scenes.SettingsObject; + + } + + /** + * The Scene Systems class. + * + * This class is available from within a Scene under the property `sys`. + * It is responsible for managing all of the plugins a Scene has running, including the display list, and + * handling the update step and renderer. It also contains references to global systems belonging to Game. + */ + class Systems { + /** + * + * @param scene The Scene that owns this Systems instance. + * @param config Scene specific configuration settings. + */ + constructor(scene: Phaser.Scene, config: string | Phaser.Types.Scenes.SettingsConfig); + + /** + * A reference to the Scene that these Systems belong to. + */ + scene: Phaser.Scene; + + /** + * A reference to the Phaser Game instance. + */ + game: Phaser.Game; + + /** + * A reference to either the Canvas or WebGL Renderer that this Game is using. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The Facebook Instant Games Plugin. + */ + facebook: Phaser.FacebookInstantGamesPlugin; + + /** + * The Scene Configuration object, as passed in when creating the Scene. + */ + config: string | Phaser.Types.Scenes.SettingsConfig; + + /** + * The Scene Settings. This is the parsed output based on the Scene configuration. + */ + settings: Phaser.Types.Scenes.SettingsObject; + + /** + * A handy reference to the Scene canvas / context. + */ + canvas: HTMLCanvasElement; + + /** + * A reference to the Canvas Rendering Context being used by the renderer. + */ + context: CanvasRenderingContext2D; + + /** + * A reference to the global Animations Manager. + * + * In the default set-up you can access this from within a Scene via the `this.anims` property. + */ + anims: Phaser.Animations.AnimationManager; + + /** + * A reference to the global Cache. The Cache stores all files bought in to Phaser via + * the Loader, with the exception of images. Images are stored in the Texture Manager. + * + * In the default set-up you can access this from within a Scene via the `this.cache` property. + */ + cache: Phaser.Cache.CacheManager; + + /** + * A reference to the global Plugins Manager. + * + * In the default set-up you can access this from within a Scene via the `this.plugins` property. + */ + plugins: Phaser.Plugins.PluginManager; + + /** + * A reference to the global registry. This is a game-wide instance of the Data Manager, allowing + * you to exchange data between Scenes via a universal and shared point. + * + * In the default set-up you can access this from within a Scene via the `this.registry` property. + */ + registry: Phaser.Data.DataManager; + + /** + * A reference to the global Scale Manager. + * + * In the default set-up you can access this from within a Scene via the `this.scale` property. + */ + scale: Phaser.Scale.ScaleManager; + + /** + * A reference to the global Sound Manager. + * + * In the default set-up you can access this from within a Scene via the `this.sound` property. + */ + sound: Phaser.Sound.NoAudioSoundManager | Phaser.Sound.HTML5AudioSoundManager | Phaser.Sound.WebAudioSoundManager; + + /** + * A reference to the global Texture Manager. + * + * In the default set-up you can access this from within a Scene via the `this.textures` property. + */ + textures: Phaser.Textures.TextureManager; + + /** + * A reference to the Scene's Game Object Factory. + * + * Use this to quickly and easily create new Game Object's. + * + * In the default set-up you can access this from within a Scene via the `this.add` property. + */ + add: Phaser.GameObjects.GameObjectFactory; + + /** + * A reference to the Scene's Camera Manager. + * + * Use this to manipulate and create Cameras for this specific Scene. + * + * In the default set-up you can access this from within a Scene via the `this.cameras` property. + */ + cameras: Phaser.Cameras.Scene2D.CameraManager; + + /** + * A reference to the Scene's Display List. + * + * Use this to organize the children contained in the display list. + * + * In the default set-up you can access this from within a Scene via the `this.children` property. + */ + displayList: Phaser.GameObjects.DisplayList; + + /** + * A reference to the Scene's Event Manager. + * + * Use this to listen for Scene specific events, such as `pause` and `shutdown`. + * + * In the default set-up you can access this from within a Scene via the `this.events` property. + */ + events: Phaser.Events.EventEmitter; + + /** + * A reference to the Scene's Game Object Creator. + * + * Use this to quickly and easily create new Game Object's. The difference between this and the + * Game Object Factory, is that the Creator just creates and returns Game Object instances, it + * doesn't then add them to the Display List or Update List. + * + * In the default set-up you can access this from within a Scene via the `this.make` property. + */ + make: Phaser.GameObjects.GameObjectCreator; + + /** + * A reference to the Scene Manager Plugin. + * + * Use this to manipulate both this and other Scene's in your game, for example to launch a parallel Scene, + * or pause or resume a Scene, or switch from this Scene to another. + * + * In the default set-up you can access this from within a Scene via the `this.scene` property. + */ + scenePlugin: Phaser.Scenes.ScenePlugin; + + /** + * A reference to the Scene's Update List. + * + * Use this to organize the children contained in the update list. + * + * The Update List is responsible for managing children that need their `preUpdate` methods called, + * in order to process so internal components, such as Sprites with Animations. + * + * In the default set-up there is no reference to this from within the Scene itself. + */ + updateList: Phaser.GameObjects.UpdateList; + + /** + * This method is called only once by the Scene Manager when the Scene is instantiated. + * It is responsible for setting up all of the Scene plugins and references. + * It should never be called directly. + * @param game A reference to the Phaser Game instance. + */ + protected init(game: Phaser.Game): void; + + /** + * A single game step. Called automatically by the Scene Manager as a result of a Request Animation + * Frame or Set Timeout call to the main Game instance. + * @param time The time value from the most recent Game step. Typically a high-resolution timer value, or Date.now(). + * @param delta The delta value since the last frame. This is smoothed to avoid delta spikes by the TimeStep class. + */ + step(time: number, delta: number): void; + + /** + * Called automatically by the Scene Manager. + * Instructs the Scene to render itself via its Camera Manager to the renderer given. + * @param renderer The renderer that invoked the render call. + */ + render(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer): void; + + /** + * Force a sort of the display list on the next render. + */ + queueDepthSort(): void; + + /** + * Immediately sorts the display list if the flag is set. + */ + depthSort(): void; + + /** + * Pause this Scene. + * + * A paused Scene still renders, it just doesn't run any of its update handlers or systems. + * @param data A data object that will be passed in the 'pause' event. + */ + pause(data?: object): Phaser.Scenes.Systems; + + /** + * Resume this Scene from a paused state. + * @param data A data object that will be passed in the 'resume' event. + */ + resume(data?: object): Phaser.Scenes.Systems; + + /** + * Send this Scene to sleep. + * + * A sleeping Scene doesn't run its update step or render anything, but it also isn't shut down + * or has any of its systems or children removed, meaning it can be re-activated at any point and + * will carry on from where it left off. It also keeps everything in memory and events and callbacks + * from other Scenes may still invoke changes within it, so be careful what is left active. + * @param data A data object that will be passed in the 'sleep' event. + */ + sleep(data?: object): Phaser.Scenes.Systems; + + /** + * Wake-up this Scene if it was previously asleep. + * @param data A data object that will be passed in the 'wake' event. + */ + wake(data?: object): Phaser.Scenes.Systems; + + /** + * Returns any data that was sent to this Scene by another Scene. + * + * The data is also passed to `Scene.init` and in various Scene events, but + * you can access it at any point via this method. + */ + getData(): any; + + /** + * Returns the current status of this Scene. + */ + getStatus(): number; + + /** + * Can this Scene receive Input events? + */ + canInput(): boolean; + + /** + * Is this Scene sleeping? + */ + isSleeping(): boolean; + + /** + * Is this Scene running? + */ + isActive(): boolean; + + /** + * Is this Scene paused? + */ + isPaused(): boolean; + + /** + * Is this Scene currently transitioning out to, or in from another Scene? + */ + isTransitioning(): boolean; + + /** + * Is this Scene currently transitioning out from itself to another Scene? + */ + isTransitionOut(): boolean; + + /** + * Is this Scene currently transitioning in from another Scene? + */ + isTransitionIn(): boolean; + + /** + * Is this Scene visible and rendering? + */ + isVisible(): boolean; + + /** + * Sets the visible state of this Scene. + * An invisible Scene will not render, but will still process updates. + * @param value `true` to render this Scene, otherwise `false`. + */ + setVisible(value: boolean): Phaser.Scenes.Systems; + + /** + * Set the active state of this Scene. + * + * An active Scene will run its core update loop. + * @param value If `true` the Scene will be resumed, if previously paused. If `false` it will be paused. + * @param data A data object that will be passed in the 'resume' or 'pause' events. + */ + setActive(value: boolean, data?: object): Phaser.Scenes.Systems; + + /** + * Start this Scene running and rendering. + * Called automatically by the SceneManager. + * @param data Optional data object that may have been passed to this Scene from another. + */ + start(data: object): void; + + /** + * Shutdown this Scene and send a shutdown event to all of its systems. + * A Scene that has been shutdown will not run its update loop or render, but it does + * not destroy any of its plugins or references. It is put into hibernation for later use. + * If you don't ever plan to use this Scene again, then it should be destroyed instead + * to free-up resources. + * @param data A data object that will be passed in the 'shutdown' event. + */ + shutdown(data?: object): void; + + } + + } + + /** + * A base Phaser.Scene class which can be extended for your own use. + * + * You can also define the optional methods {@link Phaser.Types.Scenes.SceneInitCallback init()}, {@link Phaser.Types.Scenes.ScenePreloadCallback preload()}, and {@link Phaser.Types.Scenes.SceneCreateCallback create()}. + */ + class Scene { + /** + * + * @param config The scene key or scene specific configuration settings. + */ + constructor(config?: string | Phaser.Types.Scenes.SettingsConfig); + + /** + * The Scene Systems. You must never overwrite this property, or all hell will break lose. + */ + sys: Phaser.Scenes.Systems; + + /** + * A reference to the Phaser.Game instance. + * + * This property will only be available if defined in the Scene Injection Map. + */ + game: Phaser.Game; + + /** + * A reference to the global Animation Manager. + * + * This property will only be available if defined in the Scene Injection Map. + */ + anims: Phaser.Animations.AnimationManager; + + /** + * A reference to the global Cache. + * + * This property will only be available if defined in the Scene Injection Map. + */ + cache: Phaser.Cache.CacheManager; + + /** + * A reference to the global Data Manager. + * + * This property will only be available if defined in the Scene Injection Map. + */ + registry: Phaser.Data.DataManager; + + /** + * A reference to the Sound Manager. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + sound: Phaser.Sound.NoAudioSoundManager | Phaser.Sound.HTML5AudioSoundManager | Phaser.Sound.WebAudioSoundManager; + + /** + * A reference to the Texture Manager. + * + * This property will only be available if defined in the Scene Injection Map. + */ + textures: Phaser.Textures.TextureManager; + + /** + * A Scene specific Event Emitter. + * + * This property will only be available if defined in the Scene Injection Map. + */ + events: Phaser.Events.EventEmitter; + + /** + * The Scene Camera Manager. + * + * This property will only be available if defined in the Scene Injection Map. + */ + cameras: Phaser.Cameras.Scene2D.CameraManager; + + /** + * The Scene Game Object Factory. + * + * This property will only be available if defined in the Scene Injection Map. + */ + add: Phaser.GameObjects.GameObjectFactory; + + /** + * The Scene Game Object Creator. + * + * This property will only be available if defined in the Scene Injection Map. + */ + make: Phaser.GameObjects.GameObjectCreator; + + /** + * A reference to the Scene Manager Plugin. + * + * This property will only be available if defined in the Scene Injection Map. + */ + scene: Phaser.Scenes.ScenePlugin; + + /** + * The Game Object Display List belonging to this Scene. + * + * This property will only be available if defined in the Scene Injection Map. + */ + children: Phaser.GameObjects.DisplayList; + + /** + * The Scene Lights Manager Plugin. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + lights: Phaser.GameObjects.LightsManager; + + /** + * A Scene specific Data Manager Plugin. + * + * See the `registry` property for the global Data Manager. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + data: Phaser.Data.DataManager; + + /** + * The Scene Input Manager Plugin. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + input: Phaser.Input.InputPlugin; + + /** + * The Scene Loader Plugin. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + load: Phaser.Loader.LoaderPlugin; + + /** + * The Scene Time and Clock Plugin. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + time: Phaser.Time.Clock; + + /** + * The Scene Tween Manager Plugin. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + tweens: Phaser.Tweens.TweenManager; + + /** + * The Scene Arcade Physics Plugin. + * + * This property will only be available if defined in the Scene Injection Map, the plugin is installed and configured. + */ + physics: Phaser.Physics.Arcade.ArcadePhysics; + + /** + * The Scene Matter Physics Plugin. + * + * This property will only be available if defined in the Scene Injection Map, the plugin is installed and configured. + */ + matter: Phaser.Physics.Matter.MatterPhysics; + + /** + * The Facebook Instant Games Plugin. + * + * This property will only be available if defined in the Scene Injection Map, the plugin is installed and configured. + */ + facebook: Phaser.FacebookInstantGamesPlugin; + + /** + * A reference to the global Scale Manager. + * + * This property will only be available if defined in the Scene Injection Map. + */ + scale: Phaser.Scale.ScaleManager; + + /** + * A reference to the global Plugin Manager. + * + * The Plugin Manager is a global system that allows plugins to register themselves with it, and can then install + * those plugins into Scenes as required. + */ + plugins: Phaser.Plugins.PluginManager; + + /** + * A reference to the renderer instance Phaser is using, either Canvas Renderer or WebGL Renderer. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * This method should be overridden by your own Scenes. + * + * This method is called once per game step while the scene is running. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(time: number, delta: number): void; + + } + + namespace Sound { + /** + * Class containing all the shared state and behavior of a sound object, independent of the implementation. + */ + class BaseSound extends Phaser.Events.EventEmitter { + /** + * + * @param manager Reference to the current sound manager instance. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + constructor(manager: Phaser.Sound.BaseSoundManager, key: string, config?: Phaser.Types.Sound.SoundConfig); + + /** + * Local reference to the sound manager. + */ + manager: Phaser.Sound.BaseSoundManager; + + /** + * Asset key for the sound. + */ + readonly key: string; + + /** + * Flag indicating if sound is currently playing. + */ + readonly isPlaying: boolean; + + /** + * Flag indicating if sound is currently paused. + */ + readonly isPaused: boolean; + + /** + * A property that holds the value of sound's actual playback rate, + * after its rate and detune values has been combined with global + * rate and detune values. + */ + readonly totalRate: number; + + /** + * A value representing the duration, in seconds. + * It could be total sound duration or a marker duration. + */ + readonly duration: number; + + /** + * The total duration of the sound in seconds. + */ + readonly totalDuration: number; + + /** + * Object containing markers definitions. + */ + readonly markers: {[key: string]: Phaser.Types.Sound.SoundMarker}; + + /** + * Currently playing marker. + * 'null' if whole sound is playing. + */ + readonly currentMarker: Phaser.Types.Sound.SoundMarker; + + /** + * Flag indicating if destroy method was called on this sound. + */ + pendingRemove: boolean; + + /** + * Adds a marker into the current sound. A marker is represented by name, start time, duration, and optionally config object. + * This allows you to bundle multiple sounds together into a single audio file and use markers to jump between them for playback. + * @param marker Marker object. + */ + addMarker(marker: Phaser.Types.Sound.SoundMarker): boolean; + + /** + * Updates previously added marker. + * @param marker Marker object with updated values. + */ + updateMarker(marker: Phaser.Types.Sound.SoundMarker): boolean; + + /** + * Removes a marker from the sound. + * @param markerName The name of the marker to remove. + */ + removeMarker(markerName: string): Phaser.Types.Sound.SoundMarker | null; + + /** + * Play this sound, or a marked section of it. + * + * It always plays the sound from the start. If you want to start playback from a specific time + * you can set 'seek' setting of the config object, provided to this call, to that value. + * @param markerName If you want to play a marker then provide the marker name here. Alternatively, this parameter can be a SoundConfig object. Default ''. + * @param config Optional sound config object to be applied to this marker or entire sound if no marker name is provided. It gets memorized for future plays of current section of the sound. + */ + play(markerName?: string | Phaser.Types.Sound.SoundConfig, config?: Phaser.Types.Sound.SoundConfig): boolean; + + /** + * Pauses the sound. This only works if the sound is currently playing. + * + * You can inspect the `isPlaying` and `isPaused` properties to check the state. + */ + pause(): boolean; + + /** + * Resumes the sound. This only works if the sound is paused and not already playing. + * + * You can inspect the `isPlaying` and `isPaused` properties to check the state. + */ + resume(): boolean; + + /** + * Stop playing this sound. + */ + stop(): boolean; + + /** + * Method used internally for applying config values to some of the sound properties. + */ + applyConfig(): void; + + /** + * Method used internally for resetting values of some of the config properties. + */ + resetConfig(): void; + + /** + * Update method called automatically by sound manager on every game step. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Method used internally to calculate total playback rate of the sound. + */ + calculateRate(): void; + + /** + * Destroys this sound and all associated events and marks it for removal from the sound manager. + */ + destroy(): void; + + } + + /** + * Base class for other Sound Manager classes. + */ + class BaseSoundManager extends Phaser.Events.EventEmitter { + /** + * + * @param game Reference to the current game instance. + */ + constructor(game: Phaser.Game); + + /** + * Local reference to game. + */ + readonly game: Phaser.Game; + + /** + * Local reference to the JSON Cache, as used by Audio Sprites. + */ + readonly jsonCache: Phaser.Cache.BaseCache; + + /** + * Global mute setting. + */ + mute: boolean; + + /** + * Global volume setting. + */ + volume: number; + + /** + * Flag indicating if sounds should be paused when game looses focus, + * for instance when user switches to another tab/program/app. + */ + pauseOnBlur: boolean; + + /** + * Mobile devices require sounds to be triggered from an explicit user action, + * such as a tap, before any sound can be loaded/played on a web page. + * Set to true if the audio system is currently locked awaiting user interaction. + */ + readonly locked: boolean; + + /** + * Flag used to track if the game has lost focus. + */ + gameLostFocus: boolean; + + /** + * The Spatial Audio listener position. + * + * Only available with WebAudio. + * + * You can modify the x/y properties of this Vec2 directly to + * adjust the listener position within the game world. + */ + listenerPosition: Phaser.Math.Vector2; + + /** + * Adds a new sound into the sound manager. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + add(key: string, config?: Phaser.Types.Sound.SoundConfig): Phaser.Sound.BaseSound; + + /** + * Adds a new audio sprite sound into the sound manager. + * Audio Sprites are a combination of audio files and a JSON configuration. + * The JSON follows the format of that created by https://github.com/tonistiigi/audiosprite + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + addAudioSprite(key: string, config?: Phaser.Types.Sound.SoundConfig): Phaser.Sound.NoAudioSound | Phaser.Sound.HTML5AudioSound | Phaser.Sound.WebAudioSound; + + /** + * Gets the first sound in this Sound Manager that matches the given key. + * If none can be found it returns `null`. + * @param key Sound asset key. + */ + get(key: string): T; + + /** + * Gets all sounds in this Sound Manager. + * + * You can optionally specify a key, in which case only Sound instances that match the given key + * will be returned. + * @param key Optional asset key. If given, only Sound instances with this key will be returned. + */ + getAll(key?: string): T[]; + + /** + * Returns all sounds from this Sound Manager that are currently + * playing. That is, Sound instances that have their `isPlaying` + * property set to `true`. + */ + getAllPlaying(): T[]; + + /** + * Adds a new sound to the sound manager and plays it. + * + * The sound will be automatically removed (destroyed) once playback ends. + * + * This lets you play a new sound on the fly without the need to keep a reference to it. + * @param key Asset key for the sound. + * @param extra An optional additional object containing settings to be applied to the sound. It could be either config or marker object. + */ + play(key: string, extra?: Phaser.Types.Sound.SoundConfig | Phaser.Types.Sound.SoundMarker): boolean; + + /** + * Adds a new audio sprite sound to the sound manager and plays it. + * The sprite will be automatically removed (destroyed) once playback ends. + * This lets you play a new sound on the fly without the need to keep a reference to it. + * @param key Asset key for the sound. + * @param spriteName The name of the sound sprite to play. + * @param config An optional config object containing default sound settings. + */ + playAudioSprite(key: string, spriteName: string, config?: Phaser.Types.Sound.SoundConfig): boolean; + + /** + * Removes a sound from the sound manager. + * The removed sound is destroyed before removal. + * @param sound The sound object to remove. + */ + remove(sound: Phaser.Sound.BaseSound): boolean; + + /** + * Removes all sounds from the manager, destroying the sounds. + */ + removeAll(): void; + + /** + * Removes all sounds from the sound manager that have an asset key matching the given value. + * The removed sounds are destroyed before removal. + * @param key The key to match when removing sound objects. + */ + removeByKey(key: string): number; + + /** + * Pauses all the sounds in the game. + */ + pauseAll(): void; + + /** + * Resumes all the sounds in the game. + */ + resumeAll(): void; + + /** + * Sets the X and Y position of the Spatial Audio listener on this Web Audios context. + * + * If you call this method with no parameters it will default to the center-point of + * the game canvas. Depending on the type of game you're making, you may need to call + * this method constantly to reset the listener position as the camera scrolls. + * + * Calling this method does nothing on HTML5Audio. + * @param x The x position of the Spatial Audio listener. + * @param y The y position of the Spatial Audio listener. + */ + setListenerPosition(x?: number, y?: number): void; + + /** + * Stops all the sounds in the game. + */ + stopAll(): void; + + /** + * Stops any sounds matching the given key. + * @param key Sound asset key. + */ + stopByKey(key: string): number; + + /** + * Method used internally for unlocking audio playback on devices that + * require user interaction before any sound can be played on a web page. + * + * Read more about how this issue is handled here in [this article](https://medium.com/@pgoloskokovic/unlocking-web-audio-the-smarter-way-8858218c0e09). + */ + protected unlock(): void; + + /** + * Method used internally for pausing sound manager if + * Phaser.Sound.BaseSoundManager#pauseOnBlur is set to true. + */ + protected onBlur(): void; + + /** + * Method used internally for resuming sound manager if + * Phaser.Sound.BaseSoundManager#pauseOnBlur is set to true. + */ + protected onFocus(): void; + + /** + * Update method called on every game step. + * Removes destroyed sounds and updates every active sound in the game. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time elapsed since the last frame. + */ + protected update(time: number, delta: number): void; + + /** + * Destroys all the sounds in the game and all associated events. + */ + destroy(): void; + + /** + * Sets the global playback rate at which all the sounds will be played. + * + * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + * @param value Global playback rate at which all the sounds will be played. + */ + setRate(value: number): this; + + /** + * Global playback rate at which all the sounds will be played. + * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audio's playback speed. + */ + rate: number; + + /** + * Sets the global detuning of all sounds in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + * @param value The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + setDetune(value: number): this; + + /** + * Global detuning of all sounds in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + detune: number; + + } + + namespace Events { + /** + * The Sound Complete Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they complete playback. + * + * Listen to it from a Sound instance using `Sound.on('complete', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('complete', listener); + * music.play(); + * ``` + */ + const COMPLETE: string; + + /** + * The Audio Data Decoded All Event. + * + * This event is dispatched by the Web Audio Sound Manager as a result of calling the `decodeAudio` method, + * once all files passed to the method have been decoded (or errored). + * + * Use `Phaser.Sound.Events#DECODED` to listen for single sounds being decoded, and `DECODED_ALL` to + * listen for them all completing. + * + * Listen to it from the Sound Manager in a Scene using `this.sound.on('decodedall', listener)`, i.e.: + * + * ```javascript + * this.sound.once('decodedall', handler); + * this.sound.decodeAudio([ audioFiles ]); + * ``` + */ + const DECODED_ALL: string; + + /** + * The Audio Data Decoded Event. + * + * This event is dispatched by the Web Audio Sound Manager as a result of calling the `decodeAudio` method. + * + * Listen to it from the Sound Manager in a Scene using `this.sound.on('decoded', listener)`, i.e.: + * + * ```javascript + * this.sound.on('decoded', handler); + * this.sound.decodeAudio(key, audioData); + * ``` + */ + const DECODED: string; + + /** + * The Sound Destroy Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are destroyed, either + * directly or via a Sound Manager. + * + * Listen to it from a Sound instance using `Sound.on('destroy', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('destroy', listener); + * music.destroy(); + * ``` + */ + const DESTROY: string; + + /** + * The Sound Detune Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their detune value changes. + * + * Listen to it from a Sound instance using `Sound.on('detune', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('detune', listener); + * music.play(); + * music.setDetune(200); + * ``` + */ + const DETUNE: string; + + /** + * The Sound Manager Global Detune Event. + * + * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager, + * or the HTML5 Audio Manager. It is dispatched when the `detune` property of the Sound Manager is changed, which globally + * adjusts the detuning of all active sounds. + * + * Listen to it from a Scene using: `this.sound.on('rate', listener)`. + */ + const GLOBAL_DETUNE: string; + + /** + * The Sound Manager Global Mute Event. + * + * This event is dispatched by the Sound Manager when its `mute` property is changed, either directly + * or via the `setMute` method. This changes the mute state of all active sounds. + * + * Listen to it from a Scene using: `this.sound.on('mute', listener)`. + */ + const GLOBAL_MUTE: string; + + /** + * The Sound Manager Global Rate Event. + * + * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager, + * or the HTML5 Audio Manager. It is dispatched when the `rate` property of the Sound Manager is changed, which globally + * adjusts the playback rate of all active sounds. + * + * Listen to it from a Scene using: `this.sound.on('rate', listener)`. + */ + const GLOBAL_RATE: string; + + /** + * The Sound Manager Global Volume Event. + * + * This event is dispatched by the Sound Manager when its `volume` property is changed, either directly + * or via the `setVolume` method. This changes the volume of all active sounds. + * + * Listen to it from a Scene using: `this.sound.on('volume', listener)`. + */ + const GLOBAL_VOLUME: string; + + /** + * The Sound Looped Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they loop during playback. + * + * Listen to it from a Sound instance using `Sound.on('looped', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('looped', listener); + * music.setLoop(true); + * music.play(); + * ``` + * + * This is not to be confused with the [LOOP]{@linkcode Phaser.Sound.Events#event:LOOP} event, which only emits when the loop state of a Sound is changed. + */ + const LOOPED: string; + + /** + * The Sound Loop Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their loop state is changed. + * + * Listen to it from a Sound instance using `Sound.on('loop', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('loop', listener); + * music.setLoop(true); + * ``` + * + * This is not to be confused with the [LOOPED]{@linkcode Phaser.Sound.Events#event:LOOPED} event, which emits each time a Sound loops during playback. + */ + const LOOP: string; + + /** + * The Sound Mute Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their mute state changes. + * + * Listen to it from a Sound instance using `Sound.on('mute', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('mute', listener); + * music.play(); + * music.setMute(true); + * ``` + */ + const MUTE: string; + + /** + * The Sound Pan Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their pan changes. + * + * Listen to it from a Sound instance using `Sound.on('pan', listener)`, i.e.: + * + * ```javascript + * var sound = this.sound.add('key'); + * sound.on('pan', listener); + * sound.play(); + * sound.setPan(0.5); + * ``` + */ + const PAN: string; + + /** + * The Pause All Sounds Event. + * + * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager, + * or the HTML5 Audio Manager. It is dispatched when the `pauseAll` method is invoked and after all current Sounds + * have been paused. + * + * Listen to it from a Scene using: `this.sound.on('pauseall', listener)`. + */ + const PAUSE_ALL: string; + + /** + * The Sound Pause Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are paused. + * + * Listen to it from a Sound instance using `Sound.on('pause', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('pause', listener); + * music.play(); + * music.pause(); + * ``` + */ + const PAUSE: string; + + /** + * The Sound Play Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are played. + * + * Listen to it from a Sound instance using `Sound.on('play', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('play', listener); + * music.play(); + * ``` + */ + const PLAY: string; + + /** + * The Sound Rate Change Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their rate changes. + * + * Listen to it from a Sound instance using `Sound.on('rate', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('rate', listener); + * music.play(); + * music.setRate(0.5); + * ``` + */ + const RATE: string; + + /** + * The Resume All Sounds Event. + * + * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager, + * or the HTML5 Audio Manager. It is dispatched when the `resumeAll` method is invoked and after all current Sounds + * have been resumed. + * + * Listen to it from a Scene using: `this.sound.on('resumeall', listener)`. + */ + const RESUME_ALL: string; + + /** + * The Sound Resume Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are resumed from a paused state. + * + * Listen to it from a Sound instance using `Sound.on('resume', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('resume', listener); + * music.play(); + * music.pause(); + * music.resume(); + * ``` + */ + const RESUME: string; + + /** + * The Sound Seek Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are seeked to a new position. + * + * Listen to it from a Sound instance using `Sound.on('seek', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('seek', listener); + * music.play(); + * music.setSeek(5000); + * ``` + */ + const SEEK: string; + + /** + * The Stop All Sounds Event. + * + * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager, + * or the HTML5 Audio Manager. It is dispatched when the `stopAll` method is invoked and after all current Sounds + * have been stopped. + * + * Listen to it from a Scene using: `this.sound.on('stopall', listener)`. + */ + const STOP_ALL: string; + + /** + * The Sound Stop Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are stopped. + * + * Listen to it from a Sound instance using `Sound.on('stop', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('stop', listener); + * music.play(); + * music.stop(); + * ``` + */ + const STOP: string; + + /** + * The Sound Manager Unlocked Event. + * + * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager, + * or the HTML5 Audio Manager. It is dispatched during the update loop when the Sound Manager becomes unlocked. For + * Web Audio this is on the first user gesture on the page. + * + * Listen to it from a Scene using: `this.sound.on('unlocked', listener)`. + */ + const UNLOCKED: string; + + /** + * The Sound Volume Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their volume changes. + * + * Listen to it from a Sound instance using `Sound.on('volume', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('volume', listener); + * music.play(); + * music.setVolume(0.5); + * ``` + */ + const VOLUME: string; + + } + + /** + * HTML5 Audio implementation of the sound. + */ + class HTML5AudioSound extends Phaser.Sound.BaseSound { + /** + * + * @param manager Reference to the current sound manager instance. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. Default {}. + */ + constructor(manager: Phaser.Sound.HTML5AudioSoundManager, key: string, config?: Phaser.Types.Sound.SoundConfig); + + /** + * An array containing all HTML5 Audio tags that could be used for individual + * sound playback. Number of instances depends on the config value passed + * to the `Loader#audio` method call, default is 1. + */ + tags: HTMLAudioElement[]; + + /** + * Reference to an HTML5 Audio tag used for playing sound. + */ + audio: HTMLAudioElement; + + /** + * Timestamp as generated by the Request Animation Frame or SetTimeout + * representing the time at which the delayed sound playback should start. + * Set to 0 if sound playback is not delayed. + */ + startTime: number; + + /** + * Audio tag's playback position recorded on previous + * update method call. Set to 0 if sound is not playing. + */ + previousTime: number; + + /** + * Play this sound, or a marked section of it. + * + * It always plays the sound from the start. If you want to start playback from a specific time + * you can set 'seek' setting of the config object, provided to this call, to that value. + * + * If you want to play the same sound simultaneously, then you need to create another instance + * of it and play that Sound. For HTML5 Audio this also requires creating multiple audio instances + * when loading the audio files. + * @param markerName If you want to play a marker then provide the marker name here. Alternatively, this parameter can be a SoundConfig object. Default ''. + * @param config Optional sound config object to be applied to this marker or entire sound if no marker name is provided. It gets memorized for future plays of current section of the sound. + */ + play(markerName?: string | Phaser.Types.Sound.SoundConfig, config?: Phaser.Types.Sound.SoundConfig): boolean; + + /** + * Pauses the sound. + */ + pause(): boolean; + + /** + * Resumes the sound. + */ + resume(): boolean; + + /** + * Stop playing this sound. + */ + stop(): boolean; + + /** + * This method is used internally to pick and play the next available audio tag. + */ + pickAndPlayAudioTag(): boolean; + + /** + * This method performs the audio tag pooling logic. It first looks for + * unused audio tag to assign to this sound object. If there are no unused + * audio tags, based on HTML5AudioSoundManager#override property value, it + * looks for sound with most advanced playback and hijacks its audio tag or + * does nothing. + */ + pickAudioTag(): boolean; + + /** + * Method used for playing audio tag and catching possible exceptions + * thrown from rejected Promise returned from play method call. + */ + playCatchPromise(): void; + + /** + * This method is used internally to stop and release the current audio tag. + */ + stopAndReleaseAudioTag(): void; + + /** + * Method used internally to reset sound state, usually when stopping sound + * or when hijacking audio tag from another sound. + */ + reset(): void; + + /** + * Method used internally by sound manager for pausing sound if + * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true. + */ + onBlur(): void; + + /** + * Method used internally by sound manager for resuming sound if + * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true. + */ + onFocus(): void; + + /** + * Update method called automatically by sound manager on every game step. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + */ + update(time: number): void; + + /** + * Calls Phaser.Sound.BaseSound#destroy method + * and cleans up all HTML5 Audio related stuff. + */ + destroy(): void; + + /** + * This method is used internally to update the mute setting of this sound. + */ + updateMute(): void; + + /** + * This method is used internally to update the volume of this sound. + */ + updateVolume(): void; + + /** + * This method is used internally to update the playback rate of this sound. + */ + calculateRate(): void; + + /** + * Boolean indicating whether the sound is muted or not. + * Gets or sets the muted state of this sound. + */ + mute: boolean; + + /** + * Sets the muted state of this Sound. + * @param value `true` to mute this sound, `false` to unmute it. + */ + setMute(value: boolean): this; + + /** + * Gets or sets the volume of this sound, a value between 0 (silence) and 1 (full volume). + */ + volume: number; + + /** + * Sets the volume of this Sound. + * @param value The volume of the sound. + */ + setVolume(value: number): this; + + /** + * Rate at which this Sound will be played. + * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + */ + rate: number; + + /** + * Sets the playback rate of this Sound. + * + * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + * @param value The playback rate at of this Sound. + */ + setRate(value: number): this; + + /** + * The detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + detune: number; + + /** + * Sets the detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + * @param value The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + setDetune(value: number): this; + + /** + * Property representing the position of playback for this sound, in seconds. + * Setting it to a specific value moves current playback to that position. + * The value given is clamped to the range 0 to current marker duration. + * Setting seek of a stopped sound has no effect. + */ + seek: number; + + /** + * Seeks to a specific point in this sound. + * @param value The point in the sound to seek to. + */ + setSeek(value: number): this; + + /** + * Flag indicating whether or not the sound or current sound marker will loop. + */ + loop: boolean; + + /** + * Sets the loop state of this Sound. + * @param value `true` to loop this sound, `false` to not loop it. + */ + setLoop(value: boolean): Phaser.Sound.HTML5AudioSound; + + /** + * Gets or sets the pan of this sound, a value between -1 (full left pan) and 1 (full right pan). + * + * Has no audible effect on HTML5 Audio Sound, but still generates the PAN Event. + */ + pan: number; + + /** + * Sets the pan of this sound, a value between -1 (full left pan) and 1 (full right pan). + * + * Has no audible effect on HTML5 Audio Sound, but still generates the PAN Event. + * @param value The pan of the sound. A value between -1 (full left pan) and 1 (full right pan). + */ + setPan(value: number): this; + + } + + /** + * HTML5AudioSoundManager + */ + class HTML5AudioSoundManager extends Phaser.Sound.BaseSoundManager { + /** + * + * @param game Reference to the current game instance. + */ + constructor(game: Phaser.Game); + + /** + * Flag indicating whether if there are no idle instances of HTML5 Audio tag, + * for any particular sound, if one of the used tags should be hijacked and used + * for succeeding playback or if succeeding Phaser.Sound.HTML5AudioSound#play + * call should be ignored. + */ + override: boolean; + + /** + * Value representing time difference, in seconds, between calling + * play method on an audio tag and when it actually starts playing. + * It is used to achieve more accurate delayed sound playback. + * + * You might need to tweak this value to get the desired results + * since audio play delay varies depending on the browser/platform. + */ + audioPlayDelay: number; + + /** + * A value by which we should offset the loop end marker of the + * looping sound to compensate for lag, caused by changing audio + * tag playback position, in order to achieve gapless looping. + * + * You might need to tweak this value to get the desired results + * since loop lag varies depending on the browser/platform. + */ + loopEndOffset: number; + + /** + * Adds a new sound into the sound manager. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + add(key: string, config?: Phaser.Types.Sound.SoundConfig): Phaser.Sound.HTML5AudioSound; + + /** + * Unlocks HTML5 Audio loading and playback on mobile + * devices on the initial explicit user interaction. + */ + unlock(): void; + + /** + * Method used internally for pausing sound manager if + * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true. + */ + protected onBlur(): void; + + /** + * Method used internally for resuming sound manager if + * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true. + */ + protected onFocus(): void; + + /** + * Calls Phaser.Sound.BaseSoundManager#destroy method + * and cleans up all HTML5 Audio related stuff. + */ + destroy(): void; + + /** + * Method used internally by Phaser.Sound.HTML5AudioSound class methods and property setters + * to check if sound manager is locked and then either perform action immediately or queue it + * to be performed once the sound manager gets unlocked. + * @param sound Sound object on which to perform queued action. + * @param prop Name of the method to be called or property to be assigned a value to. + * @param value An optional parameter that either holds an array of arguments to be passed to the method call or value to be set to the property. + */ + protected isLocked(sound: Phaser.Sound.HTML5AudioSound, prop: string, value?: any): boolean; + + /** + * Sets the muted state of all this Sound Manager. + * @param value `true` to mute all sounds, `false` to unmute them. + */ + setMute(value: boolean): Phaser.Sound.HTML5AudioSoundManager; + + mute: boolean; + + /** + * Sets the volume of this Sound Manager. + * @param value The global volume of this Sound Manager. + */ + setVolume(value: number): Phaser.Sound.HTML5AudioSoundManager; + + volume: number; + + } + + /** + * No audio implementation of the sound. It is used if audio has been + * disabled in the game config or the device doesn't support any audio. + * + * It represents a graceful degradation of sound logic that provides + * minimal functionality and prevents Phaser projects that use audio from + * breaking on devices that don't support any audio playback technologies. + */ + class NoAudioSound extends Phaser.Events.EventEmitter { + /** + * + * @param manager Reference to the current sound manager instance. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. Default {}. + */ + constructor(manager: Phaser.Sound.NoAudioSoundManager, key: string, config?: Phaser.Types.Sound.SoundConfig); + + /** + * Local reference to the sound manager. + */ + manager: Phaser.Sound.BaseSoundManager; + + /** + * Asset key for the sound. + */ + readonly key: string; + + /** + * Flag indicating if sound is currently playing. + */ + readonly isPlaying: boolean; + + /** + * Flag indicating if sound is currently paused. + */ + readonly isPaused: boolean; + + /** + * A property that holds the value of sound's actual playback rate, + * after its rate and detune values has been combined with global + * rate and detune values. + */ + readonly totalRate: number; + + /** + * A value representing the duration, in seconds. + * It could be total sound duration or a marker duration. + */ + readonly duration: number; + + /** + * The total duration of the sound in seconds. + */ + readonly totalDuration: number; + + /** + * A config object used to store default sound settings' values. + * Default values will be set by properties' setters. + */ + config: Phaser.Types.Sound.SoundConfig; + + /** + * Reference to the currently used config. + * It could be default config or marker config. + */ + currentConfig: Phaser.Types.Sound.SoundConfig; + + /** + * Boolean indicating whether the sound is muted or not. + * Gets or sets the muted state of this sound. + */ + mute: boolean; + + /** + * Gets or sets the volume of this sound, a value between 0 (silence) and 1 (full volume). + */ + volume: number; + + /** + * Rate at which this Sound will be played. + * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + */ + rate: number; + + /** + * The detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + detune: number; + + /** + * Property representing the position of playback for this sound, in seconds. + * Setting it to a specific value moves current playback to that position. + * The value given is clamped to the range 0 to current marker duration. + * Setting seek of a stopped sound has no effect. + */ + seek: number; + + /** + * Flag indicating whether or not the sound or current sound marker will loop. + */ + loop: boolean; + + /** + * Gets or sets the pan of this sound, a value between -1 (full left pan) and 1 (full right pan). + * + * Always returns zero on iOS / Safari as it doesn't support the stereo panner node. + */ + pan: number; + + /** + * Object containing markers definitions. + */ + readonly markers: {[key: string]: Phaser.Types.Sound.SoundMarker}; + + /** + * Currently playing marker. + * 'null' if whole sound is playing. + */ + readonly currentMarker: Phaser.Types.Sound.SoundMarker; + + /** + * Flag indicating if destroy method was called on this sound. + */ + pendingRemove: boolean; + + /** + * + * @param marker Marker object. + */ + addMarker(marker: Phaser.Types.Sound.SoundMarker): boolean; + + /** + * + * @param marker Marker object with updated values. + */ + updateMarker(marker: Phaser.Types.Sound.SoundMarker): boolean; + + /** + * + * @param markerName The name of the marker to remove. + */ + removeMarker(markerName: string): null; + + /** + * + * @param markerName If you want to play a marker then provide the marker name here. Alternatively, this parameter can be a SoundConfig object. Default ''. + * @param config Optional sound config object to be applied to this marker or entire sound if no marker name is provided. It gets memorized for future plays of current section of the sound. + */ + play(markerName?: string | Phaser.Types.Sound.SoundConfig, config?: Phaser.Types.Sound.SoundConfig): boolean; + + pause(): boolean; + + /** + * Resumes the sound. + */ + resume(): boolean; + + /** + * Stop playing this sound. + */ + stop(): boolean; + + /** + * Sets the muted state of this Sound. + * @param value `true` to mute this sound, `false` to unmute it. + */ + setMute(value: boolean): this; + + /** + * Sets the volume of this Sound. + * @param value The volume of the sound. + */ + setVolume(value: number): this; + + /** + * Sets the playback rate of this Sound. + * + * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + * @param value The playback rate at of this Sound. + */ + setRate(value: number): this; + + /** + * Sets the detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + * @param value The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + setDetune(value: number): this; + + /** + * Seeks to a specific point in this sound. + * @param value The point in the sound to seek to. + */ + setSeek(value: number): this; + + /** + * Sets the loop state of this Sound. + * @param value `true` to loop this sound, `false` to not loop it. + */ + setLoop(value: boolean): this; + + /** + * Sets the pan of this sound, a value between -1 (full left pan) and 1 (full right pan). + * + * Note: iOS / Safari doesn't support the stereo panner node. + * @param value The pan of the sound. A value between -1 (full left pan) and 1 (full right pan). + */ + setPan(value: number): this; + + /** + * Method used internally for applying config values to some of the sound properties. + */ + applyConfig(): void; + + /** + * Method used internally for resetting values of some of the config properties. + */ + resetConfig(): void; + + /** + * Update method called automatically by sound manager on every game step. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Method used internally to calculate total playback rate of the sound. + */ + calculateRate(): void; + + /** + * Destroys this sound and all associated events and marks it for removal from the sound manager. + */ + destroy(): void; + + } + + /** + * No-audio implementation of the Sound Manager. It is used if audio has been + * disabled in the game config or the device doesn't support any audio. + * + * It represents a graceful degradation of Sound Manager logic that provides + * minimal functionality and prevents Phaser projects that use audio from + * breaking on devices that don't support any audio playback technologies. + */ + class NoAudioSoundManager extends Phaser.Sound.BaseSoundManager { + /** + * + * @param game Reference to the current game instance. + */ + constructor(game: Phaser.Game); + + /** + * Adds a new sound into the sound manager. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + add(key: string, config?: Phaser.Types.Sound.SoundConfig): Phaser.Sound.NoAudioSound; + + /** + * Adds a new audio sprite sound into the sound manager. + * Audio Sprites are a combination of audio files and a JSON configuration. + * The JSON follows the format of that created by https://github.com/tonistiigi/audiosprite + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + addAudioSprite(key: string, config?: Phaser.Types.Sound.SoundConfig): Phaser.Sound.NoAudioSound; + + /** + * Gets the first sound in the manager matching the given key, if any. + * @param key Sound asset key. + */ + get(key: string): T; + + /** + * Gets any sounds in the manager matching the given key. + * @param key Sound asset key. + */ + getAll(key: string): T[]; + + /** + * This method does nothing but return 'false' for the No Audio Sound Manager, to maintain + * compatibility with the other Sound Managers. + * @param key Asset key for the sound. + * @param extra An optional additional object containing settings to be applied to the sound. It could be either config or marker object. + */ + play(key: string, extra?: Phaser.Types.Sound.SoundConfig | Phaser.Types.Sound.SoundMarker): boolean; + + /** + * This method does nothing but return 'false' for the No Audio Sound Manager, to maintain + * compatibility with the other Sound Managers. + * @param key Asset key for the sound. + * @param spriteName The name of the sound sprite to play. + * @param config An optional config object containing default sound settings. + */ + playAudioSprite(key: string, spriteName: string, config?: Phaser.Types.Sound.SoundConfig): boolean; + + /** + * Removes a sound from the sound manager. + * The removed sound is destroyed before removal. + * @param sound The sound object to remove. + */ + remove(sound: Phaser.Sound.BaseSound): boolean; + + /** + * Removes all sounds from the manager, destroying the sounds. + */ + removeAll(): void; + + /** + * Removes all sounds from the sound manager that have an asset key matching the given value. + * The removed sounds are destroyed before removal. + * @param key The key to match when removing sound objects. + */ + removeByKey(key: string): number; + + /** + * Stops any sounds matching the given key. + * @param key Sound asset key. + */ + stopByKey(key: string): number; + + /** + * Empty function for the No Audio Sound Manager. + */ + onBlur(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + onFocus(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + onGameBlur(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + onGameFocus(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + pauseAll(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + resumeAll(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + stopAll(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + update(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + setRate(): this; + + /** + * Empty function for the No Audio Sound Manager. + */ + setDetune(): this; + + /** + * Empty function for the No Audio Sound Manager. + */ + setMute(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + setVolume(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + unlock(): void; + + /** + * Destroys all the sounds in the game and all associated events. + */ + destroy(): void; + + } + + /** + * Creates a Web Audio, HTML5 Audio or No Audio Sound Manager based on config and device settings. + * + * Be aware of https://developers.google.com/web/updates/2017/09/autoplay-policy-changes + * @param game Reference to the current game instance. + */ + function SoundManagerCreator(game: Phaser.Game): Phaser.Sound.HTML5AudioSoundManager | Phaser.Sound.WebAudioSoundManager | Phaser.Sound.NoAudioSoundManager; + + /** + * Web Audio API implementation of the sound. + */ + class WebAudioSound extends Phaser.Sound.BaseSound { + /** + * + * @param manager Reference to the WebAudio Sound Manager that owns this Sound instance. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. Default {}. + */ + constructor(manager: Phaser.Sound.WebAudioSoundManager, key: string, config?: Phaser.Types.Sound.SoundConfig); + + /** + * Audio buffer containing decoded data of the audio asset to be played. + */ + audioBuffer: AudioBuffer; + + /** + * A reference to an audio source node used for playing back audio from + * audio data stored in Phaser.Sound.WebAudioSound#audioBuffer. + */ + source: AudioBufferSourceNode; + + /** + * A reference to a second audio source used for gapless looped playback. + */ + loopSource: AudioBufferSourceNode; + + /** + * Gain node responsible for controlling this sound's muting. + */ + muteNode: GainNode; + + /** + * Gain node responsible for controlling this sound's volume. + */ + volumeNode: GainNode; + + /** + * Panner node responsible for controlling this sound's pan. + * + * Doesn't work on iOS / Safari. + */ + pannerNode: StereoPannerNode; + + /** + * The Stereo Spatial Panner node. + */ + spatialNode: PannerNode; + + /** + * If the Spatial Panner node has been set to track a vector or + * Game Object, this retains a reference to it. + */ + spatialSource: Phaser.Types.Math.Vector2Like; + + /** + * The time at which the sound should have started playback from the beginning. + * + * Treat this property as read-only. + * + * Based on `BaseAudioContext.currentTime` value. + */ + playTime: number; + + /** + * The time at which the sound source should have actually started playback. + * + * Treat this property as read-only. + * + * Based on `BaseAudioContext.currentTime` value. + */ + startTime: number; + + /** + * The time at which the sound loop source should actually start playback. + * + * Based on `BaseAudioContext.currentTime` value. + */ + loopTime: number; + + /** + * An array where we keep track of all rate updates during playback. + * + * Treat this property as read-only. + * + * Array of object types: `{ time: number, rate: number }` + */ + rateUpdates: any[]; + + /** + * Used for keeping track when sound source playback has ended + * so its state can be updated accordingly. + */ + readonly hasEnded: boolean; + + /** + * Used for keeping track when sound source has looped + * so its state can be updated accordingly. + */ + readonly hasLooped: boolean; + + /** + * Play this sound, or a marked section of it. + * + * It always plays the sound from the start. If you want to start playback from a specific time + * you can set 'seek' setting of the config object, provided to this call, to that value. + * + * If you want to play the same sound simultaneously, then you need to create another instance + * of it and play that Sound. + * @param markerName If you want to play a marker then provide the marker name here. Alternatively, this parameter can be a SoundConfig object. Default ''. + * @param config Optional sound config object to be applied to this marker or entire sound if no marker name is provided. It gets memorized for future plays of current section of the sound. + */ + play(markerName?: string | Phaser.Types.Sound.SoundConfig, config?: Phaser.Types.Sound.SoundConfig): boolean; + + /** + * Pauses the sound. + */ + pause(): boolean; + + /** + * Resumes the sound. + */ + resume(): boolean; + + /** + * Stop playing this sound. + */ + stop(): boolean; + + /** + * This method is only used internally and it creates a looping buffer source. + */ + createAndStartLoopBufferSource(): void; + + /** + * This method is only used internally and it creates a buffer source. + */ + createBufferSource(): AudioBufferSourceNode; + + /** + * This method is only used internally and it stops and removes a buffer source. + */ + stopAndRemoveBufferSource(): void; + + /** + * This method is only used internally and it stops and removes a looping buffer source. + */ + stopAndRemoveLoopBufferSource(): void; + + /** + * Method used internally for applying config values to some of the sound properties. + */ + applyConfig(): void; + + /** + * Sets the x position of this Sound in Spatial Audio space. + * + * This only has any effect if the sound was created with a SpatialSoundConfig object. + * + * Also see the `WebAudioSoundManager.setListenerPosition` method. + * + * If you find that the sound becomes too quiet, too quickly, as it moves away from + * the listener, then try different `refDistance` property values when configuring + * the spatial sound. + */ + x: number; + + /** + * Sets the y position of this Sound in Spatial Audio space. + * + * This only has any effect if the sound was created with a SpatialSoundConfig object. + * + * Also see the `WebAudioSoundManager.setListenerPosition` method. + * + * If you find that the sound becomes too quiet, too quickly, as it moves away from + * the listener, then try different `refDistance` property values when configuring + * the spatial sound. + */ + y: number; + + /** + * Update method called automatically by sound manager on every game step. + */ + update(): void; + + /** + * Calls Phaser.Sound.BaseSound#destroy method + * and cleans up all Web Audio API related stuff. + */ + destroy(): void; + + /** + * Method used internally to calculate total playback rate of the sound. + */ + calculateRate(): void; + + /** + * Method used internally for calculating current playback time of a playing sound. + */ + getCurrentTime(): void; + + /** + * Method used internally for calculating the time + * at witch the loop source should start playing. + */ + getLoopTime(): void; + + /** + * Rate at which this Sound will be played. + * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + */ + rate: number; + + /** + * Sets the playback rate of this Sound. + * + * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + * @param value The playback rate at of this Sound. + */ + setRate(value: number): this; + + /** + * The detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + detune: number; + + /** + * Sets the detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + * @param value The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + setDetune(value: number): this; + + /** + * Boolean indicating whether the sound is muted or not. + * Gets or sets the muted state of this sound. + */ + mute: boolean; + + /** + * Sets the muted state of this Sound. + * @param value `true` to mute this sound, `false` to unmute it. + */ + setMute(value: boolean): this; + + /** + * Gets or sets the volume of this sound, a value between 0 (silence) and 1 (full volume). + */ + volume: number; + + /** + * Sets the volume of this Sound. + * @param value The volume of the sound. + */ + setVolume(value: number): this; + + /** + * Property representing the position of playback for this sound, in seconds. + * Setting it to a specific value moves current playback to that position. + * The value given is clamped to the range 0 to current marker duration. + * Setting seek of a stopped sound has no effect. + */ + seek: number; + + /** + * Seeks to a specific point in this sound. + * @param value The point in the sound to seek to. + */ + setSeek(value: number): this; + + /** + * Flag indicating whether or not the sound or current sound marker will loop. + */ + loop: boolean; + + /** + * Sets the loop state of this Sound. + * @param value `true` to loop this sound, `false` to not loop it. + */ + setLoop(value: boolean): this; + + /** + * Gets or sets the pan of this sound, a value between -1 (full left pan) and 1 (full right pan). + * + * Always returns zero on iOS / Safari as it doesn't support the stereo panner node. + */ + pan: number; + + /** + * Sets the pan of this sound, a value between -1 (full left pan) and 1 (full right pan). + * + * Note: iOS / Safari doesn't support the stereo panner node. + * @param value The pan of the sound. A value between -1 (full left pan) and 1 (full right pan). + */ + setPan(value: number): this; + + } + + /** + * Web Audio API implementation of the Sound Manager. + * + * Not all browsers can play all audio formats. + * + * There is a good guide to what's supported: [Cross-browser audio basics: Audio codec support](https://developer.mozilla.org/en-US/Apps/Fundamentals/Audio_and_video_delivery/Cross-browser_audio_basics#Audio_Codec_Support). + */ + class WebAudioSoundManager extends Phaser.Sound.BaseSoundManager { + /** + * + * @param game Reference to the current game instance. + */ + constructor(game: Phaser.Game); + + /** + * The AudioContext being used for playback. + */ + context: AudioContext; + + /** + * Gain node responsible for controlling global muting. + */ + masterMuteNode: GainNode; + + /** + * Gain node responsible for controlling global volume. + */ + masterVolumeNode: GainNode; + + /** + * Destination node for connecting individual sounds to. + */ + destination: AudioNode; + + /** + * Method responsible for instantiating and returning AudioContext instance. + * If an instance of an AudioContext class was provided through the game config, + * that instance will be returned instead. This can come in handy if you are reloading + * a Phaser game on a page that never properly refreshes (such as in an SPA project) + * and you want to reuse already instantiated AudioContext. + * @param game Reference to the current game instance. + */ + createAudioContext(game: Phaser.Game): AudioContext; + + /** + * This method takes a new AudioContext reference and then sets + * this Sound Manager to use that context for all playback. + * + * As part of this call it also disconnects the master mute and volume + * nodes and then re-creates them on the new given context. + * @param context Reference to an already created AudioContext instance. + */ + setAudioContext(context: AudioContext): this; + + /** + * Adds a new sound into the sound manager. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + add(key: string, config?: Phaser.Types.Sound.SoundConfig): Phaser.Sound.WebAudioSound; + + /** + * Decode audio data into a format ready for playback via Web Audio. + * + * The audio data can be a base64 encoded string, an audio media-type data uri, or an ArrayBuffer instance. + * + * The `audioKey` is the key that will be used to save the decoded audio to the audio cache. + * + * Instead of passing a single entry you can instead pass an array of `Phaser.Types.Sound.DecodeAudioConfig` + * objects as the first and only argument. + * + * Decoding is an async process, so be sure to listen for the events to know when decoding has completed. + * + * Once the audio has decoded it can be added to the Sound Manager or played via its key. + * @param audioKey The string-based key to be used to reference the decoded audio in the audio cache, or an array of audio config objects. + * @param audioData The audio data, either a base64 encoded string, an audio media-type data uri, or an ArrayBuffer instance. + */ + decodeAudio(audioKey?: Phaser.Types.Sound.DecodeAudioConfig[] | string, audioData?: ArrayBuffer | string): void; + + /** + * Sets the X and Y position of the Spatial Audio listener on this Web Audios context. + * + * If you call this method with no parameters it will default to the center-point of + * the game canvas. Depending on the type of game you're making, you may need to call + * this method constantly to reset the listener position as the camera scrolls. + * + * Calling this method does nothing on HTML5Audio. + * @param x The x position of the Spatial Audio listener. + * @param y The y position of the Spatial Audio listener. + */ + setListenerPosition(x?: number, y?: number): void; + + /** + * Unlocks Web Audio API on the initial input event. + * + * Read more about how this issue is handled here in [this article](https://medium.com/@pgoloskokovic/unlocking-web-audio-the-smarter-way-8858218c0e09). + */ + unlock(): void; + + /** + * Method used internally for pausing sound manager if + * Phaser.Sound.WebAudioSoundManager#pauseOnBlur is set to true. + */ + protected onBlur(): void; + + /** + * Method used internally for resuming sound manager if + * Phaser.Sound.WebAudioSoundManager#pauseOnBlur is set to true. + */ + protected onFocus(): void; + + /** + * Update method called on every game step. + * + * Removes destroyed sounds and updates every active sound in the game. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time elapsed since the last frame. + */ + protected update(time: number, delta: number): void; + + /** + * Calls Phaser.Sound.BaseSoundManager#destroy method + * and cleans up all Web Audio API related stuff. + */ + destroy(): void; + + /** + * Sets the muted state of all this Sound Manager. + * @param value `true` to mute all sounds, `false` to unmute them. + */ + setMute(value: boolean): Phaser.Sound.WebAudioSoundManager; + + mute: boolean; + + /** + * Sets the volume of this Sound Manager. + * @param value The global volume of this Sound Manager. + */ + setVolume(value: number): Phaser.Sound.WebAudioSoundManager; + + volume: number; + + } + + } + + namespace Structs { + namespace Events { + /** + * The Process Queue Add Event. + * + * This event is dispatched by a Process Queue when a new item is successfully moved to its active list. + * + * You will most commonly see this used by a Scene's Update List when a new Game Object has been added. + * + * In that instance, listen to this event from within a Scene using: `this.sys.updateList.on('add', listener)`. + */ + const PROCESS_QUEUE_ADD: string; + + /** + * The Process Queue Remove Event. + * + * This event is dispatched by a Process Queue when a new item is successfully removed from its active list. + * + * You will most commonly see this used by a Scene's Update List when a Game Object has been removed. + * + * In that instance, listen to this event from within a Scene using: `this.sys.updateList.on('remove', listener)`. + */ + const PROCESS_QUEUE_REMOVE: string; + + } + + /** + * List is a generic implementation of an ordered list which contains utility methods for retrieving, manipulating, and iterating items. + */ + class List { + /** + * + * @param parent The parent of this list. + */ + constructor(parent: any); + + /** + * The parent of this list. + */ + parent: any; + + /** + * The objects that belong to this collection. + */ + list: T[]; + + /** + * The index of the current element. + * + * This is used internally when iterating through the list with the {@link #first}, {@link #last}, {@link #get}, and {@link #previous} properties. + */ + position: number; + + /** + * A callback that is invoked every time a child is added to this list. + */ + addCallback: Function; + + /** + * A callback that is invoked every time a child is removed from this list. + */ + removeCallback: Function; + + /** + * The property key to sort by. + */ + _sortKey: string; + + /** + * Adds the given item to the end of the list. Each item must be unique. + * @param child The item, or array of items, to add to the list. + * @param skipCallback Skip calling the List.addCallback if this child is added successfully. Default false. + */ + add(child: any | any[], skipCallback?: boolean): any; + + /** + * Adds an item to list, starting at a specified index. Each item must be unique within the list. + * @param child The item, or array of items, to add to the list. + * @param index The index in the list at which the element(s) will be inserted. Default 0. + * @param skipCallback Skip calling the List.addCallback if this child is added successfully. Default false. + */ + addAt(child: (T|T[]), index?: number, skipCallback?: boolean): (T|T[]); + + /** + * Retrieves the item at a given position inside the List. + * @param index The index of the item. + */ + getAt(index: number): T; + + /** + * Locates an item within the List and returns its index. + * @param child The item to locate. + */ + getIndex(child: T): number; + + /** + * Sort the contents of this List so the items are in order based on the given property. + * For example, `sort('alpha')` would sort the List contents based on the value of their `alpha` property. + * @param property The property to lexically sort by. + * @param handler Provide your own custom handler function. Will receive 2 children which it should compare and return a boolean. + */ + sort(property: string, handler?: Function): T[]; + + /** + * Searches for the first instance of a child with its `name` + * property matching the given argument. Should more than one child have + * the same name only the first is returned. + * @param name The name to search for. + */ + getByName(name: string): T | null; + + /** + * Returns a random child from the group. + * @param startIndex Offset from the front of the group (lowest child). Default 0. + * @param length Restriction on the number of values you want to randomly select from. Default (to top). + */ + getRandom(startIndex?: number, length?: number): T | null; + + /** + * Returns the first element in a given part of the List which matches a specific criterion. + * @param property The name of the property to test or a falsey value to have no criterion. + * @param value The value to test the `property` against, or `undefined` to allow any value and only check for existence. + * @param startIndex The position in the List to start the search at. Default 0. + * @param endIndex The position in the List to optionally stop the search at. It won't be checked. + */ + getFirst(property: string, value: any, startIndex?: number, endIndex?: number): T | null; + + /** + * Returns all children in this List. + * + * You can optionally specify a matching criteria using the `property` and `value` arguments. + * + * For example: `getAll('parent')` would return only children that have a property called `parent`. + * + * You can also specify a value to compare the property to: + * + * `getAll('visible', true)` would return only children that have their visible property set to `true`. + * + * Optionally you can specify a start and end index. For example if this List had 100 children, + * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only + * the first 50 children in the List. + * @param property An optional property to test against the value argument. + * @param value If property is set then Child.property must strictly equal this value to be included in the results. + * @param startIndex The first child index to start the search from. + * @param endIndex The last child index to search up until. + */ + getAll(property?: string, value?: any, startIndex?: number, endIndex?: number): T[]; + + /** + * Returns the total number of items in the List which have a property matching the given value. + * @param property The property to test on each item. + * @param value The value to test the property against. + */ + count(property: string, value: T): number; + + /** + * Swaps the positions of two items in the list. + * @param child1 The first item to swap. + * @param child2 The second item to swap. + */ + swap(child1: T, child2: T): void; + + /** + * Moves an item in the List to a new position. + * @param child The item to move. + * @param index Moves an item in the List to a new position. + */ + moveTo(child: T, index: number): T; + + /** + * Moves the given array element above another one in the array. + * @param child1 The element to move above base element. + * @param child2 The base element. + */ + moveAbove(child1: T, child2: T): void; + + /** + * Moves the given array element below another one in the array. + * @param child1 The element to move below base element. + * @param child2 The base element. + */ + moveBelow(child1: T, child2: T): void; + + /** + * Removes one or many items from the List. + * @param child The item, or array of items, to remove. + * @param skipCallback Skip calling the List.removeCallback. Default false. + */ + remove(child: any, skipCallback?: boolean): any; + + /** + * Removes the item at the given position in the List. + * @param index The position to remove the item from. + * @param skipCallback Skip calling the List.removeCallback. Default false. + */ + removeAt(index: number, skipCallback?: boolean): T; + + /** + * Removes the items within the given range in the List. + * @param startIndex The index to start removing from. Default 0. + * @param endIndex The position to stop removing at. The item at this position won't be removed. + * @param skipCallback Skip calling the List.removeCallback. Default false. + */ + removeBetween(startIndex?: number, endIndex?: number, skipCallback?: boolean): T[]; + + /** + * Removes all the items. + * @param skipCallback Skip calling the List.removeCallback. Default false. + */ + removeAll(skipCallback?: boolean): this; + + /** + * Brings the given child to the top of this List. + * @param child The item to bring to the top of the List. + */ + bringToTop(child: T): T; + + /** + * Sends the given child to the bottom of this List. + * @param child The item to send to the back of the list. + */ + sendToBack(child: T): T; + + /** + * Moves the given child up one place in this group unless it's already at the top. + * @param child The item to move up. + */ + moveUp(child: T): T; + + /** + * Moves the given child down one place in this group unless it's already at the bottom. + * @param child The item to move down. + */ + moveDown(child: T): T; + + /** + * Reverses the order of all children in this List. + */ + reverse(): Phaser.Structs.List; + + /** + * Shuffles the items in the list. + */ + shuffle(): Phaser.Structs.List; + + /** + * Replaces a child of this List with the given newChild. The newChild cannot be a member of this List. + * @param oldChild The child in this List that will be replaced. + * @param newChild The child to be inserted into this List. + */ + replace(oldChild: T, newChild: T): T; + + /** + * Checks if an item exists within the List. + * @param child The item to check for the existence of. + */ + exists(child: T): boolean; + + /** + * Sets the property `key` to the given value on all members of this List. + * @param property The name of the property to set. + * @param value The value to set the property to. + * @param startIndex The first child index to start the search from. + * @param endIndex The last child index to search up until. + */ + setAll(property: string, value: T, startIndex?: number, endIndex?: number): void; + + /** + * Passes all children to the given callback. + * @param callback The function to call. + * @param context Value to use as `this` when executing callback. + * @param args Additional arguments that will be passed to the callback, after the child. + */ + each(callback: EachListCallback, context?: any, ...args: any[]): void; + + /** + * Clears the List and recreates its internal array. + */ + shutdown(): void; + + /** + * Destroys this List. + */ + destroy(): void; + + /** + * The number of items inside the List. + */ + readonly length: number; + + /** + * The first item in the List or `null` for an empty List. + */ + readonly first: T; + + /** + * The last item in the List, or `null` for an empty List. + */ + readonly last: T; + + /** + * The next item in the List, or `null` if the entire List has been traversed. + * + * This property can be read successively after reading {@link #first} or manually setting the {@link #position} to iterate the List. + */ + readonly next: T; + + /** + * The previous item in the List, or `null` if the entire List has been traversed. + * + * This property can be read successively after reading {@link #last} or manually setting the {@link #position} to iterate the List backwards. + */ + readonly previous: T; + + } + + /** + * The keys of a Map can be arbitrary values. + * + * ```javascript + * var map = new Map([ + * [ 1, 'one' ], + * [ 2, 'two' ], + * [ 3, 'three' ] + * ]); + * ``` + */ + class Map { + /** + * + * @param elements An optional array of key-value pairs to populate this Map with. + */ + constructor(elements: V[]); + + /** + * The entries in this Map. + */ + entries: {[key: string]: V}; + + /** + * The number of key / value pairs in this Map. + */ + size: number; + + /** + * Adds all the elements in the given array to this Map. + * + * If the element already exists, the value will be skipped. + * @param elements An array of key-value pairs to populate this Map with. + */ + setAll(elements: V[]): this; + + /** + * Adds an element with a specified `key` and `value` to this Map. + * + * If the `key` already exists, the value will be replaced. + * + * If you wish to add multiple elements in a single call, use the `setAll` method instead. + * @param key The key of the element to be added to this Map. + * @param value The value of the element to be added to this Map. + */ + set(key: K, value: V): Phaser.Structs.Map; + + /** + * Returns the value associated to the `key`, or `undefined` if there is none. + * @param key The key of the element to return from the `Map` object. + */ + get(key: K): V; + + /** + * Returns an `Array` of all the values stored in this Map. + */ + getArray(): V[]; + + /** + * Returns a boolean indicating whether an element with the specified key exists or not. + * @param key The key of the element to test for presence of in this Map. + */ + has(key: K): boolean; + + /** + * Delete the specified element from this Map. + * @param key The key of the element to delete from this Map. + */ + delete(key: K): Phaser.Structs.Map; + + /** + * Delete all entries from this Map. + */ + clear(): Phaser.Structs.Map; + + /** + * Returns all entries keys in this Map. + */ + keys(): K[]; + + /** + * Returns an `Array` of all entries. + */ + values(): V[]; + + /** + * Dumps the contents of this Map to the console via `console.group`. + */ + dump(): void; + + /** + * Iterates through all entries in this Map, passing each one to the given callback. + * + * If the callback returns `false`, the iteration will break. + * @param callback The callback which will receive the keys and entries held in this Map. + */ + each(callback: EachMapCallback): Phaser.Structs.Map; + + /** + * Returns `true` if the value exists within this Map. Otherwise, returns `false`. + * @param value The value to search for. + */ + contains(value: V): boolean; + + /** + * Merges all new keys from the given Map into this one. + * If it encounters a key that already exists it will be skipped unless override is set to `true`. + * @param map The Map to merge in to this Map. + * @param override Set to `true` to replace values in this Map with those from the source map, or `false` to skip them. Default false. + */ + merge(map: Phaser.Structs.Map, override?: boolean): Phaser.Structs.Map; + + } + + /** + * A Process Queue maintains three internal lists. + * + * The `pending` list is a selection of items which are due to be made 'active' in the next update. + * The `active` list is a selection of items which are considered active and should be updated. + * The `destroy` list is a selection of items that were active and are awaiting being destroyed in the next update. + * + * When new items are added to a Process Queue they are put in the pending list, rather than being added + * immediately the active list. Equally, items that are removed are put into the destroy list, rather than + * being destroyed immediately. This allows the Process Queue to carefully process each item at a specific, fixed + * time, rather than at the time of the request from the API. + */ + class ProcessQueue extends Phaser.Events.EventEmitter { + /** + * If `true` only unique objects will be allowed in the queue. + */ + checkQueue: boolean; + + /** + * Checks the given item to see if it is already active within this Process Queue. + * @param item The item to check. + */ + isActive(item: T): Phaser.Structs.ProcessQueue; + + /** + * Checks the given item to see if it is already pending addition to this Process Queue. + * @param item The item to check. + */ + isPending(item: T): Phaser.Structs.ProcessQueue; + + /** + * Checks the given item to see if it is already pending destruction from this Process Queue. + * @param item The item to check. + */ + isDestroying(item: T): Phaser.Structs.ProcessQueue; + + /** + * Adds a new item to the Process Queue. + * + * The item is added to the pending list and made active in the next update. + * @param item The item to add to the queue. + */ + add(item: T): Phaser.Structs.ProcessQueue; + + /** + * Removes an item from the Process Queue. + * + * The item is added to the 'destroy' list and is fully removed in the next update. + * @param item The item to be removed from the queue. + */ + remove(item: T): Phaser.Structs.ProcessQueue; + + /** + * Removes all active items from this Process Queue. + * + * All the items are marked as 'pending destroy' and fully removed in the next update. + */ + removeAll(): this; + + /** + * Update this queue. First it will process any items awaiting destruction, and remove them. + * + * Then it will check to see if there are any items pending insertion, and move them to an + * active state. Finally, it will return a list of active items for further processing. + */ + update(): T[]; + + /** + * Returns the current list of active items. + * + * This method returns a reference to the active list array, not a copy of it. + * Therefore, be careful to not modify this array outside of the ProcessQueue. + */ + getActive(): T[]; + + /** + * The number of entries in the active list. + */ + readonly length: number; + + /** + * Immediately destroys this process queue, clearing all of its internal arrays and resetting the process totals. + */ + destroy(): void; + + } + + /** + * RBush is a high-performance JavaScript library for 2D spatial indexing of points and rectangles. + * It's based on an optimized R-tree data structure with bulk insertion support. + * + * Spatial index is a special data structure for points and rectangles that allows you to perform queries like + * "all items within this bounding box" very efficiently (e.g. hundreds of times faster than looping over all items). + * + * This version of RBush uses a fixed min/max accessor structure of `[ '.left', '.top', '.right', '.bottom' ]`. + * This is to avoid the eval like function creation that the original library used, which caused CSP policy violations. + * + * rbush is forked from https://github.com/mourner/rbush by Vladimir Agafonkin + */ + class RTree { + } + + /** + * A Set is a collection of unique elements. + */ + class Set { + /** + * + * @param elements An optional array of elements to insert into this Set. + */ + constructor(elements?: T[]); + + /** + * The entries of this Set. Stored internally as an array. + */ + entries: T[]; + + /** + * Inserts the provided value into this Set. If the value is already contained in this Set this method will have no effect. + * @param value The value to insert into this Set. + */ + set(value: T): Phaser.Structs.Set; + + /** + * Get an element of this Set which has a property of the specified name, if that property is equal to the specified value. + * If no elements of this Set satisfy the condition then this method will return `null`. + * @param property The property name to check on the elements of this Set. + * @param value The value to check for. + */ + get(property: string, value: T): T; + + /** + * Returns an array containing all the values in this Set. + */ + getArray(): T[]; + + /** + * Removes the given value from this Set if this Set contains that value. + * @param value The value to remove from the Set. + */ + delete(value: T): Phaser.Structs.Set; + + /** + * Dumps the contents of this Set to the console via `console.group`. + */ + dump(): void; + + /** + * Passes each value in this Set to the given callback. + * Use this function when you know this Set will be modified during the iteration, otherwise use `iterate`. + * @param callback The callback to be invoked and passed each value this Set contains. + * @param callbackScope The scope of the callback. + */ + each(callback: EachSetCallback, callbackScope?: any): Phaser.Structs.Set; + + /** + * Passes each value in this Set to the given callback. + * + * For when you absolutely know this Set won't be modified during the iteration. + * + * The callback must return a boolean. If it returns `false` then it will abort + * the Set iteration immediately. If it returns `true`, it will carry on + * iterating the next child in the Set. + * @param callback The callback to be invoked and passed each value this Set contains. + * @param callbackScope The scope of the callback. + */ + iterate(callback: EachSetCallback, callbackScope?: any): Phaser.Structs.Set; + + /** + * Goes through each entry in this Set and invokes the given function on them, passing in the arguments. + * @param callbackKey The key of the function to be invoked on each Set entry. + * @param args Additional arguments that will be passed to the callback, after the child. + */ + iterateLocal(callbackKey: string, ...args: any[]): Phaser.Structs.Set; + + /** + * Clears this Set so that it no longer contains any values. + */ + clear(): Phaser.Structs.Set; + + /** + * Returns `true` if this Set contains the given value, otherwise returns `false`. + * @param value The value to check for in this Set. + */ + contains(value: T): boolean; + + /** + * Returns a new Set containing all values that are either in this Set or in the Set provided as an argument. + * @param set The Set to perform the union with. + */ + union(set: Phaser.Structs.Set): Phaser.Structs.Set; + + /** + * Returns a new Set that contains only the values which are in this Set and that are also in the given Set. + * @param set The Set to intersect this set with. + */ + intersect(set: Phaser.Structs.Set): Phaser.Structs.Set; + + /** + * Returns a new Set containing all the values in this Set which are *not* also in the given Set. + * @param set The Set to perform the difference with. + */ + difference(set: Phaser.Structs.Set): Phaser.Structs.Set; + + /** + * The size of this Set. This is the number of entries within it. + * Changing the size will truncate the Set if the given value is smaller than the current size. + * Increasing the size larger than the current size has no effect. + */ + size: number; + + } + + /** + * The Size component allows you to set `width` and `height` properties and define the relationship between them. + * + * The component can automatically maintain the aspect ratios between the two values, and clamp them + * to a defined min-max range. You can also control the dominant axis. When dimensions are given to the Size component + * that would cause it to exceed its min-max range, the dimensions are adjusted based on the dominant axis. + */ + class Size { + /** + * + * @param width The width of the Size component. Default 0. + * @param height The height of the Size component. If not given, it will use the `width`. Default width. + * @param aspectMode The aspect mode of the Size component. Defaults to 0, no mode. Default 0. + * @param parent The parent of this Size component. Can be any object with public `width` and `height` properties. Dimensions are clamped to keep them within the parent bounds where possible. Default null. + */ + constructor(width?: number, height?: number, aspectMode?: number, parent?: any); + + /** + * The aspect mode this Size component will use when calculating its dimensions. + * This property is read-only. To change it use the `setAspectMode` method. + */ + readonly aspectMode: number; + + /** + * The proportional relationship between the width and height. + * + * This property is read-only and is updated automatically when either the `width` or `height` properties are changed, + * depending on the aspect mode. + */ + readonly aspectRatio: number; + + /** + * The minimum allowed width. + * Cannot be less than zero. + * This value is read-only. To change it see the `setMin` method. + */ + readonly minWidth: number; + + /** + * The minimum allowed height. + * Cannot be less than zero. + * This value is read-only. To change it see the `setMin` method. + */ + readonly minHeight: number; + + /** + * The maximum allowed width. + * This value is read-only. To change it see the `setMax` method. + */ + readonly maxWidth: number; + + /** + * The maximum allowed height. + * This value is read-only. To change it see the `setMax` method. + */ + readonly maxHeight: number; + + /** + * A Vector2 containing the horizontal and vertical snap values, which the width and height are snapped to during resizing. + * + * By default this is disabled. + * + * This property is read-only. To change it see the `setSnap` method. + */ + readonly snapTo: Phaser.Math.Vector2; + + /** + * Sets the aspect mode of this Size component. + * + * The aspect mode controls what happens when you modify the `width` or `height` properties, or call `setSize`. + * + * It can be a number from 0 to 4, or a Size constant: + * + * 0. NONE = Do not make the size fit the aspect ratio. Change the ratio when the size changes. + * 1. WIDTH_CONTROLS_HEIGHT = The height is automatically adjusted based on the width. + * 2. HEIGHT_CONTROLS_WIDTH = The width is automatically adjusted based on the height. + * 3. FIT = The width and height are automatically adjusted to fit inside the given target area, while keeping the aspect ratio. Depending on the aspect ratio there may be some space inside the area which is not covered. + * 4. ENVELOP = The width and height are automatically adjusted to make the size cover the entire target area while keeping the aspect ratio. This may extend further out than the target size. + * + * Calling this method automatically recalculates the `width` and the `height`, if required. + * @param value The aspect mode value. Default 0. + */ + setAspectMode(value?: number): this; + + /** + * By setting snap values, when this Size component is modified its dimensions will automatically + * be snapped to the nearest grid slice, using floor. For example, if you have snap value of 16, + * and the width changes to 68, then it will snap down to 64 (the closest multiple of 16 when floored) + * + * Note that snapping takes place before adjustments by the parent, or the min / max settings. If these + * values are not multiples of the given snap values, then this can result in un-snapped dimensions. + * + * Call this method with no arguments to reset the snap values. + * + * Calling this method automatically recalculates the `width` and the `height`, if required. + * @param snapWidth The amount to snap the width to. If you don't want to snap the width, pass a value of zero. Default 0. + * @param snapHeight The amount to snap the height to. If not provided it will use the `snapWidth` value. If you don't want to snap the height, pass a value of zero. Default snapWidth. + */ + setSnap(snapWidth?: number, snapHeight?: number): this; + + /** + * Sets, or clears, the parent of this Size component. + * + * To clear the parent call this method with no arguments. + * + * The parent influences the maximum extents to which this Size component can expand, + * based on the aspect mode: + * + * NONE - The parent clamps both the width and height. + * WIDTH_CONTROLS_HEIGHT - The parent clamps just the width. + * HEIGHT_CONTROLS_WIDTH - The parent clamps just the height. + * FIT - The parent clamps whichever axis is required to ensure the size fits within it. + * ENVELOP - The parent is used to ensure the size fully envelops the parent. + * + * Calling this method automatically calls `setSize`. + * @param parent Sets the parent of this Size component. Don't provide a value to clear an existing parent. + */ + setParent(parent?: any): this; + + /** + * Set the minimum width and height values this Size component will allow. + * + * The minimum values can never be below zero, or greater than the maximum values. + * + * Setting this will automatically adjust both the `width` and `height` properties to ensure they are within range. + * + * Note that based on the aspect mode, and if this Size component has a parent set or not, the minimums set here + * _can_ be exceed in some situations. + * @param width The minimum allowed width of the Size component. Default 0. + * @param height The minimum allowed height of the Size component. If not given, it will use the `width`. Default width. + */ + setMin(width?: number, height?: number): this; + + /** + * Set the maximum width and height values this Size component will allow. + * + * Setting this will automatically adjust both the `width` and `height` properties to ensure they are within range. + * + * Note that based on the aspect mode, and if this Size component has a parent set or not, the maximums set here + * _can_ be exceed in some situations. + * @param width The maximum allowed width of the Size component. Default Number.MAX_VALUE. + * @param height The maximum allowed height of the Size component. If not given, it will use the `width`. Default width. + */ + setMax(width?: number, height?: number): this; + + /** + * Sets the width and height of this Size component based on the aspect mode. + * + * If the aspect mode is 'none' then calling this method will change the aspect ratio, otherwise the current + * aspect ratio is honored across all other modes. + * + * If snapTo values have been set then the given width and height are snapped first, prior to any further + * adjustment via min/max values, or a parent. + * + * If minimum and/or maximum dimensions have been specified, the values given to this method will be clamped into + * that range prior to adjustment, but may still exceed them depending on the aspect mode. + * + * If this Size component has a parent set, and the aspect mode is `fit` or `envelop`, then the given sizes will + * be clamped to the range specified by the parent. + * @param width The new width of the Size component. Default 0. + * @param height The new height of the Size component. If not given, it will use the `width`. Default width. + */ + setSize(width?: number, height?: number): this; + + /** + * Sets a new aspect ratio, overriding what was there previously. + * + * It then calls `setSize` immediately using the current dimensions. + * @param ratio The new aspect ratio. + */ + setAspectRatio(ratio: number): this; + + /** + * Sets a new width and height for this Size component and updates the aspect ratio based on them. + * + * It _doesn't_ change the `aspectMode` and still factors in size limits such as the min max and parent bounds. + * @param width The new width of the Size component. + * @param height The new height of the Size component. If not given, it will use the `width`. Default width. + */ + resize(width: number, height?: number): this; + + /** + * Takes a new width and passes it through the min/max clamp and then checks it doesn't exceed the parent width. + * @param value The value to clamp and check. + * @param checkParent Check the given value against the parent, if set. Default true. + */ + getNewWidth(value: number, checkParent?: boolean): number; + + /** + * Takes a new height and passes it through the min/max clamp and then checks it doesn't exceed the parent height. + * @param value The value to clamp and check. + * @param checkParent Check the given value against the parent, if set. Default true. + */ + getNewHeight(value: number, checkParent?: boolean): number; + + /** + * The current `width` and `height` are adjusted to fit inside the given dimensions, while keeping the aspect ratio. + * + * If `fit` is true there may be some space inside the target area which is not covered if its aspect ratio differs. + * If `fit` is false the size may extend further out than the target area if the aspect ratios differ. + * + * If this Size component has a parent set, then the width and height passed to this method will be clamped so + * it cannot exceed that of the parent. + * @param width The new width of the Size component. Default 0. + * @param height The new height of the Size component. If not given, it will use the width value. + * @param fit Perform a `fit` (true) constraint, or an `envelop` (false) constraint. Default true. + */ + constrain(width?: number, height?: number, fit?: boolean): this; + + /** + * The current `width` and `height` are adjusted to fit inside the given dimensions, while keeping the aspect ratio. + * + * There may be some space inside the target area which is not covered if its aspect ratio differs. + * + * If this Size component has a parent set, then the width and height passed to this method will be clamped so + * it cannot exceed that of the parent. + * @param width The new width of the Size component. Default 0. + * @param height The new height of the Size component. If not given, it will use the width value. + */ + fitTo(width?: number, height?: number): this; + + /** + * The current `width` and `height` are adjusted so that they fully envelope the given dimensions, while keeping the aspect ratio. + * + * The size may extend further out than the target area if the aspect ratios differ. + * + * If this Size component has a parent set, then the values are clamped so that it never exceeds the parent + * on the longest axis. + * @param width The new width of the Size component. Default 0. + * @param height The new height of the Size component. If not given, it will use the width value. + */ + envelop(width?: number, height?: number): this; + + /** + * Sets the width of this Size component. + * + * Depending on the aspect mode, changing the width may also update the height and aspect ratio. + * @param width The new width of the Size component. + */ + setWidth(width: number): this; + + /** + * Sets the height of this Size component. + * + * Depending on the aspect mode, changing the height may also update the width and aspect ratio. + * @param height The new height of the Size component. + */ + setHeight(height: number): this; + + /** + * Returns a string representation of this Size component. + */ + toString(): string; + + /** + * Sets the values of this Size component to the `element.style.width` and `height` + * properties of the given DOM Element. The properties are set as `px` values. + * @param element The DOM Element to set the CSS style on. + */ + setCSS(element: HTMLElement): void; + + /** + * Copies the aspect mode, aspect ratio, width and height from this Size component + * to the given Size component. Note that the parent, if set, is not copied across. + * @param destination The Size component to copy the values to. + */ + copy(destination: Phaser.Structs.Size): Phaser.Structs.Size; + + /** + * Destroys this Size component. + * + * This clears the local properties and any parent object, if set. + * + * A destroyed Size component cannot be re-used. + */ + destroy(): void; + + /** + * The width of this Size component. + * + * This value is clamped to the range specified by `minWidth` and `maxWidth`, if enabled. + * + * A width can never be less than zero. + * + * Changing this value will automatically update the `height` if the aspect ratio lock is enabled. + * You can also use the `setWidth` and `getWidth` methods. + */ + width: number; + + /** + * The height of this Size component. + * + * This value is clamped to the range specified by `minHeight` and `maxHeight`, if enabled. + * + * A height can never be less than zero. + * + * Changing this value will automatically update the `width` if the aspect ratio lock is enabled. + * You can also use the `setHeight` and `getHeight` methods. + */ + height: number; + + /** + * Do not make the size fit the aspect ratio. Change the ratio when the size changes. + */ + static readonly NONE: number; + + /** + * The height is automatically adjusted based on the width. + */ + static readonly WIDTH_CONTROLS_HEIGHT: number; + + /** + * The width is automatically adjusted based on the height. + */ + static readonly HEIGHT_CONTROLS_WIDTH: number; + + /** + * The width and height are automatically adjusted to fit inside the given target area, while keeping the aspect ratio. Depending on the aspect ratio there may be some space inside the area which is not covered. + */ + static readonly FIT: number; + + /** + * The width and height are automatically adjusted to make the size cover the entire target area while keeping the aspect ratio. This may extend further out than the target size. + */ + static readonly ENVELOP: number; + + } + + } + + namespace Textures { + /** + * A Canvas Texture is a special kind of Texture that is backed by an HTML Canvas Element as its source. + * + * You can use the properties of this texture to draw to the canvas element directly, using all of the standard + * canvas operations available in the browser. Any Game Object can be given this texture and will render with it. + * + * Note: When running under WebGL the Canvas Texture needs to re-generate its base WebGLTexture and reupload it to + * the GPU every time you modify it, otherwise the changes you make to this texture will not be visible. To do this + * you should call `CanvasTexture.refresh()` once you are finished with your changes to the canvas. Try and keep + * this to a minimum, especially on large canvas sizes, or you may inadvertently thrash the GPU by constantly uploading + * texture data to it. This restriction does not apply if using the Canvas Renderer. + * + * It starts with only one frame that covers the whole of the canvas. You can add further frames, that specify + * sections of the canvas using the `add` method. + * + * Should you need to resize the canvas use the `setSize` method so that it accurately updates all of the underlying + * texture data as well. Forgetting to do this (i.e. by changing the canvas size directly from your code) could cause + * graphical errors. + */ + class CanvasTexture extends Phaser.Textures.Texture { + /** + * + * @param manager A reference to the Texture Manager this Texture belongs to. + * @param key The unique string-based key of this Texture. + * @param source The canvas element that is used as the base of this texture. + * @param width The width of the canvas. + * @param height The height of the canvas. + */ + constructor(manager: Phaser.Textures.TextureManager, key: string, source: HTMLCanvasElement, width: number, height: number); + + /** + * The source Canvas Element. + */ + readonly canvas: HTMLCanvasElement; + + /** + * The 2D Canvas Rendering Context. + */ + readonly context: CanvasRenderingContext2D; + + /** + * The width of the Canvas. + * This property is read-only, if you wish to change it use the `setSize` method. + */ + readonly width: number; + + /** + * The height of the Canvas. + * This property is read-only, if you wish to change it use the `setSize` method. + */ + readonly height: number; + + /** + * The context image data. + * Use the `update` method to populate this when the canvas changes. + */ + imageData: ImageData; + + /** + * A Uint8ClampedArray view into the `buffer`. + * Use the `update` method to populate this when the canvas changes. + * Note that this is unavailable in some browsers, such as Epic Browser, due to their security restrictions. + */ + data: Uint8ClampedArray; + + /** + * An Uint32Array view into the `buffer`. + */ + pixels: Uint32Array; + + /** + * An ArrayBuffer the same size as the context ImageData. + */ + buffer: ArrayBuffer; + + /** + * This re-creates the `imageData` from the current context. + * It then re-builds the ArrayBuffer, the `data` Uint8ClampedArray reference and the `pixels` Int32Array. + * + * Warning: This is a very expensive operation, so use it sparingly. + */ + update(): Phaser.Textures.CanvasTexture; + + /** + * Draws the given Image or Canvas element to this CanvasTexture, then updates the internal + * ImageData buffer and arrays. + * @param x The x coordinate to draw the source at. + * @param y The y coordinate to draw the source at. + * @param source The element to draw to this canvas. + * @param update Update the internal ImageData buffer and arrays. Default true. + */ + draw(x: number, y: number, source: HTMLImageElement | HTMLCanvasElement, update?: boolean): Phaser.Textures.CanvasTexture; + + /** + * Draws the given texture frame to this CanvasTexture, then updates the internal + * ImageData buffer and arrays. + * @param key The unique string-based key of the Texture. + * @param frame The string-based name, or integer based index, of the Frame to get from the Texture. + * @param x The x coordinate to draw the source at. Default 0. + * @param y The y coordinate to draw the source at. Default 0. + * @param update Update the internal ImageData buffer and arrays. Default true. + */ + drawFrame(key: string, frame?: string | number, x?: number, y?: number, update?: boolean): Phaser.Textures.CanvasTexture; + + /** + * Sets a pixel in the CanvasTexture to the given color and alpha values. + * + * This is an expensive operation to run in large quantities, so use sparingly. + * @param x The x coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param y The y coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param red The red color value. A number between 0 and 255. + * @param green The green color value. A number between 0 and 255. + * @param blue The blue color value. A number between 0 and 255. + * @param alpha The alpha value. A number between 0 and 255. Default 255. + */ + setPixel(x: number, y: number, red: number, green: number, blue: number, alpha?: number): this; + + /** + * Puts the ImageData into the context of this CanvasTexture at the given coordinates. + * @param imageData The ImageData to put at the given location. + * @param x The x coordinate to put the imageData. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param y The y coordinate to put the imageData. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param dirtyX Horizontal position (x coordinate) of the top-left corner from which the image data will be extracted. Default 0. + * @param dirtyY Vertical position (x coordinate) of the top-left corner from which the image data will be extracted. Default 0. + * @param dirtyWidth Width of the rectangle to be painted. Defaults to the width of the image data. + * @param dirtyHeight Height of the rectangle to be painted. Defaults to the height of the image data. + */ + putData(imageData: ImageData, x: number, y: number, dirtyX?: number, dirtyY?: number, dirtyWidth?: number, dirtyHeight?: number): this; + + /** + * Gets an ImageData region from this CanvasTexture from the position and size specified. + * You can write this back using `CanvasTexture.putData`, or manipulate it. + * @param x The x coordinate of the top-left of the area to get the ImageData from. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param y The y coordinate of the top-left of the area to get the ImageData from. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param width The width of the rectangle from which the ImageData will be extracted. Positive values are to the right, and negative to the left. + * @param height The height of the rectangle from which the ImageData will be extracted. Positive values are down, and negative are up. + */ + getData(x: number, y: number, width: number, height: number): ImageData; + + /** + * Get the color of a specific pixel from this texture and store it in a Color object. + * + * If you have drawn anything to this CanvasTexture since it was created you must call `CanvasTexture.update` to refresh the array buffer, + * otherwise this may return out of date color values, or worse - throw a run-time error as it tries to access an array element that doesn't exist. + * @param x The x coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param y The y coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param out A Color object to store the pixel values in. If not provided a new Color object will be created. + */ + getPixel(x: number, y: number, out?: Phaser.Display.Color): Phaser.Display.Color; + + /** + * Returns an array containing all of the pixels in the given region. + * + * If the requested region extends outside the bounds of this CanvasTexture, + * the region is truncated to fit. + * + * If you have drawn anything to this CanvasTexture since it was created you must call `CanvasTexture.update` to refresh the array buffer, + * otherwise this may return out of date color values, or worse - throw a run-time error as it tries to access an array element that doesn't exist. + * @param x The x coordinate of the top-left of the region. Must lay within the dimensions of this CanvasTexture and be an integer. Default 0. + * @param y The y coordinate of the top-left of the region. Must lay within the dimensions of this CanvasTexture and be an integer. Default 0. + * @param width The width of the region to get. Must be an integer. Defaults to the canvas width if not given. + * @param height The height of the region to get. Must be an integer. If not given will be set to the `width`. + */ + getPixels(x?: number, y?: number, width?: number, height?: number): Phaser.Types.Textures.PixelConfig[][]; + + /** + * Returns the Image Data index for the given pixel in this CanvasTexture. + * + * The index can be used to read directly from the `this.data` array. + * + * The index points to the red value in the array. The subsequent 3 indexes + * point to green, blue and alpha respectively. + * @param x The x coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param y The y coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer. + */ + getIndex(x: number, y: number): number; + + /** + * This should be called manually if you are running under WebGL. + * It will refresh the WebGLTexture from the Canvas source. Only call this if you know that the + * canvas has changed, as there is a significant GPU texture allocation cost involved in doing so. + */ + refresh(): Phaser.Textures.CanvasTexture; + + /** + * Gets the Canvas Element. + */ + getCanvas(): HTMLCanvasElement; + + /** + * Gets the 2D Canvas Rendering Context. + */ + getContext(): CanvasRenderingContext2D; + + /** + * Clears the given region of this Canvas Texture, resetting it back to transparent. + * If no region is given, the whole Canvas Texture is cleared. + * @param x The x coordinate of the top-left of the region to clear. Default 0. + * @param y The y coordinate of the top-left of the region to clear. Default 0. + * @param width The width of the region. + * @param height The height of the region. + * @param update Update the internal ImageData buffer and arrays. Default true. + */ + clear(x?: number, y?: number, width?: number, height?: number, update?: boolean): Phaser.Textures.CanvasTexture; + + /** + * Changes the size of this Canvas Texture. + * @param width The new width of the Canvas. + * @param height The new height of the Canvas. If not given it will use the width as the height. + */ + setSize(width: number, height?: number): Phaser.Textures.CanvasTexture; + + /** + * Destroys this Texture and releases references to its sources and frames. + */ + destroy(): void; + + } + + /** + * Filter Types. + */ + enum FilterMode { + /** + * Linear filter type. + */ + LINEAR, + /** + * Nearest neighbor filter type. + */ + NEAREST, + } + + /** + * A Dynamic Texture is a special texture that allows you to draw textures, frames and most kind of + * Game Objects directly to it. + * + * You can take many complex objects and draw them to this one texture, which can then be used as the + * base texture for other Game Objects, such as Sprites. Should you then update this texture, all + * Game Objects using it will instantly be updated as well, reflecting the changes immediately. + * + * It's a powerful way to generate dynamic textures at run-time that are WebGL friendly and don't invoke + * expensive GPU uploads on each change. + * + * ```js + * const t = this.textures.addDynamicTexture('player', 64, 128); + * // draw objects to t + * this.add.sprite(x, y, 'player'); + * ``` + * + * Because this is a standard Texture within Phaser, you can add frames to it, meaning you can use it + * to generate sprite sheets, texture atlases or tile sets. + * + * Under WebGL1, a FrameBuffer, which is what this Dynamic Texture uses internally, cannot be anti-aliased. + * This means that when drawing objects such as Shapes or Graphics instances to this texture, they may appear + * to be drawn with no aliasing around the edges. This is a technical limitation of WebGL1. To get around it, + * create your shape as a texture in an art package, then draw that to this texture. + * + * Based on the assumption that you will be using this Dynamic Texture as a source for Sprites, it will + * automatically invert any drawing done to it on the y axis. If you do not require this, please call the + * `setIsSpriteTexture()` method and pass it `false` as its parameter. Do this before you start drawing + * to this texture, otherwise you will get vertically inverted frames under WebGL. This isn't required + * for Canvas. + */ + class DynamicTexture extends Phaser.Textures.Texture { + /** + * + * @param manager A reference to the Texture Manager this Texture belongs to. + * @param key The unique string-based key of this Texture. + * @param width The width of this Dymamic Texture in pixels. Defaults to 256 x 256. Default 256. + * @param height The height of this Dymamic Texture in pixels. Defaults to 256 x 256. Default 256. + */ + constructor(manager: Phaser.Textures.TextureManager, key: string, width?: number, height?: number); + + /** + * The internal data type of this object. + */ + readonly type: string; + + /** + * A reference to either the Canvas or WebGL Renderer that the Game instance is using. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The width of this Dynamic Texture. + * + * Treat this property as read-only. Use the `setSize` method to change the size. + */ + width: number; + + /** + * The height of this Dynamic Texture. + * + * Treat this property as read-only. Use the `setSize` method to change the size. + */ + height: number; + + /** + * This flag is set to 'true' during `beginDraw` and reset to 'false` in `endDraw`, + * allowing you to determine if this Dynamic Texture is batch drawing, or not. + */ + readonly isDrawing: boolean; + + /** + * A reference to the Rendering Context belonging to the Canvas Element this Dynamic Texture is drawing to. + */ + canvas: HTMLCanvasElement; + + /** + * The 2D Canvas Rendering Context. + */ + readonly context: CanvasRenderingContext2D; + + /** + * Is this Dynamic Texture dirty or not? If not it won't spend time clearing or filling itself. + */ + dirty: boolean; + + /** + * Is this Dynamic Texture being used as the base texture for a Sprite Game Object? + * + * This is enabled by default, as we expect that will be the core use for Dynamic Textures. + * + * However, to disable it, call `RenderTexture.setIsSpriteTexture(false)`. + * + * You should do this _before_ drawing to this texture, so that it correctly + * inverses the frames for WebGL rendering. Not doing so will result in vertically flipped frames. + * + * This property is used in the `endDraw` method. + */ + isSpriteTexture: boolean; + + /** + * An internal Camera that can be used to move around this Dynamic Texture. + * + * Control it just like you would any Scene Camera. The difference is that it only impacts + * the placement of **Game Objects** (not textures) that you then draw to this texture. + * + * You can scroll, zoom and rotate this Camera. + */ + camera: Phaser.Cameras.Scene2D.BaseCamera; + + /** + * The Render Target that belongs to this Dynamic Texture. + * + * A Render Target encapsulates a framebuffer and texture for the WebGL Renderer. + * + * This property remains `null` under Canvas. + */ + renderTarget: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the WebGL Single Pipeline. + * + * This property remains `null` under Canvas. + */ + pipeline: Phaser.Renderer.WebGL.Pipelines.SinglePipeline; + + /** + * Resizes this Dynamic Texture to the new dimensions given. + * + * In WebGL it will destroy and then re-create the frame buffer being used by this Dynamic Texture. + * In Canvas it will resize the underlying canvas DOM element. + * + * Both approaches will erase everything currently drawn to this texture. + * + * If the dimensions given are the same as those already being used, calling this method will do nothing. + * @param width The new width of this Dynamic Texture. + * @param height The new height of this Dynamic Texture. If not specified, will be set the same as the `width`. Default width. + */ + setSize(width: number, height?: number): this; + + /** + * Links the WebGL Textures used by this Dynamic Texture to its Render Target. + * + * This method is called internally by the Dynamic Texture when it is first created, + * or if you change its size. + */ + setFromRenderTarget(): this; + + /** + * If you are planning on using this Render Texture as a base texture for Sprite + * Game Objects, then you should call this method with a value of `true` before + * drawing anything to it, otherwise you will get inverted frames in WebGL. + * @param value Is this Render Target being used as a Sprite Texture, or not? + */ + setIsSpriteTexture(value: boolean): this; + + /** + * Fills this Dynamic Texture with the given color. + * + * By default it will fill the entire texture, however you can set it to fill a specific + * rectangular area by using the x, y, width and height arguments. + * + * The color should be given in hex format, i.e. 0xff0000 for red, 0x00ff00 for green, etc. + * @param rgb The color to fill this Dynamic Texture with, such as 0xff0000 for red. + * @param alpha The alpha value used by the fill. Default 1. + * @param x The left coordinate of the fill rectangle. Default 0. + * @param y The top coordinate of the fill rectangle. Default 0. + * @param width The width of the fill rectangle. Default this.width. + * @param height The height of the fill rectangle. Default this.height. + */ + fill(rgb: number, alpha?: number, x?: number, y?: number, width?: number, height?: number): this; + + /** + * Fully clears this Dynamic Texture, erasing everything from it and resetting it back to + * a blank, transparent, texture. + */ + clear(): this; + + /** + * Takes the given texture key and frame and then stamps it at the given + * x and y coordinates. You can use the optional 'config' argument to provide + * lots more options about how the stamp is applied, including the alpha, + * tint, angle, scale and origin. + * + * By default, the frame will stamp on the x/y coordinates based on its center. + * + * If you wish to stamp from the top-left, set the config `originX` and + * `originY` properties both to zero. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. Set to `null` to skip this argument if not required. + * @param x The x position to draw the frame at. Default 0. + * @param y The y position to draw the frame at. Default 0. + * @param config The stamp configuration object, allowing you to set the alpha, tint, angle, scale and origin of the stamp. + */ + stamp(key: string, frame?: string | number, x?: number, y?: number, config?: Phaser.Types.Textures.StampConfig): this; + + /** + * Draws the given object, or an array of objects, to this Dynamic Texture using a blend mode of ERASE. + * This has the effect of erasing any filled pixels present in the objects from this texture. + * + * It can accept any of the following: + * + * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite. + * * Tilemap Layers. + * * A Group. The contents of which will be iterated and drawn in turn. + * * A Container. The contents of which will be iterated fully, and drawn in turn. + * * A Scene Display List. Pass in `Scene.children` to draw the whole list. + * * Another Dynamic Texture, or a Render Texture. + * * A Texture Frame instance. + * * A string. This is used to look-up the texture from the Texture Manager. + * + * Note: You cannot erase a Dynamic Texture from itself. + * + * If passing in a Group or Container it will only draw children that return `true` + * when their `willRender()` method is called. I.e. a Container with 10 children, + * 5 of which have `visible=false` will only draw the 5 visible ones. + * + * If passing in an array of Game Objects it will draw them all, regardless if + * they pass a `willRender` check or not. + * + * You can pass in a string in which case it will look for a texture in the Texture + * Manager matching that string, and draw the base frame. + * + * You can pass in the `x` and `y` coordinates to draw the objects at. The use of + * the coordinates differ based on what objects are being drawn. If the object is + * a Group, Container or Display List, the coordinates are _added_ to the positions + * of the children. For all other types of object, the coordinates are exact. + * + * Calling this method causes the WebGL batch to flush, so it can write the texture + * data to the framebuffer being used internally. The batch is flushed at the end, + * after the entries have been iterated. So if you've a bunch of objects to draw, + * try and pass them in an array in one single call, rather than making lots of + * separate calls. + * + * If you are not planning on using this Dynamic Texture as a base texture for Sprite + * Game Objects, then you should set `DynamicTexture.isSpriteTexture = false` before + * calling this method, otherwise you will get vertically inverted frames in WebGL. + * @param entries Any renderable Game Object, or Group, Container, Display List, Render Texture, Texture Frame, or an array of any of these. + * @param x The x position to draw the Frame at, or the offset applied to the object. Default 0. + * @param y The y position to draw the Frame at, or the offset applied to the object. Default 0. + */ + erase(entries: any, x?: number, y?: number): this; + + /** + * Draws the given object, or an array of objects, to this Dynamic Texture. + * + * It can accept any of the following: + * + * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite. + * * Tilemap Layers. + * * A Group. The contents of which will be iterated and drawn in turn. + * * A Container. The contents of which will be iterated fully, and drawn in turn. + * * A Scene Display List. Pass in `Scene.children` to draw the whole list. + * * Another Dynamic Texture, or a Render Texture. + * * A Texture Frame instance. + * * A string. This is used to look-up the texture from the Texture Manager. + * + * Note 1: You cannot draw a Dynamic Texture to itself. + * + * Note 2: For Game Objects that have Post FX Pipelines, the pipeline _cannot_ be + * used when drawn to this texture. + * + * If passing in a Group or Container it will only draw children that return `true` + * when their `willRender()` method is called. I.e. a Container with 10 children, + * 5 of which have `visible=false` will only draw the 5 visible ones. + * + * If passing in an array of Game Objects it will draw them all, regardless if + * they pass a `willRender` check or not. + * + * You can pass in a string in which case it will look for a texture in the Texture + * Manager matching that string, and draw the base frame. If you need to specify + * exactly which frame to draw then use the method `drawFrame` instead. + * + * You can pass in the `x` and `y` coordinates to draw the objects at. The use of + * the coordinates differ based on what objects are being drawn. If the object is + * a Group, Container or Display List, the coordinates are _added_ to the positions + * of the children. For all other types of object, the coordinates are exact. + * + * The `alpha` and `tint` values are only used by Texture Frames. + * Game Objects use their own alpha and tint values when being drawn. + * + * Calling this method causes the WebGL batch to flush, so it can write the texture + * data to the framebuffer being used internally. The batch is flushed at the end, + * after the entries have been iterated. So if you've a bunch of objects to draw, + * try and pass them in an array in one single call, rather than making lots of + * separate calls. + * + * If you are not planning on using this Dynamic Texture as a base texture for Sprite + * Game Objects, then you should set `DynamicTexture.isSpriteTexture = false` before + * calling this method, otherwise you will get vertically inverted frames in WebGL. + * @param entries Any renderable Game Object, or Group, Container, Display List, other Render Texture, Texture Frame or an array of any of these. + * @param x The x position to draw the Frame at, or the offset applied to the object. Default 0. + * @param y The y position to draw the Frame at, or the offset applied to the object. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Game Objects use their own alpha. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. Game Objects use their own tint. WebGL only. Default 0xffffff. + */ + draw(entries: any, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Draws the Texture Frame to the Render Texture at the given position. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * ```javascript + * var rt = this.add.renderTexture(0, 0, 800, 600); + * rt.drawFrame(key, frame); + * ``` + * + * You can optionally provide a position, alpha and tint value to apply to the frame + * before it is drawn. + * + * Calling this method will cause a batch flush, so if you've got a stack of things to draw + * in a tight loop, try using the `draw` method instead. + * + * If you need to draw a Sprite to this Render Texture, use the `draw` method instead. + * + * If you are not planning on using this Dynamic Texture as a base texture for Sprite + * Game Objects, then you should set `DynamicTexture.isSpriteTexture = false` before + * calling this method, otherwise you will get vertically inverted frames in WebGL. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. Set to `null` to skip this argument if not required. + * @param x The x position to draw the frame at. Default 0. + * @param y The y position to draw the frame at. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. WebGL only. Default 0xffffff. + */ + drawFrame(key: string, frame?: string | number, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Takes the given Texture Frame and draws it to this Dynamic Texture as a fill pattern, + * i.e. in a grid-layout based on the frame dimensions. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * You can optionally provide a position, width, height, alpha and tint value to apply to + * the frames before they are drawn. The position controls the top-left where the repeating + * fill will start from. The width and height control the size of the filled area. + * + * The position can be negative if required, but the dimensions cannot. + * + * Calling this method will cause a batch flush by default. Use the `skipBatch` argument + * to disable this if this call is part of a larger batch draw. + * + * If you are not planning on using this Dynamic Texture as a base texture for Sprite + * Game Objects, then you should set `DynamicTexture.isSpriteTexture = false` before + * calling this method, otherwise you will get vertically inverted frames in WebGL. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. Set to `null` to skip this argument if not required. + * @param x The x position to start drawing the frames from (can be negative to offset). Default 0. + * @param y The y position to start drawing the frames from (can be negative to offset). Default 0. + * @param width The width of the area to repeat the frame within. Defaults to the width of this Dynamic Texture. Default this.width. + * @param height The height of the area to repeat the frame within. Defaults to the height of this Dynamic Texture. Default this.height. + * @param alpha The alpha to use. Defaults to 1, no alpha. Default 1. + * @param tint WebGL only. The tint color to use. Leave as undefined, or 0xffffff to have no tint. Default 0xffffff. + * @param skipBatch Skip beginning and ending a batch with this call. Use if this is part of a bigger batched draw. Default false. + */ + repeat(key: string, frame?: string | number, x?: number, y?: number, width?: number, height?: number, alpha?: number, tint?: number, skipBatch?: boolean): this; + + /** + * Use this method if you need to batch draw a large number of Game Objects to + * this Dynamic Texture in a single pass, or on a frequent basis. This is especially + * useful under WebGL, however, if your game is using Canvas only, it will not make + * any speed difference in that situation. + * + * This method starts the beginning of a batched draw, unless one is already open. + * + * Batched drawing is faster than calling `draw` in loop, but you must be careful + * to manage the flow of code and remember to call `endDraw()` when you're finished. + * + * If you don't need to draw large numbers of objects it's much safer and easier + * to use the `draw` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * DynamicTexture.beginDraw(); + * + * // repeat n times: + * DynamicTexture.batchDraw(); + * // or + * DynamicTexture.batchDrawFrame(); + * + * // Call once: + * DynamicTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Dynamic Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `DynamicTexture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + */ + beginDraw(): this; + + /** + * Use this method if you have already called `beginDraw` and need to batch + * draw a large number of objects to this Dynamic Texture. + * + * This method batches the drawing of the given objects to this texture, + * without causing a WebGL bind or batch flush for each one. + * + * It is faster than calling `draw`, but you must be careful to manage the + * flow of code and remember to call `endDraw()`. If you don't need to draw large + * numbers of objects it's much safer and easier to use the `draw` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * DynamicTexture.beginDraw(); + * + * // repeat n times: + * DynamicTexture.batchDraw(); + * // or + * DynamicTexture.batchDrawFrame(); + * + * // Call once: + * DynamicTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Dynamic Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `DynamicTexture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + * + * This method can accept any of the following: + * + * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite. + * * Tilemap Layers. + * * A Group. The contents of which will be iterated and drawn in turn. + * * A Container. The contents of which will be iterated fully, and drawn in turn. + * * A Scene's Display List. Pass in `Scene.children` to draw the whole list. + * * Another Dynamic Texture or Render Texture. + * * A Texture Frame instance. + * * A string. This is used to look-up a texture from the Texture Manager. + * + * Note: You cannot draw a Dynamic Texture to itself. + * + * If passing in a Group or Container it will only draw children that return `true` + * when their `willRender()` method is called. I.e. a Container with 10 children, + * 5 of which have `visible=false` will only draw the 5 visible ones. + * + * If passing in an array of Game Objects it will draw them all, regardless if + * they pass a `willRender` check or not. + * + * You can pass in a string in which case it will look for a texture in the Texture + * Manager matching that string, and draw the base frame. If you need to specify + * exactly which frame to draw then use the method `drawFrame` instead. + * + * You can pass in the `x` and `y` coordinates to draw the objects at. The use of + * the coordinates differ based on what objects are being drawn. If the object is + * a Group, Container or Display List, the coordinates are _added_ to the positions + * of the children. For all other types of object, the coordinates are exact. + * + * The `alpha` and `tint` values are only used by Texture Frames. + * Game Objects use their own alpha and tint values when being drawn. + * @param entries Any renderable Game Object, or Group, Container, Display List, other Dynamic or Texture, Texture Frame or an array of any of these. + * @param x The x position to draw the Frame at, or the offset applied to the object. Default 0. + * @param y The y position to draw the Frame at, or the offset applied to the object. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Game Objects use their own alpha. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. Game Objects use their own tint. WebGL only. Default 0xffffff. + */ + batchDraw(entries: any, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Use this method if you have already called `beginDraw` and need to batch + * draw a large number of texture frames to this Dynamic Texture. + * + * This method batches the drawing of the given frames to this Dynamic Texture, + * without causing a WebGL bind or batch flush for each one. + * + * It is faster than calling `drawFrame`, but you must be careful to manage the + * flow of code and remember to call `endDraw()`. If you don't need to draw large + * numbers of frames it's much safer and easier to use the `drawFrame` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * DynamicTexture.beginDraw(); + * + * // repeat n times: + * DynamicTexture.batchDraw(); + * // or + * DynamicTexture.batchDrawFrame(); + * + * // Call once: + * DynamicTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Dynamic Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `DynamicTexture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * You can optionally provide a position, alpha and tint value to apply to the frame + * before it is drawn. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + * @param x The x position to draw the frame at. Default 0. + * @param y The y position to draw the frame at. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Game Objects use their own alpha. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. Game Objects use their own tint. WebGL only. Default 0xffffff. + */ + batchDrawFrame(key: string, frame?: string | number, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Use this method to finish batch drawing to this Dynamic Texture. + * + * Doing so will stop the WebGL Renderer from capturing draws and then blit the + * framebuffer to the Render Target owned by this texture. + * + * Calling this method without first calling `beginDraw` will have no effect. + * + * Batch drawing is faster than calling `draw`, but you must be careful to manage the + * flow of code and remember to call `endDraw()` when you're finished. + * + * If you don't need to draw large numbers of objects it's much safer and easier + * to use the `draw` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * DynamicTexture.beginDraw(); + * + * // repeat n times: + * DynamicTexture.batchDraw(); + * // or + * DynamicTexture.batchDrawFrame(); + * + * // Call once: + * DynamicTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Dynamic Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `DynamicTexture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + * @param erase Draws all objects in this batch using a blend mode of ERASE. This has the effect of erasing any filled pixels in the objects being drawn. Default false. + */ + endDraw(erase?: boolean): this; + + /** + * Takes a snapshot of the given area of this Dynamic Texture. + * + * The snapshot is taken immediately, but the results are returned via the given callback. + * + * To capture the whole Dynamic Texture see the `snapshot` method. + * To capture just a specific pixel, see the `snapshotPixel` method. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer + * into an ArrayBufferView. It then parses this, copying the contents to a temporary Canvas and finally + * creating an Image object from it, which is the image returned to the callback provided. + * + * All in all, this is a computationally expensive and blocking process, which gets more expensive + * the larger the resolution this Dynamic Texture has, so please be careful how you employ this in your game. + * @param x The x coordinate to grab from. + * @param y The y coordinate to grab from. + * @param width The width of the area to grab. + * @param height The height of the area to grab. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshotArea(x: number, y: number, width: number, height: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Takes a snapshot of the whole of this Dynamic Texture. + * + * The snapshot is taken immediately, but the results are returned via the given callback. + * + * To capture a portion of this Dynamic Texture see the `snapshotArea` method. + * To capture just a specific pixel, see the `snapshotPixel` method. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer + * into an ArrayBufferView. It then parses this, copying the contents to a temporary Canvas and finally + * creating an Image object from it, which is the image returned to the callback provided. + * + * All in all, this is a computationally expensive and blocking process, which gets more expensive + * the larger the resolution this Dynamic Texture has, so please be careful how you employ this in your game. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshot(callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Takes a snapshot of the given pixel from this Dynamic Texture. + * + * The snapshot is taken immediately, but the results are returned via the given callback. + * + * To capture the whole Dynamic Texture see the `snapshot` method. + * To capture a portion of this Dynamic Texture see the `snapshotArea` method. + * + * Unlike the two other snapshot methods, this one will send your callback a `Color` object + * containing the color data for the requested pixel. It doesn't need to create an internal + * Canvas or Image object, so is a lot faster to execute, using less memory than the other snapshot methods. + * @param x The x coordinate of the pixel to get. + * @param y The y coordinate of the pixel to get. + * @param callback The Function to invoke after the snapshot pixel data is extracted. + */ + snapshotPixel(x: number, y: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback): this; + + /** + * Returns the underlying WebGLTextureWrapper, if not running in Canvas mode. + */ + getWebGLTexture(): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * Renders this Dynamic Texture onto the Stamp Game Object as a BitmapMask. + * @param renderer A reference to the current active WebGL renderer. + * @param src The Game Object being rendered in this call. + * @param camera The Camera that is rendering the Game Object. + * @param parentMatrix This transform matrix is defined if the game object is nested + */ + renderWebGL(renderer: Phaser.Renderer.WebGL.WebGLRenderer, src: Phaser.GameObjects.Image, camera: Phaser.Cameras.Scene2D.Camera, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * This is a NOOP method. Bitmap Masks are not supported by the Canvas Renderer. + * @param renderer The Canvas Renderer which would be rendered to. + * @param mask The masked Game Object which would be rendered. + * @param camera The Camera to render to. + */ + renderCanvas(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer, mask: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Destroys this Texture and releases references to its sources and frames. + */ + destroy(): void; + + } + + namespace Events { + /** + * The Texture Add Event. + * + * This event is dispatched by the Texture Manager when a texture is added to it. + * + * Listen to this event from within a Scene using: `this.textures.on('addtexture', listener)`. + */ + const ADD: string; + + /** + * The Texture Add Key Event. + * + * This event is dispatched by the Texture Manager when a texture with the given key is added to it. + * + * Listen to this event from within a Scene using: `this.textures.on('addtexture-key', listener)`. + */ + const ADD_KEY: string; + + /** + * The Texture Load Error Event. + * + * This event is dispatched by the Texture Manager when a texture it requested to load failed. + * This only happens when base64 encoded textures fail. All other texture types are loaded via the Loader Plugin. + * + * Listen to this event from within a Scene using: `this.textures.on('onerror', listener)`. + */ + const ERROR: string; + + /** + * The Texture Load Event. + * + * This event is dispatched by the Texture Manager when a texture has finished loading on it. + * This only happens for base64 encoded textures. All other texture types are loaded via the Loader Plugin. + * + * Listen to this event from within a Scene using: `this.textures.on('onload', listener)`. + * + * This event is dispatched after the [ADD]{@linkcode Phaser.Textures.Events#event:ADD} event. + */ + const LOAD: string; + + /** + * This internal event signifies that the Texture Manager is now ready and the Game can continue booting. + * + * When a Phaser Game instance is booting for the first time, the Texture Manager has to wait on a couple of non-blocking + * async events before it's fully ready to carry on. When those complete the Texture Manager emits this event via the Game + * instance, which tells the Game to carry on booting. + */ + const READY: string; + + /** + * The Texture Remove Event. + * + * This event is dispatched by the Texture Manager when a texture is removed from it. + * + * Listen to this event from within a Scene using: `this.textures.on('removetexture', listener)`. + * + * If you have any Game Objects still using the removed texture, they will start throwing + * errors the next time they try to render. Be sure to clear all use of the texture in this event handler. + */ + const REMOVE: string; + + /** + * The Texture Remove Key Event. + * + * This event is dispatched by the Texture Manager when a texture with the given key is removed from it. + * + * Listen to this event from within a Scene using: `this.textures.on('removetexture-key', listener)`. + * + * If you have any Game Objects still using the removed texture, they will start throwing + * errors the next time they try to render. Be sure to clear all use of the texture in this event handler. + */ + const REMOVE_KEY: string; + + } + + /** + * A Frame is a section of a Texture. + */ + class Frame { + /** + * + * @param texture The Texture this Frame is a part of. + * @param name The name of this Frame. The name is unique within the Texture. + * @param sourceIndex The index of the TextureSource that this Frame is a part of. + * @param x The x coordinate of the top-left of this Frame. + * @param y The y coordinate of the top-left of this Frame. + * @param width The width of this Frame. + * @param height The height of this Frame. + */ + constructor(texture: Phaser.Textures.Texture, name: number | string, sourceIndex: number, x: number, y: number, width: number, height: number); + + /** + * The Texture this Frame is a part of. + */ + texture: Phaser.Textures.Texture; + + /** + * The name of this Frame. + * The name is unique within the Texture. + */ + name: string; + + /** + * The TextureSource this Frame is part of. + */ + source: Phaser.Textures.TextureSource; + + /** + * The index of the TextureSource in the Texture sources array. + */ + sourceIndex: number; + + /** + * X position within the source image to cut from. + */ + cutX: number; + + /** + * Y position within the source image to cut from. + */ + cutY: number; + + /** + * The width of the area in the source image to cut. + */ + cutWidth: number; + + /** + * The height of the area in the source image to cut. + */ + cutHeight: number; + + /** + * The X rendering offset of this Frame, taking trim into account. + */ + x: number; + + /** + * The Y rendering offset of this Frame, taking trim into account. + */ + y: number; + + /** + * The rendering width of this Frame, taking trim into account. + */ + width: number; + + /** + * The rendering height of this Frame, taking trim into account. + */ + height: number; + + /** + * Half the width, floored. + * Precalculated for the renderer. + */ + halfWidth: number; + + /** + * Half the height, floored. + * Precalculated for the renderer. + */ + halfHeight: number; + + /** + * The x center of this frame, floored. + */ + centerX: number; + + /** + * The y center of this frame, floored. + */ + centerY: number; + + /** + * The horizontal pivot point of this Frame. + */ + pivotX: number; + + /** + * The vertical pivot point of this Frame. + */ + pivotY: number; + + /** + * Does this Frame have a custom pivot point? + */ + customPivot: boolean; + + /** + * **CURRENTLY UNSUPPORTED** + * + * Is this frame is rotated or not in the Texture? + * Rotation allows you to use rotated frames in texture atlas packing. + * It has nothing to do with Sprite rotation. + */ + rotated: boolean; + + /** + * Over-rides the Renderer setting. + * -1 = use Renderer Setting + * 0 = No rounding + * 1 = Round + */ + autoRound: number; + + /** + * Any Frame specific custom data can be stored here. + */ + customData: object; + + /** + * WebGL UV u0 value. + */ + u0: number; + + /** + * WebGL UV v0 value. + */ + v0: number; + + /** + * WebGL UV u1 value. + */ + u1: number; + + /** + * WebGL UV v1 value. + */ + v1: number; + + /** + * Sets the width, height, x and y of this Frame. + * + * This is called automatically by the constructor + * and should rarely be changed on-the-fly. + * @param width The width of the frame before being trimmed. + * @param height The height of the frame before being trimmed. + * @param x The x coordinate of the top-left of this Frame. Default 0. + * @param y The y coordinate of the top-left of this Frame. Default 0. + */ + setSize(width: number, height: number, x?: number, y?: number): this; + + /** + * If the frame was trimmed when added to the Texture Atlas, this records the trim and source data. + * @param actualWidth The width of the frame before being trimmed. + * @param actualHeight The height of the frame before being trimmed. + * @param destX The destination X position of the trimmed frame for display. + * @param destY The destination Y position of the trimmed frame for display. + * @param destWidth The destination width of the trimmed frame for display. + * @param destHeight The destination height of the trimmed frame for display. + */ + setTrim(actualWidth: number, actualHeight: number, destX: number, destY: number, destWidth: number, destHeight: number): this; + + /** + * Sets the scale9 center rectangle values. + * + * Scale9 is a feature of Texture Packer, allowing you to define a nine-slice scaling grid. + * + * This is set automatically by the JSONArray and JSONHash parsers. + * @param x The left coordinate of the center scale9 rectangle. + * @param y The top coordinate of the center scale9 rectangle. + * @param width The width of the center scale9 rectangle. + * @param height The height coordinate of the center scale9 rectangle. + */ + setScale9(x: number, y: number, width: number, height: number): this; + + /** + * Takes a crop data object and, based on the rectangular region given, calculates the + * required UV coordinates in order to crop this Frame for WebGL and Canvas rendering. + * + * The crop size as well as coordinates can not exceed the the size of the frame. + * + * This is called directly by the Game Object Texture Components `setCrop` method. + * Please use that method to crop a Game Object. + * @param crop The crop data object. This is the `GameObject._crop` property. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle. Cannot exceed the Frame width. + * @param height The height of the crop rectangle. Cannot exceed the Frame height. + * @param flipX Does the parent Game Object have flipX set? + * @param flipY Does the parent Game Object have flipY set? + */ + setCropUVs(crop: object, x: number, y: number, width: number, height: number, flipX: boolean, flipY: boolean): object; + + /** + * Takes a crop data object and recalculates the UVs based on the dimensions inside the crop object. + * Called automatically by `setFrame`. + * @param crop The crop data object. This is the `GameObject._crop` property. + * @param flipX Does the parent Game Object have flipX set? + * @param flipY Does the parent Game Object have flipY set? + */ + updateCropUVs(crop: object, flipX: boolean, flipY: boolean): object; + + /** + * Directly sets the canvas and WebGL UV data for this frame. + * + * Use this if you need to override the values that are generated automatically + * when the Frame is created. + * @param width Width of this frame for the Canvas data. + * @param height Height of this frame for the Canvas data. + * @param u0 UV u0 value. + * @param v0 UV v0 value. + * @param u1 UV u1 value. + * @param v1 UV v1 value. + */ + setUVs(width: number, height: number, u0: number, v0: number, u1: number, v1: number): this; + + /** + * Updates the internal WebGL UV cache and the drawImage cache. + */ + updateUVs(): this; + + /** + * Updates the internal WebGL UV cache. + */ + updateUVsInverted(): this; + + /** + * Clones this Frame into a new Frame object. + */ + clone(): Phaser.Textures.Frame; + + /** + * Destroys this Frame by nulling its reference to the parent Texture and and data objects. + */ + destroy(): void; + + /** + * A reference to the Texture Source WebGL Texture that this Frame is using. + */ + readonly glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * The width of the Frame in its un-trimmed, un-padded state, as prepared in the art package, + * before being packed. + */ + readonly realWidth: number; + + /** + * The height of the Frame in its un-trimmed, un-padded state, as prepared in the art package, + * before being packed. + */ + readonly realHeight: number; + + /** + * The radius of the Frame (derived from sqrt(w * w + h * h) / 2) + */ + readonly radius: number; + + /** + * Is the Frame trimmed or not? + */ + readonly trimmed: boolean; + + /** + * Does the Frame have scale9 border data? + */ + readonly scale9: boolean; + + /** + * If the Frame has scale9 border data, is it 3-slice or 9-slice data? + */ + readonly is3Slice: boolean; + + /** + * The Canvas drawImage data object. + */ + readonly canvasData: object; + + } + + /** + * Linear filter type. + */ + const LINEAR: number; + + /** + * Nearest Neighbor filter type. + */ + const NEAREST: number; + + namespace Parsers { + /** + * Parses a KTX format Compressed Texture file and generates texture data suitable for WebGL from it. + * @param data The data object created by the Compressed Texture File Loader. + */ + function KTXParser(data: ArrayBuffer): Phaser.Types.Textures.CompressedTextureData; + + /** + * Parses a PVR format Compressed Texture file and generates texture data suitable for WebGL from it. + * @param data The data object created by the Compressed Texture File Loader. + */ + function PVRParser(data: ArrayBuffer): Phaser.Types.Textures.CompressedTextureData; + + /** + * Verify whether the given compressed texture data is valid. + * + * Compare the dimensions of each mip layer to the rules for that + * specific format. + * + * Mip layer size is assumed to have been calculated correctly during parsing. + * @param data The compressed texture data to verify. + */ + function verifyCompressedTexture(data: Phaser.Types.Textures.CompressedTextureData): boolean; + + } + + /** + * A Texture consists of a source, usually an Image from the Cache, and a collection of Frames. + * The Frames represent the different areas of the Texture. For example a texture atlas + * may have many Frames, one for each element within the atlas. Where-as a single image would have + * just one frame, that encompasses the whole image. + * + * Every Texture, no matter where it comes from, always has at least 1 frame called the `__BASE` frame. + * This frame represents the entirety of the source image. + * + * Textures are managed by the global TextureManager. This is a singleton class that is + * responsible for creating and delivering Textures and their corresponding Frames to Game Objects. + * + * Sprites and other Game Objects get the texture data they need from the TextureManager. + */ + class Texture { + /** + * + * @param manager A reference to the Texture Manager this Texture belongs to. + * @param key The unique string-based key of this Texture. + * @param source An array of sources that are used to create the texture. Usually Images, but can also be a Canvas. + * @param width The width of the Texture. This is optional and automatically derived from the source images. + * @param height The height of the Texture. This is optional and automatically derived from the source images. + */ + constructor(manager: Phaser.Textures.TextureManager, key: string, source: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[] | Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, width?: number, height?: number); + + /** + * A reference to the Texture Manager this Texture belongs to. + */ + manager: Phaser.Textures.TextureManager; + + /** + * The unique string-based key of this Texture. + */ + key: string; + + /** + * An array of TextureSource instances. + * These are unique to this Texture and contain the actual Image (or Canvas) data. + */ + source: Phaser.Textures.TextureSource[]; + + /** + * An array of TextureSource data instances. + * Used to store additional data images, such as normal maps or specular maps. + */ + dataSource: any[]; + + /** + * A key-value object pair associating the unique Frame keys with the Frames objects. + */ + frames: object; + + /** + * Any additional data that was set in the source JSON (if any), + * or any extra data you'd like to store relating to this texture + */ + customData: object; + + /** + * The name of the first frame of the Texture. + */ + firstFrame: string; + + /** + * The total number of Frames in this Texture, including the `__BASE` frame. + * + * A Texture will always contain at least 1 frame because every Texture contains a `__BASE` frame by default, + * in addition to any extra frames that have been added to it, such as when parsing a Sprite Sheet or Texture Atlas. + */ + frameTotal: number; + + /** + * Adds a new Frame to this Texture. + * + * A Frame is a rectangular region of a TextureSource with a unique index or string-based key. + * + * The name given must be unique within this Texture. If it already exists, this method will return `null`. + * @param name The name of this Frame. The name is unique within the Texture. + * @param sourceIndex The index of the TextureSource that this Frame is a part of. + * @param x The x coordinate of the top-left of this Frame. + * @param y The y coordinate of the top-left of this Frame. + * @param width The width of this Frame. + * @param height The height of this Frame. + */ + add(name: number | string, sourceIndex: number, x: number, y: number, width: number, height: number): Phaser.Textures.Frame | null; + + /** + * Removes the given Frame from this Texture. The Frame is destroyed immediately. + * + * Any Game Objects using this Frame should stop using it _before_ you remove it, + * as it does not happen automatically. + * @param name The key of the Frame to remove. + */ + remove(name: string): boolean; + + /** + * Checks to see if a Frame matching the given key exists within this Texture. + * @param name The key of the Frame to check for. + */ + has(name: string): boolean; + + /** + * Gets a Frame from this Texture based on either the key or the index of the Frame. + * + * In a Texture Atlas Frames are typically referenced by a key. + * In a Sprite Sheet Frames are referenced by an index. + * Passing no value for the name returns the base texture. + * @param name The string-based name, or integer based index, of the Frame to get from this Texture. + */ + get(name?: string | number): Phaser.Textures.Frame; + + /** + * Takes the given TextureSource and returns the index of it within this Texture. + * If it's not in this Texture, it returns -1. + * Unless this Texture has multiple TextureSources, such as with a multi-atlas, this + * method will always return zero or -1. + * @param source The TextureSource to check. + */ + getTextureSourceIndex(source: Phaser.Textures.TextureSource): number; + + /** + * Returns an array of all the Frames in the given TextureSource. + * @param sourceIndex The index of the TextureSource to get the Frames from. + * @param includeBase Include the `__BASE` Frame in the output array? Default false. + */ + getFramesFromTextureSource(sourceIndex: number, includeBase?: boolean): Phaser.Textures.Frame[]; + + /** + * Based on the given Texture Source Index, this method will get all of the Frames using + * that source and then work out the bounds that they encompass, returning them in an object. + * + * This is useful if this Texture is, for example, a sprite sheet within an Atlas, and you + * need to know the total bounds of the sprite sheet. + * @param sourceIndex The index of the TextureSource to get the Frame bounds from. + */ + getFrameBounds(sourceIndex: number): Phaser.Types.Math.RectangleLike; + + /** + * Returns an array with all of the names of the Frames in this Texture. + * + * Useful if you want to randomly assign a Frame to a Game Object, as you can + * pick a random element from the returned array. + * @param includeBase Include the `__BASE` Frame in the output array? Default false. + */ + getFrameNames(includeBase?: boolean): string[]; + + /** + * Given a Frame name, return the source image it uses to render with. + * + * This will return the actual DOM Image or Canvas element. + * @param name The string-based name, or integer based index, of the Frame to get from this Texture. + */ + getSourceImage(name?: string | number): HTMLImageElement | HTMLCanvasElement | Phaser.GameObjects.RenderTexture; + + /** + * Given a Frame name, return the data source image it uses to render with. + * You can use this to get the normal map for an image for example. + * + * This will return the actual DOM Image. + * @param name The string-based name, or integer based index, of the Frame to get from this Texture. + */ + getDataSourceImage(name?: string | number): HTMLImageElement | HTMLCanvasElement; + + /** + * Adds a data source image to this Texture. + * + * An example of a data source image would be a normal map, where all of the Frames for this Texture + * equally apply to the normal map. + * @param data The source image. + */ + setDataSource(data: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[]): void; + + /** + * Sets the Filter Mode for this Texture. + * + * The mode can be either Linear, the default, or Nearest. + * + * For pixel-art you should use Nearest. + * + * The mode applies to the entire Texture, not just a specific Frame of it. + * @param filterMode The Filter Mode. + */ + setFilter(filterMode: Phaser.Textures.FilterMode): void; + + /** + * Destroys this Texture and releases references to its sources and frames. + */ + destroy(): void; + + } + + /** + * When Phaser boots it will create an instance of this Texture Manager class. + * + * It is a global manager that handles all textures in your game. You can access it from within + * a Scene via the `this.textures` property. + * + * Its role is as a manager for all textures that your game uses. It can create, update and remove + * textures globally, as well as parse texture data from external files, such as sprite sheets + * and texture atlases. + * + * Sprites and other texture-based Game Objects get their texture data directly from this class. + */ + class TextureManager extends Phaser.Events.EventEmitter { + /** + * + * @param game The Phaser.Game instance this Texture Manager belongs to. + */ + constructor(game: Phaser.Game); + + /** + * The Game that the Texture Manager belongs to. + * + * A game will only ever have one instance of a Texture Manager. + */ + game: Phaser.Game; + + /** + * The internal name of this manager. + */ + readonly name: string; + + /** + * This object contains all Textures that belong to this Texture Manager. + * + * Textures are identified by string-based keys, which are used as the property + * within this object. Therefore, you can access any texture directly from this + * object without any iteration. + * + * You should not typically modify this object directly, but instead use the + * methods provided by the Texture Manager to add and remove entries from it. + */ + list: object; + + /** + * An Image Game Object that belongs to this Texture Manager. + * + * Used as a drawing stamp within Dynamic Textures. + * + * This is not part of the display list and doesn't render. + */ + readonly stamp: Phaser.GameObjects.Image; + + /** + * The crop Rectangle as used by the Stamp when it needs to crop itself. + */ + stampCrop: Phaser.Geom.Rectangle; + + /** + * If this flag is `true` then the Texture Manager will never emit any + * warnings to the console log that report missing textures. + */ + silentWarnings: boolean; + + /** + * Checks the given texture key and throws a console.warn if the key is already in use, then returns false. + * + * If you wish to avoid the console.warn then use `TextureManager.exists` instead. + * @param key The texture key to check. + */ + checkKey(key: string): boolean; + + /** + * Removes a Texture from the Texture Manager and destroys it. This will immediately + * clear all references to it from the Texture Manager, and if it has one, destroy its + * WebGLTexture. This will emit a `removetexture` event. + * + * Note: If you have any Game Objects still using this texture they will start throwing + * errors the next time they try to render. Make sure that removing the texture is the final + * step when clearing down to avoid this. + * @param key The key of the Texture to remove, or a reference to it. + */ + remove(key: string | Phaser.Textures.Texture): Phaser.Textures.TextureManager; + + /** + * Removes a key from the Texture Manager but does not destroy the Texture that was using the key. + * @param key The key to remove from the texture list. + */ + removeKey(key: string): Phaser.Textures.TextureManager; + + /** + * Adds a new Texture to the Texture Manager created from the given Base64 encoded data. + * + * It works by creating an `Image` DOM object, then setting the `src` attribute to + * the given base64 encoded data. As a result, the process is asynchronous by its nature, + * so be sure to listen for the events this method dispatches before using the texture. + * @param key The unique string-based key of the Texture. + * @param data The Base64 encoded data. + */ + addBase64(key: string, data: any): this; + + /** + * Gets an existing texture frame and converts it into a base64 encoded image and returns the base64 data. + * + * You can also provide the image type and encoder options. + * + * This will only work with bitmap based texture frames, such as those created from Texture Atlases. + * It will not work with GL Texture objects, such as Shaders, or Render Textures. For those please + * see the WebGL Snapshot function instead. + * @param key The unique string-based key of the Texture. + * @param frame The string-based name, or integer based index, of the Frame to get from the Texture. + * @param type A DOMString indicating the image format. The default format type is image/png. Default 'image/png'. + * @param encoderOptions A Number between 0 and 1 indicating the image quality to use for image formats that use lossy compression such as image/jpeg and image/webp. If this argument is anything else, the default value for image quality is used. The default value is 0.92. Other arguments are ignored. Default 0.92. + */ + getBase64(key: string, frame?: string | number, type?: string, encoderOptions?: number): string; + + /** + * Adds a new Texture to the Texture Manager created from the given Image element. + * @param key The unique string-based key of the Texture. + * @param source The source Image element. + * @param dataSource An optional data Image element. + */ + addImage(key: string, source: HTMLImageElement, dataSource?: HTMLImageElement | HTMLCanvasElement): Phaser.Textures.Texture | null; + + /** + * Takes a WebGLTextureWrapper and creates a Phaser Texture from it, which is added to the Texture Manager using the given key. + * + * This allows you to then use the Texture as a normal texture for texture based Game Objects like Sprites. + * + * This is a WebGL only feature. + * + * Prior to Phaser 3.80.0, this method took a bare `WebGLTexture` + * as the `glTexture` parameter. You must now wrap the `WebGLTexture` in a + * `WebGLTextureWrapper` instance before passing it to this method. + * @param key The unique string-based key of the Texture. + * @param glTexture The source Render Texture. + */ + addGLTexture(key: string, glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): Phaser.Textures.Texture | null; + + /** + * Adds a Compressed Texture to this Texture Manager. + * + * The texture should typically have been loaded via the `CompressedTextureFile` loader, + * in order to prepare the correct data object this method requires. + * + * You can optionally also pass atlas data to this method, in which case a texture atlas + * will be generated from the given compressed texture, combined with the atlas data. + * @param key The unique string-based key of the Texture. + * @param textureData The Compressed Texture data object. + * @param atlasData Optional Texture Atlas data. + */ + addCompressedTexture(key: string, textureData: Phaser.Types.Textures.CompressedTextureData, atlasData?: object): Phaser.Textures.Texture | null; + + /** + * Adds a Render Texture to the Texture Manager using the given key. + * This allows you to then use the Render Texture as a normal texture for texture based Game Objects like Sprites. + * @param key The unique string-based key of the Texture. + * @param renderTexture The source Render Texture. + */ + addRenderTexture(key: string, renderTexture: Phaser.GameObjects.RenderTexture): Phaser.Textures.Texture | null; + + /** + * Creates a new Texture using the given config values. + * + * Generated textures consist of a Canvas element to which the texture data is drawn. + * + * Generates a texture based on the given Create configuration object. + * + * The texture is drawn using a fixed-size indexed palette of 16 colors, where the hex value in the + * data cells map to a single color. For example, if the texture config looked like this: + * + * ```javascript + * var star = [ + * '.....828.....', + * '....72227....', + * '....82228....', + * '...7222227...', + * '2222222222222', + * '8222222222228', + * '.72222222227.', + * '..787777787..', + * '..877777778..', + * '.78778887787.', + * '.27887.78872.', + * '.787.....787.' + * ]; + * + * this.textures.generate('star', { data: star, pixelWidth: 4 }); + * ``` + * + * Then it would generate a texture that is 52 x 48 pixels in size, because each cell of the data array + * represents 1 pixel multiplied by the `pixelWidth` value. The cell values, such as `8`, maps to color + * number 8 in the palette. If a cell contains a period character `.` then it is transparent. + * + * The default palette is Arne16, but you can specify your own using the `palette` property. + * @param key The unique string-based key of the Texture. + * @param config The configuration object needed to generate the texture. + */ + generate(key: string, config: Phaser.Types.Create.GenerateTextureConfig): Phaser.Textures.Texture | null; + + /** + * Creates a new Texture using a blank Canvas element of the size given. + * + * Canvas elements are automatically pooled and calling this method will + * extract a free canvas from the CanvasPool, or create one if none are available. + * @param key The unique string-based key of the Texture. + * @param width The width of the Canvas element. Default 256. + * @param height The height of the Canvas element. Default 256. + */ + createCanvas(key: string, width?: number, height?: number): Phaser.Textures.CanvasTexture | null; + + /** + * Creates a new Canvas Texture object from an existing Canvas element + * and adds it to this Texture Manager, unless `skipCache` is true. + * @param key The unique string-based key of the Texture. + * @param source The Canvas element to form the base of the new Texture. + * @param skipCache Skip adding this Texture into the Cache? Default false. + */ + addCanvas(key: string, source: HTMLCanvasElement, skipCache?: boolean): Phaser.Textures.CanvasTexture | null; + + /** + * Creates a Dynamic Texture instance and adds itself to this Texture Manager. + * + * A Dynamic Texture is a special texture that allows you to draw textures, frames and most kind of + * Game Objects directly to it. + * + * You can take many complex objects and draw them to this one texture, which can then be used as the + * base texture for other Game Objects, such as Sprites. Should you then update this texture, all + * Game Objects using it will instantly be updated as well, reflecting the changes immediately. + * + * It's a powerful way to generate dynamic textures at run-time that are WebGL friendly and don't invoke + * expensive GPU uploads on each change. + * + * See the methods available on the `DynamicTexture` class for more details. + * + * Optionally, you can also pass a Dynamic Texture instance to this method to have + * it added to the Texture Manager. + * @param key The string-based key of this Texture. Must be unique within the Texture Manager. Or, a DynamicTexture instance. + * @param width The width of this Dynamic Texture in pixels. Defaults to 256 x 256. Ignored if an instance is passed as the key. Default 256. + * @param height The height of this Dynamic Texture in pixels. Defaults to 256 x 256. Ignored if an instance is passed as the key. Default 256. + */ + addDynamicTexture(key: string | Phaser.Textures.DynamicTexture, width?: number, height?: number): Phaser.Textures.DynamicTexture | null; + + /** + * Adds a Texture Atlas to this Texture Manager. + * + * In Phaser terminology, a Texture Atlas is a combination of an atlas image and a JSON data file, + * such as those exported by applications like Texture Packer. + * + * It can accept either JSON Array or JSON Hash formats, as exported by Texture Packer and similar software. + * + * As of Phaser 3.60 you can use this method to add a atlas data to an existing Phaser Texture. + * @param key The unique string-based key of the Texture. + * @param source The source Image element/s, or a Phaser Texture. + * @param data The Texture Atlas data/s. + * @param dataSource An optional data Image element. + */ + addAtlas(key: string, source: HTMLImageElement | HTMLImageElement[] | Phaser.Textures.Texture, data: object | object[], dataSource?: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[]): Phaser.Textures.Texture | null; + + /** + * Adds a Texture Atlas to this Texture Manager. + * + * In Phaser terminology, a Texture Atlas is a combination of an atlas image and a JSON data file, + * such as those exported by applications like Texture Packer. + * + * The frame data of the atlas must be stored in an Array within the JSON. + * + * This is known as a JSON Array in software such as Texture Packer. + * + * As of Phaser 3.60 you can use this method to add a atlas data to an existing Phaser Texture. + * @param key The unique string-based key of the Texture. + * @param source The source Image element/s, or a Phaser Texture. + * @param data The Texture Atlas data/s. + * @param dataSource An optional data Image element. + */ + addAtlasJSONArray(key: string, source: HTMLImageElement | HTMLImageElement[] | Phaser.Textures.Texture, data: object | object[], dataSource?: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[]): Phaser.Textures.Texture | null; + + /** + * Adds a Texture Atlas to this Texture Manager. + * + * In Phaser terminology, a Texture Atlas is a combination of an atlas image and a JSON data file, + * such as those exported by applications like Texture Packer. + * + * The frame data of the atlas must be stored in an Object within the JSON. + * + * This is known as a JSON Hash in software such as Texture Packer. + * + * As of Phaser 3.60 you can use this method to add a atlas data to an existing Phaser Texture. + * @param key The unique string-based key of the Texture. + * @param source The source Image element/s, or a Phaser Texture. + * @param data The Texture Atlas data/s. + * @param dataSource An optional data Image element. + */ + addAtlasJSONHash(key: string, source: HTMLImageElement | HTMLImageElement[] | Phaser.Textures.Texture, data: object | object[], dataSource?: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[]): Phaser.Textures.Texture | null; + + /** + * Adds a Texture Atlas to this Texture Manager. + * + * In Phaser terminology, a Texture Atlas is a combination of an atlas image and a data file, + * such as those exported by applications like Texture Packer. + * + * The frame data of the atlas must be stored in an XML file. + * + * As of Phaser 3.60 you can use this method to add a atlas data to an existing Phaser Texture. + * @param key The unique string-based key of the Texture. + * @param source The source Image element, or a Phaser Texture. + * @param data The Texture Atlas XML data. + * @param dataSource An optional data Image element. + */ + addAtlasXML(key: string, source: HTMLImageElement | Phaser.Textures.Texture, data: object, dataSource?: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[]): Phaser.Textures.Texture | null; + + /** + * Adds a Unity Texture Atlas to this Texture Manager. + * + * In Phaser terminology, a Texture Atlas is a combination of an atlas image and a data file, + * such as those exported by applications like Texture Packer or Unity. + * + * The frame data of the atlas must be stored in a Unity YAML file. + * + * As of Phaser 3.60 you can use this method to add a atlas data to an existing Phaser Texture. + * @param key The unique string-based key of the Texture. + * @param source The source Image element. + * @param data The Texture Atlas data. + * @param dataSource An optional data Image element. + */ + addUnityAtlas(key: string, source: HTMLImageElement, data: object, dataSource?: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[]): Phaser.Textures.Texture | null; + + /** + * Adds a Sprite Sheet to this Texture Manager. + * + * In Phaser terminology a Sprite Sheet is a texture containing different frames, but each frame is the exact + * same size and cannot be trimmed or rotated. This is different to a Texture Atlas, created by tools such as + * Texture Packer, and more akin with the fixed-frame exports you get from apps like Aseprite or old arcade + * games. + * + * As of Phaser 3.60 you can use this method to add a sprite sheet to an existing Phaser Texture. + * @param key The unique string-based key of the Texture. Give an empty string if you provide a Phaser Texture as the 2nd argument. + * @param source The source Image element, or a Phaser Texture. + * @param config The configuration object for this Sprite Sheet. + * @param dataSource An optional data Image element. + */ + addSpriteSheet(key: string, source: HTMLImageElement | Phaser.Textures.Texture, config: Phaser.Types.Textures.SpriteSheetConfig, dataSource?: HTMLImageElement | HTMLCanvasElement): Phaser.Textures.Texture | null; + + /** + * Adds a Sprite Sheet to this Texture Manager, where the Sprite Sheet exists as a Frame within a Texture Atlas. + * + * In Phaser terminology a Sprite Sheet is a texture containing different frames, but each frame is the exact + * same size and cannot be trimmed or rotated. + * @param key The unique string-based key of the Texture. + * @param config The configuration object for this Sprite Sheet. + */ + addSpriteSheetFromAtlas(key: string, config: Phaser.Types.Textures.SpriteSheetFromAtlasConfig): Phaser.Textures.Texture | null; + + /** + * Creates a texture from an array of colour data. + * + * This is only available in WebGL mode. + * + * If the dimensions provided are powers of two, the resulting texture + * will be automatically set to wrap by the WebGL Renderer. + * @param key The unique string-based key of the Texture. + * @param data The color data for the texture. + * @param width The width of the texture. + * @param height The height of the texture. + */ + addUint8Array(key: string, data: Uint8Array, width: number, height: number): Phaser.Textures.Texture | null; + + /** + * Creates a new Texture using the given source and dimensions. + * @param key The unique string-based key of the Texture. + * @param source An array of sources that are used to create the texture. Usually Images, but can also be a Canvas. + * @param width The width of the Texture. This is optional and automatically derived from the source images. + * @param height The height of the Texture. This is optional and automatically derived from the source images. + */ + create(key: string, source: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[] | Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, width?: number, height?: number): Phaser.Textures.Texture | null; + + /** + * Checks the given key to see if a Texture using it exists within this Texture Manager. + * @param key The unique string-based key of the Texture. + */ + exists(key: string): boolean; + + /** + * Returns a Texture from the Texture Manager that matches the given key. + * + * If the key is `undefined` it will return the `__DEFAULT` Texture. + * + * If the key is an instance of a Texture, it will return the instance. + * + * If the key is an instance of a Frame, it will return the frames parent Texture instance. + * + * Finally, if the key is given, but not found, and not a Texture or Frame instance, it will return the `__MISSING` Texture. + * @param key The unique string-based key of the Texture, or a Texture, or Frame instance. + */ + get(key: string | Phaser.Textures.Texture | Phaser.Textures.Frame): Phaser.Textures.Texture; + + /** + * Takes a Texture key and Frame name and returns a clone of that Frame if found. + * @param key The unique string-based key of the Texture. + * @param frame The string or index of the Frame to be cloned. + */ + cloneFrame(key: string, frame: string | number): Phaser.Textures.Frame; + + /** + * Takes a Texture key and Frame name and returns a reference to that Frame, if found. + * @param key The unique string-based key of the Texture. + * @param frame The string-based name, or integer based index, of the Frame to get from the Texture. + */ + getFrame(key: string, frame?: string | number): Phaser.Textures.Frame; + + /** + * Parses the 'key' parameter and returns a Texture Frame instance. + * + * It can accept the following formats: + * + * 1) A string + * 2) An array where the elements are: [ key, [frame] ] + * 3) An object with the properties: { key, [frame] } + * 4) A Texture instance - which returns the default frame from the Texture + * 5) A Frame instance - returns itself + * @param key The key to be parsed. + */ + parseFrame(key: string | any[] | object | Phaser.Textures.Texture | Phaser.Textures.Frame): Phaser.Textures.Frame; + + /** + * Returns an array with all of the keys of all Textures in this Texture Manager. + * The output array will exclude the `__DEFAULT`, `__MISSING`, `__WHITE`, and `__NORMAL` keys. + */ + getTextureKeys(): string[]; + + /** + * Given a Texture and an `x` and `y` coordinate this method will return a new + * Color object that has been populated with the color and alpha values of the pixel + * at that location in the Texture. + * @param x The x coordinate of the pixel within the Texture. + * @param y The y coordinate of the pixel within the Texture. + * @param key The unique string-based key of the Texture. + * @param frame The string or index of the Frame. + */ + getPixel(x: number, y: number, key: string, frame?: string | number): Phaser.Display.Color | null; + + /** + * Given a Texture and an `x` and `y` coordinate this method will return a value between 0 and 255 + * corresponding to the alpha value of the pixel at that location in the Texture. If the coordinate + * is out of bounds it will return null. + * @param x The x coordinate of the pixel within the Texture. + * @param y The y coordinate of the pixel within the Texture. + * @param key The unique string-based key of the Texture. + * @param frame The string or index of the Frame. + */ + getPixelAlpha(x: number, y: number, key: string, frame?: string | number): number; + + /** + * Sets the given Game Objects `texture` and `frame` properties so that it uses + * the Texture and Frame specified in the `key` and `frame` arguments to this method. + * @param gameObject The Game Object the texture would be set on. + * @param key The unique string-based key of the Texture. + * @param frame The string or index of the Frame. + */ + setTexture(gameObject: Phaser.GameObjects.GameObject, key: string, frame?: string | number): Phaser.GameObjects.GameObject; + + /** + * Changes the key being used by a Texture to the new key provided. + * + * The old key is removed, allowing it to be re-used. + * + * Game Objects are linked to Textures by a reference to the Texture object, so + * all existing references will be retained. + * @param currentKey The current string-based key of the Texture you wish to rename. + * @param newKey The new unique string-based key to use for the Texture. + */ + renameTexture(currentKey: string, newKey: string): boolean; + + /** + * Passes all Textures to the given callback. + * @param callback The callback function to be sent the Textures. + * @param scope The value to use as `this` when executing the callback. + * @param args Additional arguments that will be passed to the callback, after the child. + */ + each(callback: EachTextureCallback, scope: object, ...args: any[]): void; + + /** + * Resets the internal Stamp object, ready for drawing and returns it. + * @param alpha The alpha to use. Default 1. + * @param tint WebGL only. The tint color to use. Default 0xffffff. + */ + resetStamp(alpha?: number, tint?: number): Phaser.GameObjects.Image; + + /** + * Destroys the Texture Manager and all Textures stored within it. + */ + destroy(): void; + + } + + /** + * A Texture Source is the encapsulation of the actual source data for a Texture. + * + * This is typically an Image Element, loaded from the file system or network, a Canvas Element or a Video Element. + * + * A Texture can contain multiple Texture Sources, which only happens when a multi-atlas is loaded. + */ + class TextureSource { + /** + * + * @param texture The Texture this TextureSource belongs to. + * @param source The source image data. + * @param width Optional width of the source image. If not given it's derived from the source itself. + * @param height Optional height of the source image. If not given it's derived from the source itself. + * @param flipY Sets the `UNPACK_FLIP_Y_WEBGL` flag the WebGL Texture uses during upload. Default false. + */ + constructor(texture: Phaser.Textures.Texture, source: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | Phaser.GameObjects.RenderTexture | Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | Phaser.Types.Textures.CompressedTextureData | Phaser.Textures.DynamicTexture, width?: number, height?: number, flipY?: boolean); + + /** + * A reference to the Canvas or WebGL Renderer. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The Texture this TextureSource instance belongs to. + */ + texture: Phaser.Textures.Texture; + + /** + * The source of the image data. + * + * This is either an Image Element, a Canvas Element, a Video Element, a RenderTexture or a WebGLTextureWrapper. + * + * In Phaser 3.60 and above it can also be a Compressed Texture data object. + */ + source: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | Phaser.GameObjects.RenderTexture | Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | Phaser.Types.Textures.CompressedTextureData | Phaser.Textures.DynamicTexture; + + /** + * The image data. + * + * This is either an Image element, Canvas element, Video Element, or Uint8Array. + */ + image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | Uint8Array; + + /** + * Holds the compressed textured algorithm, or `null` if it's not a compressed texture. + * + * Prior to Phaser 3.60 this value always held `null`. + */ + compressionAlgorithm: number; + + /** + * The resolution of the source image. + */ + resolution: number; + + /** + * The width of the source image. If not specified in the constructor it will check + * the `naturalWidth` and then `width` properties of the source image. + */ + width: number; + + /** + * The height of the source image. If not specified in the constructor it will check + * the `naturalHeight` and then `height` properties of the source image. + */ + height: number; + + /** + * The Scale Mode the image will use when rendering. + * Either Linear or Nearest. + */ + scaleMode: number; + + /** + * Is the source image a Canvas Element? + */ + isCanvas: boolean; + + /** + * Is the source image a Video Element? + */ + isVideo: boolean; + + /** + * Is the source image a Render Texture? + */ + isRenderTexture: boolean; + + /** + * Is the source image a WebGLTextureWrapper? + */ + isGLTexture: boolean; + + /** + * Are the source image dimensions a power of two? + */ + isPowerOf2: boolean; + + /** + * The wrapped WebGL Texture of the source image. + * If this TextureSource is driven from a WebGLTexture already, + * then this wrapper contains a reference to that WebGLTexture. + */ + glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * Sets the `UNPACK_FLIP_Y_WEBGL` flag the WebGL Texture uses during upload. + */ + flipY: boolean; + + /** + * Creates a WebGL Texture, if required, and sets the Texture filter mode. + * @param game A reference to the Phaser Game instance. + */ + init(game: Phaser.Game): void; + + /** + * Sets the Filter Mode for this Texture. + * + * The mode can be either Linear, the default, or Nearest. + * + * For pixel-art you should use Nearest. + * @param filterMode The Filter Mode. + */ + setFilter(filterMode: Phaser.Textures.FilterMode): void; + + /** + * Sets the `UNPACK_FLIP_Y_WEBGL` flag for the WebGL Texture during texture upload. + * @param value Should the WebGL Texture be flipped on the Y axis on texture upload or not? Default true. + */ + setFlipY(value?: boolean): void; + + /** + * If this TextureSource is backed by a Canvas and is running under WebGL, + * it updates the WebGLTexture using the canvas data. + */ + update(): void; + + /** + * Destroys this Texture Source and nulls the references. + */ + destroy(): void; + + } + + } + + namespace Tilemaps { + namespace Components { + /** + * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting + * faces are used internally for optimizing collisions against tiles. This method is mostly used + * internally to optimize recalculating faces when only one tile has been changed. + * @param tileX The x coordinate. + * @param tileY The y coordinate. + * @param layer The Tilemap Layer to act upon. + */ + function CalculateFacesAt(tileX: number, tileY: number, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the + * layer. Interesting faces are used internally for optimizing collisions against tiles. This method + * is mostly used internally. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The Tilemap Layer to act upon. + */ + function CalculateFacesWithin(tileX: number, tileY: number, width: number, height: number, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Checks if the given tile coordinate is within the isometric layer bounds, or not. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param layer The Tilemap Layer to check against. + * @param camera The Camera to run the cull check against. + */ + function CheckIsoBounds(tileX: number, tileY: number, layer: Phaser.Tilemaps.LayerData, camera?: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Copies the tiles in the source rectangular area to a new destination (all specified in tile + * coordinates) within the layer. This copies all tile properties and recalculates collision + * information in the destination region. + * @param srcTileX The x coordinate of the area to copy from, in tiles, not pixels. + * @param srcTileY The y coordinate of the area to copy from, in tiles, not pixels. + * @param width The width of the area to copy, in tiles, not pixels. + * @param height The height of the area to copy, in tiles, not pixels. + * @param destTileX The x coordinate of the area to copy to, in tiles, not pixels. + * @param destTileY The y coordinate of the area to copy to, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The Tilemap Layer to act upon. + */ + function Copy(srcTileX: number, srcTileY: number, width: number, height: number, destTileX: number, destTileY: number, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Creates a Sprite for every object matching the given tile indexes in the layer. You can + * optionally specify if each tile will be replaced with a new tile after the Sprite has been + * created. This is useful if you want to lay down special tiles in a level that are converted to + * Sprites, but want to replace the tile itself with a floor tile or similar once converted. + * @param indexes The tile index, or array of indexes, to create Sprites from. + * @param replacements The tile index, or array of indexes, to change a converted tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a one-to-one mapping with the indexes array. + * @param spriteConfig The config object to pass into the Sprite creator (i.e. scene.make.sprite). + * @param scene The Scene to create the Sprites within. + * @param camera The Camera to use when determining the world XY + * @param layer The Tilemap Layer to act upon. + */ + function CreateFromTiles(indexes: number | number[], replacements: number | number[] | undefined, spriteConfig: Phaser.Types.GameObjects.Sprite.SpriteConfig, scene: Phaser.Scene, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.GameObjects.Sprite[]; + + /** + * Returns the bounds in the given orthogonal layer that are within the cameras viewport. + * This is used internally by the cull tiles function. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + */ + function CullBounds(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera): Phaser.Geom.Rectangle; + + /** + * Returns the tiles in the given layer that are within the cameras viewport. This is used internally. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + * @param outputArray An optional array to store the Tile objects within. + * @param renderOrder The rendering order constant. Default 0. + */ + function CullTiles(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera, outputArray?: any[], renderOrder?: number): Phaser.Tilemaps.Tile[]; + + /** + * Sets the tiles in the given rectangular area (in tile coordinates) of the layer with the + * specified index. Tiles will be set to collide if the given index is a colliding index. + * Collision information in the region will be recalculated. + * @param index The tile index to fill the area with. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The tile layer to use. If not given the current layer is used. + */ + function Fill(index: number, tileX: number, tileY: number, width: number, height: number, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given + * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns + * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS. + * @param callback The callback. Each tile in the given area will be passed to this + * callback as the first and only parameter. The callback should return true for tiles that pass the + * filter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The Tilemap Layer to act upon. + */ + function FilterTiles(callback: Function, context: object, tileX: number, tileY: number, width: number, height: number, filteringOptions: Phaser.Types.Tilemaps.FilteringOptions, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile[]; + + /** + * Searches the entire map layer for the first tile matching the given index, then returns that Tile + * object. If no match is found, it returns null. The search starts from the top-left tile and + * continues horizontally until it hits the end of the row, then it drops down to the next column. + * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to + * the top-left. + * @param index The tile index value to search for. + * @param skip The number of times to skip a matching tile before returning. + * @param reverse If true it will scan the layer in reverse, starting at the bottom-right. Otherwise it scans from the top-left. + * @param layer The Tilemap Layer to act upon. + */ + function FindByIndex(index: number, skip: number, reverse: boolean, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile | null; + + /** + * Find the first tile in the given rectangular area (in tile coordinates) of the layer that + * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns + * true. Similar to Array.prototype.find in vanilla JS. + * @param callback The callback. Each tile in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The Tilemap Layer to act upon. + */ + function FindTile(callback: FindTileCallback, context: object, tileX: number, tileY: number, width: number, height: number, filteringOptions: Phaser.Types.Tilemaps.FilteringOptions, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile | null; + + /** + * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given + * callback. Similar to Array.prototype.forEach in vanilla JS. + * @param callback The callback. Each tile in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The Tilemap Layer to act upon. + */ + function ForEachTile(callback: EachTileCallback, context: object, tileX: number, tileY: number, width: number, height: number, filteringOptions: Phaser.Types.Tilemaps.FilteringOptions, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Gets the correct function to use to cull tiles, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetCullTilesFunction(orientation: number): Function; + + /** + * Gets a tile at the given tile coordinates from the given layer. + * @param tileX X position to get the tile from (given in tile units, not pixels). + * @param tileY Y position to get the tile from (given in tile units, not pixels). + * @param nonNull If true getTile won't return null for empty tiles, but a Tile object with an index of -1. + * @param layer The Tilemap Layer to act upon. + */ + function GetTileAt(tileX: number, tileY: number, nonNull: boolean, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile; + + /** + * Gets a tile at the given world coordinates from the given layer. + * @param worldX X position to get the tile from (given in pixels) + * @param worldY Y position to get the tile from (given in pixels) + * @param nonNull If true, function won't return null for empty tiles, but a Tile object with an index of -1. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function GetTileAtWorldXY(worldX: number, worldY: number, nonNull: boolean, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile; + + /** + * Gets the corners of the Tile as an array of Vector2s. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function GetTileCorners(tileX: number, tileY: number, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2[]; + + /** + * Gets the correct function to use to get the tile corners, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetTileCornersFunction(orientation: number): Function; + + /** + * Gets the tiles in the given rectangular area (in tile coordinates) of the layer. + * + * This returns an array with references to the Tile instances in, so be aware of + * modifying them directly. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The Tilemap Layer to act upon. + */ + function GetTilesWithin(tileX: number, tileY: number, width: number, height: number, filteringOptions: Phaser.Types.Tilemaps.FilteringOptions, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile[]; + + /** + * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle, + * Line, Rectangle or Triangle. The shape should be in world coordinates. + * @param shape A shape in world (pixel) coordinates + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function GetTilesWithinShape(shape: Phaser.Geom.Circle | Phaser.Geom.Line | Phaser.Geom.Rectangle | Phaser.Geom.Triangle, filteringOptions: Phaser.Types.Tilemaps.FilteringOptions, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile[]; + + /** + * Gets the tiles in the given rectangular area (in world coordinates) of the layer. + * @param worldX The world x coordinate for the top-left of the area. + * @param worldY The world y coordinate for the top-left of the area. + * @param width The width of the area. + * @param height The height of the area. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param camera The Camera to use when factoring in which tiles to return. + * @param layer The Tilemap Layer to act upon. + */ + function GetTilesWithinWorldXY(worldX: number, worldY: number, width: number, height: number, filteringOptions: Phaser.Types.Tilemaps.FilteringOptions, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile[]; + + /** + * Gets the correct function to use to translate tiles, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetTileToWorldXFunction(orientation: number): Function; + + /** + * Gets the correct function to use to translate tiles, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetTileToWorldXYFunction(orientation: number): Function; + + /** + * Gets the correct function to use to translate tiles, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetTileToWorldYFunction(orientation: number): Function; + + /** + * Gets the correct function to use to translate tiles, based on the map orientation. + * + * Only orthogonal maps support this feature. + * @param orientation The Tilemap orientation constant. + */ + function GetWorldToTileXFunction(orientation: number): Function; + + /** + * Gets the correct function to use to translate tiles, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetWorldToTileXYFunction(orientation: number): Function; + + /** + * Gets the correct function to use to translate tiles, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetWorldToTileYFunction(orientation: number): Function; + + /** + * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns + * false if there is no tile or if the tile at that location has an index of -1. + * @param tileX X position to get the tile from (given in tile units, not pixels). + * @param tileY Y position to get the tile from (given in tile units, not pixels). + * @param layer The Tilemap Layer to act upon. + */ + function HasTileAt(tileX: number, tileY: number, layer: Phaser.Tilemaps.LayerData): boolean | null; + + /** + * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns + * false if there is no tile or if the tile at that location has an index of -1. + * @param worldX The X coordinate of the world position. + * @param worldY The Y coordinate of the world position. + * @param camera The Camera to use when factoring in which tiles to return. + * @param layer The Tilemap Layer to act upon. + */ + function HasTileAtWorldXY(worldX: number, worldY: number, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): boolean | null; + + /** + * Returns the bounds in the given layer that are within the camera's viewport. + * This is used internally by the cull tiles function. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + */ + function HexagonalCullBounds(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera): object; + + /** + * Returns the tiles in the given layer that are within the cameras viewport. This is used internally. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + * @param outputArray An optional array to store the Tile objects within. + * @param renderOrder The rendering order constant. Default 0. + */ + function HexagonalCullTiles(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera, outputArray?: any[], renderOrder?: number): Phaser.Tilemaps.Tile[]; + + /** + * Gets the corners of the Hexagonal Tile as an array of Vector2s. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function HexagonalGetTileCorners(tileX: number, tileY: number, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2[]; + + /** + * Converts from hexagonal tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function HexagonalTileToWorldXY(tileX: number, tileY: number, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Converts from world XY coordinates (pixels) to hexagonal tile XY coordinates (tile units), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinates down to the nearest integer. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function HexagonalWorldToTileXY(worldX: number, worldY: number, snapToFloor: boolean, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Checks if the given tile coordinates are within the bounds of the layer. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param layer The Tilemap Layer to act upon. + */ + function IsInLayerBounds(tileX: number, tileY: number, layer: Phaser.Tilemaps.LayerData): boolean; + + /** + * Returns the tiles in the given layer that are within the cameras viewport. This is used internally. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + * @param outputArray An optional array to store the Tile objects within. + * @param renderOrder The rendering order constant. Default 0. + */ + function IsometricCullTiles(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera, outputArray?: any[], renderOrder?: number): Phaser.Tilemaps.Tile[]; + + /** + * Converts from isometric tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function IsometricTileToWorldXY(tileX: number, tileY: number, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Converts from world XY coordinates (pixels) to isometric tile XY coordinates (tile units), factoring in the + * layers position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + * @param originTop Which is the active face of the isometric tile? The top (default, true), or the base? (false) Default true. + */ + function IsometricWorldToTileXY(worldX: number, worldY: number, snapToFloor: boolean, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData, originTop?: boolean): Phaser.Math.Vector2; + + /** + * Puts a tile at the given tile coordinates in the specified layer. You can pass in either an index + * or a Tile object. If you pass in a Tile, all attributes will be copied over to the specified + * location. If you pass in an index, only the index at the specified location will be changed. + * Collision information will be recalculated at the specified location. + * @param tile The index of this tile to set or a Tile object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The Tilemap Layer to act upon. + */ + function PutTileAt(tile: number | Phaser.Tilemaps.Tile, tileX: number, tileY: number, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile; + + /** + * Puts a tile at the given world coordinates (pixels) in the specified layer. You can pass in either + * an index or a Tile object. If you pass in a Tile, all attributes will be copied over to the + * specified location. If you pass in an index, only the index at the specified location will be + * changed. Collision information will be recalculated at the specified location. + * @param tile The index of this tile to set or a Tile object. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function PutTileAtWorldXY(tile: number | Phaser.Tilemaps.Tile, worldX: number, worldY: number, recalculateFaces: boolean, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile; + + /** + * Puts an array of tiles or a 2D array of tiles at the given tile coordinates in the specified + * layer. The array can be composed of either tile indexes or Tile objects. If you pass in a Tile, + * all attributes will be copied over to the specified location. If you pass in an index, only the + * index at the specified location will be changed. Collision information will be recalculated + * within the region tiles were changed. + * @param tile A row (array) or grid (2D array) of Tiles or tile indexes to place. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The Tilemap Layer to act upon. + */ + function PutTilesAt(tile: number[] | number[][] | Phaser.Tilemaps.Tile[] | Phaser.Tilemaps.Tile[][], tileX: number, tileY: number, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the + * specified layer. Each tile will receive a new index. If an array of indexes is passed in, then + * those will be used for randomly assigning new tile indexes. If an array is not provided, the + * indexes found within the region (excluding -1) will be used for randomly assigning new tile + * indexes. This method only modifies tile indexes and does not change collision information. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param indexes An array of indexes to randomly draw from during randomization. + * @param layer The Tilemap Layer to act upon. + */ + function Randomize(tileX: number, tileY: number, width: number, height: number, indexes: number[], layer: Phaser.Tilemaps.LayerData): void; + + /** + * Removes the tile at the given tile coordinates in the specified layer and updates the layer's + * collision information. + * @param tileX The x coordinate. + * @param tileY The y coordinate. + * @param replaceWithNull If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The Tilemap Layer to act upon. + */ + function RemoveTileAt(tileX: number, tileY: number, replaceWithNull: boolean, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile; + + /** + * Removes the tile at the given world coordinates in the specified layer and updates the layer's + * collision information. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param replaceWithNull If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function RemoveTileAtWorldXY(worldX: number, worldY: number, replaceWithNull: boolean, recalculateFaces: boolean, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile; + + /** + * Draws a debug representation of the layer to the given Graphics. This is helpful when you want to + * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles + * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation + * wherever you want on the screen. + * @param graphics The target Graphics object to draw upon. + * @param styleConfig An object specifying the colors to use for the debug drawing. + * @param layer The Tilemap Layer to act upon. + */ + function RenderDebug(graphics: Phaser.GameObjects.Graphics, styleConfig: Phaser.Types.Tilemaps.DebugStyleOptions, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching + * `findIndex` and updates their index to match `newIndex`. This only modifies the index and does + * not change collision information. + * @param findIndex The index of the tile to search for. + * @param newIndex The index of the tile to replace it with. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The Tilemap Layer to act upon. + */ + function ReplaceByIndex(findIndex: number, newIndex: number, tileX: number, tileY: number, width: number, height: number, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Returns the tiles in the given layer that are within the cameras viewport. This is used internally. + * @param layer The Tilemap Layer to act upon. + * @param bounds An object containing the `left`, `right`, `top` and `bottom` bounds. + * @param renderOrder The rendering order constant. + * @param outputArray The array to store the Tile objects within. + */ + function RunCull(layer: Phaser.Tilemaps.LayerData, bounds: object, renderOrder: number, outputArray: any[]): Phaser.Tilemaps.Tile[]; + + /** + * Sets collision on the given tile or tiles within a layer by index. You can pass in either a + * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if + * collision will be enabled (true) or disabled (false). + * @param indexes Either a single tile index, or an array of tile indexes. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The Tilemap Layer to act upon. + * @param updateLayer If true, updates the current tiles on the layer. Set to false if no tiles have been placed for significant performance boost. Default true. + */ + function SetCollision(indexes: number | any[], collides: boolean, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData, updateLayer?: boolean): void; + + /** + * Sets collision on a range of tiles in a layer whose index is between the specified `start` and + * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set + * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be + * enabled (true) or disabled (false). + * @param start The first index of the tile to be set for collision. + * @param stop The last index of the tile to be set for collision. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The Tilemap Layer to act upon. + * @param updateLayer If true, updates the current tiles on the layer. Set to false if no tiles have been placed for significant performance boost. Default true. + */ + function SetCollisionBetween(start: number, stop: number, collides: boolean, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData, updateLayer?: boolean): void; + + /** + * Sets collision on all tiles in the given layer, except for tiles that have an index specified in + * the given array. The `collides` parameter controls if collision will be enabled (true) or + * disabled (false). Tile indexes not currently in the layer are not affected. + * @param indexes An array of the tile indexes to not be counted for collision. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The Tilemap Layer to act upon. + */ + function SetCollisionByExclusion(indexes: number[], collides: boolean, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property + * that matches the given properties object, its collision flag will be set. The `collides` + * parameter controls if collision will be enabled (true) or disabled (false). Passing in + * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that + * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can + * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a + * "types" property that matches any of those values, its collision flag will be updated. + * @param properties An object with tile properties and corresponding values that should be checked. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The Tilemap Layer to act upon. + */ + function SetCollisionByProperty(properties: object, collides: boolean, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Sets collision on the tiles within a layer by checking each tile's collision group data + * (typically defined in Tiled within the tileset collision editor). If any objects are found within + * a tile's collision group, the tile's colliding information will be set. The `collides` parameter + * controls if collision will be enabled (true) or disabled (false). + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The Tilemap Layer to act upon. + */ + function SetCollisionFromCollisionGroup(collides: boolean, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Internally used method to keep track of the tile indexes that collide within a layer. This + * updates LayerData.collideIndexes to either contain or not contain the given `tileIndex`. + * @param tileIndex The tile index to set the collision boolean for. + * @param collides Should the tile index collide or not? + * @param layer The Tilemap Layer to act upon. + */ + function SetLayerCollisionIndex(tileIndex: number, collides: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Internally used method to set the colliding state of a tile. This does not recalculate + * interesting faces. + * @param tile The Tile to set the collision on. + * @param collides Should the tile index collide or not? Default true. + */ + function SetTileCollision(tile: Phaser.Tilemaps.Tile, collides?: boolean): void; + + /** + * Sets a global collision callback for the given tile index within the layer. This will affect all + * tiles on this layer that have the same index. If a callback is already set for the tile index it + * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile + * at a specific location on the map then see setTileLocationCallback. + * @param indexes Either a single tile index, or an array of tile indexes to have a collision callback set for. + * @param callback The callback that will be invoked when the tile is collided with. + * @param callbackContext The context under which the callback is called. + * @param layer The Tilemap Layer to act upon. + */ + function SetTileIndexCallback(indexes: number | any[], callback: Function, callbackContext: object, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Sets a collision callback for the given rectangular area (in tile coordinates) within the layer. + * If a callback is already set for the tile index it will be replaced. Set the callback to null to + * remove it. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param callback The callback that will be invoked when the tile is collided with. + * @param callbackContext The context under which the callback is called. + * @param layer The Tilemap Layer to act upon. + */ + function SetTileLocationCallback(tileX: number, tileY: number, width: number, height: number, callback: Function, callbackContext: object, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Shuffles the tiles in a rectangular region (specified in tile coordinates) within the given + * layer. It will only randomize the tiles in that area, so if they're all the same nothing will + * appear to have changed! This method only modifies tile indexes and does not change collision + * information. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The Tilemap Layer to act upon. + */ + function Shuffle(tileX: number, tileY: number, width: number, height: number, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Returns the bounds in the given layer that are within the camera's viewport. + * This is used internally by the cull tiles function. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + */ + function StaggeredCullBounds(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera): object; + + /** + * Returns the tiles in the given layer that are within the cameras viewport. This is used internally. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + * @param outputArray An optional array to store the Tile objects within. + * @param renderOrder The rendering order constant. Default 0. + */ + function StaggeredCullTiles(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera, outputArray?: any[], renderOrder?: number): Phaser.Tilemaps.Tile[]; + + /** + * Converts from staggered tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function StaggeredTileToWorldXY(tileX: number, tileY: number, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Converts from staggered tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the + * layers position, scale and scroll. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function StaggeredTileToWorldY(tileY: number, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): number; + + /** + * Converts from world XY coordinates (pixels) to staggered tile XY coordinates (tile units), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function StaggeredWorldToTileXY(worldX: number, worldY: number, snapToFloor: boolean, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Converts from world Y coordinates (pixels) to staggered tile Y coordinates (tile units), factoring in the + * layers position, scale and scroll. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function StaggeredWorldToTileY(worldY: number, snapToFloor: boolean, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): number; + + /** + * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching + * `indexA` and swaps then with `indexB`. This only modifies the index and does not change collision + * information. + * @param tileA First tile index. + * @param tileB Second tile index. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The Tilemap Layer to act upon. + */ + function SwapByIndex(tileA: number, tileB: number, tileX: number, tileY: number, width: number, height: number, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the + * layer's position, scale and scroll. + * @param tileX The x coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function TileToWorldX(tileX: number, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): number; + + /** + * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function TileToWorldXY(tileX: number, tileY: number, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the + * layer's position, scale and scroll. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function TileToWorldY(tileY: number, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): number; + + /** + * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the + * specified layer. Each tile will receive a new index. New indexes are drawn from the given + * weightedIndexes array. An example weighted array: + * + * [ + * { index: 6, weight: 4 }, // Probability of index 6 is 4 / 8 + * { index: 7, weight: 2 }, // Probability of index 7 would be 2 / 8 + * { index: 8, weight: 1.5 }, // Probability of index 8 would be 1.5 / 8 + * { index: 26, weight: 0.5 } // Probability of index 27 would be 0.5 / 8 + * ] + * + * The probability of any index being choose is (the index's weight) / (sum of all weights). This + * method only modifies tile indexes and does not change collision information. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param weightedIndexes An array of objects to randomly draw from during + * randomization. They should be in the form: { index: 0, weight: 4 } or + * { index: [0, 1], weight: 4 } if you wish to draw from multiple tile indexes. + * @param layer The Tilemap Layer to act upon. + */ + function WeightedRandomize(tileX: number, tileY: number, width: number, height: number, weightedIndexes: object[], layer: Phaser.Tilemaps.LayerData): void; + + /** + * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the + * layer's position, scale and scroll. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function WorldToTileX(worldX: number, snapToFloor: boolean, camera: Phaser.Cameras.Scene2D.Camera | undefined, layer: Phaser.Tilemaps.LayerData): number; + + /** + * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function WorldToTileXY(worldX: number, worldY: number, snapToFloor: boolean, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the + * layer's position, scale and scroll. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function WorldToTileY(worldY: number, snapToFloor: boolean, camera: Phaser.Cameras.Scene2D.Camera | undefined, layer: Phaser.Tilemaps.LayerData): number; + + } + + /** + * Phaser Tilemap constants for orientation. + */ + enum Orientation { + /** + * Orthogonal Tilemap orientation constant. + */ + ORTHOGONAL, + /** + * Isometric Tilemap orientation constant. + */ + ISOMETRIC, + /** + * Staggered Tilemap orientation constant. + */ + STAGGERED, + /** + * Hexagonal Tilemap orientation constant. + */ + HEXAGONAL, + } + + /** + * Phaser Tilemap constants for orientation. + * + * To find out what each mode does please see [Phaser.Tilemaps.Orientation]{@link Phaser.Tilemaps.Orientation}. + */ + type OrientationType = Phaser.Tilemaps.Orientation; + + namespace Formats { + /** + * CSV Map Type + */ + var CSV: number; + + /** + * Tiled JSON Map Type + */ + var TILED_JSON: number; + + /** + * 2D Array Map Type + */ + var ARRAY_2D: number; + + /** + * Weltmeister (Impact.js) Map Type + */ + var WELTMEISTER: number; + + } + + /** + * An Image Collection is a special Tile Set containing multiple images, with no slicing into each image. + * + * Image Collections are normally created automatically when Tiled data is loaded. + */ + class ImageCollection { + /** + * + * @param name The name of the image collection in the map data. + * @param firstgid The first image index this image collection contains. + * @param width Width of widest image (in pixels). Default 32. + * @param height Height of tallest image (in pixels). Default 32. + * @param margin The margin around all images in the collection (in pixels). Default 0. + * @param spacing The spacing between each image in the collection (in pixels). Default 0. + * @param properties Custom Image Collection properties. Default {}. + */ + constructor(name: string, firstgid: number, width?: number, height?: number, margin?: number, spacing?: number, properties?: object); + + /** + * The name of the Image Collection. + */ + name: string; + + /** + * The Tiled firstgid value. + * This is the starting index of the first image index this Image Collection contains. + */ + firstgid: number; + + /** + * The width of the widest image (in pixels). + */ + readonly imageWidth: number; + + /** + * The height of the tallest image (in pixels). + */ + readonly imageHeight: number; + + /** + * The margin around the images in the collection (in pixels). + * Use `setSpacing` to change. + */ + readonly imageMarge: number; + + /** + * The spacing between each image in the collection (in pixels). + * Use `setSpacing` to change. + */ + readonly imageSpacing: number; + + /** + * Image Collection-specific properties that are typically defined in the Tiled editor. + */ + properties: object; + + /** + * The cached images that are a part of this collection. + */ + readonly images: any[]; + + /** + * The total number of images in the image collection. + */ + readonly total: number; + + /** + * Returns true if and only if this image collection contains the given image index. + * @param imageIndex The image index to search for. + */ + containsImageIndex(imageIndex: number): boolean; + + /** + * Add an image to this Image Collection. + * @param gid The gid of the image in the Image Collection. + * @param image The the key of the image in the Image Collection and in the cache. + */ + addImage(gid: number, image: string): Phaser.Tilemaps.ImageCollection; + + } + + /** + * A class for representing data about about a layer in a map. Maps are parsed from CSV, Tiled, + * etc. into this format. Tilemap and TilemapLayer objects have a reference + * to this data and use it to look up and perform operations on tiles. + */ + class LayerData { + /** + * + * @param config The Layer Data configuration object. + */ + constructor(config?: Phaser.Types.Tilemaps.LayerDataConfig); + + /** + * The name of the layer, if specified in Tiled. + */ + name: string; + + /** + * The id of the layer, as specified in the map data. + * + * Note: This is not the index of the layer in the map data, but its actual ID in Tiled. + */ + id: number; + + /** + * The x offset of where to draw from the top left. + */ + x: number; + + /** + * The y offset of where to draw from the top left. + */ + y: number; + + /** + * The width of the layer in tiles. + */ + width: number; + + /** + * The height of the layer in tiles. + */ + height: number; + + /** + * The pixel width of the tiles. + */ + tileWidth: number; + + /** + * The pixel height of the tiles. + */ + tileHeight: number; + + /** + * The base tile width. + */ + baseTileWidth: number; + + /** + * The base tile height. + */ + baseTileHeight: number; + + /** + * The layers orientation, necessary to be able to determine a tiles pixelX and pixelY as well as the layers width and height. + */ + orientation: Phaser.Tilemaps.OrientationType; + + /** + * The width in pixels of the entire layer. + */ + widthInPixels: number; + + /** + * The height in pixels of the entire layer. + */ + heightInPixels: number; + + /** + * The alpha value of the layer. + */ + alpha: number; + + /** + * Is the layer visible or not? + */ + visible: boolean; + + /** + * Layer specific properties (can be specified in Tiled) + */ + properties: object[]; + + /** + * Tile ID index map. + */ + indexes: any[]; + + /** + * Tile Collision ID index map. + */ + collideIndexes: any[]; + + /** + * An array of callbacks. + */ + callbacks: any[]; + + /** + * An array of physics bodies. + */ + bodies: any[]; + + /** + * An array of the tile data indexes. + */ + data: Phaser.Tilemaps.Tile[][]; + + /** + * A reference to the Tilemap layer that owns this data. + */ + tilemapLayer: Phaser.Tilemaps.TilemapLayer; + + /** + * The length of the horizontal sides of the hexagon. + * Only used for hexagonal orientation Tilemaps. + */ + hexSideLength: number; + + /** + * The Stagger Axis as defined in Tiled. + * + * Only used for hexagonal orientation Tilemaps. + */ + staggerAxis: string; + + /** + * The Stagger Index as defined in Tiled. + * + * Either 'odd' or 'even'. + * + * Only used for hexagonal orientation Tilemaps. + */ + staggerIndex: string; + + } + + /** + * A class for representing data about a map. Maps are parsed from CSV, Tiled, etc. into this + * format. A Tilemap object get a copy of this data and then unpacks the needed properties into + * itself. + */ + class MapData { + /** + * + * @param config The Map configuration object. + */ + constructor(config?: Phaser.Types.Tilemaps.MapDataConfig); + + /** + * The key in the Phaser cache that corresponds to the loaded tilemap data. + */ + name: string; + + /** + * The width of the entire tilemap. + */ + width: number; + + /** + * The height of the entire tilemap. + */ + height: number; + + /** + * If the map is infinite or not. + */ + infinite: boolean; + + /** + * The width of the tiles. + */ + tileWidth: number; + + /** + * The height of the tiles. + */ + tileHeight: number; + + /** + * The width in pixels of the entire tilemap. + */ + widthInPixels: number; + + /** + * The height in pixels of the entire tilemap. + */ + heightInPixels: number; + + /** + * The format of the map data. + */ + format: number; + + /** + * The orientation of the map data (i.e. orthogonal, isometric, hexagonal), default 'orthogonal'. + */ + orientation: Phaser.Tilemaps.OrientationType; + + /** + * Determines the draw order of tilemap. Default is right-down + * + * 0, or 'right-down' + * 1, or 'left-down' + * 2, or 'right-up' + * 3, or 'left-up' + */ + renderOrder: string; + + /** + * The version of the map data (as specified in Tiled). + */ + version: string; + + /** + * Map specific properties (can be specified in Tiled) + */ + properties: object; + + /** + * An array with all the layers configured to the MapData. + */ + layers: Phaser.Tilemaps.LayerData[] | Phaser.Tilemaps.ObjectLayer; + + /** + * An array of Tiled Image Layers. + */ + images: any[]; + + /** + * An object of Tiled Object Layers. + */ + objects: Phaser.Types.Tilemaps.ObjectLayerConfig[]; + + /** + * An object of collision data. Must be created as physics object or will return undefined. + */ + collision: object; + + /** + * An array of Tilesets. + */ + tilesets: Phaser.Tilemaps.Tileset[]; + + /** + * The collection of images the map uses(specified in Tiled) + */ + imageCollections: any[]; + + /** + * An array of tile instances. + */ + tiles: any[]; + + /** + * The length of the horizontal sides of the hexagon. + * + * Only used for hexagonal orientation Tilemaps. + */ + hexSideLength: number; + + /** + * The Stagger Axis as defined in Tiled. + * + * Only used for hexagonal orientation Tilemaps. + */ + staggerAxis: string; + + /** + * The Stagger Index as defined in Tiled. + * + * Either 'odd' or 'even'. + * + * Only used for hexagonal orientation Tilemaps. + */ + staggerIndex: string; + + } + + /** + * A class for representing a Tiled object layer in a map. This mirrors the structure of a Tiled + * object layer, except: + * - "x" & "y" properties are ignored since these cannot be changed in Tiled. + * - "offsetx" & "offsety" are applied to the individual object coordinates directly, so they + * are ignored as well. + * - "draworder" is ignored. + */ + class ObjectLayer { + /** + * + * @param config The data for the layer from the Tiled JSON object. + */ + constructor(config?: Phaser.Types.Tilemaps.ObjectLayerConfig); + + /** + * The name of the Object Layer. + */ + name: string; + + /** + * The id of the object layer, as specified in the map data. + */ + id: number; + + /** + * The opacity of the layer, between 0 and 1. + */ + opacity: number; + + /** + * The custom properties defined on the Object Layer, keyed by their name. + */ + properties: object; + + /** + * The type of each custom property defined on the Object Layer, keyed by its name. + */ + propertyTypes: object; + + /** + * The type of the layer, which should be `objectgroup`. + */ + type: string; + + /** + * Whether the layer is shown (`true`) or hidden (`false`). + */ + visible: boolean; + + /** + * An array of all objects on this Object Layer. + * + * Each Tiled object corresponds to a JavaScript object in this array. It has an `id` (unique), + * `name` (as assigned in Tiled), `type` (as assigned in Tiled), `rotation` (in clockwise degrees), + * `properties` (if any), `visible` state (`true` if visible, `false` otherwise), + * `x` and `y` coordinates (in pixels, relative to the tilemap), and a `width` and `height` (in pixels). + * + * An object tile has a `gid` property (GID of the represented tile), a `flippedHorizontal` property, + * a `flippedVertical` property, and `flippedAntiDiagonal` property. + * The {@link http://docs.mapeditor.org/en/latest/reference/tmx-map-format/|Tiled documentation} contains + * information on flipping and rotation. + * + * Polylines have a `polyline` property, which is an array of objects corresponding to points, + * where each point has an `x` property and a `y` property. Polygons have an identically structured + * array in their `polygon` property. Text objects have a `text` property with the text's properties. + * + * Rectangles and ellipses have a `rectangle` or `ellipse` property set to `true`. + */ + objects: Phaser.Types.Tilemaps.TiledObject[]; + + } + + /** + * The ObjectHelper helps tie objects with `gids` into the tileset + * that sits behind them. + */ + class ObjectHelper { + /** + * + * @param tilesets The backing tileset data. + */ + constructor(tilesets: Phaser.Tilemaps.Tileset[]); + + /** + * The Tile GIDs array. + */ + gids: any[]; + + /** + * Enabled if the object helper reaches in to tilesets for data. + * Disabled if it only uses data directly on a gid object. + */ + enabled: boolean; + + /** + * Gets the Tiled `type` field value from the object or the `gid` behind it. + * @param obj The Tiled object to investigate. + */ + getTypeIncludingTile(obj: Phaser.Types.Tilemaps.TiledObject): string | null; + + /** + * Sets the sprite texture data as specified (usually in a config) or, failing that, + * as specified in the `gid` of the object being loaded (if any). + * + * This fallback will only work if the tileset was loaded as a spritesheet matching + * the geometry of sprites fed into tiled, so that, for example: "tile id #`3`"" within + * the tileset is the same as texture frame `3` from the image of the tileset. + * @param sprite The Game Object to modify. + * @param key The texture key to set (or else the `obj.gid`'s tile is used if available). + * @param frame The frames key to set (or else the `obj.gid`'s tile is used if available). + * @param obj The Tiled object for fallback. + */ + setTextureAndFrame(sprite: Phaser.GameObjects.GameObject, key?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame, obj?: Phaser.Types.Tilemaps.TiledObject): void; + + /** + * Sets the `sprite.data` field from the tiled properties on the object and its tile (if any). + */ + setPropertiesFromTiledObject(sprite: Phaser.GameObjects.GameObject, obj: Phaser.Types.Tilemaps.TiledObject): void; + + } + + namespace Parsers { + /** + * Get the Tilemap orientation from the given string. + * @param orientation The orientation type as a string. + */ + function FromOrientationString(orientation?: string): Phaser.Tilemaps.OrientationType; + + namespace Impact { + /** + * Parses all tilemap layers in an Impact JSON object into new LayerData objects. + * @param json The Impact JSON object. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled (see {@link Phaser.Tilemaps.Parsers.Tiled.ParseJSONTiled}). + */ + function ParseTileLayers(json: object, insertNull: boolean): Phaser.Tilemaps.LayerData[]; + + /** + * Tilesets and Image Collections + * @param json The Impact JSON data. + */ + function ParseTilesets(json: object): any[]; + + /** + * Parses a Weltmeister JSON object into a new MapData object. + * @param name The name of the tilemap, used to set the name on the MapData. + * @param json The Weltmeister JSON object. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. + */ + function ParseWeltmeister(name: string, json: object, insertNull: boolean): Phaser.Tilemaps.MapData | null; + + } + + /** + * Parses raw data of a given Tilemap format into a new MapData object. If no recognized data format + * is found, returns `null`. When loading from CSV or a 2D array, you should specify the tileWidth & + * tileHeight. When parsing from a map from Tiled, the tileWidth & tileHeight will be pulled from + * the map data. + * @param name The name of the tilemap, used to set the name on the MapData. + * @param mapFormat See ../Formats.js. + * @param data 2D array, CSV string or Tiled JSON object. + * @param tileWidth The width of a tile in pixels. Required for 2D array and CSV, but + * ignored for Tiled JSON. + * @param tileHeight The height of a tile in pixels. Required for 2D array and CSV, but + * ignored for Tiled JSON. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. + */ + function Parse(name: string, mapFormat: number, data: number[][] | string | object, tileWidth: number, tileHeight: number, insertNull: boolean): Phaser.Tilemaps.MapData; + + /** + * Parses a 2D array of tile indexes into a new MapData object with a single layer. + * @param name The name of the tilemap, used to set the name on the MapData. + * @param data 2D array, CSV string or Tiled JSON object. + * @param tileWidth The width of a tile in pixels. + * @param tileHeight The height of a tile in pixels. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. + */ + function Parse2DArray(name: string, data: number[][], tileWidth: number, tileHeight: number, insertNull: boolean): Phaser.Tilemaps.MapData; + + /** + * Parses a CSV string of tile indexes into a new MapData object with a single layer. + * @param name The name of the tilemap, used to set the name on the MapData. + * @param data CSV string of tile indexes. + * @param tileWidth The width of a tile in pixels. + * @param tileHeight The height of a tile in pixels. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. + */ + function ParseCSV(name: string, data: string, tileWidth: number, tileHeight: number, insertNull: boolean): Phaser.Tilemaps.MapData; + + namespace Tiled { + /** + * Copy properties from tileset to tiles. + * @param mapData The Map Data object. + */ + function AssignTileProperties(mapData: Phaser.Tilemaps.MapData): void; + + /** + * Decode base-64 encoded data, for example as exported by Tiled. + * @param data Base-64 encoded data to decode. + */ + function Base64Decode(data: object): any[]; + + /** + * Master list of tiles -> x, y, index in tileset. + * @param mapData The Map Data object. + */ + function BuildTilesetIndex(mapData: Phaser.Tilemaps.MapData | Phaser.Tilemaps.Tilemap): any[]; + + /** + * Parse a Tiled group layer and create a state object for inheriting. + * @param json The Tiled JSON object. + * @param group The current group layer from the Tiled JSON file. + * @param parentState The state of the parent group (if any). + */ + function CreateGroupLayer(json: object, group?: object, parentState?: object): object; + + /** + * See Tiled documentation on tile flipping: + * http://docs.mapeditor.org/en/latest/reference/tmx-map-format/ + * @param gid A Tiled GID. + */ + function ParseGID(gid: number): Phaser.Types.Tilemaps.GIDData; + + /** + * Parses a Tiled JSON object into an array of objects with details about the image layers. + * @param json The Tiled JSON object. + */ + function ParseImageLayers(json: object): any[]; + + /** + * Parses a Tiled JSON object into a new MapData object. + * @param name The name of the tilemap, used to set the name on the MapData. + * @param source The original Tiled JSON object. This is deep copied by this function. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. + */ + function ParseJSONTiled(name: string, source: object, insertNull: boolean): Phaser.Tilemaps.MapData | null; + + /** + * Convert a Tiled object to an internal parsed object normalising and copying properties over, while applying optional x and y offsets. The parsed object will always have the properties `id`, `name`, `type`, `rotation`, `properties`, `visible`, `x`, `y`, `width` and `height`. Other properties will be added according to the object type (such as text, polyline, gid etc.) + * @param tiledObject Tiled object to convert to an internal parsed object normalising and copying properties over. + * @param offsetX Optional additional offset to apply to the object's x property. Defaults to 0. Default 0. + * @param offsetY Optional additional offset to apply to the object's y property. Defaults to 0. Default 0. + */ + function ParseObject(tiledObject: object, offsetX?: number, offsetY?: number): object; + + /** + * Parses a Tiled JSON object into an array of ObjectLayer objects. + * @param json The Tiled JSON object. + */ + function ParseObjectLayers(json: object): any[]; + + /** + * Parses all tilemap layers in a Tiled JSON object into new LayerData objects. + * @param json The Tiled JSON object. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled (see {@link Phaser.Tilemaps.Parsers.Tiled.ParseJSONTiled}). + */ + function ParseTileLayers(json: object, insertNull: boolean): Phaser.Tilemaps.LayerData[]; + + /** + * Tilesets and Image Collections. + * @param json The Tiled JSON data. + */ + function ParseTilesets(json: object): object; + + /** + * Parses out the Wangset information from Tiled 1.1.5+ map data, if present. + * + * Since a given tile can be in more than one wangset, the resulting properties + * are nested. `tile.data.wangid[someWangsetName]` will return the array-based wang id in + * this implementation. + * + * Note that we're not guaranteed that there will be any 'normal' tiles if the only + * thing in the tilset are wangtile definitions, so this has to be parsed separately. + * + * See https://doc.mapeditor.org/en/latest/manual/using-wang-tiles/ for more information. + * @param wangsets The array of wangset objects (parsed from JSON) + * @param datas The field into which to put wangset data from Tiled. + */ + function ParseWangsets(wangsets: object[], datas: object): object; + + } + + } + + /** + * Create a Tilemap from the given key or data. If neither is given, make a blank Tilemap. When + * loading from CSV or a 2D array, you should specify the tileWidth & tileHeight. When parsing from + * a map from Tiled, the tileWidth, tileHeight, width & height will be pulled from the map data. For + * an empty map, you should specify tileWidth, tileHeight, width & height. + * @param scene The Scene to which this Tilemap belongs. + * @param key The key in the Phaser cache that corresponds to the loaded tilemap data. + * @param tileWidth The width of a tile in pixels. Default 32. + * @param tileHeight The height of a tile in pixels. Default 32. + * @param width The width of the map in tiles. Default 10. + * @param height The height of the map in tiles. Default 10. + * @param data Instead of loading from the cache, you can also load directly from + * a 2D array of tile indexes. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the + * map data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. Default false. + */ + function ParseToTilemap(scene: Phaser.Scene, key?: string, tileWidth?: number, tileHeight?: number, width?: number, height?: number, data?: number[][], insertNull?: boolean): Phaser.Tilemaps.Tilemap; + + /** + * A Tile is a representation of a single tile within the Tilemap. This is a lightweight data + * representation, so its position information is stored without factoring in scroll, layer + * scale or layer position. + */ + class Tile implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.Visible { + /** + * + * @param layer The LayerData object in the Tilemap that this tile belongs to. + * @param index The unique index of this tile within the map. + * @param x The x coordinate of this tile in tile coordinates. + * @param y The y coordinate of this tile in tile coordinates. + * @param width Width of the tile in pixels. + * @param height Height of the tile in pixels. + * @param baseWidth The base width a tile in the map (in pixels). Tiled maps support + * multiple tileset sizes within one map, but they are still placed at intervals of the base + * tile width. + * @param baseHeight The base height of the tile in pixels (in pixels). Tiled maps + * support multiple tileset sizes within one map, but they are still placed at intervals of the + * base tile height. + */ + constructor(layer: Phaser.Tilemaps.LayerData, index: number, x: number, y: number, width: number, height: number, baseWidth: number, baseHeight: number); + + /** + * The LayerData in the Tilemap data that this tile belongs to. + */ + layer: Phaser.Tilemaps.LayerData; + + /** + * The index of this tile within the map data corresponding to the tileset, or -1 if this + * represents a blank tile. + */ + index: number; + + /** + * The x map coordinate of this tile in tile units. + */ + x: number; + + /** + * The y map coordinate of this tile in tile units. + */ + y: number; + + /** + * The width of the tile in pixels. + */ + width: number; + + /** + * The height of the tile in pixels. + */ + height: number; + + /** + * The right of the tile in pixels. + * + * Set in the `updatePixelXY` method. + */ + right: number; + + /** + * The bottom of the tile in pixels. + * + * Set in the `updatePixelXY` method. + */ + bottom: number; + + /** + * The maps base width of a tile in pixels. Tiled maps support multiple tileset sizes + * within one map, but they are still placed at intervals of the base tile size. + */ + baseWidth: number; + + /** + * The maps base height of a tile in pixels. Tiled maps support multiple tileset sizes + * within one map, but they are still placed at intervals of the base tile size. + */ + baseHeight: number; + + /** + * The x coordinate of the top left of this tile in pixels. This is relative to the top left + * of the layer this tile is being rendered within. This property does NOT factor in camera + * scroll, layer scale or layer position. + */ + pixelX: number; + + /** + * The y coordinate of the top left of this tile in pixels. This is relative to the top left + * of the layer this tile is being rendered within. This property does NOT factor in camera + * scroll, layer scale or layer position. + */ + pixelY: number; + + /** + * Tile specific properties. These usually come from Tiled. + */ + properties: any; + + /** + * The rotation angle of this tile. + */ + rotation: number; + + /** + * Whether the tile should collide with any object on the left side. + * + * This property is used by Arcade Physics only, however, you can also use it + * in your own checks. + */ + collideLeft: boolean; + + /** + * Whether the tile should collide with any object on the right side. + * + * This property is used by Arcade Physics only, however, you can also use it + * in your own checks. + */ + collideRight: boolean; + + /** + * Whether the tile should collide with any object on the top side. + * + * This property is used by Arcade Physics only, however, you can also use it + * in your own checks. + */ + collideUp: boolean; + + /** + * Whether the tile should collide with any object on the bottom side. + * + * This property is used by Arcade Physics only, however, you can also use it + * in your own checks. + */ + collideDown: boolean; + + /** + * Whether the tiles left edge is interesting for collisions. + */ + faceLeft: boolean; + + /** + * Whether the tiles right edge is interesting for collisions. + */ + faceRight: boolean; + + /** + * Whether the tiles top edge is interesting for collisions. + */ + faceTop: boolean; + + /** + * Whether the tiles bottom edge is interesting for collisions. + */ + faceBottom: boolean; + + /** + * Tile collision callback. + */ + collisionCallback: Function; + + /** + * The context in which the collision callback will be called. + */ + collisionCallbackContext: object; + + /** + * The tint to apply to this tile. Note: tint is currently a single color value instead of + * the 4 corner tint component on other GameObjects. + */ + tint: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * An empty object where physics-engine specific information (e.g. bodies) may be stored. + */ + physics: object; + + /** + * Check if the given x and y world coordinates are within this Tile. This does not factor in + * camera scroll, layer scale or layer position. + * @param x The x coordinate to test. + * @param y The y coordinate to test. + */ + containsPoint(x: number, y: number): boolean; + + /** + * Copies the tile data and properties from the given Tile to this Tile. This copies everything + * except for position and interesting face calculations. + * @param tile The tile to copy from. + */ + copy(tile: Phaser.Tilemaps.Tile): this; + + /** + * The collision group for this Tile, defined within the Tileset. This returns a reference to + * the collision group stored within the Tileset, so any modification of the returned object + * will impact all tiles that have the same index as this tile. + */ + getCollisionGroup(): object | null; + + /** + * The tile data for this Tile, defined within the Tileset. This typically contains Tiled + * collision data, tile animations and terrain information. This returns a reference to the tile + * data stored within the Tileset, so any modification of the returned object will impact all + * tiles that have the same index as this tile. + */ + getTileData(): object | null; + + /** + * Gets the world X position of the left side of the tile, factoring in the layers position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + */ + getLeft(camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Gets the world X position of the right side of the tile, factoring in the layer's position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + */ + getRight(camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Gets the world Y position of the top side of the tile, factoring in the layer's position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + */ + getTop(camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Gets the world Y position of the bottom side of the tile, factoring in the layer's position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + */ + getBottom(camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Gets the world rectangle bounding box for the tile, factoring in the layers position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + * @param output Optional Rectangle object to store the results in. + */ + getBounds(camera?: Phaser.Cameras.Scene2D.Camera, output?: Phaser.Geom.Rectangle): Phaser.Geom.Rectangle | object; + + /** + * Gets the world X position of the center of the tile, factoring in the layer's position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + */ + getCenterX(camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Gets the world Y position of the center of the tile, factoring in the layer's position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + */ + getCenterY(camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Check for intersection with this tile. This does not factor in camera scroll, layer scale or + * layer position. + * @param x The x axis in pixels. + * @param y The y axis in pixels. + * @param right The right point. + * @param bottom The bottom point. + */ + intersects(x: number, y: number, right: number, bottom: number): boolean; + + /** + * Checks if the tile is interesting. + * @param collides If true, will consider the tile interesting if it collides on any side. + * @param faces If true, will consider the tile interesting if it has an interesting face. + */ + isInteresting(collides: boolean, faces: boolean): boolean; + + /** + * Reset collision status flags. + * @param recalculateFaces Whether or not to recalculate interesting faces for this tile and its neighbors. Default true. + */ + resetCollision(recalculateFaces?: boolean): this; + + /** + * Reset faces. + */ + resetFaces(): this; + + /** + * Sets the collision flags for each side of this tile and updates the interesting faces list. + * @param left Indicating collide with any object on the left. + * @param right Indicating collide with any object on the right. + * @param up Indicating collide with any object on the top. + * @param down Indicating collide with any object on the bottom. + * @param recalculateFaces Whether or not to recalculate interesting faces for this tile and its neighbors. Default true. + */ + setCollision(left: boolean, right?: boolean, up?: boolean, down?: boolean, recalculateFaces?: boolean): this; + + /** + * Set a callback to be called when this tile is hit by an object. The callback must true for + * collision processing to take place. + * @param callback Callback function. + * @param context Callback will be called within this context. + */ + setCollisionCallback(callback: Function, context: object): this; + + /** + * Sets the size of the tile and updates its pixelX and pixelY. + * @param tileWidth The width of the tile in pixels. + * @param tileHeight The height of the tile in pixels. + * @param baseWidth The base width a tile in the map (in pixels). + * @param baseHeight The base height of the tile in pixels (in pixels). + */ + setSize(tileWidth: number, tileHeight: number, baseWidth: number, baseHeight: number): this; + + /** + * Used internally. Updates the tiles world XY position based on the current tile size. + */ + updatePixelXY(): this; + + /** + * Clean up memory. + */ + destroy(): void; + + /** + * True if this tile can collide on any of its faces or has a collision callback set. + */ + readonly canCollide: boolean; + + /** + * True if this tile can collide on any of its faces. + */ + readonly collides: boolean; + + /** + * True if this tile has any interesting faces. + */ + readonly hasInterestingFace: boolean; + + /** + * The tileset that contains this Tile. This is null if accessed from a LayerData instance + * before the tile is placed in a TilemapLayer, or if the tile has an index that doesn't correspond + * to any of the maps tilesets. + */ + readonly tileset: Phaser.Tilemaps.Tileset | null; + + /** + * The tilemap layer that contains this Tile. This will only return null if accessed from a + * LayerData instance before the tile is placed within a TilemapLayer. + */ + readonly tilemapLayer: Phaser.Tilemaps.TilemapLayer | null; + + /** + * The tilemap that contains this Tile. This will only return null if accessed from a LayerData + * instance before the tile is placed within a TilemapLayer. + */ + readonly tilemap: Phaser.Tilemaps.Tilemap | null; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Tilemap is a container for Tilemap data. This isn't a display object, rather, it holds data + * about the map and allows you to add tilesets and tilemap layers to it. A map can have one or + * more tilemap layers, which are the display objects that actually render the tiles. + * + * The Tilemap data can be parsed from a Tiled JSON file, a CSV file or a 2D array. Tiled is a free + * software package specifically for creating tile maps, and is available from: + * http://www.mapeditor.org + * + * As of Phaser 3.50.0 the Tilemap API now supports the following types of map: + * + * 1) Orthogonal + * 2) Isometric + * 3) Hexagonal + * 4) Staggered + * + * Prior to this release, only orthogonal maps were supported. + * + * Another large change in 3.50 was the consolidation of Tilemap Layers. Previously, you created + * either a Static or Dynamic Tilemap Layer. However, as of 3.50 the features of both have been + * merged and the API simplified, so now there is just the single `TilemapLayer` class. + * + * A Tilemap has handy methods for getting and manipulating the tiles within a layer, allowing + * you to build or modify the tilemap data at runtime. + * + * Note that all Tilemaps use a base tile size to calculate dimensions from, but that a + * TilemapLayer may have its own unique tile size that overrides this. + * + * As of Phaser 3.21.0, if your tilemap includes layer groups (a feature of Tiled 1.2.0+) these + * will be traversed and the following properties will impact children: + * + * - Opacity (blended with parent) and visibility (parent overrides child) + * - Vertical and horizontal offset + * + * The grouping hierarchy is not preserved and all layers will be flattened into a single array. + * + * Group layers are parsed during Tilemap construction but are discarded after parsing so dynamic + * layers will NOT continue to be affected by a parent. + * + * To avoid duplicate layer names, a layer that is a child of a group layer will have its parent + * group name prepended with a '/'. For example, consider a group called 'ParentGroup' with a + * child called 'Layer 1'. In the Tilemap object, 'Layer 1' will have the name + * 'ParentGroup/Layer 1'. + * + * The Phaser Tiled Parser does **not** support the 'Collection of Images' feature for a Tileset. + * You must ensure all of your tiles are contained in a single tileset image file (per layer) + * and have this 'embedded' in the exported Tiled JSON map data. + */ + class Tilemap { + /** + * + * @param scene The Scene to which this Tilemap belongs. + * @param mapData A MapData instance containing Tilemap data. + */ + constructor(scene: Phaser.Scene, mapData: Phaser.Tilemaps.MapData); + + scene: Phaser.Scene; + + /** + * The base width of a tile in pixels. Note that individual layers may have a different tile + * width. + */ + tileWidth: number; + + /** + * The base height of a tile in pixels. Note that individual layers may have a different + * tile height. + */ + tileHeight: number; + + /** + * The width of the map (in tiles). + */ + width: number; + + /** + * The height of the map (in tiles). + */ + height: number; + + /** + * The orientation of the map data (as specified in Tiled), usually 'orthogonal'. + */ + orientation: string; + + /** + * The render (draw) order of the map data (as specified in Tiled), usually 'right-down'. + * + * The draw orders are: + * + * right-down + * left-down + * right-up + * left-up + * + * This can be changed via the `setRenderOrder` method. + */ + renderOrder: string; + + /** + * The format of the map data. + */ + format: number; + + /** + * The version of the map data (as specified in Tiled, usually 1). + */ + version: number; + + /** + * Map specific properties as specified in Tiled. + * + * Depending on the version of Tiled and the JSON export used, this will be either + * an object or an array of objects. For Tiled 1.2.0+ maps, it will be an array. + */ + properties: object | object[]; + + /** + * The width of the map in pixels based on width * tileWidth. + */ + widthInPixels: number; + + /** + * The height of the map in pixels based on height * tileHeight. + */ + heightInPixels: number; + + /** + * A collection of Images, as parsed from Tiled map data. + */ + imageCollections: Phaser.Tilemaps.ImageCollection[]; + + /** + * An array of Tiled Image Layers. + */ + images: any[]; + + /** + * An array of Tilemap layer data. + */ + layers: Phaser.Tilemaps.LayerData[]; + + /** + * Master list of tiles -> x, y, index in tileset. + */ + tiles: any[]; + + /** + * An array of Tilesets used in the map. + */ + tilesets: Phaser.Tilemaps.Tileset[]; + + /** + * An array of ObjectLayer instances parsed from Tiled object layers. + */ + objects: Phaser.Tilemaps.ObjectLayer[]; + + /** + * The index of the currently selected LayerData object. + */ + currentLayerIndex: number; + + /** + * The length of the horizontal sides of the hexagon. + * Only used for hexagonal orientation Tilemaps. + */ + hexSideLength: number; + + /** + * Sets the rendering (draw) order of the tiles in this map. + * + * The default is 'right-down', meaning it will order the tiles starting from the top-left, + * drawing to the right and then moving down to the next row. + * + * The draw orders are: + * + * 0 = right-down + * 1 = left-down + * 2 = right-up + * 3 = left-up + * + * Setting the render order does not change the tiles or how they are stored in the layer, + * it purely impacts the order in which they are rendered. + * + * You can provide either an integer (0 to 3), or the string version of the order. + * + * Calling this method _after_ creating Tilemap Layers will **not** automatically + * update them to use the new render order. If you call this method after creating layers, use their + * own `setRenderOrder` methods to change them as needed. + * @param renderOrder The render (draw) order value. Either an integer between 0 and 3, or a string: 'right-down', 'left-down', 'right-up' or 'left-up'. + */ + setRenderOrder(renderOrder: number | string): this; + + /** + * Adds an image to the map to be used as a tileset. A single map may use multiple tilesets. + * Note that the tileset name can be found in the JSON file exported from Tiled, or in the Tiled + * editor. + * @param tilesetName The name of the tileset as specified in the map data. + * @param key The key of the Phaser.Cache image used for this tileset. If + * `undefined` or `null` it will look for an image with a key matching the tilesetName parameter. + * @param tileWidth The width of the tile (in pixels) in the Tileset Image. If not + * given it will default to the map's tileWidth value, or the tileWidth specified in the Tiled + * JSON file. + * @param tileHeight The height of the tiles (in pixels) in the Tileset Image. If + * not given it will default to the map's tileHeight value, or the tileHeight specified in the + * Tiled JSON file. + * @param tileMargin The margin around the tiles in the sheet (in pixels). If not + * specified, it will default to 0 or the value specified in the Tiled JSON file. + * @param tileSpacing The spacing between each the tile in the sheet (in pixels). + * If not specified, it will default to 0 or the value specified in the Tiled JSON file. + * @param gid If adding multiple tilesets to a blank map, specify the starting + * GID this set will use here. Default 0. + * @param tileOffset Tile texture drawing offset. + * If not specified, it will default to {0, 0} Default {x: 0, y: 0}. + */ + addTilesetImage(tilesetName: string, key?: string, tileWidth?: number, tileHeight?: number, tileMargin?: number, tileSpacing?: number, gid?: number, tileOffset?: object): Phaser.Tilemaps.Tileset | null; + + /** + * Copies the tiles in the source rectangular area to a new destination (all specified in tile + * coordinates) within the layer. This copies all tile properties & recalculates collision + * information in the destination region. + * + * If no layer specified, the map's current layer is used. This cannot be applied to StaticTilemapLayers. + * @param srcTileX The x coordinate of the area to copy from, in tiles, not pixels. + * @param srcTileY The y coordinate of the area to copy from, in tiles, not pixels. + * @param width The width of the area to copy, in tiles, not pixels. + * @param height The height of the area to copy, in tiles, not pixels. + * @param destTileX The x coordinate of the area to copy to, in tiles, not pixels. + * @param destTileY The y coordinate of the area to copy to, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + * @param layer The tile layer to use. If not given the current layer is used. + */ + copy(srcTileX: number, srcTileY: number, width: number, height: number, destTileX: number, destTileY: number, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Creates a new and empty Tilemap Layer. The currently selected layer in the map is set to this new layer. + * + * Prior to v3.50.0 this method was called `createBlankDynamicLayer`. + * @param name The name of this layer. Must be unique within the map. + * @param tileset The tileset, or an array of tilesets, used to render this layer. Can be a string or a Tileset object. + * @param x The world x position where the top left of this layer will be placed. Default 0. + * @param y The world y position where the top left of this layer will be placed. Default 0. + * @param width The width of the layer in tiles. If not specified, it will default to the map's width. + * @param height The height of the layer in tiles. If not specified, it will default to the map's height. + * @param tileWidth The width of the tiles the layer uses for calculations. If not specified, it will default to the map's tileWidth. + * @param tileHeight The height of the tiles the layer uses for calculations. If not specified, it will default to the map's tileHeight. + */ + createBlankLayer(name: string, tileset: string | string[] | Phaser.Tilemaps.Tileset | Phaser.Tilemaps.Tileset[], x?: number, y?: number, width?: number, height?: number, tileWidth?: number, tileHeight?: number): Phaser.Tilemaps.TilemapLayer | null; + + /** + * Creates a new Tilemap Layer that renders the LayerData associated with the given + * `layerID`. The currently selected layer in the map is set to this new layer. + * + * The `layerID` is important. If you've created your map in Tiled then you can get this by + * looking in Tiled and looking at the layer name. Or you can open the JSON file it exports and + * look at the layers[].name value. Either way it must match. + * + * Prior to v3.50.0 this method was called `createDynamicLayer`. + * @param layerID The layer array index value, or if a string is given, the layer name from Tiled. + * @param tileset The tileset, or an array of tilesets, used to render this layer. Can be a string or a Tileset object. + * @param x The x position to place the layer in the world. If not specified, it will default to the layer offset from Tiled or 0. Default 0. + * @param y The y position to place the layer in the world. If not specified, it will default to the layer offset from Tiled or 0. Default 0. + */ + createLayer(layerID: number | string, tileset: string | string[] | Phaser.Tilemaps.Tileset | Phaser.Tilemaps.Tileset[], x?: number, y?: number): Phaser.Tilemaps.TilemapLayer | null; + + /** + * This method will iterate through all of the objects defined in a Tiled Object Layer and then + * convert the matching results into Phaser Game Objects (by default, Sprites) + * + * Objects are matched on one of 4 criteria: The Object ID, the Object GID, the Object Name, or the Object Type. + * + * Within Tiled, Object IDs are unique per Object. Object GIDs, however, are shared by all objects + * using the same image. Finally, Object Names and Types are strings and the same name can be used on multiple + * Objects in Tiled, they do not have to be unique; Names are specific to Objects while Types can be inherited + * from Object GIDs using the same image. + * + * You set the configuration parameter accordingly, based on which type of criteria you wish + * to match against. For example, to convert all items on an Object Layer with a `gid` of 26: + * + * ```javascript + * createFromObjects(layerName, { + * gid: 26 + * }); + * ``` + * + * Or, to convert objects with the name 'bonus': + * + * ```javascript + * createFromObjects(layerName, { + * name: 'bonus' + * }); + * ``` + * + * Or, to convert an object with a specific id: + * + * ```javascript + * createFromObjects(layerName, { + * id: 9 + * }); + * ``` + * + * You should only specify either `id`, `gid`, `name`, `type`, or none of them. Do not add more than + * one criteria to your config. If you do not specify any criteria, then _all_ objects in the + * Object Layer will be converted. + * + * By default this method will convert Objects into {@link Phaser.GameObjects.Sprite} instances, but you can override + * this by providing your own class type: + * + * ```javascript + * createFromObjects(layerName, { + * gid: 26, + * classType: Coin + * }); + * ``` + * + * This will convert all Objects with a gid of 26 into your custom `Coin` class. You can pass + * any class type here, but it _must_ extend {@link Phaser.GameObjects.GameObject} as its base class. + * Your class will always be passed 1 parameter: `scene`, which is a reference to either the Scene + * specified in the config object or, if not given, the Scene to which this Tilemap belongs. The + * class must have {@link Phaser.GameObjects.Components.Transform#setPosition setPosition} and + * {@link Phaser.GameObjects.Components.Texture#setTexture setTexture} methods. + * + * This method will set the following Tiled Object properties on the new Game Object: + * + * - `flippedHorizontal` as `flipX` + * - `flippedVertical` as `flipY` + * - `height` as `displayHeight` + * - `name` + * - `rotation` + * - `visible` + * - `width` as `displayWidth` + * - `x`, adjusted for origin + * - `y`, adjusted for origin + * + * Additionally, this method will set Tiled Object custom properties + * + * - on the Game Object, if it has the same property name and a value that isn't `undefined`; or + * - on the Game Object's {@link Phaser.GameObjects.GameObject#data data store} otherwise. + * + * For example, a Tiled Object with custom properties `{ alpha: 0.5, gold: 1 }` will be created as a Game + * Object with an `alpha` value of 0.5 and a `data.values.gold` value of 1. + * + * When `useTileset` is `true` (the default), Tile Objects will inherit the texture and any tile properties + * from the tileset, and the local tile ID will be used as the texture frame. For the frame selection to work + * you need to load the tileset texture as a spritesheet so its frame names match the local tile IDs. + * + * For instance, a tileset tile + * + * ``` + * { id: 3, type: 'treadmill', speed: 4 } + * ``` + * + * with gid 19 and an object + * + * ``` + * { id: 7, gid: 19, speed: 5, rotation: 90 } + * ``` + * + * will be interpreted as + * + * ``` + * { id: 7, gid: 19, speed: 5, rotation: 90, type: 'treadmill', texture: '[the tileset texture]', frame: 3 } + * ``` + * + * You can suppress this behavior by setting the boolean `ignoreTileset` for each `config` that should ignore + * object gid tilesets. + * + * You can set a `container` property in the config. If given, the new Game Object will be added to + * the Container or Layer instance instead of the Scene. + * + * You can set named texture-`key` and texture-`frame` properties, which will be set on the new Game Object. + * + * Finally, you can provide an array of config objects, to convert multiple types of object in + * a single call: + * + * ```javascript + * createFromObjects(layerName, [ + * { + * gid: 26, + * classType: Coin + * }, + * { + * id: 9, + * classType: BossMonster + * }, + * { + * name: 'lava', + * classType: LavaTile + * }, + * { + * type: 'endzone', + * classType: Phaser.GameObjects.Zone + * } + * ]); + * ``` + * + * The signature of this method changed significantly in v3.60.0. Prior to this, it did not take config objects. + * @param objectLayerName The name of the Tiled object layer to create the Game Objects from. + * @param config A CreateFromObjects configuration object, or an array of them. + * @param useTileset True if objects that set gids should also search the underlying tile for properties and data. Default true. + */ + createFromObjects(objectLayerName: string, config: Phaser.Types.Tilemaps.CreateFromObjectLayerConfig | Phaser.Types.Tilemaps.CreateFromObjectLayerConfig[], useTileset?: boolean): Phaser.GameObjects.GameObject[]; + + /** + * Creates a Sprite for every tile matching the given tile indexes in the layer. You can + * optionally specify if each tile will be replaced with a new tile after the Sprite has been + * created. Set this value to -1 if you want to just remove the tile after conversion. + * + * This is useful if you want to lay down special tiles in a level that are converted to + * Sprites, but want to replace the tile itself with a floor tile or similar once converted. + * + * The following features were added in Phaser v3.80: + * + * By default, Phaser Sprites have their origin set to 0.5 x 0.5. If you don't specify a new + * origin in the spriteConfig, then it will adjust the sprite positions by half the tile size, + * to position them accurately on the map. + * + * When the Sprite is created it will copy the following properties from the tile: + * + * 'rotation', 'flipX', 'flipY', 'alpha', 'visible' and 'tint'. + * + * The spriteConfig also has a special property called `useSpriteSheet`. If this is set to + * `true` and you have loaded the tileset as a sprite sheet (not an image), then it will + * set the Sprite key and frame to match the sprite texture and tile index. + * @param indexes The tile index, or array of indexes, to create Sprites from. + * @param replacements The tile index, or array of indexes, to change a converted + * tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a + * one-to-one mapping with the indexes array. + * @param spriteConfig The config object to pass into the Sprite creator (i.e. scene.make.sprite). + * @param scene The Scene to create the Sprites within. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + createFromTiles(indexes: number | any[], replacements: number | any[] | undefined, spriteConfig?: Phaser.Types.GameObjects.Sprite.SpriteConfig, scene?: Phaser.Scene, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.GameObjects.Sprite[] | null; + + /** + * Sets the tiles in the given rectangular area (in tile coordinates) of the layer with the + * specified index. Tiles will be set to collide if the given index is a colliding index. + * Collision information in the region will be recalculated. + * + * If no layer specified, the map's current layer is used. + * This cannot be applied to StaticTilemapLayers. + * @param index The tile index to fill the area with. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + * @param layer The tile layer to use. If not given the current layer is used. + */ + fill(index: number, tileX?: number, tileY?: number, width?: number, height?: number, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * For each object in the given object layer, run the given filter callback function. Any + * objects that pass the filter test (i.e. where the callback returns true) will be returned in a + * new array. Similar to Array.prototype.Filter in vanilla JS. + * @param objectLayer The name of an object layer (from Tiled) or an ObjectLayer instance. + * @param callback The callback. Each object in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + */ + filterObjects(objectLayer: Phaser.Tilemaps.ObjectLayer | string, callback: TilemapFilterCallback, context?: object): Phaser.Types.Tilemaps.TiledObject[] | null; + + /** + * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given + * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns + * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS. + * If no layer specified, the map's current layer is used. + * @param callback The callback. Each tile in the given area will be passed to this + * callback as the first and only parameter. The callback should return true for tiles that pass the + * filter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The tile layer to use. If not given the current layer is used. + */ + filterTiles(callback: Function, context?: object, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile[] | null; + + /** + * Searches the entire map layer for the first tile matching the given index, then returns that Tile + * object. If no match is found, it returns null. The search starts from the top-left tile and + * continues horizontally until it hits the end of the row, then it drops down to the next column. + * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to + * the top-left. + * If no layer specified, the map's current layer is used. + * @param index The tile index value to search for. + * @param skip The number of times to skip a matching tile before returning. Default 0. + * @param reverse If true it will scan the layer in reverse, starting at the bottom-right. Otherwise it scans from the top-left. Default false. + * @param layer The tile layer to use. If not given the current layer is used. + */ + findByIndex(index: number, skip?: number, reverse?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Find the first object in the given object layer that satisfies the provided testing function. + * I.e. finds the first object for which `callback` returns true. Similar to + * Array.prototype.find in vanilla JS. + * @param objectLayer The name of an object layer (from Tiled) or an ObjectLayer instance. + * @param callback The callback. Each object in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + */ + findObject(objectLayer: Phaser.Tilemaps.ObjectLayer | string, callback: TilemapFindCallback, context?: object): Phaser.Types.Tilemaps.TiledObject | null; + + /** + * Find the first tile in the given rectangular area (in tile coordinates) of the layer that + * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns + * true. Similar to Array.prototype.find in vanilla JS. + * If no layer specified, the maps current layer is used. + * @param callback The callback. Each tile in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to search. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to search. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The Tile layer to run the search on. If not provided will use the current layer. + */ + findTile(callback: FindTileCallback, context?: object, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given + * callback. Similar to Array.prototype.forEach in vanilla JS. + * + * If no layer specified, the map's current layer is used. + * @param callback The callback. Each tile in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to search. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to search. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The Tile layer to run the search on. If not provided will use the current layer. + */ + forEachTile(callback: EachTileCallback, context?: object, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Gets the image layer index based on its name. + * @param name The name of the image to get. + */ + getImageIndex(name: string): number; + + /** + * Return a list of all valid imagelayer names loaded in this Tilemap. + */ + getImageLayerNames(): string[]; + + /** + * Internally used. Returns the index of the object in one of the Tilemaps arrays whose name + * property matches the given `name`. + * @param location The Tilemap array to search. + * @param name The name of the array element to get. + */ + getIndex(location: any[], name: string): number; + + /** + * Gets the LayerData from `this.layers` that is associated with the given `layer`, or null if the layer is invalid. + * @param layer The name of the layer from Tiled, the index of the layer in the map or Tilemap Layer. If not given will default to the maps current layer index. + */ + getLayer(layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.LayerData | null; + + /** + * Gets the ObjectLayer from `this.objects` that has the given `name`, or null if no ObjectLayer is found with that name. + * @param name The name of the object layer from Tiled. + */ + getObjectLayer(name?: string): Phaser.Tilemaps.ObjectLayer | null; + + /** + * Return a list of all valid objectgroup names loaded in this Tilemap. + */ + getObjectLayerNames(): string[]; + + /** + * Gets the LayerData index of the given `layer` within this.layers, or null if an invalid + * `layer` is given. + * @param layer The name of the layer from Tiled, the index of the layer in the map or a Tilemap Layer. If not given will default to the map's current layer index. + */ + getLayerIndex(layer?: string | number | Phaser.Tilemaps.TilemapLayer): number; + + /** + * Gets the index of the LayerData within this.layers that has the given `name`, or null if an + * invalid `name` is given. + * @param name The name of the layer to get. + */ + getLayerIndexByName(name: string): number; + + /** + * Gets a tile at the given tile coordinates from the given layer. + * + * If no layer is specified, the maps current layer is used. + * @param tileX X position to get the tile from (given in tile units, not pixels). + * @param tileY Y position to get the tile from (given in tile units, not pixels). + * @param nonNull If true getTile won't return null for empty tiles, but a Tile object with an index of -1. + * @param layer The tile layer to use. If not given the current layer is used. + */ + getTileAt(tileX: number, tileY: number, nonNull?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Gets a tile at the given world coordinates from the given layer. + * + * If no layer is specified, the maps current layer is used. + * @param worldX X position to get the tile from (given in pixels) + * @param worldY Y position to get the tile from (given in pixels) + * @param nonNull If true, function won't return null for empty tiles, but a Tile object with an index of -1. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + getTileAtWorldXY(worldX: number, worldY: number, nonNull?: boolean, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Return a list of all valid tilelayer names loaded in this Tilemap. + */ + getTileLayerNames(): string[]; + + /** + * Gets the tiles in the given rectangular area (in tile coordinates) of the layer. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The tile layer to use. If not given the current layer is used. + */ + getTilesWithin(tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile[] | null; + + /** + * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle, + * Line, Rectangle or Triangle. The shape should be in world coordinates. + * + * If no layer is specified, the maps current layer is used. + * @param shape A shape in world (pixel) coordinates + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param camera The Camera to use when factoring in which tiles to return. + * @param layer The tile layer to use. If not given the current layer is used. + */ + getTilesWithinShape(shape: Phaser.Geom.Circle | Phaser.Geom.Line | Phaser.Geom.Rectangle | Phaser.Geom.Triangle, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile[] | null; + + /** + * Gets the tiles in the given rectangular area (in world coordinates) of the layer. + * + * If no layer is specified, the maps current layer is used. + * @param worldX The world x coordinate for the top-left of the area. + * @param worldY The world y coordinate for the top-left of the area. + * @param width The width of the area. + * @param height The height of the area. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param camera The Camera to use when factoring in which tiles to return. + * @param layer The tile layer to use. If not given the current layer is used. + */ + getTilesWithinWorldXY(worldX: number, worldY: number, width: number, height: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile[] | null; + + /** + * Gets the Tileset that has the given `name`, or null if an invalid `name` is given. + * @param name The name of the Tileset to get. + */ + getTileset(name: string): Phaser.Tilemaps.Tileset | null; + + /** + * Gets the index of the Tileset within this.tilesets that has the given `name`, or null if an + * invalid `name` is given. + * @param name The name of the Tileset to get. + */ + getTilesetIndex(name: string): number; + + /** + * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns + * false if there is no tile or if the tile at that location has an index of -1. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param layer The tile layer to use. If not given the current layer is used. + */ + hasTileAt(tileX: number, tileY: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): boolean | null; + + /** + * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns + * false if there is no tile or if the tile at that location has an index of -1. + * + * If no layer is specified, the maps current layer is used. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param camera The Camera to use when factoring in which tiles to return. + * @param layer The tile layer to use. If not given the current layer is used. + */ + hasTileAtWorldXY(worldX: number, worldY: number, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): boolean | null; + + /** + * The LayerData object that is currently selected in the map. You can set this property using + * any type supported by setLayer. + */ + layer: Phaser.Tilemaps.LayerData; + + /** + * Puts a tile at the given tile coordinates in the specified layer. You can pass in either an index + * or a Tile object. If you pass in a Tile, all attributes will be copied over to the specified + * location. If you pass in an index, only the index at the specified location will be changed. + * Collision information will be recalculated at the specified location. + * + * If no layer is specified, the maps current layer is used. + * @param tile The index of this tile to set or a Tile object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The tile layer to use. If not given the current layer is used. + */ + putTileAt(tile: number | Phaser.Tilemaps.Tile, tileX: number, tileY: number, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Puts a tile at the given world coordinates (pixels) in the specified layer. You can pass in either + * an index or a Tile object. If you pass in a Tile, all attributes will be copied over to the + * specified location. If you pass in an index, only the index at the specified location will be + * changed. Collision information will be recalculated at the specified location. + * + * If no layer is specified, the maps current layer is used. + * @param tile The index of this tile to set or a Tile object. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + putTileAtWorldXY(tile: number | Phaser.Tilemaps.Tile, worldX: number, worldY: number, recalculateFaces?: boolean, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Puts an array of tiles or a 2D array of tiles at the given tile coordinates in the specified + * layer. The array can be composed of either tile indexes or Tile objects. If you pass in a Tile, + * all attributes will be copied over to the specified location. If you pass in an index, only the + * index at the specified location will be changed. Collision information will be recalculated + * within the region tiles were changed. + * + * If no layer is specified, the maps current layer is used. + * @param tile A row (array) or grid (2D array) of Tiles or tile indexes to place. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The tile layer to use. If not given the current layer is used. + */ + putTilesAt(tile: number[] | number[][] | Phaser.Tilemaps.Tile[] | Phaser.Tilemaps.Tile[][], tileX: number, tileY: number, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the + * specified layer. Each tile will receive a new index. If an array of indexes is passed in, then + * those will be used for randomly assigning new tile indexes. If an array is not provided, the + * indexes found within the region (excluding -1) will be used for randomly assigning new tile + * indexes. This method only modifies tile indexes and does not change collision information. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param indexes An array of indexes to randomly draw from during randomization. + * @param layer The tile layer to use. If not given the current layer is used. + */ + randomize(tileX?: number, tileY?: number, width?: number, height?: number, indexes?: number[], layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting + * faces are used internally for optimizing collisions against tiles. This method is mostly used + * internally to optimize recalculating faces when only one tile has been changed. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param layer The tile layer to use. If not given the current layer is used. + */ + calculateFacesAt(tileX: number, tileY: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the + * layer. Interesting faces are used internally for optimizing collisions against tiles. This method + * is mostly used internally. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The tile layer to use. If not given the current layer is used. + */ + calculateFacesWithin(tileX?: number, tileY?: number, width?: number, height?: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Removes the given TilemapLayer from this Tilemap without destroying it. + * + * If no layer is specified, the maps current layer is used. + * @param layer The tile layer to be removed. + */ + removeLayer(layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Destroys the given TilemapLayer and removes it from this Tilemap. + * + * If no layer is specified, the maps current layer is used. + * @param layer The tile layer to be destroyed. + */ + destroyLayer(layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Removes all Tilemap Layers from this Tilemap and calls `destroy` on each of them. + */ + removeAllLayers(): this; + + /** + * Removes the given Tile, or an array of Tiles, from the layer to which they belong, + * and optionally recalculates the collision information. + * @param tiles The Tile to remove, or an array of Tiles. + * @param replaceIndex After removing the Tile, insert a brand new Tile into its location with the given index. Leave as -1 to just remove the tile. Default -1. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + */ + removeTile(tiles: Phaser.Tilemaps.Tile | Phaser.Tilemaps.Tile[], replaceIndex?: number, recalculateFaces?: boolean): Phaser.Tilemaps.Tile[]; + + /** + * Removes the tile at the given tile coordinates in the specified layer and updates the layers collision information. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param replaceWithNull If `true` (the default), this will replace the tile at the specified location with null instead of a Tile with an index of -1. + * @param recalculateFaces If `true` (the default), the faces data will be recalculated. + * @param layer The tile layer to use. If not given the current layer is used. + */ + removeTileAt(tileX: number, tileY: number, replaceWithNull?: boolean, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Removes the tile at the given world coordinates in the specified layer and updates the layers collision information. + * + * If no layer is specified, the maps current layer is used. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param replaceWithNull If `true` (the default), this will replace the tile at the specified location with null instead of a Tile with an index of -1. + * @param recalculateFaces If `true` (the default), the faces data will be recalculated. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + removeTileAtWorldXY(worldX: number, worldY: number, replaceWithNull?: boolean, recalculateFaces?: boolean, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Draws a debug representation of the layer to the given Graphics object. This is helpful when you want to + * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles + * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation + * wherever you want on the screen. + * + * If no layer is specified, the maps current layer is used. + * + * **Note:** This method currently only works with orthogonal tilemap layers. + * @param graphics The target Graphics object to draw upon. + * @param styleConfig An object specifying the colors to use for the debug drawing. + * @param layer The tile layer to use. If not given the current layer is used. + */ + renderDebug(graphics: Phaser.GameObjects.Graphics, styleConfig?: Phaser.Types.Tilemaps.StyleConfig, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Draws a debug representation of all layers within this Tilemap to the given Graphics object. + * + * This is helpful when you want to get a quick idea of which of your tiles are colliding and which + * have interesting faces. The tiles are drawn starting at (0, 0) in the Graphics, allowing you to + * place the debug representation wherever you want on the screen. + * @param graphics The target Graphics object to draw upon. + * @param styleConfig An object specifying the colors to use for the debug drawing. + */ + renderDebugFull(graphics: Phaser.GameObjects.Graphics, styleConfig?: Phaser.Types.Tilemaps.StyleConfig): this; + + /** + * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching + * `findIndex` and updates their index to match `newIndex`. This only modifies the index and does + * not change collision information. + * + * If no layer is specified, the maps current layer is used. + * @param findIndex The index of the tile to search for. + * @param newIndex The index of the tile to replace it with. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The tile layer to use. If not given the current layer is used. + */ + replaceByIndex(findIndex: number, newIndex: number, tileX?: number, tileY?: number, width?: number, height?: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets collision on the given tile or tiles within a layer by index. You can pass in either a + * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if + * collision will be enabled (true) or disabled (false). + * + * If no layer is specified, the maps current layer is used. + * @param indexes Either a single tile index, or an array of tile indexes. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The tile layer to use. If not given the current layer is used. + * @param updateLayer If true, updates the current tiles on the layer. Set to false if no tiles have been placed for significant performance boost. Default true. + */ + setCollision(indexes: number | any[], collides?: boolean, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer, updateLayer?: boolean): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets collision on a range of tiles in a layer whose index is between the specified `start` and + * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set + * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be + * enabled (true) or disabled (false). + * + * If no layer is specified, the maps current layer is used. + * @param start The first index of the tile to be set for collision. + * @param stop The last index of the tile to be set for collision. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The tile layer to use. If not given the current layer is used. + */ + setCollisionBetween(start: number, stop: number, collides?: boolean, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property + * that matches the given properties object, its collision flag will be set. The `collides` + * parameter controls if collision will be enabled (true) or disabled (false). Passing in + * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that + * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can + * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a + * "types" property that matches any of those values, its collision flag will be updated. + * + * If no layer is specified, the maps current layer is used. + * @param properties An object with tile properties and corresponding values that should be checked. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The tile layer to use. If not given the current layer is used. + */ + setCollisionByProperty(properties: object, collides?: boolean, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets collision on all tiles in the given layer, except for tiles that have an index specified in + * the given array. The `collides` parameter controls if collision will be enabled (true) or + * disabled (false). Tile indexes not currently in the layer are not affected. + * + * If no layer is specified, the maps current layer is used. + * @param indexes An array of the tile indexes to not be counted for collision. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The tile layer to use. If not given the current layer is used. + */ + setCollisionByExclusion(indexes: number[], collides?: boolean, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets collision on the tiles within a layer by checking each tiles collision group data + * (typically defined in Tiled within the tileset collision editor). If any objects are found within + * a tiles collision group, the tiles colliding information will be set. The `collides` parameter + * controls if collision will be enabled (true) or disabled (false). + * + * If no layer is specified, the maps current layer is used. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The tile layer to use. If not given the current layer is used. + */ + setCollisionFromCollisionGroup(collides?: boolean, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets a global collision callback for the given tile index within the layer. This will affect all + * tiles on this layer that have the same index. If a callback is already set for the tile index it + * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile + * at a specific location on the map then see `setTileLocationCallback`. + * + * If no layer is specified, the maps current layer is used. + * @param indexes Either a single tile index, or an array of tile indexes to have a collision callback set for. All values should be integers. + * @param callback The callback that will be invoked when the tile is collided with. + * @param callbackContext The context under which the callback is called. + * @param layer The tile layer to use. If not given the current layer is used. + */ + setTileIndexCallback(indexes: number | number[], callback: Function, callbackContext: object, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets a collision callback for the given rectangular area (in tile coordinates) within the layer. + * If a callback is already set for the tile index it will be replaced. Set the callback to null to + * remove it. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param callback The callback that will be invoked when the tile is collided with. + * @param callbackContext The context under which the callback is called. + * @param layer The tile layer to use. If not given the current layer is used. + */ + setTileLocationCallback(tileX: number, tileY: number, width: number, height: number, callback: Function, callbackContext?: object, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets the current layer to the LayerData associated with `layer`. + * @param layer The name of the layer from Tiled, the index of the layer in the map or a TilemapLayer. If not given will default to the maps current layer index. + */ + setLayer(layer?: string | number | Phaser.Tilemaps.TilemapLayer): this; + + /** + * Sets the base tile size for the map. Note: this does not necessarily match the tileWidth and + * tileHeight for all layers. This also updates the base size on all tiles across all layers. + * @param tileWidth The width of the tiles the map uses for calculations. + * @param tileHeight The height of the tiles the map uses for calculations. + */ + setBaseTileSize(tileWidth: number, tileHeight: number): this; + + /** + * Sets the tile size for a specific `layer`. Note: this does not necessarily match the maps + * tileWidth and tileHeight for all layers. This will set the tile size for the layer and any + * tiles the layer has. + * @param tileWidth The width of the tiles (in pixels) in the layer. + * @param tileHeight The height of the tiles (in pixels) in the layer. + * @param layer The name of the layer from Tiled, the index of the layer in the map or a TilemapLayer. If not given will default to the maps current layer index. + */ + setLayerTileSize(tileWidth: number, tileHeight: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): this; + + /** + * Shuffles the tiles in a rectangular region (specified in tile coordinates) within the given + * layer. It will only randomize the tiles in that area, so if they're all the same nothing will + * appear to have changed! This method only modifies tile indexes and does not change collision + * information. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The tile layer to use. If not given the current layer is used. + */ + shuffle(tileX?: number, tileY?: number, width?: number, height?: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching + * `indexA` and swaps then with `indexB`. This only modifies the index and does not change collision + * information. + * + * If no layer is specified, the maps current layer is used. + * @param tileA First tile index. + * @param tileB Second tile index. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The tile layer to use. If not given the current layer is used. + */ + swapByIndex(tileA: number, tileB: number, tileX?: number, tileY?: number, width?: number, height?: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the + * layers position, scale and scroll. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The x coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + tileToWorldX(tileX: number, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): number | null; + + /** + * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the + * layers position, scale and scroll. + * + * If no layer is specified, the maps current layer is used. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + tileToWorldY(tileY: number, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): number | null; + + /** + * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the + * layers position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param vec2 A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + tileToWorldXY(tileX: number, tileY: number, vec2?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Math.Vector2 | null; + + /** + * Returns an array of Vector2s where each entry corresponds to the corner of the requested tile. + * + * The `tileX` and `tileY` parameters are in tile coordinates, not world coordinates. + * + * The corner coordinates are in world space, having factored in TilemapLayer scale, position + * and the camera, if given. + * + * The size of the array will vary based on the orientation of the map. For example an + * orthographic map will return an array of 4 vectors, where-as a hexagonal map will, + * of course, return an array of 6 corner vectors. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + getTileCorners(tileX: number, tileY: number, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Math.Vector2[] | null; + + /** + * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the + * specified layer. Each tile will receive a new index. New indexes are drawn from the given + * weightedIndexes array. An example weighted array: + * + * [ + * { index: 6, weight: 4 }, // Probability of index 6 is 4 / 8 + * { index: 7, weight: 2 }, // Probability of index 7 would be 2 / 8 + * { index: 8, weight: 1.5 }, // Probability of index 8 would be 1.5 / 8 + * { index: 26, weight: 0.5 } // Probability of index 27 would be 0.5 / 8 + * ] + * + * The probability of any index being picked is (the indexs weight) / (sum of all weights). This + * method only modifies tile indexes and does not change collision information. + * + * If no layer is specified, the maps current layer is used. + * @param weightedIndexes An array of objects to randomly draw from during randomization. They should be in the form: { index: 0, weight: 4 } or { index: [0, 1], weight: 4 } if you wish to draw from multiple tile indexes. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The tile layer to use. If not given the current layer is used. + */ + weightedRandomize(weightedIndexes: object[], tileX?: number, tileY?: number, width?: number, height?: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the + * layers position, scale and scroll. + * + * If no layer is specified, the maps current layer is used. + * + * You cannot call this method for Isometric or Hexagonal tilemaps as they require + * both `worldX` and `worldY` values to determine the correct tile, instead you + * should use the `worldToTileXY` method. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + worldToTileX(worldX: number, snapToFloor?: boolean, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): number | null; + + /** + * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the + * layers position, scale and scroll. + * + * If no layer is specified, the maps current layer is used. + * + * You cannot call this method for Isometric or Hexagonal tilemaps as they require + * both `worldX` and `worldY` values to determine the correct tile, instead you + * should use the `worldToTileXY` method. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + worldToTileY(worldY: number, snapToFloor?: boolean, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): number | null; + + /** + * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the + * layers position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * + * If no layer is specified, the maps current layer is used. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param vec2 A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + worldToTileXY(worldX: number, worldY: number, snapToFloor?: boolean, vec2?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Math.Vector2 | null; + + /** + * Removes all layer data from this Tilemap and nulls the scene reference. This will destroy any + * TilemapLayers that have been created. + */ + destroy(): void; + + } + + /** + * A Tilemap Layer is a Game Object that renders LayerData from a Tilemap when used in combination + * with one, or more, Tilesets. + */ + class TilemapLayer extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.ComputedSize, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible, Phaser.Physics.Arcade.Components.Collision { + /** + * + * @param scene The Scene to which this Game Object belongs. + * @param tilemap The Tilemap this layer is a part of. + * @param layerIndex The index of the LayerData associated with this layer. + * @param tileset The tileset, or an array of tilesets, used to render this layer. Can be a string or a Tileset object. + * @param x The world x position where the top left of this layer will be placed. Default 0. + * @param y The world y position where the top left of this layer will be placed. Default 0. + */ + constructor(scene: Phaser.Scene, tilemap: Phaser.Tilemaps.Tilemap, layerIndex: number, tileset: string | string[] | Phaser.Tilemaps.Tileset | Phaser.Tilemaps.Tileset[], x?: number, y?: number); + + /** + * Used internally by physics system to perform fast type checks. + */ + readonly isTilemap: boolean; + + /** + * The Tilemap that this layer is a part of. + */ + tilemap: Phaser.Tilemaps.Tilemap; + + /** + * The index of the LayerData associated with this layer. + */ + layerIndex: number; + + /** + * The LayerData associated with this layer. LayerData can only be associated with one + * tilemap layer. + */ + layer: Phaser.Tilemaps.LayerData; + + /** + * An array of `Tileset` objects associated with this layer. + */ + tileset: Phaser.Tilemaps.Tileset[]; + + /** + * The total number of tiles drawn by the renderer in the last frame. + */ + readonly tilesDrawn: number; + + /** + * The total number of tiles in this layer. Updated every frame. + */ + readonly tilesTotal: number; + + /** + * Used internally during rendering. This holds the tiles that are visible within the Camera. + */ + culledTiles: Phaser.Tilemaps.Tile[]; + + /** + * You can control if the camera should cull tiles on this layer before rendering them or not. + * + * By default the camera will try to cull the tiles in this layer, to avoid over-drawing to the renderer. + * + * However, there are some instances when you may wish to disable this, and toggling this flag allows + * you to do so. Also see `setSkipCull` for a chainable method that does the same thing. + */ + skipCull: boolean; + + /** + * The amount of extra tiles to add into the cull rectangle when calculating its horizontal size. + * + * See the method `setCullPadding` for more details. + */ + cullPaddingX: number; + + /** + * The amount of extra tiles to add into the cull rectangle when calculating its vertical size. + * + * See the method `setCullPadding` for more details. + */ + cullPaddingY: number; + + /** + * The callback that is invoked when the tiles are culled. + * + * It will call a different function based on the map orientation: + * + * Orthogonal (the default) is `TilemapComponents.CullTiles` + * Isometric is `TilemapComponents.IsometricCullTiles` + * Hexagonal is `TilemapComponents.HexagonalCullTiles` + * Staggered is `TilemapComponents.StaggeredCullTiles` + * + * However, you can override this to call any function you like. + * + * It will be sent 4 arguments: + * + * 1. The Phaser.Tilemaps.LayerData object for this Layer + * 2. The Camera that is culling the layer. You can check its `dirty` property to see if it has changed since the last cull. + * 3. A reference to the `culledTiles` array, which should be used to store the tiles you want rendered. + * 4. The Render Order constant. + * + * See the `TilemapComponents.CullTiles` source code for details on implementing your own culling system. + */ + cullCallback: Function; + + /** + * An array holding the mapping between the tile indexes and the tileset they belong to. + */ + gidMap: Phaser.Tilemaps.Tileset[]; + + /** + * The Tilemap Layer Collision Category. + * + * This is exclusively used by the Arcade Physics system. + * + * This can be set to any valid collision bitfield value. + * + * See the `setCollisionCategory` method for more details. + */ + collisionCategory: number; + + /** + * The Tilemap Layer Collision Mask. + * + * This is exclusively used by the Arcade Physics system. + * + * See the `setCollidesWith` method for more details. + */ + collisionMask: number; + + /** + * The horizontal origin of this Tilemap Layer. + */ + readonly originX: number; + + /** + * The vertical origin of this Tilemap Layer. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Tilemap Layer. + */ + readonly displayOriginX: number; + + /** + * The vertical display origin of this Tilemap Layer. + */ + readonly displayOriginY: number; + + /** + * Sets the rendering (draw) order of the tiles in this layer. + * + * The default is 'right-down', meaning it will order the tiles starting from the top-left, + * drawing to the right and then moving down to the next row. + * + * The draw orders are: + * + * 0 = right-down + * 1 = left-down + * 2 = right-up + * 3 = left-up + * + * Setting the render order does not change the tiles or how they are stored in the layer, + * it purely impacts the order in which they are rendered. + * + * You can provide either an integer (0 to 3), or the string version of the order. + * @param renderOrder The render (draw) order value. Either an integer between 0 and 3, or a string: 'right-down', 'left-down', 'right-up' or 'left-up'. + */ + setRenderOrder(renderOrder: number | string): this; + + /** + * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting + * faces are used internally for optimizing collisions against tiles. This method is mostly used + * internally to optimize recalculating faces when only one tile has been changed. + * @param tileX The x coordinate. + * @param tileY The y coordinate. + */ + calculateFacesAt(tileX: number, tileY: number): this; + + /** + * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the + * layer. Interesting faces are used internally for optimizing collisions against tiles. This method + * is mostly used internally. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + */ + calculateFacesWithin(tileX?: number, tileY?: number, width?: number, height?: number): this; + + /** + * Creates a Sprite for every object matching the given tile indexes in the layer. You can + * optionally specify if each tile will be replaced with a new tile after the Sprite has been + * created. This is useful if you want to lay down special tiles in a level that are converted to + * Sprites, but want to replace the tile itself with a floor tile or similar once converted. + * @param indexes The tile index, or array of indexes, to create Sprites from. + * @param replacements The tile index, or array of indexes, to change a converted + * tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a + * one-to-one mapping with the indexes array. + * @param spriteConfig The config object to pass into the Sprite creator (i.e. + * scene.make.sprite). + * @param scene The Scene to create the Sprites within. + * @param camera The Camera to use when determining the world XY + */ + createFromTiles(indexes: number | any[], replacements: number | any[] | undefined, spriteConfig?: Phaser.Types.GameObjects.Sprite.SpriteConfig, scene?: Phaser.Scene, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.GameObjects.Sprite[]; + + /** + * Returns the tiles in the given layer that are within the cameras viewport. + * This is used internally during rendering. + * @param camera The Camera to run the cull check against. + */ + cull(camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile[]; + + /** + * Copies the tiles in the source rectangular area to a new destination (all specified in tile + * coordinates) within the layer. This copies all tile properties & recalculates collision + * information in the destination region. + * @param srcTileX The x coordinate of the area to copy from, in tiles, not pixels. + * @param srcTileY The y coordinate of the area to copy from, in tiles, not pixels. + * @param width The width of the area to copy, in tiles, not pixels. + * @param height The height of the area to copy, in tiles, not pixels. + * @param destTileX The x coordinate of the area to copy to, in tiles, not pixels. + * @param destTileY The y coordinate of the area to copy to, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + */ + copy(srcTileX: number, srcTileY: number, width: number, height: number, destTileX: number, destTileY: number, recalculateFaces?: boolean): this; + + /** + * Sets the tiles in the given rectangular area (in tile coordinates) of the layer with the + * specified index. Tiles will be set to collide if the given index is a colliding index. + * Collision information in the region will be recalculated. + * @param index The tile index to fill the area with. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + */ + fill(index: number, tileX?: number, tileY?: number, width?: number, height?: number, recalculateFaces?: boolean): this; + + /** + * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given + * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns + * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS. + * @param callback The callback. Each tile in the given area will be passed to this + * callback as the first and only parameter. The callback should return true for tiles that pass the + * filter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + */ + filterTiles(callback: Function, context?: object, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions): Phaser.Tilemaps.Tile[]; + + /** + * Searches the entire map layer for the first tile matching the given index, then returns that Tile + * object. If no match is found, it returns null. The search starts from the top-left tile and + * continues horizontally until it hits the end of the row, then it drops down to the next column. + * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to + * the top-left. + * @param index The tile index value to search for. + * @param skip The number of times to skip a matching tile before returning. Default 0. + * @param reverse If true it will scan the layer in reverse, starting at the bottom-right. Otherwise it scans from the top-left. Default false. + */ + findByIndex(index: number, skip?: number, reverse?: boolean): Phaser.Tilemaps.Tile; + + /** + * Find the first tile in the given rectangular area (in tile coordinates) of the layer that + * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns + * true. Similar to Array.prototype.find in vanilla JS. + * @param callback The callback. Each tile in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to search. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to search. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + */ + findTile(callback: FindTileCallback, context?: object, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions): Phaser.Tilemaps.Tile | null; + + /** + * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given + * callback. Similar to Array.prototype.forEach in vanilla JS. + * @param callback The callback. Each tile in the given area will be passed to this callback as the first and only parameter. + * @param context The context, or scope, under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to search. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to search. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + */ + forEachTile(callback: EachTileCallback, context?: object, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions): this; + + /** + * Sets an additive tint on each Tile within the given area. + * + * The tint works by taking the pixel color values from the tileset texture, and then + * multiplying it by the color value of the tint. + * + * If no area values are given then all tiles will be tinted to the given color. + * + * To remove a tint call this method with either no parameters, or by passing white `0xffffff` as the tint color. + * + * If a tile already has a tint set then calling this method will override that. + * @param tint The tint color being applied to each tile within the region. Given as a hex value, i.e. `0xff0000` for red. Set to white (`0xffffff`) to reset the tint. Default 0xffffff. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to search. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to search. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + */ + setTint(tint?: number, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions): this; + + /** + * Sets a fill-based tint on each Tile within the given area. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. + * + * If no area values are given then all tiles will be tinted to the given color. + * + * To remove a tint call this method with either no parameters, or by passing white `0xffffff` as the tint color. + * + * If a tile already has a tint set then calling this method will override that. + * @param tint The tint color being applied to each tile within the region. Given as a hex value, i.e. `0xff0000` for red. Set to white (`0xffffff`) to reset the tint. Default 0xffffff. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to search. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to search. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + */ + setTintFill(tint?: number, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions): this; + + /** + * Gets a tile at the given tile coordinates from the given layer. + * @param tileX X position to get the tile from (given in tile units, not pixels). + * @param tileY Y position to get the tile from (given in tile units, not pixels). + * @param nonNull If true getTile won't return null for empty tiles, but a Tile object with an index of -1. Default false. + */ + getTileAt(tileX: number, tileY: number, nonNull?: boolean): Phaser.Tilemaps.Tile; + + /** + * Gets a tile at the given world coordinates from the given layer. + * @param worldX X position to get the tile from (given in pixels) + * @param worldY Y position to get the tile from (given in pixels) + * @param nonNull If true, function won't return null for empty tiles, but a Tile object with an index of -1. Default false. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + getTileAtWorldXY(worldX: number, worldY: number, nonNull?: boolean, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile; + + /** + * Gets a tile at the given world coordinates from the given isometric layer. + * @param worldX X position to get the tile from (given in pixels) + * @param worldY Y position to get the tile from (given in pixels) + * @param originTop Which is the active face of the isometric tile? The top (default, true), or the base? (false) Default true. + * @param nonNull If true, function won't return null for empty tiles, but a Tile object with an index of -1. Default false. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + getIsoTileAtWorldXY(worldX: number, worldY: number, originTop?: boolean, nonNull?: boolean, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile; + + /** + * Gets the tiles in the given rectangular area (in tile coordinates) of the layer. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + */ + getTilesWithin(tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions): Phaser.Tilemaps.Tile[]; + + /** + * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle, + * Line, Rectangle or Triangle. The shape should be in world coordinates. + * @param shape A shape in world (pixel) coordinates + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param camera The Camera to use when factoring in which tiles to return. + */ + getTilesWithinShape(shape: Phaser.Geom.Circle | Phaser.Geom.Line | Phaser.Geom.Rectangle | Phaser.Geom.Triangle, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile[]; + + /** + * Gets the tiles in the given rectangular area (in world coordinates) of the layer. + * @param worldX The world x coordinate for the top-left of the area. + * @param worldY The world y coordinate for the top-left of the area. + * @param width The width of the area. + * @param height The height of the area. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param camera The Camera to use when factoring in which tiles to return. + */ + getTilesWithinWorldXY(worldX: number, worldY: number, width: number, height: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile[]; + + /** + * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns + * false if there is no tile or if the tile at that location has an index of -1. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + */ + hasTileAt(tileX: number, tileY: number): boolean; + + /** + * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns + * false if there is no tile or if the tile at that location has an index of -1. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param camera The Camera to use when factoring in which tiles to return. + */ + hasTileAtWorldXY(worldX: number, worldY: number, camera?: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Puts a tile at the given tile coordinates in the specified layer. You can pass in either an index + * or a Tile object. If you pass in a Tile, all attributes will be copied over to the specified + * location. If you pass in an index, only the index at the specified location will be changed. + * Collision information will be recalculated at the specified location. + * @param tile The index of this tile to set or a Tile object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + */ + putTileAt(tile: number | Phaser.Tilemaps.Tile, tileX: number, tileY: number, recalculateFaces?: boolean): Phaser.Tilemaps.Tile; + + /** + * Puts a tile at the given world coordinates (pixels) in the specified layer. You can pass in either + * an index or a Tile object. If you pass in a Tile, all attributes will be copied over to the + * specified location. If you pass in an index, only the index at the specified location will be + * changed. Collision information will be recalculated at the specified location. + * @param tile The index of this tile to set or a Tile object. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + putTileAtWorldXY(tile: number | Phaser.Tilemaps.Tile, worldX: number, worldY: number, recalculateFaces?: boolean, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile; + + /** + * Puts an array of tiles or a 2D array of tiles at the given tile coordinates in the specified + * layer. The array can be composed of either tile indexes or Tile objects. If you pass in a Tile, + * all attributes will be copied over to the specified location. If you pass in an index, only the + * index at the specified location will be changed. Collision information will be recalculated + * within the region tiles were changed. + * @param tile A row (array) or grid (2D array) of Tiles or tile indexes to place. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + */ + putTilesAt(tile: number[] | number[][] | Phaser.Tilemaps.Tile[] | Phaser.Tilemaps.Tile[][], tileX: number, tileY: number, recalculateFaces?: boolean): this; + + /** + * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the + * specified layer. Each tile will receive a new index. If an array of indexes is passed in, then + * those will be used for randomly assigning new tile indexes. If an array is not provided, the + * indexes found within the region (excluding -1) will be used for randomly assigning new tile + * indexes. This method only modifies tile indexes and does not change collision information. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param indexes An array of indexes to randomly draw from during randomization. + */ + randomize(tileX?: number, tileY?: number, width?: number, height?: number, indexes?: number[]): this; + + /** + * Removes the tile at the given tile coordinates in the specified layer and updates the layers + * collision information. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param replaceWithNull If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1. Default true. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + */ + removeTileAt(tileX: number, tileY: number, replaceWithNull?: boolean, recalculateFaces?: boolean): Phaser.Tilemaps.Tile; + + /** + * Removes the tile at the given world coordinates in the specified layer and updates the layers + * collision information. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param replaceWithNull If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1. Default true. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + removeTileAtWorldXY(worldX: number, worldY: number, replaceWithNull?: boolean, recalculateFaces?: boolean, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile; + + /** + * Draws a debug representation of the layer to the given Graphics. This is helpful when you want to + * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles + * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation + * wherever you want on the screen. + * @param graphics The target Graphics object to draw upon. + * @param styleConfig An object specifying the colors to use for the debug drawing. + */ + renderDebug(graphics: Phaser.GameObjects.Graphics, styleConfig?: Phaser.Types.Tilemaps.StyleConfig): this; + + /** + * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching + * `findIndex` and updates their index to match `newIndex`. This only modifies the index and does + * not change collision information. + * @param findIndex The index of the tile to search for. + * @param newIndex The index of the tile to replace it with. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + */ + replaceByIndex(findIndex: number, newIndex: number, tileX?: number, tileY?: number, width?: number, height?: number): this; + + /** + * You can control if the Cameras should cull tiles before rendering them or not. + * + * By default the camera will try to cull the tiles in this layer, to avoid over-drawing to the renderer. + * + * However, there are some instances when you may wish to disable this. + * @param value Set to `true` to stop culling tiles. Set to `false` to enable culling again. Default true. + */ + setSkipCull(value?: boolean): this; + + /** + * When a Camera culls the tiles in this layer it does so using its view into the world, building up a + * rectangle inside which the tiles must exist or they will be culled. Sometimes you may need to expand the size + * of this 'cull rectangle', especially if you plan on rotating the Camera viewing the layer. Do so + * by providing the padding values. The values given are in tiles, not pixels. So if the tile width was 32px + * and you set `paddingX` to be 4, it would add 32px x 4 to the cull rectangle (adjusted for scale) + * @param paddingX The amount of extra horizontal tiles to add to the cull check padding. Default 1. + * @param paddingY The amount of extra vertical tiles to add to the cull check padding. Default 1. + */ + setCullPadding(paddingX?: number, paddingY?: number): this; + + /** + * Sets collision on the given tile or tiles within a layer by index. You can pass in either a + * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if + * collision will be enabled (true) or disabled (false). + * @param indexes Either a single tile index, or an array of tile indexes. + * @param collides If true it will enable collision. If false it will clear collision. Default true. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. Default true. + * @param updateLayer If true, updates the current tiles on the layer. Set to false if no tiles have been placed for significant performance boost. Default true. + */ + setCollision(indexes: number | any[], collides?: boolean, recalculateFaces?: boolean, updateLayer?: boolean): this; + + /** + * Sets collision on a range of tiles in a layer whose index is between the specified `start` and + * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set + * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be + * enabled (true) or disabled (false). + * @param start The first index of the tile to be set for collision. + * @param stop The last index of the tile to be set for collision. + * @param collides If true it will enable collision. If false it will clear collision. Default true. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. Default true. + */ + setCollisionBetween(start: number, stop: number, collides?: boolean, recalculateFaces?: boolean): this; + + /** + * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property + * that matches the given properties object, its collision flag will be set. The `collides` + * parameter controls if collision will be enabled (true) or disabled (false). Passing in + * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that + * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can + * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a + * "types" property that matches any of those values, its collision flag will be updated. + * @param properties An object with tile properties and corresponding values that should be checked. + * @param collides If true it will enable collision. If false it will clear collision. Default true. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. Default true. + */ + setCollisionByProperty(properties: object, collides?: boolean, recalculateFaces?: boolean): this; + + /** + * Sets collision on all tiles in the given layer, except for tiles that have an index specified in + * the given array. The `collides` parameter controls if collision will be enabled (true) or + * disabled (false). Tile indexes not currently in the layer are not affected. + * @param indexes An array of the tile indexes to not be counted for collision. + * @param collides If true it will enable collision. If false it will clear collision. Default true. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. Default true. + */ + setCollisionByExclusion(indexes: number[], collides?: boolean, recalculateFaces?: boolean): this; + + /** + * Sets collision on the tiles within a layer by checking each tiles collision group data + * (typically defined in Tiled within the tileset collision editor). If any objects are found within + * a tiles collision group, the tile's colliding information will be set. The `collides` parameter + * controls if collision will be enabled (true) or disabled (false). + * @param collides If true it will enable collision. If false it will clear collision. Default true. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. Default true. + */ + setCollisionFromCollisionGroup(collides?: boolean, recalculateFaces?: boolean): this; + + /** + * Sets a global collision callback for the given tile index within the layer. This will affect all + * tiles on this layer that have the same index. If a callback is already set for the tile index it + * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile + * at a specific location on the map then see setTileLocationCallback. + * @param indexes Either a single tile index, or an array of tile indexes to have a collision callback set for. + * @param callback The callback that will be invoked when the tile is collided with. + * @param callbackContext The context under which the callback is called. + */ + setTileIndexCallback(indexes: number | number[], callback: Function, callbackContext: object): this; + + /** + * Sets a collision callback for the given rectangular area (in tile coordinates) within the layer. + * If a callback is already set for the tile index it will be replaced. Set the callback to null to + * remove it. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param callback The callback that will be invoked when the tile is collided with. + * @param callbackContext The context, or scope, under which the callback is invoked. + */ + setTileLocationCallback(tileX?: number, tileY?: number, width?: number, height?: number, callback?: Function, callbackContext?: object): this; + + /** + * Shuffles the tiles in a rectangular region (specified in tile coordinates) within the given + * layer. It will only randomize the tiles in that area, so if they're all the same nothing will + * appear to have changed! This method only modifies tile indexes and does not change collision + * information. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + */ + shuffle(tileX?: number, tileY?: number, width?: number, height?: number): this; + + /** + * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching + * `indexA` and swaps then with `indexB`. This only modifies the index and does not change collision + * information. + * @param tileA First tile index. + * @param tileB Second tile index. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + */ + swapByIndex(tileA: number, tileB: number, tileX?: number, tileY?: number, width?: number, height?: number): this; + + /** + * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the + * layers position, scale and scroll. + * @param tileX The x coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + tileToWorldX(tileX: number, camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the + * layers position, scale and scroll. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + tileToWorldY(tileY: number, camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the + * layers position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + tileToWorldXY(tileX: number, tileY: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Returns an array of Vector2s where each entry corresponds to the corner of the requested tile. + * + * The `tileX` and `tileY` parameters are in tile coordinates, not world coordinates. + * + * The corner coordinates are in world space, having factored in TilemapLayer scale, position + * and the camera, if given. + * + * The size of the array will vary based on the orientation of the map. For example an + * orthographic map will return an array of 4 vectors, where-as a hexagonal map will, + * of course, return an array of 6 corner vectors. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + getTileCorners(tileX: number, tileY: number, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2[] | null; + + /** + * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the + * specified layer. Each tile will receive a new index. New indexes are drawn from the given + * weightedIndexes array. An example weighted array: + * + * [ + * { index: 6, weight: 4 }, // Probability of index 6 is 4 / 8 + * { index: 7, weight: 2 }, // Probability of index 7 would be 2 / 8 + * { index: 8, weight: 1.5 }, // Probability of index 8 would be 1.5 / 8 + * { index: 26, weight: 0.5 } // Probability of index 27 would be 0.5 / 8 + * ] + * + * The probability of any index being choose is (the index's weight) / (sum of all weights). This + * method only modifies tile indexes and does not change collision information. + * @param weightedIndexes An array of objects to randomly draw from during randomization. They should be in the form: { index: 0, weight: 4 } or { index: [0, 1], weight: 4 } if you wish to draw from multiple tile indexes. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + */ + weightedRandomize(weightedIndexes: object[], tileX?: number, tileY?: number, width?: number, height?: number): this; + + /** + * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the + * layers position, scale and scroll. + * + * You cannot call this method for Isometric or Hexagonal tilemaps as they require + * both `worldX` and `worldY` values to determine the correct tile, instead you + * should use the `worldToTileXY` method. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + worldToTileX(worldX: number, snapToFloor?: boolean, camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the + * layers position, scale and scroll. + * + * You cannot call this method for Isometric or Hexagonal tilemaps as they require + * both `worldX` and `worldY` values to determine the correct tile, instead you + * should use the `worldToTileXY` method. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + worldToTileY(worldY: number, snapToFloor?: boolean, camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the + * layers position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + worldToTileXY(worldX: number, worldY: number, snapToFloor?: boolean, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Destroys this TilemapLayer and removes its link to the associated LayerData. + * @param removeFromTilemap Remove this layer from the parent Tilemap? Default true. + */ + destroy(removeFromTilemap?: boolean): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + } + + /** + * A Tileset is a combination of a single image containing the tiles and a container for data about + * each tile. + */ + class Tileset { + /** + * + * @param name The name of the tileset in the map data. + * @param firstgid The first tile index this tileset contains. + * @param tileWidth Width of each tile (in pixels). Default 32. + * @param tileHeight Height of each tile (in pixels). Default 32. + * @param tileMargin The margin around all tiles in the sheet (in pixels). Default 0. + * @param tileSpacing The spacing between each tile in the sheet (in pixels). Default 0. + * @param tileProperties Custom properties defined per tile in the Tileset. + * These typically are custom properties created in Tiled when editing a tileset. Default {}. + * @param tileData Data stored per tile. These typically are created in Tiled when editing a tileset, e.g. from Tiled's tile collision editor or terrain editor. Default {}. + * @param tileOffset Tile texture drawing offset. Default {x: 0, y: 0}. + */ + constructor(name: string, firstgid: number, tileWidth?: number, tileHeight?: number, tileMargin?: number, tileSpacing?: number, tileProperties?: object, tileData?: object, tileOffset?: object); + + /** + * The name of the Tileset.s + */ + name: string; + + /** + * The starting index of the first tile index this Tileset contains. + */ + firstgid: number; + + /** + * The width of each tile (in pixels). Use setTileSize to change. + */ + readonly tileWidth: number; + + /** + * The height of each tile (in pixels). Use setTileSize to change. + */ + readonly tileHeight: number; + + /** + * The margin around the tiles in the sheet (in pixels). Use `setSpacing` to change. + */ + readonly tileMargin: number; + + /** + * The spacing between each the tile in the sheet (in pixels). Use `setSpacing` to change. + */ + readonly tileSpacing: number; + + /** + * Tileset-specific properties per tile that are typically defined in the Tiled editor in the + * Tileset editor. + */ + tileProperties: object; + + /** + * Tileset-specific data per tile that are typically defined in the Tiled editor, e.g. within + * the Tileset collision editor. This is where collision objects and terrain are stored. + */ + tileData: object; + + /** + * Controls the drawing offset from the tile origin. + * Defaults to 0x0, no offset. + */ + tileOffset: Phaser.Math.Vector2; + + /** + * The cached image that contains the individual tiles. Use setImage to set. + */ + readonly image: Phaser.Textures.Texture | null; + + /** + * The gl texture used by the WebGL renderer. + */ + readonly glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * The number of tile rows in the the tileset. + */ + readonly rows: number; + + /** + * The number of tile columns in the tileset. + */ + readonly columns: number; + + /** + * The total number of tiles in the tileset. + */ + readonly total: number; + + /** + * The look-up table to specific tile image texture coordinates (UV in pixels). Each element + * contains the coordinates for a tile in an object of the form {x, y}. + */ + readonly texCoordinates: object[]; + + /** + * Get a tiles properties that are stored in the Tileset. Returns null if tile index is not + * contained in this Tileset. This is typically defined in Tiled under the Tileset editor. + * @param tileIndex The unique id of the tile across all tilesets in the map. + */ + getTileProperties(tileIndex: number): object | undefined | null; + + /** + * Get a tile's data that is stored in the Tileset. Returns null if tile index is not contained + * in this Tileset. This is typically defined in Tiled and will contain both Tileset collision + * info and terrain mapping. + * @param tileIndex The unique id of the tile across all tilesets in the map. + */ + getTileData(tileIndex: number): object | undefined; + + /** + * Get a tile's collision group that is stored in the Tileset. Returns null if tile index is not + * contained in this Tileset. This is typically defined within Tiled's tileset collision editor. + * @param tileIndex The unique id of the tile across all tilesets in the map. + */ + getTileCollisionGroup(tileIndex: number): object | null; + + /** + * Returns true if and only if this Tileset contains the given tile index. + * @param tileIndex The unique id of the tile across all tilesets in the map. + */ + containsTileIndex(tileIndex: number): boolean; + + /** + * Returns the texture coordinates (UV in pixels) in the Tileset image for the given tile index. + * Returns null if tile index is not contained in this Tileset. + * @param tileIndex The unique id of the tile across all tilesets in the map. + */ + getTileTextureCoordinates(tileIndex: number): object | null; + + /** + * Sets the image associated with this Tileset and updates the tile data (rows, columns, etc.). + * @param texture The image that contains the tiles. + */ + setImage(texture: Phaser.Textures.Texture): Phaser.Tilemaps.Tileset; + + /** + * Sets the tile width & height and updates the tile data (rows, columns, etc.). + * @param tileWidth The width of a tile in pixels. + * @param tileHeight The height of a tile in pixels. + */ + setTileSize(tileWidth?: number, tileHeight?: number): Phaser.Tilemaps.Tileset; + + /** + * Sets the tile margin & spacing and updates the tile data (rows, columns, etc.). + * @param margin The margin around the tiles in the sheet (in pixels). + * @param spacing The spacing between the tiles in the sheet (in pixels). + */ + setSpacing(margin?: number, spacing?: number): Phaser.Tilemaps.Tileset; + + /** + * Updates tile texture coordinates and tileset data. + * @param imageWidth The (expected) width of the image to slice. + * @param imageHeight The (expected) height of the image to slice. + * @param offsetX The x offset in the source texture where the tileset starts. Default 0. + * @param offsetY The y offset in the source texture where the tileset starts. Default 0. + */ + updateTileData(imageWidth: number, imageHeight: number, offsetX?: number, offsetY?: number): Phaser.Tilemaps.Tileset; + + } + + /** + * Orthogonal Tilemap orientation constant. + */ + const ORTHOGONAL: number; + + /** + * Isometric Tilemap orientation constant. + */ + const ISOMETRIC: number; + + /** + * Staggered Tilemap orientation constant. + */ + const STAGGERED: number; + + /** + * Hexagonal Tilemap orientation constant. + */ + const HEXAGONAL: number; + + } + + namespace Time { + /** + * The Clock is a Scene plugin which creates and updates Timer Events for its Scene. + */ + class Clock { + /** + * + * @param scene The Scene which owns this Clock. + */ + constructor(scene: Phaser.Scene); + + /** + * The Scene which owns this Clock. + */ + scene: Phaser.Scene; + + /** + * The Scene Systems object of the Scene which owns this Clock. + */ + systems: Phaser.Scenes.Systems; + + /** + * The current time of the Clock, in milliseconds. + * + * If accessed externally, this is equivalent to the `time` parameter normally passed to a Scene's `update` method. + */ + now: number; + + /** + * The time the Clock (and Scene) started, in milliseconds. + * + * This can be compared to the `time` parameter passed to a Scene's `update` method. + */ + startTime: number; + + /** + * The scale of the Clock's time delta. + * + * The time delta is the time elapsed between two consecutive frames and influences the speed of time for this Clock and anything which uses it, such as its Timer Events. Values higher than 1 increase the speed of time, while values smaller than 1 decrease it. A value of 0 freezes time and is effectively equivalent to pausing the Clock. + */ + timeScale: number; + + /** + * Whether the Clock is paused (`true`) or active (`false`). + * + * When paused, the Clock will not update any of its Timer Events, thus freezing time. + */ + paused: boolean; + + /** + * Creates a Timer Event and adds it to this Clock at the start of the next frame. + * + * You can pass in either a `TimerEventConfig` object, from with a new `TimerEvent` will + * be created, or you can pass in a `TimerEvent` instance. + * + * If passing an instance please make sure that this instance hasn't been used before. + * If it has ever entered a 'completed' state then it will no longer be suitable to + * run again. + * + * Also, if the `TimerEvent` instance is being used by _another_ Clock (in another Scene) + * it will still be updated by that Clock as well, so be careful when using this feature. + * @param config The configuration for the Timer Event, or an existing Timer Event object. + */ + addEvent(config: Phaser.Time.TimerEvent | Phaser.Types.Time.TimerEventConfig): Phaser.Time.TimerEvent; + + /** + * Creates a Timer Event and adds it to the Clock at the start of the frame. + * + * This is a shortcut for {@link #addEvent} which can be shorter and is compatible with the syntax of the GreenSock Animation Platform (GSAP). + * @param delay The delay of the function call, in milliseconds. + * @param callback The function to call after the delay expires. + * @param args The arguments to call the function with. + * @param callbackScope The scope (`this` object) to call the function with. + */ + delayedCall(delay: number, callback: Function, args?: any[], callbackScope?: any): Phaser.Time.TimerEvent; + + /** + * Clears and recreates the array of pending Timer Events. + */ + clearPendingEvents(): this; + + /** + * Removes the given Timer Event, or an array of Timer Events, from this Clock. + * + * The events are removed from all internal lists (active, pending and removal), + * freeing the event up to be re-used. + * @param events The Timer Event, or an array of Timer Events, to remove from this Clock. + */ + removeEvent(events: Phaser.Time.TimerEvent | Phaser.Time.TimerEvent[]): this; + + /** + * Schedules all active Timer Events for removal at the start of the frame. + */ + removeAllEvents(): this; + + /** + * Updates the arrays of active and pending Timer Events. Called at the start of the frame. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + preUpdate(time: number, delta: number): void; + + /** + * Updates the Clock's internal time and all of its Timer Events. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(time: number, delta: number): void; + + } + + namespace Events { + /** + * The Timeline Complete Event. + * + * This event is dispatched by timeline when all timeline events complete. + * + * Listen to it from a Timeline instance using `Timeline.on('complete', listener)`, i.e.: + * + * ```javascript + * const timeline = this.add.timeline(); + * timeline.on('complete', listener); + * timeline.play(); + * ``` + */ + const COMPLETE: string; + + } + + /** + * A Timeline is a way to schedule events to happen at specific times in the future. + * + * You can think of it as an event sequencer for your game, allowing you to schedule the + * running of callbacks, events and other actions at specific times in the future. + * + * A Timeline is a Scene level system, meaning you can have as many Timelines as you like, each + * belonging to a different Scene. You can also have multiple Timelines running at the same time. + * + * If the Scene is paused, the Timeline will also pause. If the Scene is destroyed, the Timeline + * will be automatically destroyed. However, you can control the Timeline directly, pausing, + * resuming and stopping it at any time. + * + * Create an instance of a Timeline via the Game Object Factory: + * + * ```js + * const timeline = this.add.timeline(); + * ``` + * + * The Timeline always starts paused. You must call `play` on it to start it running. + * + * You can also pass in a configuration object on creation, or an array of them: + * + * ```js + * const timeline = this.add.timeline({ + * at: 1000, + * run: () => { + * this.add.sprite(400, 300, 'logo'); + * } + * }); + * + * timeline.play(); + * ``` + * + * In this example we sequence a few different events: + * + * ```js + * const timeline = this.add.timeline([ + * { + * at: 1000, + * run: () => { this.logo = this.add.sprite(400, 300, 'logo'); }, + * sound: 'TitleMusic' + * }, + * { + * at: 2500, + * tween: { + * targets: this.logo, + * y: 600, + * yoyo: true + * }, + * sound: 'Explode' + * }, + * { + * at: 8000, + * event: 'HURRY_PLAYER', + * target: this.background, + * set: { + * tint: 0xff0000 + * } + * } + * ]); + * + * timeline.play(); + * ``` + * + * The Timeline can also be looped with the repeat method: + * ```js + * timeline.repeat().play(); + * ``` + * + * There are lots of options available to you via the configuration object. See the + * {@link Phaser.Types.Time.TimelineEventConfig} typedef for more details. + */ + class Timeline extends Phaser.Events.EventEmitter { + /** + * + * @param scene The Scene which owns this Timeline. + * @param config The configuration object for this Timeline Event, or an array of them. + */ + constructor(scene: Phaser.Scene, config?: Phaser.Types.Time.TimelineEventConfig | Phaser.Types.Time.TimelineEventConfig[]); + + /** + * The Scene to which this Timeline belongs. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * The elapsed time counter. + * + * Treat this as read-only. + */ + elapsed: number; + + /** + * Whether the Timeline is running (`true`) or active (`false`). + * + * When paused, the Timeline will not run any of its actions. + * + * By default a Timeline is always paused and should be started by + * calling the `Timeline.play` method. + * + * You can use the `Timeline.pause` and `Timeline.resume` methods to control + * this value in a chainable way. + */ + paused: boolean; + + /** + * Whether the Timeline is complete (`true`) or not (`false`). + * + * A Timeline is considered complete when all of its events have been run. + * + * If you wish to reset a Timeline after it has completed, you can do so + * by calling the `Timeline.reset` method. + * + * You can also use the `Timeline.stop` method to stop a running Timeline, + * at any point, without resetting it. + */ + complete: boolean; + + /** + * The total number of events that have been run. + * + * This value is reset to zero if the Timeline is restarted. + * + * Treat this as read-only. + */ + totalComplete: number; + + /** + * The number of times this timeline should loop. + * + * If this value is -1 or any negative number this Timeline will not stop. + */ + loop: number; + + /** + * The number of times this Timeline has looped. + * + * This value is incremented each loop if looping is enabled. + */ + iteration: number; + + /** + * An array of all the Timeline Events. + */ + events: Phaser.Types.Time.TimelineEvent[]; + + /** + * Updates the elapsed time counter, if this Timeline is not paused. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + preUpdate(time: number, delta: number): void; + + /** + * Called automatically by the Scene update step. + * + * Iterates through all of the Timeline Events and checks to see if they should be run. + * + * If they should be run, then the `TimelineEvent.action` callback is invoked. + * + * If the `TimelineEvent.once` property is `true` then the event is removed from the Timeline. + * + * If the `TimelineEvent.event` property is set then the Timeline emits that event. + * + * If the `TimelineEvent.run` property is set then the Timeline invokes that method. + * + * If the `TimelineEvent.loop` property is set then the Timeline invokes that method when repeated. + * + * If the `TimelineEvent.target` property is set then the Timeline invokes the `run` method on that target. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(time: number, delta: number): void; + + /** + * Starts this Timeline running. + * + * If the Timeline is already running and the `fromStart` parameter is `true`, + * then calling this method will reset the Timeline events as incomplete. + * + * If you wish to resume a paused Timeline, then use the `Timeline.resume` method instead. + * @param fromStart Reset this Timeline back to the start before playing. Default true. + */ + play(fromStart?: boolean): this; + + /** + * Pauses this Timeline. + * + * To resume it again, call the `Timeline.resume` method or set the `Timeline.paused` property to `false`. + * + * If the Timeline is paused while processing the current game step, then it + * will carry on with all events that are due to run during that step and pause + * from the next game step. + * + * Note that if any Tweens have been started prior to calling this method, they will **not** be paused as well. + */ + pause(): this; + + /** + * Repeats this Timeline. + * + * If the value for `amount` is positive, the Timeline will repeat that many additional times. + * For example a value of 1 will actually run this Timeline twice. + * + * Depending on the value given, `false` is 0 and `true`, undefined and negative numbers are infinite. + * + * If this Timeline had any events set to `once` that have already been removed, + * they will **not** be repeated each loop. + * @param amount Amount of times to repeat, if `true` or negative it will be infinite. Default -1. + */ + repeat(amount?: number | boolean): this; + + /** + * Resumes this Timeline from a paused state. + * + * The Timeline will carry on from where it left off. + * + * If you need to reset the Timeline to the start, then call the `Timeline.reset` method. + */ + resume(): this; + + /** + * Stops this Timeline. + * + * This will set the `paused` and `complete` properties to `true`. + * + * If you wish to reset the Timeline to the start, then call the `Timeline.reset` method. + */ + stop(): this; + + /** + * Resets this Timeline back to the start. + * + * This will set the elapsed time to zero and set all events to be incomplete. + * + * If the Timeline had any events that were set to `once` that have already + * been removed, they will **not** be present again after calling this method. + * + * If the Timeline isn't currently running (i.e. it's paused or complete) then + * calling this method resets those states, the same as calling `Timeline.play(true)`. + * @param loop Set to true if you do not want to reset the loop counters. Default false. + */ + reset(loop?: boolean): this; + + /** + * Adds one or more events to this Timeline. + * + * You can pass in a single configuration object, or an array of them: + * + * ```js + * const timeline = this.add.timeline({ + * at: 1000, + * run: () => { + * this.add.sprite(400, 300, 'logo'); + * } + * }); + * ``` + * @param config The configuration object for this Timeline Event, or an array of them. + */ + add(config: Phaser.Types.Time.TimelineEventConfig | Phaser.Types.Time.TimelineEventConfig[]): this; + + /** + * Removes all events from this Timeline, resets the elapsed time to zero + * and pauses the Timeline. + */ + clear(): this; + + /** + * Returns `true` if this Timeline is currently playing. + * + * A Timeline is playing if it is not paused or not complete. + */ + isPlaying(): boolean; + + /** + * Returns a number between 0 and 1 representing the progress of this Timeline. + * + * A value of 0 means the Timeline has just started, 0.5 means it's half way through, + * and 1 means it's complete. + * + * If the Timeline has no events, or all events have been removed, this will return 1. + * + * If the Timeline is paused, this will return the progress value at the time it was paused. + * + * Note that the value returned is based on the number of events that have been completed, + * not the 'duration' of the events (as this is unknown to the Timeline). + */ + getProgress(): number; + + /** + * Destroys this Timeline. + * + * This will remove all events from the Timeline and stop it from processing. + * + * This method is called automatically when the Scene shuts down, but you may + * also call it directly should you need to destroy the Timeline earlier. + */ + destroy(): void; + + } + + /** + * A Timer Event represents a delayed function call. It's managed by a Scene's {@link Clock} and will call its function after a set amount of time has passed. The Timer Event can optionally repeat - i.e. call its function multiple times before finishing, or loop indefinitely. + * + * Because it's managed by a Clock, a Timer Event is based on game time, will be affected by its Clock's time scale, and will pause if its Clock pauses. + */ + class TimerEvent { + /** + * + * @param config The configuration for the Timer Event, including its delay and callback. + */ + constructor(config: Phaser.Types.Time.TimerEventConfig); + + /** + * The delay in ms at which this TimerEvent fires. + */ + readonly delay: number; + + /** + * The total number of times this TimerEvent will repeat before finishing. + */ + readonly repeat: number; + + /** + * If repeating this contains the current repeat count. + */ + repeatCount: number; + + /** + * True if this TimerEvent loops, otherwise false. + */ + readonly loop: boolean; + + /** + * The callback that will be called when the TimerEvent occurs. + */ + callback: Function; + + /** + * The scope in which the callback will be called. + */ + callbackScope: object; + + /** + * Additional arguments to be passed to the callback. + */ + args: any[]; + + /** + * Scale the time causing this TimerEvent to update. + */ + timeScale: number; + + /** + * Start this many MS into the elapsed (useful if you want a long duration with repeat, but for the first loop to fire quickly) + */ + startAt: number; + + /** + * The time in milliseconds which has elapsed since the Timer Event's creation. + * + * This value is local for the Timer Event and is relative to its Clock. As such, it's influenced by the Clock's time scale and paused state, the Timer Event's initial {@link #startAt} property, and the Timer Event's {@link #timeScale} and {@link #paused} state. + */ + elapsed: number; + + /** + * Whether or not this timer is paused. + */ + paused: boolean; + + /** + * Whether the Timer Event's function has been called. + * + * When the Timer Event fires, this property will be set to `true` before the callback function is invoked and will be reset immediately afterward if the Timer Event should repeat. The value of this property does not directly influence whether the Timer Event will be removed from its Clock, but can prevent it from firing. + */ + hasDispatched: boolean; + + /** + * Completely reinitializes the Timer Event, regardless of its current state, according to a configuration object. + * @param config The new state for the Timer Event. + */ + reset(config: Phaser.Types.Time.TimerEventConfig): Phaser.Time.TimerEvent; + + /** + * Gets the progress of the current iteration, not factoring in repeats. + */ + getProgress(): number; + + /** + * Gets the progress of the timer overall, factoring in repeats. + */ + getOverallProgress(): number; + + /** + * Returns the number of times this Timer Event will repeat before finishing. + * + * This should not be confused with the number of times the Timer Event will fire before finishing. A return value of 0 doesn't indicate that the Timer Event has finished running - it indicates that it will not repeat after the next time it fires. + */ + getRepeatCount(): number; + + /** + * Returns the local elapsed time for the current iteration of the Timer Event. + */ + getElapsed(): number; + + /** + * Returns the local elapsed time for the current iteration of the Timer Event in seconds. + */ + getElapsedSeconds(): number; + + /** + * Returns the time interval until the next iteration of the Timer Event. + */ + getRemaining(): number; + + /** + * Returns the time interval until the next iteration of the Timer Event in seconds. + */ + getRemainingSeconds(): number; + + /** + * Returns the time interval until the last iteration of the Timer Event. + */ + getOverallRemaining(): number; + + /** + * Returns the time interval until the last iteration of the Timer Event in seconds. + */ + getOverallRemainingSeconds(): number; + + /** + * Forces the Timer Event to immediately expire, thus scheduling its removal in the next frame. + * @param dispatchCallback If `true`, the function of the Timer Event will be called before its removal. Default false. + */ + remove(dispatchCallback?: boolean): void; + + /** + * Destroys all object references in the Timer Event, i.e. its callback, scope, and arguments. + * + * Normally, this method is only called by the Clock when it shuts down. As such, it doesn't stop the Timer Event. If called manually, the Timer Event will still be updated by the Clock, but it won't do anything when it fires. + */ + destroy(): void; + + } + + } + + namespace Tweens { + namespace Builders { + /** + * Retrieves the value of the given key from an object. + * @param source The object to retrieve the value from. + * @param key The key to look for in the `source` object. + * @param defaultValue The default value to return if the `key` doesn't exist or if no `source` object is provided. + */ + function GetBoolean(source: object, key: string, defaultValue: boolean): boolean; + + /** + * This internal function is used to return the correct ease function for a Tween. + * + * It can take a variety of input, including an EaseMap based string, or a custom function. + * @param ease The ease to find. This can be either a string from the EaseMap, or a custom function. + * @param easeParams An optional array of ease parameters to go with the ease. + */ + function GetEaseFunction(ease: string | Function, easeParams?: number[]): Function; + + /** + * This internal function is used to return the correct interpolation function for a Tween. + * + * It can take a variety of input, including a string, or a custom function. + * @param interpolation The interpolation function to find. This can be either a string, or a custom function, or null. + */ + function GetInterpolationFunction(interpolation: string | Function | null): Function | null; + + /** + * Internal function used by the Tween Builder to create a function that will return + * the given value from the source. + * @param source The source object to get the value from. + * @param key The property to get from the source. + * @param defaultValue A default value to return should the source not have the property set. + */ + function GetNewValue(source: any, key: string, defaultValue: any): Function; + + /** + * Internal function used by the Tween Builder to return an array of properties + * that the Tween will be operating on. It takes a tween configuration object + * and then checks that none of the `props` entries start with an underscore, or that + * none of the direct properties are on the Reserved list. + * @param config The configuration object of the Tween to get the properties from. + */ + function GetProps(config: Phaser.Types.Tweens.TweenBuilderConfig): string[]; + + /** + * Extracts an array of targets from a Tween configuration object. + * + * The targets will be looked for in a `targets` property. If it's a function, its return value will be used as the result. + * @param config The configuration object to use. + */ + function GetTargets(config: object): any[]; + + /** + * Returns `getActive`, `getStart` and `getEnd` functions for a TweenData based on a target property and end value. + * + * `getActive` if not null, is invoked _immediately_ as soon as the TweenData is running, and is set on the target property. + * `getEnd` is invoked once any start delays have expired and returns what the value should tween to. + * `getStart` is invoked when the tween reaches the end and needs to either repeat or yoyo, it returns the value to go back to. + * + * If the end value is a number, it will be treated as an absolute value and the property will be tweened to it. + * A string can be provided to specify a relative end value which consists of an operation + * (`+=` to add to the current value, `-=` to subtract from the current value, `*=` to multiply the current + * value, or `/=` to divide the current value) followed by its operand. + * + * A function can be provided to allow greater control over the end value; it will receive the target + * object being tweened, the name of the property being tweened, and the current value of the property + * as its arguments and must return a value. + * + * If both the starting and the ending values need to be controlled, an object with `getStart` and `getEnd` + * callbacks, which will receive the same arguments, can be provided instead. If an object with a `value` + * property is provided, the property will be used as the effective value under the same rules described here. + * @param key The name of the property to modify. + * @param propertyValue The ending value of the property, as described above. + */ + function GetValueOp(key: string, propertyValue: any): Function; + + /** + * Creates a new Number Tween. + * @param parent The owner of the new Tween. + * @param config Configuration for the new Tween. + * @param defaults Tween configuration defaults. + */ + function NumberTweenBuilder(parent: Phaser.Tweens.TweenManager, config: Phaser.Types.Tweens.NumberTweenBuilderConfig, defaults: Phaser.Types.Tweens.TweenConfigDefaults): Phaser.Tweens.Tween; + + /** + * Creates a Stagger function to be used by a Tween property. + * + * The stagger function will allow you to stagger changes to the value of the property across all targets of the tween. + * + * This is only worth using if the tween has multiple targets. + * + * The following will stagger the delay by 100ms across all targets of the tween, causing them to scale down to 0.2 + * over the duration specified: + * + * ```javascript + * this.tweens.add({ + * targets: [ ... ], + * scale: 0.2, + * ease: 'linear', + * duration: 1000, + * delay: this.tweens.stagger(100) + * }); + * ``` + * + * The following will stagger the delay by 500ms across all targets of the tween using a 10 x 6 grid, staggering + * from the center out, using a cubic ease. + * + * ```javascript + * this.tweens.add({ + * targets: [ ... ], + * scale: 0.2, + * ease: 'linear', + * duration: 1000, + * delay: this.tweens.stagger(500, { grid: [ 10, 6 ], from: 'center', ease: 'cubic.out' }) + * }); + * ``` + * @param value The amount to stagger by, or an array containing two elements representing the min and max values to stagger between. + * @param config A Stagger Configuration object. + */ + function StaggerBuilder(value: number | number[], config?: Phaser.Types.Tweens.StaggerConfig): Function; + + /** + * Creates a new Tween. + * @param parent The owner of the new Tween. + * @param config Configuration for the new Tween. + * @param defaults Tween configuration defaults. + */ + function TweenBuilder(parent: Phaser.Tweens.TweenManager, config: Phaser.Types.Tweens.TweenBuilderConfig | object, defaults: Phaser.Types.Tweens.TweenConfigDefaults): Phaser.Tweens.Tween; + + /** + * Creates a new Tween Chain instance. + * @param parent The owner of the new Tween. + * @param config Configuration for the new Tween. + */ + function TweenChainBuilder(parent: Phaser.Tweens.TweenManager, config: Phaser.Types.Tweens.TweenChainBuilderConfig | object): Phaser.Tweens.TweenChain; + + } + + namespace Events { + /** + * The Tween Active Event. + * + * This event is dispatched by a Tween when it becomes active within the Tween Manager. + * + * An 'active' Tween is one that is now progressing, although it may not yet be updating + * any target properties, due to settings such as `delay`. If you need an event for when + * the Tween starts actually updating its first property, see `TWEEN_START`. + * + * Listen to it from a Tween instance using `Tween.on('active', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.create({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000 + * }); + * tween.on('active', listener); + * this.tweens.existing(tween); + * ``` + * + * Note that this event is usually dispatched already by the time you call `this.tweens.add()`, and is + * meant for use with `tweens.create()` and/or `tweens.existing()`. + */ + const TWEEN_ACTIVE: string; + + /** + * The Tween Complete Event. + * + * This event is dispatched by a Tween when it completes playback entirely, factoring in repeats and loops. + * + * If the Tween has been set to loop or repeat infinitely, this event will not be dispatched + * unless the `Tween.stop` method is called. + * + * If a Tween has a `completeDelay` set, this event will fire after that delay expires. + * + * Listen to it from a Tween instance using `Tween.on('complete', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000 + * }); + * tween.on('complete', listener); + * ``` + */ + const TWEEN_COMPLETE: string; + + /** + * The Tween Loop Event. + * + * This event is dispatched by a Tween when it loops. + * + * This event will only be dispatched if the Tween has a loop count set. + * + * If a Tween has a `loopDelay` set, this event will fire after that delay expires. + * + * The difference between `loop` and `repeat` is that `repeat` is a property setting, + * where-as `loop` applies to the entire Tween. + * + * Listen to it from a Tween instance using `Tween.on('loop', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000, + * loop: 6 + * }); + * tween.on('loop', listener); + * ``` + */ + const TWEEN_LOOP: string; + + /** + * The Tween Pause Event. + * + * This event is dispatched by a Tween when it is paused. + * + * Listen to it from a Tween instance using `Tween.on('pause', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * ease: 'Power1', + * duration: 3000, + * x: 600 + * }); + * tween.on('pause', listener); + * // At some point later ... + * tween.pause(); + * ``` + */ + const TWEEN_PAUSE: string; + + /** + * The Tween Repeat Event. + * + * This event is dispatched by a Tween when one of the properties it is tweening repeats. + * + * This event will only be dispatched if the Tween has a property with a repeat count set. + * + * If a Tween has a `repeatDelay` set, this event will fire after that delay expires. + * + * The difference between `loop` and `repeat` is that `repeat` is a property setting, + * where-as `loop` applies to the entire Tween. + * + * Listen to it from a Tween instance using `Tween.on('repeat', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000, + * repeat: 4 + * }); + * tween.on('repeat', listener); + * ``` + */ + const TWEEN_REPEAT: string; + + /** + * The Tween Resume Event. + * + * This event is dispatched by a Tween when it is resumed from a paused state. + * + * Listen to it from a Tween instance using `Tween.on('resume', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * ease: 'Power1', + * duration: 3000, + * x: 600 + * }); + * tween.on('resume', listener); + * // At some point later ... + * tween.resume(); + * ``` + */ + const TWEEN_RESUME: string; + + /** + * The Tween Start Event. + * + * This event is dispatched by a Tween when it starts tweening its first property. + * + * A Tween will only emit this event once, as it can only start once. + * + * If a Tween has a `delay` set, this event will fire after that delay expires. + * + * Listen to it from a Tween instance using `Tween.on('start', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000 + * }); + * tween.on('start', listener); + * ``` + */ + const TWEEN_START: string; + + /** + * The Tween Stop Event. + * + * This event is dispatched by a Tween when it is stopped. + * + * Listen to it from a Tween instance using `Tween.on('stop', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000 + * }); + * tween.on('stop', listener); + * ``` + */ + const TWEEN_STOP: string; + + /** + * The Tween Update Event. + * + * This event is dispatched by a Tween every time it updates _any_ of the properties it is tweening. + * + * A Tween that is changing 3 properties of a target will emit this event 3 times per change, once per property. + * + * **Note:** This is a very high frequency event and may be dispatched multiple times, every single frame. + * + * Listen to it from a Tween instance using `Tween.on('update', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000, + * }); + * tween.on('update', listener); + * ``` + */ + const TWEEN_UPDATE: string; + + /** + * The Tween Yoyo Event. + * + * This event is dispatched by a Tween whenever a property it is tweening yoyos. + * + * This event will only be dispatched if the Tween has a property with `yoyo` set. + * + * If the Tween has a `hold` value, this event is dispatched when the hold expires. + * + * This event is dispatched for every property, and for every target, that yoyos. + * For example, if a Tween was updating 2 properties and had 10 targets, this event + * would be dispatched 20 times (twice per target). So be careful how you use it! + * + * Listen to it from a Tween instance using `Tween.on('yoyo', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000, + * yoyo: true + * }); + * tween.on('yoyo', listener); + * ``` + */ + const TWEEN_YOYO: string; + + } + + /** + * As the name implies, this is the base Tween class that both the Tween and TweenChain + * inherit from. It contains shared properties and methods common to both types of Tween. + * + * Typically you would never instantiate this class directly, although you could certainly + * use it to create your own variation of Tweens from. + */ + class BaseTween extends Phaser.Events.EventEmitter { + /** + * + * @param parent A reference to the Tween Manager, or Tween Chain, that owns this Tween. + */ + constructor(parent: Phaser.Tweens.TweenManager | Phaser.Tweens.TweenChain); + + /** + * A reference to the Tween Manager, or Tween Chain, that owns this Tween. + */ + parent: Phaser.Tweens.TweenManager | Phaser.Tweens.TweenChain; + + /** + * The main data array. For a Tween, this contains all of the `TweenData` objects, each + * containing a unique property and target that is being tweened. + * + * For a TweenChain, this contains an array of `Tween` instances, which are being played + * through in sequence. + */ + data: Phaser.Tweens.TweenData[] | Phaser.Tweens.Tween[]; + + /** + * The cached size of the data array. + */ + totalData: number; + + /** + * The time in milliseconds before the 'onStart' event fires. + * + * For a Tween, this is the shortest `delay` value across all of the TweenDatas it owns. + * For a TweenChain, it is whatever delay value was given in the configuration. + */ + startDelay: number; + + /** + * Has this Tween started playback yet? + * + * This boolean is toggled when the Tween leaves the 'start delayed' state and begins running. + */ + readonly hasStarted: boolean; + + /** + * Scales the time applied to this Tween. A value of 1 runs in real-time. A value of 0.5 runs 50% slower, and so on. + * + * The value isn't used when calculating total duration of the tween, it's a run-time delta adjustment only. + * + * This value is multiplied by the `TweenManager.timeScale`. + */ + timeScale: number; + + /** + * The number of times this Tween will loop. + * + * Can be -1 for an infinite loop, zero for none, or a positive integer. + * + * Typically this is set in the configuration object, but can also be set directly + * as long as this Tween is paused and hasn't started playback. + * + * When enabled it will play through ALL Tweens again. + * + * Use TweenData.repeat to loop a single element. + */ + loop: number; + + /** + * The time in milliseconds before the Tween loops. + * + * Only used if `loop` is > 0. + */ + loopDelay: number; + + /** + * Internal counter recording how many loops are left to run. + */ + loopCounter: number; + + /** + * The time in milliseconds before the 'onComplete' event fires. + * + * This never fires if `loop = -1` as it never completes because it has been + * set to loop forever. + */ + completeDelay: number; + + /** + * An internal countdown timer (used by loopDelay and completeDelay) + */ + countdown: number; + + /** + * The current state of the Tween. + */ + state: Phaser.Tweens.StateType; + + /** + * Is the Tween currently paused? + * + * A paused Tween needs to be started with the `play` method, or resumed with the `resume` method. + * + * This property can be toggled at runtime if required. + */ + paused: boolean; + + /** + * An object containing the different Tween callback functions. + * + * You can either set these in the Tween config, or by calling the `Tween.setCallback` method. + * + * The types available are: + * + * `onActive` - When the Tween is first created it moves to an 'active' state when added to the Tween Manager. 'Active' does not mean 'playing'. + * `onStart` - When the Tween starts playing after a delayed or paused state. This will happen at the same time as `onActive` if the tween has no delay and isn't paused. + * `onLoop` - When a Tween loops, if it has been set to do so. This happens _after_ the `loopDelay` expires, if set. + * `onComplete` - When the Tween finishes playback fully. Never invoked if the Tween is set to repeat infinitely. + * `onStop` - Invoked only if the `Tween.stop` method is called. + * `onPause` - Invoked only if the `Tween.pause` method is called. Not invoked if the Tween Manager is paused. + * `onResume` - Invoked only if the `Tween.resume` method is called. Not invoked if the Tween Manager is resumed. + * + * The following types are also available and are invoked on a `TweenData` level - that is per-object, per-property, being tweened. + * + * `onYoyo` - When a TweenData starts a yoyo. This happens _after_ the `hold` delay expires, if set. + * `onRepeat` - When a TweenData repeats playback. This happens _after_ the `repeatDelay` expires, if set. + * `onUpdate` - When a TweenData updates a property on a source target during playback. + */ + callbacks: Phaser.Types.Tweens.TweenCallbacks; + + /** + * The scope (or context) in which all of the callbacks are invoked. + * + * This defaults to be this Tween, but you can override this property + * to set it to whatever object you require. + */ + callbackScope: any; + + /** + * Will this Tween persist after playback? A Tween that persists will _not_ be destroyed by the + * Tween Manager, or when calling `Tween.stop`, and can be re-played as required. You can either + * set this property when creating the tween in the tween config, or set it _prior_ to playback. + * + * However, it's up to you to ensure you destroy persistent tweens when you are finished with them, + * or they will retain references you may no longer require and waste memory. + * + * By default, `Tweens` are set to _not_ persist, so they are automatically cleaned-up by + * the Tween Manager. But `TweenChains` _do_ persist by default, unless overridden in their + * config. This is because the type of situations you use a chain for is far more likely to + * need to be replayed again in the future, rather than disposed of. + */ + persist: boolean; + + /** + * Sets the value of the time scale applied to this Tween. A value of 1 runs in real-time. + * A value of 0.5 runs 50% slower, and so on. + * + * The value isn't used when calculating total duration of the tween, it's a run-time delta adjustment only. + * + * This value is multiplied by the `TweenManager.timeScale`. + * @param value The time scale value to set. + */ + setTimeScale(value: number): this; + + /** + * Gets the value of the time scale applied to this Tween. A value of 1 runs in real-time. + * A value of 0.5 runs 50% slower, and so on. + */ + getTimeScale(): number; + + /** + * Checks if this Tween is currently playing. + * + * If this Tween is paused, or not active, this method will return false. + */ + isPlaying(): boolean; + + /** + * Checks if the Tween is currently paused. + * + * This is the same as inspecting the `BaseTween.paused` property directly. + */ + isPaused(): boolean; + + /** + * Pauses the Tween immediately. Use `resume` to continue playback. + * + * You can also toggle the `Tween.paused` boolean property, but doing so will not trigger the PAUSE event. + */ + pause(): this; + + /** + * Resumes the playback of a previously paused Tween. + * + * You can also toggle the `Tween.paused` boolean property, but doing so will not trigger the RESUME event. + */ + resume(): this; + + /** + * Internal method that makes this Tween active within the TweenManager + * and emits the onActive event and callback. + */ + makeActive(): void; + + /** + * Internal method that handles this tween completing and emitting the onComplete event + * and callback. + */ + onCompleteHandler(): void; + + /** + * Flags the Tween as being complete, whatever stage of progress it is at. + * + * If an `onComplete` callback has been defined it will automatically invoke it, unless a `delay` + * argument is provided, in which case the Tween will delay for that period of time before calling the callback. + * + * If you don't need a delay or don't have an `onComplete` callback then call `Tween.stop` instead. + * @param delay The time to wait before invoking the complete callback. If zero it will fire immediately. Default 0. + */ + complete(delay?: number): this; + + /** + * Flags the Tween as being complete only once the current loop has finished. + * + * This is a useful way to stop an infinitely looping tween once a complete cycle is over, + * rather than abruptly. + * + * If you don't have a loop then call `Tween.stop` instead. + * @param loops The number of loops that should finish before this tween completes. Zero means complete just the current loop. Default 0. + */ + completeAfterLoop(loops?: number): this; + + /** + * Immediately removes this Tween from the TweenManager and all of its internal arrays, + * no matter what stage it is at. Then sets the tween state to `REMOVED`. + * + * You should dispose of your reference to this tween after calling this method, to + * free it from memory. If you no longer require it, call `Tween.destroy()` on it. + */ + remove(): this; + + /** + * Stops the Tween immediately, whatever stage of progress it is at. + * + * If not a part of a Tween Chain it is also flagged for removal by the Tween Manager. + * + * If an `onStop` callback has been defined it will automatically invoke it. + * + * The Tween will be removed during the next game frame, but should be considered 'destroyed' from this point on. + * + * Typically, you cannot play a Tween that has been stopped. If you just wish to pause the tween, not destroy it, + * then call the `pause` method instead and use `resume` to continue playback. If you wish to restart the Tween, + * use the `restart` or `seek` methods. + */ + stop(): this; + + /** + * Internal method that handles the processing of the loop delay countdown timer and + * the dispatch of related events. Called automatically by `Tween.update`. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + updateLoopCountdown(delta: number): void; + + /** + * Internal method that handles the processing of the start delay countdown timer and + * the dispatch of related events. Called automatically by `Tween.update`. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + updateStartCountdown(delta: number): void; + + /** + * Internal method that handles the processing of the complete delay countdown timer and + * the dispatch of related events. Called automatically by `Tween.update`. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + updateCompleteDelay(delta: number): void; + + /** + * Sets an event based callback to be invoked during playback. + * + * Calling this method will replace a previously set callback for the given type, if any exists. + * + * The types available are: + * + * `onActive` - When the Tween is first created it moves to an 'active' state when added to the Tween Manager. 'Active' does not mean 'playing'. + * `onStart` - When the Tween starts playing after a delayed or paused state. This will happen at the same time as `onActive` if the tween has no delay and isn't paused. + * `onLoop` - When a Tween loops, if it has been set to do so. This happens _after_ the `loopDelay` expires, if set. + * `onComplete` - When the Tween finishes playback fully. Never invoked if the Tween is set to repeat infinitely. + * `onStop` - Invoked only if the `Tween.stop` method is called. + * `onPause` - Invoked only if the `Tween.pause` method is called. Not invoked if the Tween Manager is paused. + * `onResume` - Invoked only if the `Tween.resume` method is called. Not invoked if the Tween Manager is resumed. + * + * The following types are also available and are invoked on a `TweenData` level - that is per-object, per-property, being tweened. + * + * `onYoyo` - When a TweenData starts a yoyo. This happens _after_ the `hold` delay expires, if set. + * `onRepeat` - When a TweenData repeats playback. This happens _after_ the `repeatDelay` expires, if set. + * `onUpdate` - When a TweenData updates a property on a source target during playback. + * @param type The type of callback to set. One of: `onActive`, `onComplete`, `onLoop`, `onPause`, `onRepeat`, `onResume`, `onStart`, `onStop`, `onUpdate` or `onYoyo`. + * @param callback Your callback that will be invoked. + * @param params The parameters to pass to the callback. Pass an empty array if you don't want to define any, but do wish to set the scope. + */ + setCallback(type: Phaser.Types.Tweens.TweenCallbackTypes, callback: Function, params?: any[]): this; + + /** + * Sets this Tween state to PENDING. + */ + setPendingState(): void; + + /** + * Sets this Tween state to ACTIVE. + */ + setActiveState(): void; + + /** + * Sets this Tween state to LOOP_DELAY. + */ + setLoopDelayState(): void; + + /** + * Sets this Tween state to COMPLETE_DELAY. + */ + setCompleteDelayState(): void; + + /** + * Sets this Tween state to START_DELAY. + */ + setStartDelayState(): void; + + /** + * Sets this Tween state to PENDING_REMOVE. + */ + setPendingRemoveState(): void; + + /** + * Sets this Tween state to REMOVED. + */ + setRemovedState(): void; + + /** + * Sets this Tween state to FINISHED. + */ + setFinishedState(): void; + + /** + * Sets this Tween state to DESTROYED. + */ + setDestroyedState(): void; + + /** + * Returns `true` if this Tween has a _current_ state of PENDING, otherwise `false`. + */ + isPending(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of ACTIVE, otherwise `false`. + */ + isActive(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of LOOP_DELAY, otherwise `false`. + */ + isLoopDelayed(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of COMPLETE_DELAY, otherwise `false`. + */ + isCompleteDelayed(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of START_DELAY, otherwise `false`. + */ + isStartDelayed(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of PENDING_REMOVE, otherwise `false`. + */ + isPendingRemove(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of REMOVED, otherwise `false`. + */ + isRemoved(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of FINISHED, otherwise `false`. + */ + isFinished(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of DESTROYED, otherwise `false`. + */ + isDestroyed(): boolean; + + /** + * Handles the destroy process of this Tween, clearing out the + * Tween Data and resetting the targets. A Tween that has been + * destroyed cannot ever be played or used again. + */ + destroy(): void; + + } + + /** + * BaseTweenData is the class that the TweenData and TweenFrameData classes + * extend from. You should not typically instantiate this class directly, but instead + * use it to form your own tween data classes from, should you require it. + * + * Prior to Phaser 3.60 the TweenData was just an object, but was refactored to a class, + * to make it responsible for its own state and updating. + */ + class BaseTweenData { + /** + * + * @param tween The tween this TweenData instance belongs to. + * @param targetIndex The target index within the Tween targets array. + * @param key The property of the target to tween. + * @param getEnd What the property will be at the END of the Tween. + * @param getStart What the property will be at the START of the Tween. + * @param getActive If not null, is invoked _immediately_ as soon as the TweenData is running, and is set on the target property. + * @param ease The ease function this tween uses. + * @param delay Function that returns the time in milliseconds before tween will start. + * @param duration The duration of the tween in milliseconds. + * @param yoyo Determines whether the tween should return back to its start value after hold has expired. + * @param hold Function that returns the time in milliseconds the tween will pause before repeating or returning to its starting value if yoyo is set to true. + * @param repeat Function that returns the number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + * @param repeatDelay Function that returns the time in milliseconds before the repeat will start. + * @param flipX Should toggleFlipX be called when yoyo or repeat happens? + * @param flipY Should toggleFlipY be called when yoyo or repeat happens? + * @param interpolation The interpolation function to be used for arrays of data. Defaults to 'null'. + * @param interpolationData The array of interpolation data to be set. Defaults to 'null'. + */ + constructor(tween: Phaser.Tweens.Tween, targetIndex: number, key: string, getEnd: Phaser.Types.Tweens.GetEndCallback, getStart: Phaser.Types.Tweens.GetStartCallback, getActive: Phaser.Types.Tweens.GetActiveCallback | undefined, ease: Function, delay: Function, duration: number, yoyo: boolean, hold: number, repeat: number, repeatDelay: number, flipX: boolean, flipY: boolean, interpolation: Function | undefined, interpolationData: number[] | undefined); + + /** + * A reference to the Tween that this TweenData instance belongs to. + */ + tween: Phaser.Tweens.Tween; + + /** + * The index of the target within the Tween `targets` array. + */ + targetIndex: number; + + /** + * The duration of the tween in milliseconds, excluding any time required + * for yoyo or repeats. + */ + duration: number; + + /** + * The total calculated duration, in milliseconds, of this TweenData. + * Factoring in the duration, repeats, delays and yoyos. + */ + totalDuration: number; + + /** + * The time, in milliseconds, before this tween will start playing. + * + * This value is generated by the `getDelay` function. + */ + delay: number; + + /** + * This function returns the value to be used for `TweenData.delay`. + */ + getDelay: Function; + + /** + * Will the Tween ease back to its starting values, after reaching the end + * and any `hold` value that may be set? + */ + yoyo: boolean; + + /** + * The time, in milliseconds, before this tween will start a yoyo to repeat. + */ + hold: number; + + /** + * The number of times this tween will repeat. + * + * The tween will always run once regardless of this value, + * so a repeat value of '1' will play the tween twice: I.e. the original + * play-through and then it repeats that once (1). + * + * If this value is set to -1 this tween will repeat forever. + */ + repeat: number; + + /** + * The time, in milliseconds, before the repeat will start. + */ + repeatDelay: number; + + /** + * How many repeats are left to run? + */ + repeatCounter: number; + + /** + * If `true` this Tween will call `toggleFlipX` on the Tween target + * whenever it yoyo's or repeats. It will only be called if the target + * has a function matching this name, like most Phaser GameObjects do. + */ + flipX: boolean; + + /** + * If `true` this Tween will call `toggleFlipY` on the Tween target + * whenever it yoyo's or repeats. It will only be called if the target + * has a function matching this name, like most Phaser GameObjects do. + */ + flipY: boolean; + + /** + * A value between 0 and 1 holding the progress of this TweenData. + */ + progress: number; + + /** + * The amount of time, in milliseconds, that has elapsed since this + * TweenData was made active. + */ + elapsed: number; + + /** + * The state of this TweenData. + */ + state: Phaser.Tweens.StateType; + + /** + * Is this Tween Data currently waiting for a countdown to elapse, or not? + */ + isCountdown: boolean; + + /** + * Returns a reference to the target object belonging to this TweenData. + */ + getTarget(): object; + + /** + * Sets this TweenData's target object property to be the given value. + * @param value The value to set on the target. If not given, sets it to the last `current` value. + */ + setTargetValue(value?: number): void; + + /** + * Sets this TweenData state to CREATED. + */ + setCreatedState(): void; + + /** + * Sets this TweenData state to DELAY. + */ + setDelayState(): void; + + /** + * Sets this TweenData state to PENDING_RENDER. + */ + setPendingRenderState(): void; + + /** + * Sets this TweenData state to PLAYING_FORWARD. + */ + setPlayingForwardState(): void; + + /** + * Sets this TweenData state to PLAYING_BACKWARD. + */ + setPlayingBackwardState(): void; + + /** + * Sets this TweenData state to HOLD_DELAY. + */ + setHoldState(): void; + + /** + * Sets this TweenData state to REPEAT_DELAY. + */ + setRepeatState(): void; + + /** + * Sets this TweenData state to COMPLETE. + */ + setCompleteState(): void; + + /** + * Returns `true` if this TweenData has a _current_ state of CREATED, otherwise `false`. + */ + isCreated(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of DELAY, otherwise `false`. + */ + isDelayed(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of PENDING_RENDER, otherwise `false`. + */ + isPendingRender(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of PLAYING_FORWARD, otherwise `false`. + */ + isPlayingForward(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of PLAYING_BACKWARD, otherwise `false`. + */ + isPlayingBackward(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of HOLD_DELAY, otherwise `false`. + */ + isHolding(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of REPEAT_DELAY, otherwise `false`. + */ + isRepeating(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of COMPLETE, otherwise `false`. + */ + isComplete(): boolean; + + /** + * Internal method used as part of the playback process that checks if this + * TweenData should yoyo, repeat, or has completed. + * @param diff Any extra time that needs to be accounted for in the elapsed and progress values. + */ + setStateFromEnd(diff: number): void; + + /** + * Internal method used as part of the playback process that checks if this + * TweenData should repeat or has completed. + * @param diff Any extra time that needs to be accounted for in the elapsed and progress values. + */ + setStateFromStart(diff: number): void; + + /** + * Internal method that resets this Tween Data entirely, including the progress and elapsed values. + * + * Called automatically by the parent Tween. Should not be called directly. + */ + reset(): void; + + /** + * Internal method that handles repeating or yoyo'ing this TweenData. + * + * Called automatically by `setStateFromStart` and `setStateFromEnd`. + * @param diff Any extra time that needs to be accounted for in the elapsed and progress values. + * @param setStart Set the TweenData start values? + * @param isYoyo Is this call a Yoyo check? + */ + onRepeat(diff: number, setStart: boolean, isYoyo: boolean): void; + + /** + * Immediately destroys this TweenData, nulling of all its references. + */ + destroy(): void; + + } + + /** + * Phaser Tween States. + */ + enum States { + /** + * TweenData state. + */ + CREATED, + /** + * TweenData state. + */ + DELAY, + /** + * TweenData state. + */ + PENDING_RENDER, + /** + * TweenData state. + */ + PLAYING_FORWARD, + /** + * TweenData state. + */ + PLAYING_BACKWARD, + /** + * TweenData state. + */ + HOLD_DELAY, + /** + * TweenData state. + */ + REPEAT_DELAY, + /** + * TweenData state. + */ + COMPLETE, + /** + * Tween state. The Tween has been created but has not yet been added to the Tween Manager. + */ + PENDING, + /** + * Tween state. The Tween is active within the Tween Manager. This means it is either playing, + * or was playing and is currently paused, but in both cases it's still being processed by + * the Tween Manager, so is considered 'active'. + */ + ACTIVE, + /** + * Tween state. The Tween is waiting for a loop countdown to elapse. + */ + LOOP_DELAY, + /** + * Tween state. The Tween is waiting for a complete delay to elapse. + */ + COMPLETE_DELAY, + /** + * Tween state. The Tween is waiting for a starting delay to elapse. + */ + START_DELAY, + /** + * Tween state. The Tween has finished playback and is waiting to be removed from the Tween Manager. + */ + PENDING_REMOVE, + /** + * Tween state. The Tween has been removed from the Tween Manager. + */ + REMOVED, + /** + * Tween state. The Tween has finished playback but was flagged as 'persistent' during creation, + * so will not be automatically removed by the Tween Manager. + */ + FINISHED, + /** + * Tween state. The Tween has been destroyed and can no longer be played by a Tween Manager. + */ + DESTROYED, + /** + * A large integer value used for 'infinite' style countdowns. + * + * Similar use-case to Number.MAX_SAFE_INTEGER but we cannot use that because it's not + * supported on IE. + */ + MAX, + } + + /** + * Phaser Tween state constants. + */ + type StateType = Phaser.Tweens.States; + + /** + * A Tween is able to manipulate the properties of one or more objects to any given value, based + * on a duration and type of ease. They are rarely instantiated directly and instead should be + * created via the TweenManager. + * + * Please note that a Tween will not manipulate any property that begins with an underscore. + */ + class Tween extends Phaser.Tweens.BaseTween { + /** + * + * @param parent A reference to the Tween Manager that owns this Tween. + * @param targets An array of targets to be tweened. + */ + constructor(parent: Phaser.Tweens.TweenManager, targets: object[]); + + /** + * An array of references to the target/s this Tween is operating on. + * + * This array should not be manipulated outside of this Tween. + */ + targets: object[]; + + /** + * Cached target total. + * + * Used internally and should be treated as read-only. + * + * This is not necessarily the same as the data total. + */ + totalTargets: number; + + /** + * Is this Tween currently seeking? + * + * This boolean is toggled in the `Tween.seek` method. + * + * When a tween is seeking, by default it will not dispatch any events or callbacks. + */ + readonly isSeeking: boolean; + + /** + * Does this Tween loop or repeat infinitely? + */ + readonly isInfinite: boolean; + + /** + * Elapsed time in milliseconds of this run through of the Tween. + */ + elapsed: number; + + /** + * Total elapsed time in milliseconds of the entire Tween, including looping. + */ + totalElapsed: number; + + /** + * Time in milliseconds for the whole Tween to play through once, excluding loop amounts and loop delays. + * + * This value is set in the `Tween.initTweenData` method and is zero before that point. + */ + duration: number; + + /** + * Value between 0 and 1. The amount of progress through the Tween, excluding loops. + */ + progress: number; + + /** + * Time in milliseconds it takes for the Tween to complete a full playthrough (including looping) + * + * For an infinite Tween, this value is a very large integer. + */ + totalDuration: number; + + /** + * The amount of progress that has been made through the entire Tween, including looping. + * + * A value between 0 and 1. + */ + totalProgress: number; + + /** + * Adds a new TweenData to this Tween. Typically, this method is called + * automatically by the TweenBuilder, however you can also invoke it + * yourself. + * @param targetIndex The target index within the Tween targets array. + * @param key The property of the target to tween. + * @param getEnd What the property will be at the END of the Tween. + * @param getStart What the property will be at the START of the Tween. + * @param getActive If not null, is invoked _immediately_ as soon as the TweenData is running, and is set on the target property. + * @param ease The ease function this tween uses. + * @param delay Function that returns the time in milliseconds before tween will start. + * @param duration The duration of the tween in milliseconds. + * @param yoyo Determines whether the tween should return back to its start value after hold has expired. + * @param hold Function that returns the time in milliseconds the tween will pause before repeating or returning to its starting value if yoyo is set to true. + * @param repeat Function that returns the number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + * @param repeatDelay Function that returns the time in milliseconds before the repeat will start. + * @param flipX Should toggleFlipX be called when yoyo or repeat happens? + * @param flipY Should toggleFlipY be called when yoyo or repeat happens? + * @param interpolation The interpolation function to be used for arrays of data. Defaults to 'null'. + * @param interpolationData The array of interpolation data to be set. Defaults to 'null'. + */ + add(targetIndex: number, key: string, getEnd: Phaser.Types.Tweens.GetEndCallback, getStart: Phaser.Types.Tweens.GetStartCallback, getActive: Phaser.Types.Tweens.GetActiveCallback | undefined, ease: Function, delay: Function, duration: number, yoyo: boolean, hold: number, repeat: number, repeatDelay: number, flipX: boolean, flipY: boolean, interpolation: Function | undefined, interpolationData: number[] | undefined): Phaser.Tweens.TweenData; + + /** + * Adds a new TweenFrameData to this Tween. Typically, this method is called + * automatically by the TweenBuilder, however you can also invoke it + * yourself. + * @param targetIndex The target index within the Tween targets array. + * @param texture The texture to set on the target at the end of the tween. + * @param frame The texture frame to set on the target at the end of the tween. + * @param delay Function that returns the time in milliseconds before tween will start. + * @param duration The duration of the tween in milliseconds. + * @param hold Function that returns the time in milliseconds the tween will pause before repeating or returning to its starting value if yoyo is set to true. + * @param repeat Function that returns the number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + * @param repeatDelay Function that returns the time in milliseconds before the repeat will start. + * @param flipX Should toggleFlipX be called when yoyo or repeat happens? + * @param flipY Should toggleFlipY be called when yoyo or repeat happens? + */ + addFrame(targetIndex: number, texture: string, frame: string | number, delay: Function, duration: number, hold: number, repeat: number, repeatDelay: number, flipX: boolean, flipY: boolean): Phaser.Tweens.TweenFrameData; + + /** + * Returns the current value of the specified Tween Data. + * + * If this Tween has been destroyed, it will return `null`. + * @param index The Tween Data to return the value from. Default 0. + */ + getValue(index?: number): number; + + /** + * See if this Tween is currently acting upon the given target. + * @param target The target to check against this Tween. + */ + hasTarget(target: object): boolean; + + /** + * Updates the 'end' value of the given property across all matching targets, as long + * as this Tween is currently playing (either forwards or backwards). + * + * Calling this does not adjust the duration of the Tween, or the current progress. + * + * You can optionally tell it to set the 'start' value to be the current value. + * + * If this Tween is in any other state other than playing then calling this method has no effect. + * + * Additionally, if the Tween repeats, is reset, or is seeked, it will revert to the original + * starting and ending values. + * @param key The property to set the new value for. You cannot update the 'texture' property via this method. + * @param value The new value of the property. + * @param startToCurrent Should this change set the start value to be the current value? Default false. + */ + updateTo(key: string, value: number, startToCurrent?: boolean): this; + + /** + * Restarts the Tween from the beginning. + * + * If the Tween has already finished and been destroyed, restarting it will throw an error. + * + * If you wish to restart the Tween from a specific point, use the `Tween.seek` method instead. + */ + restart(): this; + + /** + * Internal method that advances to the next state of the Tween during playback. + */ + nextState(): boolean; + + /** + * Internal method that handles this tween completing and starting + * the next tween in the chain, if any. + */ + onCompleteHandler(): void; + + /** + * Starts a Tween playing. + * + * You only need to call this method if you have configured the tween to be paused on creation. + * + * If the Tween is already playing, calling this method again will have no effect. If you wish to + * restart the Tween, use `Tween.restart` instead. + * + * Calling this method after the Tween has completed will start the Tween playing again from the beginning. + * This is the same as calling `Tween.seek(0)` and then `Tween.play()`. + */ + play(): this; + + /** + * Seeks to a specific point in the Tween. + * + * The given amount is a value in milliseconds that represents how far into the Tween + * you wish to seek, based on the start of the Tween. + * + * Note that the seek amount takes the entire duration of the Tween into account, including delays, loops and repeats. + * For example, a Tween that lasts for 2 seconds, but that loops 3 times, would have a total duration of 6 seconds, + * so seeking to 3000 ms would seek to the Tweens half-way point based on its _entire_ duration. + * + * Prior to Phaser 3.60 this value was given as a number between 0 and 1 and didn't + * work for Tweens had an infinite repeat. This new method works for all Tweens. + * + * Seeking works by resetting the Tween to its initial values and then iterating through the Tween at `delta` + * jumps per step. The longer the Tween, the longer this can take. If you need more precision you can + * reduce the delta value. If you need a faster seek, you can increase it. When the Tween is + * reset it will refresh the starting and ending values. If these are coming from a dynamic function, + * or a random array, it will be called for each seek. + * + * While seeking the Tween will _not_ emit any of its events or callbacks unless + * the 3rd parameter is set to `true`. + * + * If this Tween is paused, seeking will not change this fact. It will advance the Tween + * to the desired point and then pause it again. + * @param amount The number of milliseconds to seek into the Tween from the beginning. Default 0. + * @param delta The size of each step when seeking through the Tween. A higher value completes faster but at the cost of less precision. Default 16.6. + * @param emit While seeking, should the Tween emit any of its events or callbacks? The default is 'false', i.e. to seek silently. Default false. + */ + seek(amount?: number, delta?: number, emit?: boolean): this; + + /** + * Initialises all of the Tween Data and Tween values. + * + * This is called automatically and should not typically be invoked directly. + * @param isSeeking Is the Tween Data being reset as part of a seek? Default false. + */ + initTweenData(isSeeking?: boolean): void; + + /** + * Resets this Tween ready for another play-through. + * + * This is called automatically from the Tween Manager, or from the parent TweenChain, + * and should not typically be invoked directly. + * + * If you wish to restart this Tween, use the `Tween.restart` or `Tween.seek` methods instead. + * @param skipInit Skip resetting the TweenData and Active State? Default false. + */ + reset(skipInit?: boolean): this; + + /** + * Internal method that advances the Tween based on the time values. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(delta: number): boolean; + + /** + * Moves this Tween forward by the given amount of milliseconds. + * + * It will only advance through the current loop of the Tween. For example, if the + * Tween is set to repeat or yoyo, it can only fast forward through a single + * section of the sequence. Use `Tween.seek` for more complex playhead control. + * + * If the Tween is paused or has already finished, calling this will have no effect. + * @param ms The number of milliseconds to advance this Tween by. + */ + forward(ms: number): this; + + /** + * Moves this Tween backward by the given amount of milliseconds. + * + * It will only rewind through the current loop of the Tween. For example, if the + * Tween is set to repeat or yoyo, it can only fast forward through a single + * section of the sequence. Use `Tween.seek` for more complex playhead control. + * + * If the Tween is paused or has already finished, calling this will have no effect. + * @param ms The number of milliseconds to rewind this Tween by. + */ + rewind(ms: number): this; + + /** + * Internal method that will emit a Tween based Event and invoke the given callback. + * @param event The Event to be dispatched. + * @param callback The name of the callback to be invoked. Can be `null` or `undefined` to skip invocation. + */ + dispatchEvent(event: Phaser.Types.Tweens.Event, callback?: Phaser.Types.Tweens.TweenCallbackTypes): void; + + /** + * Handles the destroy process of this Tween, clearing out the + * Tween Data and resetting the targets. A Tween that has been + * destroyed cannot ever be played or used again. + */ + destroy(): void; + + } + + /** + * A TweenChain is a special type of Tween that allows you to create a sequence of Tweens, chained to one-another, + * and add them to the Tween Manager. + * + * The tweens are played in order, from start to finish. You can optionally set the chain + * to repeat as many times as you like. Once the chain has finished playing, or repeating if set, + * all tweens in the chain will be destroyed automatically. To override this, set the 'persist' + * argument to 'true'. + * + * Playback will start immediately unless the _first_ Tween has been configured to be paused. + * + * Please note that Tweens will not manipulate any target property that begins with an underscore. + */ + class TweenChain extends Phaser.Tweens.BaseTween { + /** + * + * @param parent A reference to the Tween Manager, or TweenChain, that owns this TweenChain. + */ + constructor(parent: Phaser.Tweens.TweenManager | Phaser.Tweens.TweenChain); + + /** + * A reference to the Tween that this TweenChain is currently playing. + */ + currentTween: Phaser.Tweens.Tween; + + /** + * A reference to the data array index of the currently playing tween. + */ + currentIndex: number; + + /** + * Prepares this TweenChain for playback. + * + * Called automatically by the TweenManager. Should not be called directly. + */ + init(): this; + + /** + * Create a sequence of Tweens, chained to one-another, and add them to this Tween Manager. + * + * The tweens are played in order, from start to finish. You can optionally set the chain + * to repeat as many times as you like. Once the chain has finished playing, or repeating if set, + * all tweens in the chain will be destroyed automatically. To override this, set the 'persist' + * argument to 'true'. + * + * Playback will start immediately unless the _first_ Tween has been configured to be paused. + * + * Please note that Tweens will not manipulate any target property that begins with an underscore. + * @param tweens An array of Tween configuration objects for the Tweens in this chain. + */ + add(tweens: Phaser.Types.Tweens.TweenBuilderConfig[] | object[]): this; + + /** + * See if any of the tweens in this Tween Chain is currently acting upon the given target. + * @param target The target to check against this TweenChain. + */ + hasTarget(target: object): boolean; + + /** + * Restarts the TweenChain from the beginning. + * + * If this TweenChain was configured to have a loop, or start delay, those + * are reset to their initial values as well. It will also dispatch the + * `onActive` callback and event again. + */ + restart(): this; + + /** + * Resets the given Tween. + * + * It will seek to position 0 and playback will start on the next frame. + * @param tween The Tween to be reset. + */ + reset(tween: Phaser.Tweens.Tween): this; + + /** + * Internal method that advances to the next state of the TweenChain playback. + */ + nextState(): boolean; + + /** + * Starts this TweenChain playing. + * + * You only need to call this method if you have configured this TweenChain to be paused on creation. + * + * If the TweenChain is already playing, calling this method again will have no effect. If you wish to + * restart the chain, use `TweenChain.restart` instead. + * + * Calling this method after the TweenChain has completed will start the chain playing again from the beginning. + */ + play(): this; + + /** + * Internal method that resets all of the Tweens and the current index pointer. + */ + resetTweens(): void; + + /** + * Internal method that advances the TweenChain based on the time values. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(delta: number): boolean; + + /** + * Immediately advances to the next Tween in the chain. + * + * This is typically called internally, but can be used if you need to + * advance playback for some reason. + */ + nextTween(): boolean; + + /** + * Sets the current active Tween to the given index, based on its + * entry in the TweenChain data array. + * @param index The index of the Tween to be made current. + */ + setCurrentTween(index: number): void; + + /** + * Internal method that will emit a TweenChain based Event and invoke the given callback. + * @param event The Event to be dispatched. + * @param callback The name of the callback to be invoked. Can be `null` or `undefined` to skip invocation. + */ + dispatchEvent(event: Phaser.Types.Tweens.Event, callback?: Phaser.Types.Tweens.TweenCallbackTypes): void; + + /** + * Immediately destroys this TweenChain, nulling of all its references. + */ + destroy(): void; + + } + + /** + * The TweenData is a class that contains a single target and property that is being tweened. + * + * Tweens create TweenData instances when they are created, with one TweenData instance per + * target, per property. A Tween can own multiple TweenData instances, but a TweenData only + * ever belongs to a single Tween. + * + * You should not typically create these yourself, but rather use the TweenBuilder, + * or the `Tween.add` method. + * + * Prior to Phaser 3.60 the TweenData was just an object, but was refactored to a class, + * to make it responsible for its own state and updating. + */ + class TweenData extends Phaser.Tweens.BaseTweenData { + /** + * + * @param tween The tween this TweenData instance belongs to. + * @param targetIndex The target index within the Tween targets array. + * @param key The property of the target to tween. + * @param getEnd What the property will be at the END of the Tween. + * @param getStart What the property will be at the START of the Tween. + * @param getActive If not null, is invoked _immediately_ as soon as the TweenData is running, and is set on the target property. + * @param ease The ease function this tween uses. + * @param delay Function that returns the time in milliseconds before tween will start. + * @param duration The duration of the tween in milliseconds. + * @param yoyo Determines whether the tween should return back to its start value after hold has expired. + * @param hold Function that returns the time in milliseconds the tween will pause before repeating or returning to its starting value if yoyo is set to true. + * @param repeat Function that returns the number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + * @param repeatDelay Function that returns the time in milliseconds before the repeat will start. + * @param flipX Should toggleFlipX be called when yoyo or repeat happens? + * @param flipY Should toggleFlipY be called when yoyo or repeat happens? + * @param interpolation The interpolation function to be used for arrays of data. Defaults to 'null'. + * @param interpolationData The array of interpolation data to be set. Defaults to 'null'. + */ + constructor(tween: Phaser.Tweens.Tween, targetIndex: number, key: string, getEnd: Phaser.Types.Tweens.GetEndCallback, getStart: Phaser.Types.Tweens.GetStartCallback, getActive: Phaser.Types.Tweens.GetActiveCallback | undefined, ease: Function, delay: Function, duration: number, yoyo: boolean, hold: number, repeat: number, repeatDelay: number, flipX: boolean, flipY: boolean, interpolation: Function | undefined, interpolationData: number[] | undefined); + + /** + * The property of the target to be tweened. + */ + readonly key: string; + + /** + * A function that returns what to set the target property to, + * the moment the TweenData is invoked. + * + * This is called when this TweenData is inititalised or reset. + */ + getActiveValue: Phaser.Types.Tweens.GetActiveCallback | null; + + /** + * A function that returns what to set the target property to + * at the end of the tween. + * + * This is called when the tween starts playing, after any initial + * start delay, or if the tween is reset, or is set to repeat. + */ + getEndValue: Phaser.Types.Tweens.GetEndCallback; + + /** + * A function that returns what to set the target property to + * at the start of the tween. + * + * This is called when the tween starts playing, after any initial + * start delay, or if the tween is reset, or is set to repeat. + */ + getStartValue: Phaser.Types.Tweens.GetStartCallback; + + /** + * The ease function this Tween uses to calculate the target value. + */ + ease: Function; + + /** + * The targets starting value, as returned by `getStartValue`. + */ + start: number; + + /** + * The target value from the previous step. + */ + previous: number; + + /** + * The targets current value, as recorded in the most recent step. + */ + current: number; + + /** + * The targets ending value, as returned by `getEndValue`. + */ + end: number; + + /** + * The interpolation function to be used for arrays of data. + */ + interpolation: Function | null; + + /** + * The array of data to interpolate, if interpolation is being used. + */ + interpolationData: number[] | null; + + /** + * Internal method that resets this Tween Data entirely, including the progress and elapsed values. + * + * Called automatically by the parent Tween. Should not be called directly. + * @param isSeeking Is the Tween Data being reset as part of a Tween seek? Default false. + */ + reset(isSeeking?: boolean): void; + + /** + * Internal method that advances this TweenData based on the delta value given. + * @param delta The elapsed delta time in ms. + */ + update(delta: number): boolean; + + /** + * Internal method that will emit a TweenData based Event on the + * parent Tween and also invoke the given callback, if provided. + * @param event The Event to be dispatched. + * @param callback The name of the callback to be invoked. Can be `null` or `undefined` to skip invocation. + */ + dispatchEvent(event: Phaser.Types.Tweens.Event, callback?: Phaser.Types.Tweens.TweenCallbackTypes): void; + + /** + * Immediately destroys this TweenData, nulling of all its references. + */ + destroy(): void; + + } + + /** + * The TweenFrameData is a class that contains a single target that will change the texture frame + * at the conclusion of the Tween. + * + * TweenFrameData instances are typically created by the TweenBuilder automatically, when it + * detects the prescence of a 'texture' property as the key being tweened. + * + * A Tween can own multiple TweenFrameData instances, but a TweenFrameData only + * ever belongs to a single Tween. + * + * You should not typically create these yourself, but rather use the TweenBuilder, + * or the `Tween.addFrame` method. + */ + class TweenFrameData extends Phaser.Tweens.BaseTweenData { + /** + * + * @param tween The tween this TweenData instance belongs to. + * @param targetIndex The target index within the Tween targets array. + * @param texture The texture key to set at the end of this tween. + * @param frame The texture frame to set at the end of this tween. + * @param delay Function that returns the time in milliseconds before tween will start. + * @param duration The duration of the tween in milliseconds. + * @param hold Function that returns the time in milliseconds the tween will pause before repeating or returning to its starting value if yoyo is set to true. + * @param repeat Function that returns the number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + * @param repeatDelay Function that returns the time in milliseconds before the repeat will start. + * @param flipX Should toggleFlipX be called when yoyo or repeat happens? + * @param flipY Should toggleFlipY be called when yoyo or repeat happens? + */ + constructor(tween: Phaser.Tweens.Tween, targetIndex: number, texture: string, frame: string | number, delay: Function, duration: number, hold: number, repeat: number, repeatDelay: number, flipX: boolean, flipY: boolean); + + /** + * The property of the target to be tweened. + * + * Always 'texture' for a TweenFrameData object. + */ + readonly key: string; + + /** + * The texture to be set at the start of the tween. + */ + startTexture: string; + + /** + * The texture to be set at the end of the tween. + */ + endTexture: string; + + /** + * The frame to be set at the start of the tween. + */ + startFrame: string | number; + + /** + * The frame to be set at the end of the tween. + */ + endFrame: string | number; + + /** + * Will the Tween ease back to its starting values, after reaching the end + * and any `hold` value that may be set? + */ + yoyo: boolean; + + /** + * Internal method that resets this Tween Data entirely, including the progress and elapsed values. + * + * Called automatically by the parent Tween. Should not be called directly. + * @param isSeeking Is the Tween Data being reset as part of a Tween seek? Default false. + */ + reset(isSeeking?: boolean): void; + + /** + * Internal method that advances this TweenData based on the delta value given. + * @param delta The elapsed delta time in ms. + */ + update(delta: number): boolean; + + /** + * Internal method that will emit a TweenData based Event on the + * parent Tween and also invoke the given callback, if provided. + * @param event The Event to be dispatched. + * @param callback The name of the callback to be invoked. Can be `null` or `undefined` to skip invocation. + */ + dispatchEvent(event: Phaser.Types.Tweens.Event, callback?: Phaser.Types.Tweens.TweenCallbackTypes): void; + + /** + * Immediately destroys this TweenData, nulling of all its references. + */ + destroy(): void; + + } + + /** + * The Tween Manager is a default Scene Plugin which controls and updates Tweens. + * + * A tween is a way to alter one or more properties of a target object over a defined period of time. + * + * Tweens are created by calling the `add` method and passing in the configuration object. + * + * ```js + * const logo = this.add.image(100, 100, 'logo'); + * + * this.tweens.add({ + * targets: logo, + * x: 600, + * ease: 'Power1', + * duration: 2000 + * }); + * ``` + * + * See the `TweenBuilderConfig` for all of the options you have available. + * + * Playback will start immediately unless the tween has been configured to be paused. + * + * Please note that a Tween will not manipulate any target property that begins with an underscore. + * + * Tweens are designed to be 'fire-and-forget'. They automatically destroy themselves once playback + * is complete, to free-up memory and resources. If you wish to keep a tween after playback, i.e. to + * play it again at a later time, then you should set the `persist` property to `true` in the config. + * However, doing so means it's entirely up to _you_ to destroy the tween when you're finished with it, + * otherwise it will linger in memory forever. + * + * If you wish to chain Tweens together for sequential playback, see the `TweenManager.chain` method. + */ + class TweenManager { + /** + * + * @param scene The Scene which owns this Tween Manager. + */ + constructor(scene: Phaser.Scene); + + /** + * The Scene which owns this Tween Manager. + */ + scene: Phaser.Scene; + + /** + * The Scene Systems Event Emitter. + */ + events: Phaser.Events.EventEmitter; + + /** + * The time scale of the Tween Manager. + * + * This value scales the time delta between two frames, thus influencing the speed of time for all Tweens owned by this Tween Manager. + */ + timeScale: number; + + /** + * This toggles the updating state of this Tween Manager. + * + * Setting `paused` to `true` (or calling the `pauseAll` method) will + * stop this Tween Manager from updating any of its tweens, including + * newly created ones. Set back to `false` to resume playback. + */ + paused: boolean; + + /** + * Is this Tween Manager currently processing the tweens as part of + * its 'update' loop? This is set to 'true' at the start of 'update' + * and reset to 'false' at the end of the function. Allows you to trap + * Tween Manager status during tween callbacks. + */ + processing: boolean; + + /** + * An array of Tweens which are actively being processed by the Tween Manager. + */ + tweens: Phaser.Tweens.Tween[]; + + /** + * The time the Tween Manager was updated. + */ + time: number; + + /** + * The time the Tween Manager was started. + */ + startTime: number; + + /** + * The time the Tween Manager should next update. + */ + nextTime: number; + + /** + * The time the Tween Manager previously updated. + */ + prevTime: number; + + /** + * The maximum amount of time, in milliseconds, the browser can + * lag for, before lag smoothing is applied. + * + * See the `TweenManager.setLagSmooth` method for further details. + */ + maxLag: number; + + /** + * The amount of time, in milliseconds, that is used to set the + * delta when lag smoothing is applied. + * + * See the `TweenManager.setLagSmooth` method for further details. + */ + lagSkip: number; + + /** + * An internal value that holds the fps rate. + */ + gap: number; + + /** + * Create a Tween and return it, but does not add it to this Tween Manager. + * + * Please note that a Tween will not manipulate any target property that begins with an underscore. + * + * In order to play this tween, you'll need to add it to a Tween Manager via + * the `TweenManager.existing` method. + * + * You can optionally pass an **array** of Tween Configuration objects to this method and it will create + * one Tween per entry in the array. If an array is given, an array of tweens is returned. + * @param config A Tween Configuration object. Or an array of Tween Configuration objects. + */ + create(config: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenBuilderConfig[] | object | object[]): Phaser.Tweens.Tween | Phaser.Tweens.Tween[]; + + /** + * Create a Tween and add it to this Tween Manager by passing a Tween Configuration object. + * + * Example, run from within a Scene: + * + * ```js + * const logo = this.add.image(100, 100, 'logo'); + * + * this.tweens.add({ + * targets: logo, + * x: 600, + * ease: 'Power1', + * duration: 2000 + * }); + * ``` + * + * See the `TweenBuilderConfig` for all of the options you have available. + * + * Playback will start immediately unless the tween has been configured to be paused. + * + * Please note that a Tween will not manipulate any target property that begins with an underscore. + * + * Tweens are designed to be 'fire-and-forget'. They automatically destroy themselves once playback + * is complete, to free-up memory and resources. If you wish to keep a tween after playback, i.e. to + * play it again at a later time, then you should set the `persist` property to `true` in the config. + * However, doing so means it's entirely up to _you_ to destroy the tween when you're finished with it, + * otherwise it will linger in memory forever. + * + * If you wish to chain Tweens together for sequential playback, see the `TweenManager.chain` method. + * @param config A Tween Configuration object, or a Tween or TweenChain instance. + */ + add(config: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenChainBuilderConfig | Phaser.Tweens.Tween | Phaser.Tweens.TweenChain): Phaser.Tweens.Tween; + + /** + * Create multiple Tweens and add them all to this Tween Manager, by passing an array of Tween Configuration objects. + * + * See the `TweenBuilderConfig` for all of the options you have available. + * + * Playback will start immediately unless the tweens have been configured to be paused. + * + * Please note that a Tween will not manipulate any target property that begins with an underscore. + * + * Tweens are designed to be 'fire-and-forget'. They automatically destroy themselves once playback + * is complete, to free-up memory and resources. If you wish to keep a tween after playback, i.e. to + * play it again at a later time, then you should set the `persist` property to `true` in the config. + * However, doing so means it's entirely up to _you_ to destroy the tween when you're finished with it, + * otherwise it will linger in memory forever. + * + * If you wish to chain Tweens together for sequential playback, see the `TweenManager.chain` method. + * @param configs An array of Tween Configuration objects. + */ + addMultiple(configs: Phaser.Types.Tweens.TweenBuilderConfig[] | object[]): Phaser.Tweens.Tween[]; + + /** + * Create a sequence of Tweens, chained to one-another, and add them to this Tween Manager. + * + * The tweens are played in order, from start to finish. You can optionally set the chain + * to repeat as many times as you like. Once the chain has finished playing, or repeating if set, + * all tweens in the chain will be destroyed automatically. To override this, set the `persist` + * argument to 'true'. + * + * Playback will start immediately unless the _first_ Tween has been configured to be paused. + * + * Please note that Tweens will not manipulate any target property that begins with an underscore. + * @param tweens A Tween Chain configuration object. + */ + chain(tweens: Phaser.Types.Tweens.TweenChainBuilderConfig | object): Phaser.Tweens.TweenChain; + + /** + * Returns an array containing this Tween and all Tweens chained to it, + * in the order in which they will be played. + * + * If there are no chained Tweens an empty array is returned. + * @param tween The Tween to return the chain from. + */ + getChainedTweens(tween: Phaser.Tweens.Tween): Phaser.Tweens.Tween[]; + + /** + * Check to see if the given Tween instance exists within this Tween Manager. + * + * Will return `true` as long as the Tween is being processed by this Tween Manager. + * + * Will return `false` if not present, or has a state of `REMOVED` or `DESTROYED`. + * @param tween The Tween instance to check. + */ + has(tween: Phaser.Tweens.Tween): boolean; + + /** + * Add an existing Tween to this Tween Manager. + * + * Playback will start immediately unless the tween has been configured to be paused. + * @param tween The Tween to add. + */ + existing(tween: Phaser.Tweens.Tween): this; + + /** + * Create a Number Tween and add it to the active Tween list. + * + * A Number Tween is a special kind of tween that doesn't have a target. Instead, + * it allows you to tween between 2 numeric values. The default values are + * `0` and `1`, but you can change them via the `from` and `to` properties. + * + * You can get the current tweened value via the `Tween.getValue()` method. + * + * Playback will start immediately unless the tween has been configured to be paused. + * + * Please note that a Tween will not manipulate any target property that begins with an underscore. + * @param config The configuration object for the Number Tween. + */ + addCounter(config: Phaser.Types.Tweens.NumberTweenBuilderConfig): Phaser.Tweens.Tween; + + /** + * Creates a Stagger function to be used by a Tween property. + * + * The stagger function will allow you to stagger changes to the value of the property across all targets of the tween. + * + * This is only worth using if the tween has multiple targets. + * + * The following will stagger the delay by 100ms across all targets of the tween, causing them to scale down to 0.2 + * over the duration specified: + * + * ```javascript + * this.tweens.add({ + * targets: [ ... ], + * scale: 0.2, + * ease: 'linear', + * duration: 1000, + * delay: this.tweens.stagger(100) + * }); + * ``` + * + * The following will stagger the delay by 500ms across all targets of the tween using a 10 x 6 grid, staggering + * from the center out, using a cubic ease. + * + * ```javascript + * this.tweens.add({ + * targets: [ ... ], + * scale: 0.2, + * ease: 'linear', + * duration: 1000, + * delay: this.tweens.stagger(500, { grid: [ 10, 6 ], from: 'center', ease: 'cubic.out' }) + * }); + * ``` + * @param value The amount to stagger by, or an array containing two elements representing the min and max values to stagger between. + * @param config The configuration object for the Stagger function. + */ + stagger(value: number | number[], config: Phaser.Types.Tweens.StaggerConfig): Function; + + /** + * Set the limits that are used when a browser encounters lag, or delays that cause the elapsed + * time between two frames to exceed the expected amount. If this occurs, the Tween Manager will + * act as if the 'skip' amount of times has passed, in order to maintain strict tween sequencing. + * + * This is enabled by default with the values 500ms for the lag limit and 33ms for the skip. + * + * You should not set these to low values, as it won't give time for the browser to ever + * catch-up with itself and reclaim sync. + * + * Call this method with no arguments to disable smoothing. + * + * Call it with the arguments `500` and `33` to reset to the defaults. + * @param limit If the browser exceeds this amount, in milliseconds, it will act as if the 'skip' amount has elapsed instead. Default 0. + * @param skip The amount, in milliseconds, to use as the step delta should the browser lag beyond the 'limit'. Default 0. + */ + setLagSmooth(limit?: number, skip?: number): this; + + /** + * Limits the Tween system to run at a particular frame rate. + * + * You should not set this _above_ the frequency of the browser, + * but instead can use it to throttle the frame rate lower, should + * you need to in certain situations. + * @param fps The frame rate to tick at. Default 240. + */ + setFps(fps?: number): this; + + /** + * Internal method that calculates the delta value, along with the other timing values, + * and returns the new delta. + * + * You should not typically call this method directly. + * @param tick Is this a manual tick, or an automated tick? Default false. + */ + getDelta(tick?: boolean): number; + + /** + * Manually advance the Tween system by one step. + * + * This will update all Tweens even if the Tween Manager is currently + * paused. + */ + tick(): this; + + /** + * Internal update handler. + * + * Calls `TweenManager.step` as long as the Tween Manager has not + * been paused. + */ + update(): void; + + /** + * Updates all Tweens belonging to this Tween Manager. + * + * Called automatically by `update` and `tick`. + * @param tick Is this a manual tick, or an automated tick? Default false. + */ + step(tick?: boolean): void; + + /** + * Removes the given Tween from this Tween Manager, even if it hasn't started + * playback yet. If this method is called while the Tween Manager is processing + * an update loop, then the tween will be flagged for removal at the start of + * the next frame. Otherwise, it is removed immediately. + * + * The removed tween is _not_ destroyed. It is just removed from this Tween Manager. + * @param tween The Tween to be removed. + */ + remove(tween: Phaser.Tweens.Tween): this; + + /** + * Resets the given Tween. + * + * If the Tween does not belong to this Tween Manager, it will first be added. + * + * Then it will seek to position 0 and playback will start on the next frame. + * @param tween The Tween to be reset. + */ + reset(tween: Phaser.Tweens.Tween): this; + + /** + * Checks if a Tween is active and adds it to the Tween Manager at the start of the frame if it isn't. + * @param tween The Tween to check. + */ + makeActive(tween: Phaser.Tweens.Tween): this; + + /** + * Passes all Tweens to the given callback. + * @param callback The function to call. + * @param scope The scope (`this` object) to call the function with. + * @param args The arguments to pass into the function. Its first argument will always be the Tween currently being iterated. + */ + each(callback: Function, scope?: object, ...args: any[]): this; + + /** + * Returns an array containing references to all Tweens in this Tween Manager. + * + * It is safe to mutate the returned array. However, acting upon any of the Tweens + * within it, will adjust those stored in this Tween Manager, as they are passed + * by reference and not cloned. + * + * If you wish to get tweens for a specific target, see `getTweensOf`. + */ + getTweens(): Phaser.Tweens.Tween[]; + + /** + * Returns an array of all Tweens in the Tween Manager which affect the given target, or array of targets. + * + * It's possible for this method to return tweens that are about to be removed from + * the Tween Manager. You should check the state of the returned tween before acting + * upon it. + * @param target The target to look for. Provide an array to look for multiple targets. + */ + getTweensOf(target: object | object[]): Phaser.Tweens.Tween[]; + + /** + * Returns the scale of the time delta for all Tweens owned by this Tween Manager. + */ + getGlobalTimeScale(): number; + + /** + * Sets a new scale of the time delta for this Tween Manager. + * + * The time delta is the time elapsed between two consecutive frames and influences the speed of time for this Tween Manager and all Tweens it owns. Values higher than 1 increase the speed of time, while values smaller than 1 decrease it. A value of 0 freezes time and is effectively equivalent to pausing all Tweens. + * @param value The new scale of the time delta, where 1 is the normal speed. + */ + setGlobalTimeScale(value: number): this; + + /** + * Checks if the given object is being affected by a _playing_ Tween. + * + * If the Tween is paused, this method will return false. + * @param target The object to check if a tween is active for it, or not. + */ + isTweening(target: object): boolean; + + /** + * Destroys all Tweens in this Tween Manager. + * + * The tweens will erase all references to any targets they hold + * and be stopped immediately. + * + * If this method is called while the Tween Manager is running its + * update process, then the tweens will be removed at the start of + * the next frame. Outside of this, they are removed immediately. + */ + killAll(): this; + + /** + * Stops all Tweens which affect the given target or array of targets. + * + * The tweens will erase all references to any targets they hold + * and be stopped immediately. + * + * If this method is called while the Tween Manager is running its + * update process, then the tweens will be removed at the start of + * the next frame. Outside of this, they are removed immediately. + * @param target The target to kill the tweens of. Provide an array to use multiple targets. + */ + killTweensOf(target: object | any[]): this; + + /** + * Pauses this Tween Manager. No Tweens will update while paused. + * + * This includes tweens created after this method was called. + * + * See `TweenManager#resumeAll` to resume the playback. + * + * As of Phaser 3.60 you can also toggle the boolean property `TweenManager.paused`. + */ + pauseAll(): this; + + /** + * Resumes playback of this Tween Manager. + * + * All active Tweens will continue updating. + * + * See `TweenManager#pauseAll` to pause the playback. + * + * As of Phaser 3.60 you can also toggle the boolean property `TweenManager.paused`. + */ + resumeAll(): this; + + /** + * The Scene that owns this plugin is shutting down. + * + * We need to kill and reset all internal properties as well as stop listening to Scene events. + */ + shutdown(): void; + + /** + * The Scene that owns this plugin is being destroyed. + * We need to shutdown and then kill off all external references. + */ + destroy(): void; + + } + + } + + namespace Utils { + namespace Array { + /** + * Adds the given item, or array of items, to the array. + * + * Each item must be unique within the array. + * + * The array is modified in-place and returned. + * + * You can optionally specify a limit to the maximum size of the array. If the quantity of items being + * added will take the array length over this limit, it will stop adding once the limit is reached. + * + * You can optionally specify a callback to be invoked for each item successfully added to the array. + * @param array The array to be added to. + * @param item The item, or array of items, to add to the array. Each item must be unique within the array. + * @param limit Optional limit which caps the size of the array. + * @param callback A callback to be invoked for each item successfully added to the array. + * @param context The context in which the callback is invoked. + */ + function Add(array: any[], item: any | any[], limit?: number, callback?: Function, context?: object): any[]; + + /** + * Adds the given item, or array of items, to the array starting at the index specified. + * + * Each item must be unique within the array. + * + * Existing elements in the array are shifted up. + * + * The array is modified in-place and returned. + * + * You can optionally specify a limit to the maximum size of the array. If the quantity of items being + * added will take the array length over this limit, it will stop adding once the limit is reached. + * + * You can optionally specify a callback to be invoked for each item successfully added to the array. + * @param array The array to be added to. + * @param item The item, or array of items, to add to the array. + * @param index The index in the array where the item will be inserted. Default 0. + * @param limit Optional limit which caps the size of the array. + * @param callback A callback to be invoked for each item successfully added to the array. + * @param context The context in which the callback is invoked. + */ + function AddAt(array: any[], item: any | any[], index?: number, limit?: number, callback?: Function, context?: object): any[]; + + /** + * Moves the given element to the top of the array. + * The array is modified in-place. + * @param array The array. + * @param item The element to move. + */ + function BringToTop(array: any[], item: any): any; + + /** + * Returns the total number of elements in the array which have a property matching the given value. + * @param array The array to search. + * @param property The property to test on each array element. + * @param value The value to test the property against. Must pass a strict (`===`) comparison check. + * @param startIndex An optional start index to search from. + * @param endIndex An optional end index to search to. + */ + function CountAllMatching(array: any[], property: string, value: any, startIndex?: number, endIndex?: number): number; + + /** + * Passes each element in the array to the given callback. + * @param array The array to search. + * @param callback A callback to be invoked for each item in the array. + * @param context The context in which the callback is invoked. + * @param args Additional arguments that will be passed to the callback, after the current array item. + */ + function Each(array: any[], callback: Function, context: object, ...args: any[]): any[]; + + /** + * Passes each element in the array, between the start and end indexes, to the given callback. + * @param array The array to search. + * @param callback A callback to be invoked for each item in the array. + * @param context The context in which the callback is invoked. + * @param startIndex The start index to search from. + * @param endIndex The end index to search to. + * @param args Additional arguments that will be passed to the callback, after the child. + */ + function EachInRange(array: any[], callback: Function, context: object, startIndex: number, endIndex: number, ...args: any[]): any[]; + + /** + * Searches a pre-sorted array for the closet value to the given number. + * + * If the `key` argument is given it will assume the array contains objects that all have the required `key` property name, + * and will check for the closest value of those to the given number. + * @param value The value to search for in the array. + * @param array The array to search, which must be sorted. + * @param key An optional property key. If specified the array elements property will be checked against value. + */ + function FindClosestInSorted(value: number, array: any[], key?: string): number | any; + + /** + * Takes an array and flattens it, returning a shallow-copy flattened array. + * @param array The array to flatten. + * @param output An array to hold the results in. + */ + function Flatten(array: any[], output?: any[]): any[]; + + /** + * Returns all elements in the array. + * + * You can optionally specify a matching criteria using the `property` and `value` arguments. + * + * For example: `getAll('visible', true)` would return only elements that have their visible property set. + * + * Optionally you can specify a start and end index. For example if the array had 100 elements, + * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only + * the first 50 elements. + * @param array The array to search. + * @param property The property to test on each array element. + * @param value The value to test the property against. Must pass a strict (`===`) comparison check. + * @param startIndex An optional start index to search from. + * @param endIndex An optional end index to search to. + */ + function GetAll(array: any[], property?: string, value?: any, startIndex?: number, endIndex?: number): any[]; + + /** + * Returns the first element in the array. + * + * You can optionally specify a matching criteria using the `property` and `value` arguments. + * + * For example: `getAll('visible', true)` would return the first element that had its `visible` property set. + * + * Optionally you can specify a start and end index. For example if the array had 100 elements, + * and you set `startIndex` to 0 and `endIndex` to 50, it would search only the first 50 elements. + * @param array The array to search. + * @param property The property to test on each array element. + * @param value The value to test the property against. Must pass a strict (`===`) comparison check. + * @param startIndex An optional start index to search from. Default 0. + * @param endIndex An optional end index to search up to (but not included) Default array.length. + */ + function GetFirst(array: any[], property?: string, value?: any, startIndex?: number, endIndex?: number): object | null; + + /** + * Returns a Random element from the array. + * @param array The array to select the random entry from. + * @param startIndex An optional start index. Default 0. + * @param length An optional length, the total number of elements (from the startIndex) to choose from. Default array.length. + */ + function GetRandom(array: T[], startIndex?: number, length?: number): T; + + namespace Matrix { + /** + * Checks if an array can be used as a matrix. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array to check. + */ + function CheckMatrix(matrix?: T[][]): boolean; + + /** + * Generates a string (which you can pass to console.log) from the given Array Matrix. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix A 2-dimensional array. + */ + function MatrixToString(matrix?: T[][]): string; + + /** + * Reverses the columns in the given Array Matrix. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array matrix to reverse the columns for. + */ + function ReverseColumns(matrix?: T[][]): T[][]; + + /** + * Reverses the rows in the given Array Matrix. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array matrix to reverse the rows for. + */ + function ReverseRows(matrix?: T[][]): T[][]; + + /** + * Rotates the array matrix 180 degrees. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array to rotate. + */ + function Rotate180(matrix?: T[][]): T[][]; + + /** + * Rotates the array matrix to the left (or 90 degrees) + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array to rotate. + * @param amount The number of times to rotate the matrix. Default 1. + */ + function RotateLeft(matrix?: T[][], amount?: number): T[][]; + + /** + * Rotates the array matrix based on the given rotation value. + * + * The value can be given in degrees: 90, -90, 270, -270 or 180, + * or a string command: `rotateLeft`, `rotateRight` or `rotate180`. + * + * Based on the routine from {@link http://jsfiddle.net/MrPolywhirl/NH42z/}. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array to rotate. + * @param direction The amount to rotate the matrix by. Default 90. + */ + function RotateMatrix(matrix?: T[][], direction?: number | string): T[][]; + + /** + * Rotates the array matrix to the left (or -90 degrees) + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array to rotate. + * @param amount The number of times to rotate the matrix. Default 1. + */ + function RotateRight(matrix?: T[][], amount?: number): T[][]; + + /** + * Translates the given Array Matrix by shifting each column and row the + * amount specified. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array matrix to translate. + * @param x The amount to horizontally translate the matrix by. Default 0. + * @param y The amount to vertically translate the matrix by. Default 0. + */ + function Translate(matrix?: T[][], x?: number, y?: number): T[][]; + + /** + * Transposes the elements of the given matrix (array of arrays). + * + * The transpose of a matrix is a new matrix whose rows are the columns of the original. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param array The array matrix to transpose. + */ + function TransposeMatrix(array?: T[][]): T[][]; + + } + + /** + * Moves the given array element above another one in the array. + * The array is modified in-place. + * @param array The input array. + * @param item1 The element to move above base element. + * @param item2 The base element. + */ + function MoveAbove(array: any[], item1: any, item2: any): any[]; + + /** + * Moves the given array element below another one in the array. + * The array is modified in-place. + * @param array The input array. + * @param item1 The element to move below base element. + * @param item2 The base element. + */ + function MoveBelow(array: any[], item1: any, item2: any): any[]; + + /** + * Moves the given array element down one place in the array. + * The array is modified in-place. + * @param array The input array. + * @param item The element to move down the array. + */ + function MoveDown(array: any[], item: any): any[]; + + /** + * Moves an element in an array to a new position within the same array. + * The array is modified in-place. + * @param array The array. + * @param item The element to move. + * @param index The new index that the element will be moved to. + */ + function MoveTo(array: any[], item: any, index: number): any; + + /** + * Moves the given array element up one place in the array. + * The array is modified in-place. + * @param array The input array. + * @param item The element to move up the array. + */ + function MoveUp(array: any[], item: any): any[]; + + /** + * Create an array representing the range of numbers (usually integers), between, and inclusive of, + * the given `start` and `end` arguments. For example: + * + * `var array = Phaser.Utils.Array.NumberArray(2, 4); // array = [2, 3, 4]` + * `var array = Phaser.Utils.Array.NumberArray(0, 9); // array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]` + * `var array = Phaser.Utils.Array.NumberArray(8, 2); // array = [8, 7, 6, 5, 4, 3, 2]` + * + * This is equivalent to `Phaser.Utils.Array.NumberArrayStep(start, end, 1)`. + * + * You can optionally provide a prefix and / or suffix string. If given the array will contain + * strings, not integers. For example: + * + * `var array = Phaser.Utils.Array.NumberArray(1, 4, 'Level '); // array = ["Level 1", "Level 2", "Level 3", "Level 4"]` + * `var array = Phaser.Utils.Array.NumberArray(5, 7, 'HD-', '.png'); // array = ["HD-5.png", "HD-6.png", "HD-7.png"]` + * @param start The minimum value the array starts with. + * @param end The maximum value the array contains. + * @param prefix Optional prefix to place before the number. If provided the array will contain strings, not integers. + * @param suffix Optional suffix to place after the number. If provided the array will contain strings, not integers. + */ + function NumberArray(start: number, end: number, prefix?: string, suffix?: string): number[] | string[]; + + /** + * Create an array of numbers (positive and/or negative) progressing from `start` + * up to but not including `end` by advancing by `step`. + * + * If `start` is less than `end` a zero-length range is created unless a negative `step` is specified. + * + * Certain values for `start` and `end` (eg. NaN/undefined/null) are currently coerced to 0; + * for forward compatibility make sure to pass in actual numbers. + * @param start The start of the range. Default 0. + * @param end The end of the range. Default null. + * @param step The value to increment or decrement by. Default 1. + */ + function NumberArrayStep(start?: number, end?: number, step?: number): number[]; + + /** + * A [Floyd-Rivest](https://en.wikipedia.org/wiki/Floyd%E2%80%93Rivest_algorithm) quick selection algorithm. + * + * Rearranges the array items so that all items in the [left, k] range are smaller than all items in [k, right]; + * The k-th element will have the (k - left + 1)th smallest value in [left, right]. + * + * The array is modified in-place. + * + * Based on code by [Vladimir Agafonkin](https://www.npmjs.com/~mourner) + * @param arr The array to sort. + * @param k The k-th element index. + * @param left The index of the left part of the range. Default 0. + * @param right The index of the right part of the range. + * @param compare An optional comparison function. Is passed two elements and should return 0, 1 or -1. + */ + function QuickSelect(arr: any[], k: number, left?: number, right?: number, compare?: Function): void; + + /** + * Creates an array populated with a range of values, based on the given arguments and configuration object. + * + * Range ([a,b,c], [1,2,3]) = + * a1, a2, a3, b1, b2, b3, c1, c2, c3 + * + * Range ([a,b], [1,2,3], qty = 3) = + * a1, a1, a1, a2, a2, a2, a3, a3, a3, b1, b1, b1, b2, b2, b2, b3, b3, b3 + * + * Range ([a,b,c], [1,2,3], repeat x1) = + * a1, a2, a3, b1, b2, b3, c1, c2, c3, a1, a2, a3, b1, b2, b3, c1, c2, c3 + * + * Range ([a,b], [1,2], repeat -1 = endless, max = 14) = + * Maybe if max is set then repeat goes to -1 automatically? + * a1, a2, b1, b2, a1, a2, b1, b2, a1, a2, b1, b2, a1, a2 (capped at 14 elements) + * + * Range ([a], [1,2,3,4,5], random = true) = + * a4, a1, a5, a2, a3 + * + * Range ([a, b], [1,2,3], random = true) = + * b3, a2, a1, b1, a3, b2 + * + * Range ([a, b, c], [1,2,3], randomB = true) = + * a3, a1, a2, b2, b3, b1, c1, c3, c2 + * + * Range ([a], [1,2,3,4,5], yoyo = true) = + * a1, a2, a3, a4, a5, a5, a4, a3, a2, a1 + * + * Range ([a, b], [1,2,3], yoyo = true) = + * a1, a2, a3, b1, b2, b3, b3, b2, b1, a3, a2, a1 + * @param a The first array of range elements. + * @param b The second array of range elements. + * @param options A range configuration object. Can contain: repeat, random, randomB, yoyo, max, qty. + */ + function Range(a: any[], b: any[], options?: object): any[]; + + /** + * Removes the given item, or array of items, from the array. + * + * The array is modified in-place. + * + * You can optionally specify a callback to be invoked for each item successfully removed from the array. + * @param array The array to be modified. + * @param item The item, or array of items, to be removed from the array. + * @param callback A callback to be invoked for each item successfully removed from the array. + * @param context The context in which the callback is invoked. + */ + function Remove(array: any[], item: any | any[], callback?: Function, context?: object): any | any[]; + + /** + * Removes the item from the given position in the array. + * + * The array is modified in-place. + * + * You can optionally specify a callback to be invoked for the item if it is successfully removed from the array. + * @param array The array to be modified. + * @param index The array index to remove the item from. The index must be in bounds or it will throw an error. + * @param callback A callback to be invoked for the item removed from the array. + * @param context The context in which the callback is invoked. + */ + function RemoveAt(array: any[], index: number, callback?: Function, context?: object): any; + + /** + * Removes the item within the given range in the array. + * + * The array is modified in-place. + * + * You can optionally specify a callback to be invoked for the item/s successfully removed from the array. + * @param array The array to be modified. + * @param startIndex The start index to remove from. + * @param endIndex The end index to remove to. + * @param callback A callback to be invoked for the item removed from the array. + * @param context The context in which the callback is invoked. + */ + function RemoveBetween(array: any[], startIndex: number, endIndex: number, callback?: Function, context?: object): any[]; + + /** + * Removes a random object from the given array and returns it. + * Will return null if there are no array items that fall within the specified range or if there is no item for the randomly chosen index. + * @param array The array to removed a random element from. + * @param start The array index to start the search from. Default 0. + * @param length Optional restriction on the number of elements to randomly select from. Default array.length. + */ + function RemoveRandomElement(array: any[], start?: number, length?: number): object; + + /** + * Replaces an element of the array with the new element. + * The new element cannot already be a member of the array. + * The array is modified in-place. + * @param array The array to search within. + * @param oldChild The element in the array that will be replaced. + * @param newChild The element to be inserted into the array at the position of `oldChild`. + */ + function Replace(array: any[], oldChild: any, newChild: any): boolean; + + /** + * Moves the element at the start of the array to the end, shifting all items in the process. + * The "rotation" happens to the left. + * @param array The array to shift to the left. This array is modified in place. + * @param total The number of times to shift the array. Default 1. + */ + function RotateLeft(array: any[], total?: number): any; + + /** + * Moves the element at the end of the array to the start, shifting all items in the process. + * The "rotation" happens to the right. + * @param array The array to shift to the right. This array is modified in place. + * @param total The number of times to shift the array. Default 1. + */ + function RotateRight(array: any[], total?: number): any; + + /** + * Tests if the start and end indexes are a safe range for the given array. + * @param array The array to check. + * @param startIndex The start index. + * @param endIndex The end index. + * @param throwError Throw an error if the range is out of bounds. Default true. + */ + function SafeRange(array: any[], startIndex: number, endIndex: number, throwError?: boolean): boolean; + + /** + * Moves the given element to the bottom of the array. + * The array is modified in-place. + * @param array The array. + * @param item The element to move. + */ + function SendToBack(array: any[], item: any): any; + + /** + * Scans the array for elements with the given property. If found, the property is set to the `value`. + * + * For example: `SetAll('visible', true)` would set all elements that have a `visible` property to `false`. + * + * Optionally you can specify a start and end index. For example if the array had 100 elements, + * and you set `startIndex` to 0 and `endIndex` to 50, it would update only the first 50 elements. + * @param array The array to search. + * @param property The property to test for on each array element. + * @param value The value to set the property to. + * @param startIndex An optional start index to search from. + * @param endIndex An optional end index to search to. + */ + function SetAll(array: any[], property: string, value: any, startIndex?: number, endIndex?: number): any[]; + + /** + * Shuffles the contents of the given array using the Fisher-Yates implementation. + * + * The original array is modified directly and returned. + * @param array The array to shuffle. This array is modified in place. + */ + function Shuffle(array: T[]): T[]; + + /** + * Takes the given array and runs a numeric sort on it, ignoring any non-digits that + * may be in the entries. + * + * You should only run this on arrays containing strings. + * @param array The input array of strings. + */ + function SortByDigits(array: string[]): string[]; + + /** + * Removes a single item from an array and returns it without creating gc, like the native splice does. + * Based on code by Mike Reinstein. + * @param array The array to splice from. + * @param index The index of the item which should be spliced. + */ + function SpliceOne(array: any[], index: number): any; + + /** + * An in-place stable array sort, because `Array#sort()` is not guaranteed stable. + * + * This is an implementation of merge sort, without recursion. + * + * Function based on the Two-Screen/stable sort 0.1.8 from https://github.com/Two-Screen/stable + * @param array The input array to be sorted. + * @param compare The comparison function. + */ + function StableSort(array: any[], compare?: Function): any[]; + + /** + * Swaps the position of two elements in the given array. + * The elements must exist in the same array. + * The array is modified in-place. + * @param array The input array. + * @param item1 The first element to swap. + * @param item2 The second element to swap. + */ + function Swap(array: any[], item1: any, item2: any): any[]; + + } + + namespace Base64 { + /** + * Converts an ArrayBuffer into a base64 string. + * + * The resulting string can optionally be a data uri if the `mediaType` argument is provided. + * + * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs for more details. + * @param arrayBuffer The Array Buffer to encode. + * @param mediaType An optional media type, i.e. `audio/ogg` or `image/jpeg`. If included the resulting string will be a data URI. + */ + function ArrayBufferToBase64(arrayBuffer: ArrayBuffer, mediaType?: string): string; + + /** + * Converts a base64 string, either with or without a data uri, into an Array Buffer. + * @param base64 The base64 string to be decoded. Can optionally contain a data URI header, which will be stripped out prior to decoding. + */ + function Base64ToArrayBuffer(base64: string): ArrayBuffer; + + } + + /** + * A NOOP (No Operation) callback function. + * + * Used internally by Phaser when it's more expensive to determine if a callback exists + * than it is to just invoke an empty function. + */ + function NOOP(): void; + + /** + * A NULL OP callback function. + * + * This function always returns `null`. + * + * Used internally by Phaser when it's more expensive to determine if a callback exists + * than it is to just invoke an empty function. + */ + function NULL(): void; + + namespace Objects { + /** + * Shallow Object Clone. Will not clone nested objects. + * @param obj The object to clone. + */ + function Clone(obj: object): object; + + /** + * Deep Copy the given object or array. + * @param obj The object to deep copy. + */ + function DeepCopy(obj: object): object; + + /** + * This is a slightly modified version of http://api.jquery.com/jQuery.extend/ + * @param args The objects that will be mixed. + */ + function Extend(...args: any[]): object; + + /** + * Retrieves a value from an object. Allows for more advanced selection options, including: + * + * Allowed types: + * + * Explicit: + * { + * x: 4 + * } + * + * From function + * { + * x: function () + * } + * + * Randomly pick one element from the array + * { + * x: [a, b, c, d, e, f] + * } + * + * Random integer between min and max: + * { + * x: { randInt: [min, max] } + * } + * + * Random float between min and max: + * { + * x: { randFloat: [min, max] } + * } + * @param source The object to retrieve the value from. + * @param key The name of the property to retrieve from the object. If a property is nested, the names of its preceding properties should be separated by a dot (`.`) - `banner.hideBanner` would return the value of the `hideBanner` property from the object stored in the `banner` property of the `source` object. + * @param defaultValue The value to return if the `key` isn't found in the `source` object. + */ + function GetAdvancedValue(source: object, key: string, defaultValue: any): any; + + /** + * Finds the key within the top level of the {@link source} object, or returns {@link defaultValue} + * @param source The object to search + * @param key The key for the property on source. Must exist at the top level of the source object (no periods) + * @param defaultValue The default value to use if the key does not exist. + */ + function GetFastValue(source: object, key: string, defaultValue?: any): any; + + /** + * Retrieves and clamps a numerical value from an object. + * @param source The object to retrieve the value from. + * @param key The name of the property to retrieve from the object. If a property is nested, the names of its preceding properties should be separated by a dot (`.`). + * @param min The minimum value which can be returned. + * @param max The maximum value which can be returned. + * @param defaultValue The value to return if the property doesn't exist. It's also constrained to the given bounds. + */ + function GetMinMaxValue(source: object, key: string, min: number, max: number, defaultValue: number): number; + + /** + * Retrieves a value from an object, or an alternative object, falling to a back-up default value if not found. + * + * The key is a string, which can be split based on the use of the period character. + * + * For example: + * + * ```javascript + * const source = { + * lives: 3, + * render: { + * screen: { + * width: 1024 + * } + * } + * } + * + * const lives = GetValue(source, 'lives', 1); + * const width = GetValue(source, 'render.screen.width', 800); + * const height = GetValue(source, 'render.screen.height', 600); + * ``` + * + * In the code above, `lives` will be 3 because it's defined at the top level of `source`. + * The `width` value will be 1024 because it can be found inside the `render.screen` object. + * The `height` value will be 600, the default value, because it is missing from the `render.screen` object. + * @param source The primary object to try to retrieve the value from. If not found in here, `altSource` is checked. + * @param key The name of the property to retrieve from the object. If a property is nested, the names of its preceding properties should be separated by a dot (`.`) - `banner.hideBanner` would return the value of the `hideBanner` property from the object stored in the `banner` property of the `source` object. + * @param defaultValue The value to return if the `key` isn't found in the `source` object. + * @param altSource An alternative object to retrieve the value from. If the property exists in `source` then `altSource` will not be used. + */ + function GetValue(source: object, key: string, defaultValue: any, altSource?: object): any; + + /** + * Verifies that an object contains all requested keys + * @param source an object on which to check for key existence + * @param keys an array of keys to ensure the source object contains + */ + function HasAll(source: object, keys: string[]): boolean; + + /** + * Verifies that an object contains at least one of the requested keys + * @param source an object on which to check for key existence + * @param keys an array of keys to search the object for + */ + function HasAny(source: object, keys: string[]): boolean; + + /** + * Determine whether the source object has a property with the specified key. + * @param source The source object to be checked. + * @param key The property to check for within the object + */ + function HasValue(source: object, key: string): boolean; + + /** + * This is a slightly modified version of jQuery.isPlainObject. + * A plain object is an object whose internal class property is [object Object]. + * @param obj The object to inspect. + */ + function IsPlainObject(obj: object): boolean; + + /** + * Creates a new Object using all values from obj1 and obj2. + * If a value exists in both obj1 and obj2, the value in obj1 is used. + * + * This is only a shallow copy. Deeply nested objects are not cloned, so be sure to only use this + * function on shallow objects. + * @param obj1 The first object. + * @param obj2 The second object. + */ + function Merge(obj1: object, obj2: object): object; + + /** + * Creates a new Object using all values from obj1. + * + * Then scans obj2. If a property is found in obj2 that *also* exists in obj1, the value from obj2 is used, otherwise the property is skipped. + * @param obj1 The first object to merge. + * @param obj2 The second object to merge. Keys from this object which also exist in `obj1` will be copied to `obj1`. + */ + function MergeRight(obj1: object, obj2: object): object; + + /** + * Returns a new object that only contains the `keys` that were found on the object provided. + * If no `keys` are found, an empty object is returned. + * @param object The object to pick the provided keys from. + * @param keys An array of properties to retrieve from the provided object. + */ + function Pick(object: object, keys: any[]): object; + + /** + * Sets a value in an object, allowing for dot notation to control the depth of the property. + * + * For example: + * + * ```javascript + * var data = { + * world: { + * position: { + * x: 200, + * y: 100 + * } + * } + * }; + * + * SetValue(data, 'world.position.y', 300); + * + * console.log(data.world.position.y); // 300 + * ``` + * @param source The object to set the value in. + * @param key The name of the property in the object. If a property is nested, the names of its preceding properties should be separated by a dot (`.`) + * @param value The value to set into the property, if found in the source object. + */ + function SetValue(source: object, key: string, value: any): boolean; + + } + + namespace String { + /** + * Takes a string and replaces instances of markers with values in the given array. + * The markers take the form of `%1`, `%2`, etc. I.e.: + * + * `Format("The %1 is worth %2 gold", [ 'Sword', 500 ])` + * @param string The string containing the replacement markers. + * @param values An array containing values that will replace the markers. If no value exists an empty string is inserted instead. + */ + function Format(string: string, values: any[]): string; + + /** + * Takes the given string and pads it out, to the length required, using the character + * specified. For example if you need a string to be 6 characters long, you can call: + * + * `pad('bob', 6, '-', 2)` + * + * This would return: `bob---` as it has padded it out to 6 characters, using the `-` on the right. + * + * You can also use it to pad numbers (they are always returned as strings): + * + * `pad(512, 6, '0', 1)` + * + * Would return: `000512` with the string padded to the left. + * + * If you don't specify a direction it'll pad to both sides: + * + * `pad('c64', 7, '*')` + * + * Would return: `**c64**` + * @param str The target string. `toString()` will be called on the string, which means you can also pass in common data types like numbers. + * @param len The number of characters to be added. Default 0. + * @param pad The string to pad it out with (defaults to a space). Default " ". + * @param dir The direction dir = 1 (left), 2 (right), 3 (both). Default 3. + */ + function Pad(str: string | number | object, len?: number, pad?: string, dir?: number): string; + + /** + * Takes a string and removes the character at the given index. + * @param string The string to be worked on. + * @param index The index of the character to be removed. + */ + function RemoveAt(string: string, index: number): string; + + /** + * Takes the given string and reverses it, returning the reversed string. + * For example if given the string `Atari 520ST` it would return `TS025 iratA`. + * @param string The string to be reversed. + */ + function Reverse(string: string): string; + + /** + * Capitalizes the first letter of a string if there is one. + * @param str The string to capitalize. + */ + function UppercaseFirst(str: string): string; + + /** + * Creates and returns an RFC4122 version 4 compliant UUID. + * + * The string is in the form: `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx` where each `x` is replaced with a random + * hexadecimal digit from 0 to f, and `y` is replaced with a random hexadecimal digit from 8 to b. + */ + function UUID(): string; + + } + + } + + /** + * The Facebook Instant Games Plugin for Phaser 3 provides a seamless bridge between Phaser + * and the Facebook Instant Games API version 6.2. + * + * You can access this plugin via the `facebook` property in a Scene, i.e: + * + * ```javascript + * this.facebook.getPlatform(); + * ``` + * + * If this is unavailable please check to make sure you're using a build of Phaser that has + * this plugin within it. You can quickly check this by looking at the dev tools console + * header - the Phaser version number will have `-FB` after it if this plugin is loaded. + * + * If you are building your own version of Phaser then use this Webpack DefinePlugin flag: + * + * `"typeof PLUGIN_FBINSTANT": JSON.stringify(true)` + * + * You will find that every Instant Games API method has a mapping in this plugin. + * For a full list please consult either the plugin documentation, or the 6.2 SDK documentation + * at https://developers.facebook.com/docs/games/instant-games/sdk/fbinstant6.2 + * + * Internally this plugin uses its own Data Manager to handle seamless user data updates and provides + * handy functions for advertisement displaying, opening share dialogs, logging, leaderboards, purchase API requests, + * loader integration and more. + * + * To get started with Facebook Instant Games you will need to register on Facebook and create a new Instant + * Game app that has its own unique app ID. Facebook have also provided a dashboard interface for setting up + * various features for your game, including leaderboards, ad requests and the payments API. There are lots + * of guides on the Facebook Developers portal to assist with setting these + * various systems up: https://developers.facebook.com/docs/games/instant-games/guides + * + * For more details follow the Quick Start guide here: https://developers.facebook.com/docs/games/instant-games + */ + class FacebookInstantGamesPlugin extends Phaser.Events.EventEmitter { + /** + * + * @param game A reference to the Phaser.Game instance. + */ + constructor(game: Phaser.Game); + + /** + * A reference to the Phaser.Game instance. + */ + readonly game: Phaser.Game; + + /** + * A Data Manager instance. + * It allows you to store, query and retrieve any key/value data you may need to store. + * It's also used internally by the plugin to store FBIG API data. + */ + data: Phaser.Data.DataManager; + + /** + * Has the Facebook Instant Games API loaded yet? + * This is set automatically during the boot process. + */ + hasLoaded: boolean; + + /** + * Is the Data Manager currently locked? + */ + dataLocked: boolean; + + /** + * A list of the Facebook Instant Games APIs that are available, + * based on the given platform, context and user privacy settings. + * This value is populated automatically during boot. + */ + supportedAPIs: string[]; + + /** + * Holds the entry point that the game was launched from. + * This value is populated automatically during boot. + */ + entryPoint: string; + + /** + * An object that contains any data associated with the entry point that the game was launched from. + * The contents of the object are developer-defined, and can occur from entry points on different platforms. + * This will return null for older mobile clients, as well as when there is no data associated with the particular entry point. + * This value is populated automatically during boot. + */ + entryPointData: any; + + /** + * A unique identifier for the current game context. This represents a specific context + * that the game is being played in (for example, a particular messenger conversation or facebook post). + * The identifier will be null if game is being played in a solo context. + * This value is populated automatically during boot. + */ + contextID: string; + + /** + * The current context in which your game is running. This can be either `null` or + * one of: + * + * `POST` - The game is running inside of a Facebook post. + * `THREAD` - The game is running inside a Facebook Messenger thread. + * `GROUP` - The game is running inside a Facebook Group. + * `SOLO` - This is the default context, the player is the only participant. + * + * This value is populated automatically during boot. + */ + contextType: string | null; + + /** + * The current locale. + * See https://origincache.facebook.com/developers/resources/?id=FacebookLocales.xml for a complete list of supported locale values. + * Use this to determine what languages the current game should be localized with. + * This value is populated automatically during boot. + */ + locale: string | null; + + /** + * The platform on which the game is currently running, i.e. `IOS`. + * This value is populated automatically during boot. + */ + platform: string | null; + + /** + * The string representation of the Facebook Instant Games SDK version being used. + * This value is populated automatically during boot. + */ + version: string | null; + + /** + * Holds the id of the player. This is a string based ID, the same as `FBInstant.player.getID()`. + * This value is populated automatically during boot if the API is supported. + */ + playerID: string | null; + + /** + * The player's localized display name. + * This value is populated automatically during boot if the API is supported. + */ + playerName: string | null; + + /** + * A url to the player's public profile photo. The photo will always be a square, and with dimensions + * of at least 200x200. When rendering it in the game, the exact dimensions should never be assumed to be constant. + * It's recommended to always scale the image to a desired size before rendering. + * This value is populated automatically during boot if the API is supported. + */ + playerPhotoURL: string | null; + + /** + * Whether a player can subscribe to the game bot or not. + */ + playerCanSubscribeBot: boolean; + + /** + * Does the current platform and context allow for use of the payments API? + * Currently this is only available on Facebook.com and Android 6+. + */ + paymentsReady: boolean; + + /** + * The set of products that are registered to the game. + */ + catalog: Product[]; + + /** + * Contains all of the player's unconsumed purchases. + * The game must fetch the current player's purchases as soon as the client indicates that it is ready to perform payments-related operations, + * i.e. at game start. The game can then process and consume any purchases that are waiting to be consumed. + */ + purchases: Purchase[]; + + /** + * Contains all of the leaderboard data, as populated by the `getLeaderboard()` method. + */ + leaderboards: Phaser.FacebookInstantGamesLeaderboard[]; + + /** + * Contains AdInstance objects, as created by the `preloadAds()` method. + */ + ads: AdInstance[]; + + /** + * Call this method from your `Scene.preload` in order to sync the load progress + * of the Phaser Loader with the Facebook Instant Games loader display, i.e.: + * + * ```javascript + * this.facebook.showLoadProgress(this); + * this.facebook.once('startgame', this.startGame, this); + * ``` + * @param scene The Scene for which you want to show loader progress for. + */ + showLoadProgress(scene: Phaser.Scene): this; + + /** + * This method is called automatically when the game has finished loading, + * if you used the `showLoadProgress` method. If your game doesn't need to + * load any assets, or you're managing the load yourself, then call this + * method directly to start the API running. + * + * When the API has finished starting this plugin will emit a `startgame` event + * which you should listen for. + */ + gameStarted(): void; + + /** + * Checks to see if a given Facebook Instant Games API is available or not. + * @param api The API to check for, i.e. `player.getID`. + */ + checkAPI(api: string): boolean; + + /** + * Returns the unique identifier for the current game context. This represents a specific context + * that the game is being played in (for example, a particular messenger conversation or facebook post). + * The identifier will be null if game is being played in a solo context. + * + * It is only populated if `contextGetID` is in the list of supported APIs. + */ + getID(): string; + + /** + * Returns the current context in which your game is running. This can be either `null` or one of: + * + * `POST` - The game is running inside of a Facebook post. + * `THREAD` - The game is running inside a Facebook Messenger thread. + * `GROUP` - The game is running inside a Facebook Group. + * `SOLO` - This is the default context, the player is the only participant. + * + * It is only populated if `contextGetType` is in the list of supported APIs. + */ + getType(): string | null; + + /** + * Returns the current locale. + * See https://origincache.facebook.com/developers/resources/?id=FacebookLocales.xml for a complete list of supported locale values. + * Use this to determine what languages the current game should be localized with. + * It is only populated if `getLocale` is in the list of supported APIs. + */ + getLocale(): string | null; + + /** + * Returns the platform on which the game is currently running, i.e. `IOS`. + * It is only populated if `getPlatform` is in the list of supported APIs. + */ + getPlatform(): string | null; + + /** + * Returns the string representation of the Facebook Instant Games SDK version being used. + * It is only populated if `getSDKVersion` is in the list of supported APIs. + */ + getSDKVersion(): string | null; + + /** + * Returns the id of the player. This is a string based ID, the same as `FBInstant.player.getID()`. + * It is only populated if `playerGetID` is in the list of supported APIs. + */ + getPlayerID(): string | null; + + /** + * Returns the player's localized display name. + * It is only populated if `playerGetName` is in the list of supported APIs. + */ + getPlayerName(): string | null; + + /** + * Returns the url to the player's public profile photo. The photo will always be a square, and with dimensions + * of at least 200x200. When rendering it in the game, the exact dimensions should never be assumed to be constant. + * It's recommended to always scale the image to a desired size before rendering. + * It is only populated if `playerGetPhoto` is in the list of supported APIs. + */ + getPlayerPhotoURL(): string | null; + + /** + * Load the player's photo and store it in the Texture Manager, ready for use in-game. + * + * This method works by using a Scene Loader instance and then asking the Loader to + * retrieve the image. + * + * When complete the plugin will emit a `photocomplete` event, along with the key of the photo. + * + * ```javascript + * this.facebook.loadPlayerPhoto(this, 'player').once('photocomplete', function (key) { + * this.add.image(x, y, 'player'); + * }, this); + * ``` + * @param scene The Scene that will be responsible for loading this photo. + * @param key The key to use when storing the photo in the Texture Manager. + */ + loadPlayerPhoto(scene: Phaser.Scene, key: string): this; + + /** + * Checks if the current player can subscribe to the game bot. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they can subscribe, the `playerCanSubscribeBot` property is set to `true` + * and this plugin will emit the `cansubscribebot` event. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `cansubscribebotfail` event instead. + */ + canSubscribeBot(): this; + + /** + * Subscribes the current player to the game bot. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they are successfully subscribed this plugin will emit the `subscribebot` event. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `subscribebotfail` event instead. + */ + subscribeBot(): this; + + /** + * Gets the associated data from the player based on the given key, or array of keys. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes the data is set into this plugins Data Manager and the + * `getdata` event will be emitted. + * @param keys The key/s of the data to retrieve. + */ + getData(keys: string | string[]): this; + + /** + * Set data to be saved to the designated cloud storage of the current player. The game can store up to 1MB of data for each unique player. + * + * The data save is requested in an async call, so the result isn't available immediately. + * + * Data managed via this plugins Data Manager instance is automatically synced with Facebook. However, you can call this + * method directly if you need to replace the data object directly. + * + * When the APIs `setDataAsync` call resolves it will emit the `savedata` event from this plugin. If the call fails for some + * reason it will emit `savedatafail` instead. + * + * The call resolving does not necessarily mean that the input has already been persisted. Rather, it means that the data was valid and + * has been scheduled to be saved. It also guarantees that all values that were set are now available in `getData`. + * @param data An object containing a set of key-value pairs that should be persisted to cloud storage. + * The object must contain only serializable values - any non-serializable values will cause the entire modification to be rejected. + */ + saveData(data: object): this; + + /** + * Immediately flushes any changes to the player data to the designated cloud storage. + * This function is expensive, and should primarily be used for critical changes where persistence needs to be immediate + * and known by the game. Non-critical changes should rely on the platform to persist them in the background. + * NOTE: Calls to player.setDataAsync will be rejected while this function's result is pending. + * + * Data managed via this plugins Data Manager instance is automatically synced with Facebook. However, you can call this + * method directly if you need to flush the data directly. + * + * When the APIs `flushDataAsync` call resolves it will emit the `flushdata` event from this plugin. If the call fails for some + * reason it will emit `flushdatafail` instead. + */ + flushData(): this; + + /** + * Retrieve stats from the designated cloud storage of the current player. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes the `getstats` event will be emitted along with the data object returned. + * + * If the call fails, i.e. it's not in the list of supported APIs, or the request was rejected, + * it will emit a `getstatsfail` event instead. + * @param keys An optional array of unique keys to retrieve stats for. If the function is called without it, it will fetch all stats. + */ + getStats(keys?: string[]): this; + + /** + * Save the stats of the current player to the designated cloud storage. + * + * Stats in the Facebook Instant Games API are purely numerical values paired with a string-based key. Only numbers can be saved as stats, + * all other data types will be ignored. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes the `savestats` event will be emitted along with the data object returned. + * + * If the call fails, i.e. it's not in the list of supported APIs, or the request was rejected, + * it will emit a `savestatsfail` event instead. + * @param data An object containing a set of key-value pairs that should be persisted to cloud storage as stats. Note that only numerical values are stored. + */ + saveStats(data: object): this; + + /** + * Increment the stats of the current player and save them to the designated cloud storage. + * + * Stats in the Facebook Instant Games API are purely numerical values paired with a string-based key. Only numbers can be saved as stats, + * all other data types will be ignored. + * + * The data object provided for this call should contain offsets for how much to modify the stats by: + * + * ```javascript + * this.facebook.incStats({ + * level: 1, + * zombiesSlain: 17, + * rank: -1 + * }); + * ``` + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes the `incstats` event will be emitted along with the data object returned. + * + * If the call fails, i.e. it's not in the list of supported APIs, or the request was rejected, + * it will emit a `incstatsfail` event instead. + * @param data An object containing a set of key-value pairs indicating how much to increment each stat in cloud storage. Note that only numerical values are processed. + */ + incStats(data: object): this; + + /** + * Sets the data associated with the individual gameplay session for the current context. + * + * This function should be called whenever the game would like to update the current session data. + * + * This session data may be used to populate a variety of payloads, such as game play webhooks. + * @param data An arbitrary data object, which must be less than or equal to 1000 characters when stringified. + */ + saveSession(data: object): this; + + /** + * This invokes a dialog to let the user share specified content, either as a message in Messenger or as a post on the user's timeline. + * + * A blob of data can be attached to the share which every game session launched from the share will be able to access via the `this.entryPointData` property. + * + * This data must be less than or equal to 1000 characters when stringified. + * + * When this method is called you should consider your game paused. Listen out for the `resume` event from this plugin to know when the dialog has been closed. + * + * The user may choose to cancel the share action and close the dialog. The resulting `resume` event will be dispatched regardless if the user actually shared the content or not. + * @param text A text message to be shared. + * @param key The key of the texture to use as the share image. + * @param frame The frame of the texture to use as the share image. Set to `null` if you don't require a frame, but do need to set session data. + * @param sessionData A blob of data to attach to the share. + */ + openShare(text: string, key: string, frame?: string, sessionData?: object): this; + + /** + * This invokes a dialog to let the user invite a friend to play this game, either as a message in Messenger or as a post on the user's timeline. + * + * A blob of data can be attached to the share which every game session launched from the share will be able to access via the `this.entryPointData` property. + * + * This data must be less than or equal to 1000 characters when stringified. + * + * When this method is called you should consider your game paused. Listen out for the `resume` event from this plugin to know when the dialog has been closed. + * + * The user may choose to cancel the share action and close the dialog. The resulting `resume` event will be dispatched regardless if the user actually shared the content or not. + * @param text A text message to be shared. + * @param key The key of the texture to use as the share image. + * @param frame The frame of the texture to use as the share image. Set to `null` if you don't require a frame, but do need to set session data. + * @param sessionData A blob of data to attach to the share. + */ + openInvite(text: string, key: string, frame?: string, sessionData?: object): this; + + /** + * This invokes a dialog to let the user share specified content, either as a message in Messenger or as a post on the user's timeline. + * + * A blob of data can be attached to the share which every game session launched from the share will be able to access via the `this.entryPointData` property. + * + * This data must be less than or equal to 1000 characters when stringified. + * + * When this method is called you should consider your game paused. Listen out for the `resume` event from this plugin to know when the dialog has been closed. + * + * The user may choose to cancel the share action and close the dialog. The resulting `resume` event will be dispatched regardless if the user actually shared the content or not. + * @param text A text message to be shared. + * @param key The key of the texture to use as the share image. + * @param frame The frame of the texture to use as the share image. Set to `null` if you don't require a frame, but do need to set session data. + * @param sessionData A blob of data to attach to the share. + */ + openRequest(text: string, key: string, frame?: string, sessionData?: object): this; + + /** + * This invokes a dialog to let the user share specified content, either as a message in Messenger or as a post on the user's timeline. + * + * A blob of data can be attached to the share which every game session launched from the share will be able to access via the `this.entryPointData` property. + * + * This data must be less than or equal to 1000 characters when stringified. + * + * When this method is called you should consider your game paused. Listen out for the `resume` event from this plugin to know when the dialog has been closed. + * + * The user may choose to cancel the share action and close the dialog. The resulting `resume` event will be dispatched regardless if the user actually shared the content or not. + * @param text A text message to be shared. + * @param key The key of the texture to use as the share image. + * @param frame The frame of the texture to use as the share image. Set to `null` if you don't require a frame, but do need to set session data. + * @param sessionData A blob of data to attach to the share. + */ + openChallenge(text: string, key: string, frame?: string, sessionData?: object): this; + + /** + * This function determines whether the number of participants in the current game context is between a given minimum and maximum, inclusive. + * If one of the bounds is null only the other bound will be checked against. + * It will always return the original result for the first call made in a context in a given game play session. + * Subsequent calls, regardless of arguments, will return the answer to the original query until a context change occurs and the query result is reset. + * @param min The minimum bound of the context size query. + * @param max The maximum bound of the context size query. + */ + isSizeBetween(min?: integer, max?: integer): object; + + /** + * Request a switch into a specific context. If the player does not have permission to enter that context, + * or if the player does not provide permission for the game to enter that context, this will emit a `switchfail` event. + * + * Otherwise, the plugin will emit the `switch` event when the game has switched into the specified context. + * @param contextID The ID of the desired context. + */ + switchContext(contextID: string): this; + + /** + * Opens a context selection dialog for the player. If the player selects an available context, + * the client will attempt to switch into that context, and emit the `choose` event if successful. + * Otherwise, if the player exits the menu or the client fails to switch into the new context, the `choosefail` event will be emitted. + * @param options An object specifying conditions on the contexts that should be offered. + */ + chooseContext(options?: ChooseContextConfig): this; + + /** + * Attempts to create or switch into a context between a specified player and the current player. + * This plugin will emit the `create` event once the context switch is completed. + * If the API call fails, such as if the player listed is not a Connected Player of the current player or if the + * player does not provide permission to enter the new context, then the plugin will emit a 'createfail' event. + * @param playerID ID of the player. + */ + createContext(playerID: string): this; + + /** + * Fetches an array of ConnectedPlayer objects containing information about active players + * (people who played the game in the last 90 days) that are connected to the current player. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they are successfully subscribed this plugin will emit the `players` event along + * with the player data. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `playersfail` event instead. + */ + getPlayers(): this; + + /** + * Fetches the game's product catalog. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they are successfully subscribed this plugin will emit the `getcatalog` event along + * with the catalog data. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `getcatalogfail` event instead. + */ + getCatalog(): this; + + /** + * Fetches a single Product from the game's product catalog. + * + * The product catalog must have been populated using `getCatalog` prior to calling this method. + * + * Use this to look-up product details based on a purchase list. + * @param productID The Product ID of the item to get from the catalog. + */ + getProduct(productID: string): Product | null; + + /** + * Begins the purchase flow for a specific product. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they are successfully subscribed this plugin will emit the `purchase` event along + * with the purchase data. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `purchasefail` event instead. + * @param productID The identifier of the product to purchase. + * @param developerPayload An optional developer-specified payload, to be included in the returned purchase's signed request. + */ + purchase(productID: string, developerPayload?: string): this; + + /** + * Fetches all of the player's unconsumed purchases. The game must fetch the current player's purchases + * as soon as the client indicates that it is ready to perform payments-related operations, + * i.e. at game start. The game can then process and consume any purchases that are waiting to be consumed. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they are successfully subscribed this plugin will emit the `getpurchases` event along + * with the purchase data. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `getpurchasesfail` event instead. + */ + getPurchases(): this; + + /** + * Consumes a specific purchase belonging to the current player. Before provisioning a product's effects to the player, + * the game should request the consumption of the purchased product. Once the purchase is successfully consumed, + * the game should immediately provide the player with the effects of their purchase. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they are successfully subscribed this plugin will emit the `consumepurchase` event along + * with the purchase data. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `consumepurchasefail` event instead. + * @param purchaseToken The purchase token of the purchase that should be consumed. + */ + consumePurchase(purchaseToken: string): this; + + /** + * Informs Facebook of a custom update that occurred in the game. + * This will temporarily yield control to Facebook and Facebook will decide what to do based on what the update is. + * Once Facebook returns control to the game the plugin will emit an `update` or `updatefail` event. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * The `text` parameter is an update payload with the following structure: + * + * ``` + * text: { + * default: 'X just invaded Y\'s village!', + * localizations: { + * ar_AR: 'X \u0641\u0642\u0637 \u063A\u0632\u062A ' + + * '\u0642\u0631\u064A\u0629 Y!', + * en_US: 'X just invaded Y\'s village!', + * es_LA: '\u00A1X acaba de invadir el pueblo de Y!', + * } + * } + * ``` + * @param cta The call to action text. + * @param text The text object. + * @param key The key of the texture to use as the share image. + * @param frame The frame of the texture to use as the share image. Set to `null` if you don't require a frame, but do need to set session data. + * @param template The update template key. + * @param updateData The update data object payload. + */ + update(cta: string, text: object, key: string, frame: string | integer | undefined, template: string, updateData: object): this; + + /** + * Informs Facebook of a leaderboard update that occurred in the game. + * This will temporarily yield control to Facebook and Facebook will decide what to do based on what the update is. + * Once Facebook returns control to the game the plugin will emit an `update` or `updatefail` event. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * The `text` parameter is an update payload with the following structure: + * + * ``` + * text: { + * default: 'X just invaded Y\'s village!', + * localizations: { + * ar_AR: 'X \u0641\u0642\u0637 \u063A\u0632\u062A ' + + * '\u0642\u0631\u064A\u0629 Y!', + * en_US: 'X just invaded Y\'s village!', + * es_LA: '\u00A1X acaba de invadir el pueblo de Y!', + * } + * } + * ``` + * @param cta The call to action text. + * @param text The text object. + * @param key The key of the texture to use as the share image. + * @param frame The frame of the texture to use as the share image. Set to `null` if you don't require a frame, but do need to set session data. + * @param template The update template key. + * @param updateData The update data object payload. + */ + updateLeaderboard(cta: string, text: object, key: string, frame: string | integer | undefined, template: string, updateData: object): this; + + /** + * Request that the client switch to a different Instant Game. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If the game switches successfully this plugin will emit the `switchgame` event and the client will load the new game. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `switchgamefail` event instead. + * @param appID The Application ID of the Instant Game to switch to. The application must be an Instant Game, and must belong to the same business as the current game. + * @param data An optional data payload. This will be set as the entrypoint data for the game being switched to. Must be less than or equal to 1000 characters when stringified. + */ + switchGame(appID: string, data?: object): this; + + /** + * Prompts the user to create a shortcut to the game if they are eligible to. + * Can only be called once per session. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If the user choose to create a shortcut this plugin will emit the `shortcutcreated` event. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `shortcutcreatedfail` event instead. + */ + createShortcut(): this; + + /** + * Quits the game. + */ + quit(): void; + + /** + * Log an app event with FB Analytics. + * + * See https://developers.facebook.com/docs/javascript/reference/v2.8#app_events for more details about FB Analytics. + * @param name Name of the event. Must be 2 to 40 characters, and can only contain '_', '-', ' ', and alphanumeric characters. + * @param value An optional numeric value that FB Analytics can calculate a sum with. + * @param params An optional object that can contain up to 25 key-value pairs to be logged with the event. Keys must be 2 to 40 characters, and can only contain '_', '-', ' ', and alphanumeric characters. Values must be less than 100 characters in length. + */ + log(name: string, value?: number, params?: object): this; + + /** + * Attempt to create an instance of an interstitial ad. + * + * If the instance is created successfully then the ad is preloaded ready for display in-game via the method `showAd()`. + * + * If the ad loads it will emit the `adloaded` event, passing the AdInstance as the only parameter. + * + * If the ad cannot be displayed because there was no inventory to fill it, it will emit the `adsnofill` event. + * @param placementID The ad placement ID, or an array of IDs, as created in your Audience Network settings within Facebook. + */ + preloadAds(placementID: string | string[]): this; + + /** + * Attempt to create an instance of an rewarded video ad. + * + * If the instance is created successfully then the ad is preloaded ready for display in-game via the method `showVideo()`. + * + * If the ad loads it will emit the `adloaded` event, passing the AdInstance as the only parameter. + * + * If the ad cannot be displayed because there was no inventory to fill it, it will emit the `adsnofill` event. + * @param placementID The ad placement ID, or an array of IDs, as created in your Audience Network settings within Facebook. + */ + preloadVideoAds(placementID: string | string[]): this; + + /** + * Displays a previously loaded interstitial ad. + * + * If the ad is successfully displayed this plugin will emit the `adfinished` event, with the AdInstance object as its parameter. + * + * If the ad cannot be displayed, it will emit the `adsnotloaded` event. + * @param placementID The ad placement ID to display. + */ + showAd(placementID: string): this; + + /** + * Displays a previously loaded interstitial video ad. + * + * If the ad is successfully displayed this plugin will emit the `adfinished` event, with the AdInstance object as its parameter. + * + * If the ad cannot be displayed, it will emit the `adsnotloaded` event. + * @param placementID The ad placement ID to display. + */ + showVideo(placementID: string): this; + + /** + * Attempts to match the current player with other users looking for people to play with. + * If successful, a new Messenger group thread will be created containing the matched players and the player will + * be context switched to that thread. This plugin will also dispatch the `matchplayer` event, containing the new context ID and Type. + * + * The default minimum and maximum number of players in one matched thread are 2 and 20 respectively, + * depending on how many players are trying to get matched around the same time. + * + * The values can be changed in `fbapp-config.json`. See the Bundle Config documentation for documentation about `fbapp-config.json`. + * @param matchTag Optional extra information about the player used to group them with similar players. Players will only be grouped with other players with exactly the same tag. The tag must only include letters, numbers, and underscores and be 100 characters or less in length. + * @param switchImmediately Optional extra parameter that specifies whether the player should be immediately switched to the new context when a match is found. By default this will be false which will mean the player needs explicitly press play after being matched to switch to the new context. Default false. + */ + matchPlayer(matchTag?: string, switchImmediately?: boolean): this; + + /** + * Fetch a specific leaderboard belonging to this Instant Game. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes the `getleaderboard` event will be emitted along with a Leaderboard object instance. + * @param name The name of the leaderboard. Each leaderboard for an Instant Game must have its own distinct name. + */ + getLeaderboard(name: string): this; + + /** + * Quits the Facebook API and then destroys this plugin. + */ + destroy(): void; + + } + + /** + * This class represents one single Leaderboard that belongs to a Facebook Instant Game. + * + * You do not need to instantiate this class directly, it will be created when you use the + * `getLeaderboard()` method of the main plugin. + */ + class FacebookInstantGamesLeaderboard extends Phaser.Events.EventEmitter { + /** + * + * @param plugin A reference to the Facebook Instant Games Plugin. + * @param data An Instant Game leaderboard instance. + */ + constructor(plugin: Phaser.FacebookInstantGamesPlugin, data: any); + + /** + * A reference to the Facebook Instant Games Plugin. + */ + plugin: Phaser.FacebookInstantGamesPlugin; + + /** + * An Instant Game leaderboard instance. + */ + ref: any; + + /** + * The name of the leaderboard. + */ + name: string; + + /** + * The ID of the context that the leaderboard is associated with, or null if the leaderboard is not tied to a particular context. + */ + contextID: string; + + /** + * The total number of player entries in the leaderboard. + * This value defaults to zero. Populate it via the `getEntryCount()` method. + */ + entryCount: integer; + + /** + * The players score object. + * This value defaults to `null`. Populate it via the `getPlayerScore()` method. + */ + playerScore: LeaderboardScore; + + /** + * The scores in the Leaderboard from the currently requested range. + * This value defaults to an empty array. Populate it via the `getScores()` method. + * The contents of this array are reset each time `getScores()` is called. + */ + scores: LeaderboardScore[]; + + /** + * Fetches the total number of player entries in the leaderboard. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes this Leaderboard will emit the `getentrycount` event along with the count and name of the Leaderboard. + */ + getEntryCount(): this; + + /** + * Updates the player's score. If the player has an existing score, the old score will only be replaced if the new score is better than it. + * NOTE: If the leaderboard is associated with a specific context, the game must be in that context to set a score for the player. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes this Leaderboard will emit the `setscore` event along with the LeaderboardScore object and the name of the Leaderboard. + * + * If the save fails the event will send `null` as the score value. + * @param score The new score for the player. Must be a 64-bit integer number. + * @param data Metadata to associate with the stored score. Must be less than 2KB in size. If an object is given it will be passed to `JSON.stringify`. + */ + setScore(score: integer, data?: string | any): this; + + /** + * Gets the players leaderboard entry and stores it in the `playerScore` property. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes this Leaderboard will emit the `getplayerscore` event along with the score and the name of the Leaderboard. + * + * If the player has not yet saved a score, the event will send `null` as the score value, and `playerScore` will be set to `null` as well. + */ + getPlayerScore(): this; + + /** + * Retrieves a set of leaderboard entries, ordered by score ranking in the leaderboard. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes this Leaderboard will emit the `getscores` event along with an array of LeaderboardScore entries and the name of the Leaderboard. + * @param count The number of entries to attempt to fetch from the leaderboard. Currently, up to a maximum of 100 entries may be fetched per query. Default 10. + * @param offset The offset from the top of the leaderboard that entries will be fetched from. Default 0. + */ + getScores(count?: integer, offset?: integer): this; + + /** + * Retrieves a set of leaderboard entries, based on the current player's connected players (including the current player), ordered by local rank within the set of connected players. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes this Leaderboard will emit the `getconnectedscores` event along with an array of LeaderboardScore entries and the name of the Leaderboard. + */ + getConnectedScores(): this; + + } + +} + +declare type WebGLContextCallback = (renderer: Phaser.Renderer.WebGL.WebGLRenderer)=>void; + +/** + * Create temporary WebGL textures to stop WebGL errors on mac os + */ +declare function createTemporaryTextures(): void; + +declare type EachListCallback = (item: I, ...args: any[])=>void; + +declare type EachMapCallback = (key: string, entry: E)=>boolean | null; + +declare type EachSetCallback = (entry: E, index: number)=>boolean | null; + +declare type EachTextureCallback = (texture: Phaser.Textures.Texture, ...args: any[])=>void; + +declare type FindTileCallback = (value: Phaser.Tilemaps.Tile, index: number, array: Phaser.Tilemaps.Tile[])=>boolean; + +declare type EachTileCallback = (value: Phaser.Tilemaps.Tile, index: number, array: Phaser.Tilemaps.Tile[])=>void; + +/** + * A predicate, to test each element of the array. + */ +declare type TilemapFilterCallback = (value: Phaser.GameObjects.GameObject, index: number, array: Phaser.GameObjects.GameObject[])=>boolean; + +declare type TilemapFindCallback = (value: Phaser.GameObjects.GameObject, index: number, array: Phaser.GameObjects.GameObject[])=>boolean; + +/** + * Phaser.Class + */ +declare class Class { + /** + * + * @param definition a dictionary of functions for the class + */ + constructor(definition: Object); + +} + +declare type AdInstance = { + /** + * Represents an instance of an ad. + */ + instance: any; + /** + * The Audience Network placement ID of this ad instance. + */ + placementID: string; + /** + * Has this ad already been shown in-game? + */ + shown: boolean; + /** + * Is this a video ad? + */ + video: boolean; +}; + +/** + * A filter that may be applied to a Context Choose operation. + * + * 'NEW_CONTEXT_ONLY' - Prefer to only surface contexts the game has not been played in before. + * 'INCLUDE_EXISTING_CHALLENGES' - Include the "Existing Challenges" section, which surfaces actively played-in contexts that the player is a part of. + * 'NEW_PLAYERS_ONLY' - In sections containing individuals, prefer people who have not played the game. + */ +declare type ContextFilter = string; + +/** + * A configuration object that may be applied to a Context Choose operation. + */ +declare type ChooseContextConfig = { + /** + * The set of filters to apply to the context suggestions: 'NEW_CONTEXT_ONLY', 'INCLUDE_EXISTING_CHALLENGES' or 'NEW_PLAYERS_ONLY'. + */ + filters?: ContextFilter[]; + /** + * The maximum number of participants that a suggested context should ideally have. + */ + maxSize?: number; + /** + * The minimum number of participants that a suggested context should ideally have. + */ + minSize?: number; +}; + +declare type LeaderboardScore = { + /** + * An integer score value. + */ + score: integer; + /** + * The score value, formatted with the score format associated with the leaderboard. + */ + scoreFormatted: string; + /** + * The Unix timestamp of when the leaderboard entry was last updated. + */ + timestamp: integer; + /** + * The entry's leaderboard ranking. + */ + rank: integer; + /** + * The developer-specified payload associated with the score, or null if one was not set. + */ + data: string; + /** + * The player's localized display name. + */ + playerName: string; + /** + * A url to the player's public profile photo. + */ + playerPhotoURL: string; + /** + * The game's unique identifier for the player. + */ + playerID: string; +}; + +declare type Product = { + /** + * The title of the product. + */ + title?: string; + /** + * The product's game-specified identifier. + */ + productID?: string; + /** + * The product description. + */ + description?: string; + /** + * A link to the product's associated image. + */ + imageURI?: string; + /** + * The price of the product. + */ + price?: string; + /** + * The currency code for the product. + */ + priceCurrencyCode?: string; +}; + +declare type Purchase = { + /** + * A developer-specified string, provided during the purchase of the product. + */ + developerPayload?: string; + /** + * The identifier for the purchase transaction. + */ + paymentID?: string; + /** + * The product's game-specified identifier. + */ + productID?: string; + /** + * Unix timestamp of when the purchase occurred. + */ + purchaseTime?: string; + /** + * A token representing the purchase that may be used to consume the purchase. + */ + purchaseToken?: string; + /** + * Server-signed encoding of the purchase request. + */ + signedRequest?: string; +}; + +declare type integer = number; + +declare module 'phaser' { + export = Phaser; + +} + diff --git a/phaser-3/3.80/minimap-2-demo/.vscode/extensions.json b/phaser-3/3.80/minimap-2-demo/.vscode/extensions.json new file mode 100644 index 0000000..741a7c7 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["esbenp.prettier-vscode", "ritwickdey.LiveServer"] +} diff --git a/phaser-3/3.80/minimap-2-demo/.vscode/settings.json b/phaser-3/3.80/minimap-2-demo/.vscode/settings.json new file mode 100644 index 0000000..5ed0be9 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "eslint.format.enable": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "prettier.singleQuote": true, + "prettier.semi": true, + "editor.formatOnSave": true, + "prettier.printWidth": 120, + "cSpell.words": ["anims"] +} diff --git a/phaser-3/3.80/minimap-2-demo/README.md b/phaser-3/3.80/minimap-2-demo/README.md new file mode 100644 index 0000000..0915980 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/README.md @@ -0,0 +1,17 @@ +# Phaser 3 - Animation Completion Event Demo + +![demo](docs/example.gif) + +A quick demo of how you can use the built in events of Phaser 3 to know when an animation is completed, that way you can use that event to perform some additional game logic. + +For a detailed walkthrough, checkout my video on YouTube here: + +[](https://youtu.be/W-INH27SjKc "Phaser 3 Mastery: How to Listen and React to Animation Completion Events") + +Link to live demo: + +[Animation Completion Event Demo](https://devshareacademy.github.io/code-examples-from-my-video-content/phaser-3/animation-completion-events/index.html) + +## Credit + +The spritesheet that was used in this demo were created by [Essssam](https://essssam.itch.io/rocky-roads). diff --git a/phaser-3/3.80/minimap-2-demo/assets/data/animations.json b/phaser-3/3.80/minimap-2-demo/assets/data/animations.json new file mode 100644 index 0000000..5a6f4da --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/assets/data/animations.json @@ -0,0 +1,100 @@ +{ + "anims": [ + { + "key": "idle", + "type": "frame", + "frames": [ + { + "frame": 55 + } + ], + "defaultTextureKey": "characters", + "frameRate": 6, + "repeat": -1 + }, + { + "key": "walk_down", + "type": "frame", + "frames": [ + { + "frame": 54 + }, + { + "frame": 55 + }, + { + "frame": 56 + }, + { + "frame": 55 + } + ], + "defaultTextureKey": "characters", + "frameRate": 6, + "repeat": -1 + }, + { + "key": "walk_left", + "type": "frame", + "frames": [ + { + "frame": 66 + }, + { + "frame": 67 + }, + { + "frame": 68 + }, + { + "frame": 67 + } + ], + "defaultTextureKey": "characters", + "frameRate": 6, + "repeat": -1 + }, + { + "key": "walk_right", + "type": "frame", + "frames": [ + { + "frame": 78 + }, + { + "frame": 79 + }, + { + "frame": 80 + }, + { + "frame": 79 + } + ], + "defaultTextureKey": "characters", + "frameRate": 6, + "repeat": -1 + }, + { + "key": "walk_up", + "type": "frame", + "frames": [ + { + "frame": 90 + }, + { + "frame": 91 + }, + { + "frame": 92 + }, + { + "frame": 91 + } + ], + "defaultTextureKey": "characters", + "frameRate": 6, + "repeat": -1 + } + ] +} diff --git a/phaser-3/3.80/minimap-2-demo/assets/data/assets.json b/phaser-3/3.80/minimap-2-demo/assets/data/assets.json new file mode 100644 index 0000000..ab5da74 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/assets/data/assets.json @@ -0,0 +1,38 @@ +[ + { + "path": "assets/minimap", + "files": [ + { + "type": "image", + "key": "background", + "url": "town.png" + }, + { + "type": "image", + "key": "map", + "url": "minimap.png" + }, + { + "type": "image", + "key": "questIcon", + "url": "tile056.png" + }, + { + "type": "spritesheet", + "key": "characters", + "url": "bonus1_full.png", + "frameConfig": { "frameWidth": 26, "frameHeight": 36 } + } + ] + }, + { + "path": "assets/data", + "files": [ + { + "type": "json", + "key": "quests", + "url": "quests.json" + } + ] + } +] diff --git a/phaser-3/3.80/minimap-2-demo/assets/data/quests.json b/phaser-3/3.80/minimap-2-demo/assets/data/quests.json new file mode 100644 index 0000000..56bf694 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/assets/data/quests.json @@ -0,0 +1,7 @@ +[ + { + "id": "quest1", + "x": 568, + "y": 348 + } +] diff --git a/phaser-3/3.80/minimap-2-demo/assets/minimap/bonus1_full.png b/phaser-3/3.80/minimap-2-demo/assets/minimap/bonus1_full.png new file mode 100644 index 0000000000000000000000000000000000000000..9954fcd11493c30e08e99600b2f03c5c3f419e22 GIT binary patch literal 24636 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 literal 0 HcmV?d00001 diff --git a/phaser-3/3.80/minimap-2-demo/assets/minimap/minimap.png b/phaser-3/3.80/minimap-2-demo/assets/minimap/minimap.png new file mode 100644 index 0000000000000000000000000000000000000000..a98071dddc828b82dcd799a9836283b56df06016 GIT binary patch literal 104369 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 literal 0 HcmV?d00001 diff --git a/phaser-3/3.80/minimap-2-demo/assets/minimap/tile056.png b/phaser-3/3.80/minimap-2-demo/assets/minimap/tile056.png new file mode 100644 index 0000000000000000000000000000000000000000..47a42430e633afac00382b47819c292b94beaa88 GIT binary patch literal 1357 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 + + + + Phaser 3 - Minimap 1 Demo + + + + +

    + + + diff --git a/phaser-3/3.80/minimap-2-demo/jsconfig.json b/phaser-3/3.80/minimap-2-demo/jsconfig.json new file mode 100644 index 0000000..3688ce1 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/jsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "module": "es6", + "target": "es6", + "checkJs": true + } +} diff --git a/phaser-3/3.80/minimap-2-demo/src/camera-example-scene.js b/phaser-3/3.80/minimap-2-demo/src/camera-example-scene.js new file mode 100644 index 0000000..dd9f527 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/src/camera-example-scene.js @@ -0,0 +1,88 @@ +import Phaser from './lib/phaser.js'; +import { DIRECTION } from './components/common/index.js'; +import { EventBusComponent } from './components/events/event-bus-component.js'; +import { KeyboardInputComponent } from './components/input/keyboard-input-component.js'; +import { GridMovementAnimationComponent } from './components/movement/grid-movement-animation-component.js'; +import { GRID_MOVEMENT_EVENTS, GridMovementComponent } from './components/movement/grid-movement-component.js'; + +const SCALE_FACTOR = 2; + +export class CameraExampleScene extends Phaser.Scene { + constructor() { + super({ key: 'CameraExampleScene' }); + } + + preload() { + this.load.pack('assetPack', 'assets/data/assets.json'); + this.load.animation('gemData', 'assets/data/animations.json'); + } + + create() { + const mainBg = this.add.image(0, 0, 'background').setOrigin(0).setScale(2); + const player = this.add + .sprite(220 * SCALE_FACTOR, 220 * SCALE_FACTOR, 'characters', 55) + .setOrigin(0) + .setScale(SCALE_FACTOR) + .setName('player') + .play('walk_down'); + this.cameras.main.setBounds(0, 0, this.scale.width * SCALE_FACTOR, this.scale.height * SCALE_FACTOR); + this.cameras.main.startFollow(player); + const playerEventBusComponent = new EventBusComponent(); + const keyboardInputComponent = new KeyboardInputComponent(this); + const gridMovementComponent = new GridMovementComponent({ + inputComponent: keyboardInputComponent, + currentDirection: DIRECTION.DOWN, + phaserGameObject: player, + gridTileSize: 32, + eventBusComponent: playerEventBusComponent, + }); + new GridMovementAnimationComponent({ + gridMovementComponent, + phaserGameObject: player, + idleFrameConfig: { + DOWN: 55, + LEFT: 67, + RIGHT: 79, + UP: 91, + }, + movementAnimationConfig: { + DOWN: 'walk_down', + LEFT: 'walk_left', + RIGHT: 'walk_right', + UP: 'walk_up', + }, + }); + + // Example of how to listen for movement events from player game object + // playerEventBusComponent.on(GRID_MOVEMENT_EVENTS.GRID_MOVEMENT_FINISHED, () => { + // console.log(player.x, player.y) + // }); + + /* start of code for camera minimap */ + // create a new background image that we will apply special effects to, this image will not be shown on the main camera + const mapBg = this.add.image(0, 0, 'background').setOrigin(0).setScale(2); + mapBg.postFX.addColorMatrix().grayscale(0.8); + // create a 2nd camera that will be a zoomed out version of the main camera (birds eye view) + const minimapCamera = this.cameras + .add( + this.scale.width - 230, + 10, + this.scale.width * SCALE_FACTOR, + this.scale.height * SCALE_FACTOR, + false, + 'minimap' + ) + .setOrigin(0) + .setZoom(0.16); + // ignore any game objects we don't want visible on the 2nd camera + minimapCamera.ignore([player, mainBg]); + + const playerIcon = this.add.circle(player.x, player.y, 20, 0xff0000, 1).setOrigin(0, -1); + playerEventBusComponent.on(GRID_MOVEMENT_EVENTS.GRID_MOVEMENT_FINISHED, () => { + playerIcon.setPosition(player.x, player.y); + }); + this.cameras.main.ignore([playerIcon, mapBg]); + + /* end of code for camera minimap */ + } +} diff --git a/phaser-3/3.80/minimap-2-demo/src/components/common/index.js b/phaser-3/3.80/minimap-2-demo/src/components/common/index.js new file mode 100644 index 0000000..3818d81 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/src/components/common/index.js @@ -0,0 +1,31 @@ +/** + * @typedef Coordinate + * @type {object} + * @property {number} x the position of this coordinate + * @property {number} y the position of this coordinate + */ + +/** + * @typedef {keyof typeof DIRECTION} Direction + */ + +/** @enum {Direction} */ +export const DIRECTION = Object.freeze({ + LEFT: 'LEFT', + RIGHT: 'RIGHT', + UP: 'UP', + DOWN: 'DOWN', +}); + +/** + * Utility function to ensure we handle the full possible range of types when checking a variable for a possible + * type in a union. + * + * A good example of this is when we check for all of the possible values in a `switch` statement, and we want + * to ensure we check for all possible values in an enum type object. + * @param {never} _value + * @returns {never} + */ +export function exhaustiveGuard(_value) { + throw new Error(`Error! Reached forbidden guard function with unexpected value: ${JSON.stringify(_value)}`); +} diff --git a/phaser-3/3.80/minimap-2-demo/src/components/events/event-bus-component.js b/phaser-3/3.80/minimap-2-demo/src/components/events/event-bus-component.js new file mode 100644 index 0000000..1653cd1 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/src/components/events/event-bus-component.js @@ -0,0 +1,13 @@ +import Phaser from '../../lib/phaser.js'; + +export const CUSTOM_EVENTS = Object.freeze({ + ENEMY_DESTROYED: 'ENEMY_DESTROYED', + PLAYER_DESTROYED: 'PLAYER_DESTROYED', + PLAYER_SPAWN: 'PLAYER_SPAWN', +}); + +export class EventBusComponent extends Phaser.Events.EventEmitter { + constructor() { + super(); + } +} diff --git a/phaser-3/3.80/minimap-2-demo/src/components/input/input-component.js b/phaser-3/3.80/minimap-2-demo/src/components/input/input-component.js new file mode 100644 index 0000000..a14c57b --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/src/components/input/input-component.js @@ -0,0 +1,63 @@ +import { DIRECTION } from '../common/index.js'; + +export class InputComponent { + /** @protected @type {boolean} */ + _up; + /** @protected @type {boolean} */ + _down; + /** @protected @type {boolean} */ + _left; + /** @protected @type {boolean} */ + _right; + + constructor() { + this.reset(); + } + + /** @type {boolean} */ + get leftIsDown() { + return this._left; + } + + /** @type {boolean} */ + get rightIsDown() { + return this._right; + } + + /** @type {boolean} */ + get downIsDown() { + return this._down; + } + + /** @type {boolean} */ + get upIsDown() { + return this._up; + } + + /** @type {import("../common/index").Direction | undefined} */ + get directionKeyPressed() { + if (this._left) { + return DIRECTION.LEFT; + } + if (this._right) { + return DIRECTION.RIGHT; + } + if (this._up) { + return DIRECTION.UP; + } + if (this._down) { + return DIRECTION.DOWN; + } + return undefined; + } + + /** + * @returns {void} + */ + reset() { + this._up = false; + this._down = false; + this._right = false; + this._left = false; + } +} diff --git a/phaser-3/3.80/minimap-2-demo/src/components/input/keyboard-input-component.js b/phaser-3/3.80/minimap-2-demo/src/components/input/keyboard-input-component.js new file mode 100644 index 0000000..a73b0c7 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/src/components/input/keyboard-input-component.js @@ -0,0 +1,43 @@ +import Phaser from '../../lib/phaser.js'; +import { InputComponent } from './input-component.js'; + +export class KeyboardInputComponent extends InputComponent { + /** @type {Phaser.Types.Input.Keyboard.CursorKeys | undefined} */ + #cursorKeys; + + /** + * @param {Phaser.Scene} scene + */ + constructor(scene) { + super(); + + if (!scene.input.keyboard === undefined) { + console.log('Phaser Keyboard Plugin is not enabled, KeyboardInputComponent will not work properly'); + return; + } + this.#cursorKeys = scene.input.keyboard.createCursorKeys(); + + // handle automatic call to update + scene.events.on(Phaser.Scenes.Events.UPDATE, this.update, this); + scene.events.once( + Phaser.Scenes.Events.SHUTDOWN, + () => { + scene.events.off(Phaser.Scenes.Events.UPDATE, this.update, this); + }, + this + ); + } + + /** + * @returns {void} + */ + update() { + if (this.#cursorKeys === undefined) { + return; + } + this._up = this.#cursorKeys.up.isDown || false; + this._down = this.#cursorKeys.down.isDown || false; + this._left = this.#cursorKeys.left.isDown || false; + this._right = this.#cursorKeys.right.isDown || false; + } +} diff --git a/phaser-3/3.80/minimap-2-demo/src/components/movement/grid-movement-animation-component.js b/phaser-3/3.80/minimap-2-demo/src/components/movement/grid-movement-animation-component.js new file mode 100644 index 0000000..3634a78 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/src/components/movement/grid-movement-animation-component.js @@ -0,0 +1,97 @@ +import Phaser from '../../lib/phaser.js'; +import { GridMovementComponent } from './grid-movement-component.js'; + +/** + * @typedef IdleFrameConfig + * @type {object} + * @property {number} LEFT + * @property {number} RIGHT + * @property {number} UP + * @property {number} DOWN + */ + +/** + * @typedef MovementAnimationConfig + * @type {object} + * @property {string} LEFT + * @property {string} RIGHT + * @property {string} UP + * @property {string} DOWN + */ + +/** + * @typedef GridMovementAnimationComponentConfig + * @type {object} + * @property {GridMovementComponent} gridMovementComponent + * @property {Phaser.GameObjects.Sprite} phaserGameObject + * @property {IdleFrameConfig} idleFrameConfig + * @property {MovementAnimationConfig} movementAnimationConfig + */ + +export class GridMovementAnimationComponent { + /** @type {Phaser.Scene} */ + #scene; + /** @type {Phaser.GameObjects.Sprite} */ + #phaserGameObject; + /** @type {GridMovementComponent} */ + #gridMovementComponent; + /** @type {IdleFrameConfig} */ + #idleFrameConfig; + /** @type {MovementAnimationConfig} */ + #movementAnimationConfig; + + /** + * @param {GridMovementAnimationComponentConfig} config + */ + constructor(config) { + this.#scene = config.phaserGameObject.scene; + this.#gridMovementComponent = config.gridMovementComponent; + this.#phaserGameObject = config.phaserGameObject; + this.#idleFrameConfig = config.idleFrameConfig; + this.#movementAnimationConfig = config.movementAnimationConfig; + + // handle automatic call to update + this.#scene.events.on(Phaser.Scenes.Events.PRE_RENDER, this.update, this); + this.#scene.events.once( + Phaser.Scenes.Events.SHUTDOWN, + () => { + this.#scene.events.off(Phaser.Scenes.Events.PRE_RENDER, this.update, this); + }, + this + ); + } + + /** + * @returns {void} + */ + update() { + if (this.#phaserGameObject === undefined || this.#phaserGameObject.anims === undefined) { + return; + } + + if (this.#gridMovementComponent.isMoving) { + // check to see if we need to play an animation + if ( + !this.#phaserGameObject.anims.isPlaying || + this.#phaserGameObject.anims.currentAnim?.key !== + this.#movementAnimationConfig[this.#gridMovementComponent.direction] + ) { + this.#phaserGameObject.play(this.#movementAnimationConfig[this.#gridMovementComponent.direction]); + } + return; + } + + // stop the animation if needed + if (this.#phaserGameObject.anims.isPlaying) { + this.#phaserGameObject.stop(); + } + + // update idle frame if needed + if ( + this.#phaserGameObject.frame.name.toString() !== + this.#idleFrameConfig[this.#gridMovementComponent.direction].toString() + ) { + this.#phaserGameObject.setFrame(this.#idleFrameConfig[this.#gridMovementComponent.direction]); + } + } +} diff --git a/phaser-3/3.80/minimap-2-demo/src/components/movement/grid-movement-component.js b/phaser-3/3.80/minimap-2-demo/src/components/movement/grid-movement-component.js new file mode 100644 index 0000000..fa61be6 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/src/components/movement/grid-movement-component.js @@ -0,0 +1,147 @@ +import Phaser from '../../lib/phaser.js'; +import { EventBusComponent } from '../events/event-bus-component.js'; +import { InputComponent } from '../input/input-component.js'; +import { getTargetPositionFromGameObjectPositionAndDirection } from './grid-utils.js'; + +/** + * @typedef GridMovementComponentConfig + * @type {object} + * @property {InputComponent} inputComponent + * @property {EventBusComponent} eventBusComponent + * @property {import('../common/index.js').Direction} currentDirection + * @property {Phaser.GameObjects.Sprite} phaserGameObject + * @property {number} gridTileSize + */ + +export const GRID_MOVEMENT_EVENTS = Object.freeze({ + INPUT_STOPPED: 'INPUT_STOPPED', + CHANGED_DIRECTION: 'CHANGED_DIRECTION', + GRID_MOVEMENT_STARTED: 'GRID_MOVEMENT_STARTED', + GRID_MOVEMENT_FINISHED: 'GRID_MOVEMENT_FINISHED', +}); + +export class GridMovementComponent { + /** @type {Phaser.Scene} */ + #scene; + /** @type {Phaser.GameObjects.Sprite} */ + #phaserGameObject; + /** @type {EventBusComponent} */ + #eventBusComponent; + /** @type {InputComponent} */ + #inputComponent; + /** @type {import('../common/index.js').Direction} */ + #direction; + /** @type {boolean} */ + #isMoving; + /** @type {boolean} */ + #startedMoving; + /** @type {import('../common/index.js').Coordinate} */ + #targetPosition; + /** @type {import('../common/index.js').Coordinate} */ + #previousTargetPosition; + /** @type {number} */ + #gridTileSize; + + /** + * @param {GridMovementComponentConfig} config + */ + constructor(config) { + this.#scene = config.phaserGameObject.scene; + this.#phaserGameObject = config.phaserGameObject; + this.#inputComponent = config.inputComponent; + this.#eventBusComponent = config.eventBusComponent; + this.#direction = config.currentDirection; + this.#isMoving = false; + this.#startedMoving = false; + /** @type {import('../common/index.js').Coordinate} */ + const currentPosition = { + x: this.#phaserGameObject.x, + y: this.#phaserGameObject.y, + }; + this.#previousTargetPosition = { ...currentPosition }; + this.#targetPosition = { ...currentPosition }; + this.#gridTileSize = config.gridTileSize; + + // handle automatic call to update + this.#scene.events.on(Phaser.Scenes.Events.UPDATE, this.update, this); + this.#scene.events.once( + Phaser.Scenes.Events.SHUTDOWN, + () => { + this.#scene.events.off(Phaser.Scenes.Events.UPDATE, this.update, this); + }, + this + ); + } + + /** @type {boolean} */ + get isMoving() { + return this.#isMoving; + } + + /** @type {import('../common/index.js').Direction} */ + get direction() { + return this.#direction; + } + + /** + * @returns {void} + */ + update() { + if (this.isMoving) { + return; + } + + const directionKeyPressed = this.#inputComponent.directionKeyPressed; + if (directionKeyPressed === undefined) { + if (this.#startedMoving) { + // fire event so we can stop animations since there is no input + this.#eventBusComponent.emit(GRID_MOVEMENT_EVENTS.INPUT_STOPPED, this.#direction); + this.#startedMoving = false; + } + return; + } + const changedDirection = this.#direction !== this.#inputComponent.directionKeyPressed; + this.#direction = directionKeyPressed; + + if (changedDirection) { + this.#eventBusComponent.emit(GRID_MOVEMENT_EVENTS.CHANGED_DIRECTION, this.#direction); + } + + this.#isMoving = true; + this.#startedMoving = true; + const updatedPosition = getTargetPositionFromGameObjectPositionAndDirection( + this.#targetPosition, + this.#direction, + this.#gridTileSize + ); + this.#previousTargetPosition = { ...this.#targetPosition }; + this.#targetPosition.x = updatedPosition.x; + this.#targetPosition.y = updatedPosition.y; + + this.#eventBusComponent.emit(GRID_MOVEMENT_EVENTS.GRID_MOVEMENT_STARTED, this.#direction); + this.#phaserGameObject.scene.add.tween({ + delay: 0, + duration: 300, + y: { + from: this.#phaserGameObject.y, + start: this.#phaserGameObject.y, + to: this.#targetPosition.y, + }, + x: { + from: this.#phaserGameObject.x, + start: this.#phaserGameObject.x, + to: this.#targetPosition.x, + }, + targets: this.#phaserGameObject, + onComplete: () => { + this.#isMoving = false; + this.#previousTargetPosition = { ...this.#targetPosition }; + this.#eventBusComponent.emit(GRID_MOVEMENT_EVENTS.GRID_MOVEMENT_FINISHED, { + direction: this.#direction, + x: this.#phaserGameObject.x, + y: this.#phaserGameObject.y, + }); + }, + }); + } +} diff --git a/phaser-3/3.80/minimap-2-demo/src/components/movement/grid-utils.js b/phaser-3/3.80/minimap-2-demo/src/components/movement/grid-utils.js new file mode 100644 index 0000000..469df72 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/src/components/movement/grid-utils.js @@ -0,0 +1,29 @@ +import { DIRECTION, exhaustiveGuard } from '../common/index.js'; + +/** + * @param {import('../common/index').Coordinate} currentPosition + * @param {import('../common/index').Direction} direction + * @param {number} tileSize + * @returns {import('../common/index').Coordinate} + */ +export function getTargetPositionFromGameObjectPositionAndDirection(currentPosition, direction, tileSize) { + /** @type {import('../common/index').Coordinate} */ + const targetPosition = { ...currentPosition }; + switch (direction) { + case DIRECTION.DOWN: + targetPosition.y += tileSize; + break; + case DIRECTION.UP: + targetPosition.y -= tileSize; + break; + case DIRECTION.LEFT: + targetPosition.x -= tileSize; + break; + case DIRECTION.RIGHT: + targetPosition.x += tileSize; + break; + default: + exhaustiveGuard(direction); + } + return targetPosition; +} diff --git a/phaser-3/3.80/minimap-2-demo/src/image-example-scene.js b/phaser-3/3.80/minimap-2-demo/src/image-example-scene.js new file mode 100644 index 0000000..fe657c9 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/src/image-example-scene.js @@ -0,0 +1,64 @@ +import Phaser from './lib/phaser.js'; +import { DIRECTION } from './components/common/index.js'; +import { EventBusComponent } from './components/events/event-bus-component.js'; +import { KeyboardInputComponent } from './components/input/keyboard-input-component.js'; +import { GridMovementAnimationComponent } from './components/movement/grid-movement-animation-component.js'; +import { GRID_MOVEMENT_EVENTS, GridMovementComponent } from './components/movement/grid-movement-component.js'; + +const SCALE_FACTOR = 2; + +export class ImageExampleScene extends Phaser.Scene { + constructor() { + super({ key: 'ImageExampleScene' }); + } + + preload() { + this.load.pack('assetPack', 'assets/data/assets.json'); + this.load.animation('gemData', 'assets/data/animations.json'); + } + + create() { + const mainBg = this.add.image(0, 0, 'background').setOrigin(0).setScale(2); + const player = this.add + .sprite(220 * SCALE_FACTOR, 220 * SCALE_FACTOR, 'characters', 55) + .setOrigin(0) + .setScale(SCALE_FACTOR) + .setName('player') + .play('walk_down'); + this.cameras.main.setBounds(0, 0, this.scale.width * SCALE_FACTOR, this.scale.height * SCALE_FACTOR); + this.cameras.main.startFollow(player); + const playerEventBusComponent = new EventBusComponent(); + const keyboardInputComponent = new KeyboardInputComponent(this); + const gridMovementComponent = new GridMovementComponent({ + inputComponent: keyboardInputComponent, + currentDirection: DIRECTION.DOWN, + phaserGameObject: player, + gridTileSize: 32, + eventBusComponent: playerEventBusComponent, + }); + new GridMovementAnimationComponent({ + gridMovementComponent, + phaserGameObject: player, + idleFrameConfig: { + DOWN: 55, + LEFT: 67, + RIGHT: 79, + UP: 91, + }, + movementAnimationConfig: { + DOWN: 'walk_down', + LEFT: 'walk_left', + RIGHT: 'walk_right', + UP: 'walk_up', + }, + }); + + // Example of how to listen for movement events from player game object + // playerEventBusComponent.on(GRID_MOVEMENT_EVENTS.GRID_MOVEMENT_FINISHED, () => { + // console.log(player.x, player.y) + // }); + + /* start of code for minimap */ + /* end of code for minimap */ + } +} diff --git a/phaser-3/3.80/minimap-2-demo/src/lib/phaser.js b/phaser-3/3.80/minimap-2-demo/src/lib/phaser.js new file mode 100644 index 0000000..1cf6072 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/src/lib/phaser.js @@ -0,0 +1 @@ +export default window.Phaser; diff --git a/phaser-3/3.80/minimap-2-demo/src/main.js b/phaser-3/3.80/minimap-2-demo/src/main.js new file mode 100644 index 0000000..f1cecf4 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/src/main.js @@ -0,0 +1,19 @@ +import { CameraExampleScene } from './camera-example-scene.js'; +import { ImageExampleScene } from './image-example-scene.js'; +import Phaser from './lib/phaser.js'; + +const gameConfig = { + type: Phaser.WEBGL, + pixelArt: true, + scale: { + parent: 'game-container', + width: 688, + height: 544, + mode: Phaser.Scale.FIT, + autoCenter: Phaser.Scale.CENTER_BOTH, + }, + backgroundColor: '#5c5b5b', + scene: [CameraExampleScene, ImageExampleScene], +}; + +const game = new Phaser.Game(gameConfig); diff --git a/phaser-3/3.80/minimap-2-demo/src/types/phaser.d.ts b/phaser-3/3.80/minimap-2-demo/src/types/phaser.d.ts new file mode 100644 index 0000000..b416946 --- /dev/null +++ b/phaser-3/3.80/minimap-2-demo/src/types/phaser.d.ts @@ -0,0 +1,116274 @@ +// DO NOT EDIT THIS FILE! It was generated by running `npm run tsgen` +/// + +declare type CameraRotateCallback = (camera: Phaser.Cameras.Scene2D.Camera, progress: number, angle: number)=>void; + +declare type DataEachCallback = (parent: any, key: string, value: any, ...args: any[])=>void; + +declare type ContentLoadedCallback = ()=>void; + +declare type CreateCallback = (bob: Phaser.GameObjects.Bob, index: number)=>void; + +declare type EachContainerCallback = (item: any, ...args: any[])=>void; + +declare type LightForEach = (light: Phaser.GameObjects.Light)=>void; + +/** + * A custom function that will be responsible for wrapping the text. + */ +declare type TextStyleWordWrapCallback = (text: string, textObject: Phaser.GameObjects.Text)=>string | string[]; + +declare type CenterFunction = (triangle: Phaser.Geom.Triangle)=>Phaser.Math.Vector2; + +declare namespace Phaser { + namespace Actions { + /** + * Takes an array of Game Objects and aligns them next to each other. + * + * The alignment position is controlled by the `position` parameter, which should be one + * of the Phaser.Display.Align constants, such as `Phaser.Display.Align.TOP_LEFT`, + * `Phaser.Display.Align.TOP_CENTER`, etc. + * + * The first item isn't moved. The second item is aligned next to the first, + * then the third next to the second, and so on. + * @param items The array of items to be updated by this action. + * @param position The position to align the items with. This is an align constant, such as `Phaser.Display.Align.LEFT_CENTER`. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function AlignTo(items: G, position: number, offsetX?: number, offsetY?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `angle` property, + * and then adds the given value to each of their `angle` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `Angle(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `angle` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function Angle(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of objects and passes each of them to the given callback. + * @param items The array of items to be updated by this action. + * @param callback The callback to be invoked. It will be passed just one argument: the item from the array. + * @param context The scope in which the callback will be invoked. + */ + function Call(items: G, callback: Phaser.Types.Actions.CallCallback, context: any): G; + + /** + * Takes an array of objects and returns the first element in the array that has properties which match + * all of those specified in the `compare` object. For example, if the compare object was: `{ scaleX: 0.5, alpha: 1 }` + * then it would return the first item which had the property `scaleX` set to 0.5 and `alpha` set to 1. + * + * To use this with a Group: `GetFirst(group.getChildren(), compare, index)` + * @param items The array of items to be searched by this action. + * @param compare The comparison object. Each property in this object will be checked against the items of the array. + * @param index An optional offset to start searching from within the items array. Default 0. + */ + function GetFirst(items: G, compare: object, index?: number): object | Phaser.GameObjects.GameObject | null; + + /** + * Takes an array of objects and returns the last element in the array that has properties which match + * all of those specified in the `compare` object. For example, if the compare object was: `{ scaleX: 0.5, alpha: 1 }` + * then it would return the last item which had the property `scaleX` set to 0.5 and `alpha` set to 1. + * + * To use this with a Group: `GetLast(group.getChildren(), compare, index)` + * @param items The array of items to be searched by this action. + * @param compare The comparison object. Each property in this object will be checked against the items of the array. + * @param index An optional offset to start searching from within the items array. Default 0. + */ + function GetLast(items: G, compare: object, index?: number): object | Phaser.GameObjects.GameObject | null; + + /** + * Takes an array of Game Objects, or any objects that have public `x` and `y` properties, + * and then aligns them based on the grid configuration given to this action. + * @param items The array of items to be updated by this action. + * @param options The GridAlign Configuration object. + */ + function GridAlign(items: G, options: Phaser.Types.Actions.GridAlignConfig): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `alpha` property, + * and then adds the given value to each of their `alpha` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `IncAlpha(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `alpha` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function IncAlpha(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `x` property, + * and then adds the given value to each of their `x` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `IncX(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `x` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function IncX(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have public `x` and `y` properties, + * and then adds the given value to each of them. + * + * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `IncXY(group.getChildren(), x, y, stepX, stepY)` + * @param items The array of items to be updated by this action. + * @param x The amount to be added to the `x` property. + * @param y The amount to be added to the `y` property. If `undefined` or `null` it uses the `x` value. Default x. + * @param stepX This is added to the `x` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `y` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function IncXY(items: G, x: number, y?: number, stepX?: number, stepY?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `y` property, + * and then adds the given value to each of their `y` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `IncY(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `y` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function IncY(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects and positions them on evenly spaced points around the perimeter of a Circle. + * + * If you wish to pass a `Phaser.GameObjects.Circle` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param circle The Circle to position the Game Objects on. + * @param startAngle Optional angle to start position from, in radians. Default 0. + * @param endAngle Optional angle to stop position at, in radians. Default 6.28. + */ + function PlaceOnCircle(items: G, circle: Phaser.Geom.Circle, startAngle?: number, endAngle?: number): G; + + /** + * Takes an array of Game Objects and positions them on evenly spaced points around the perimeter of an Ellipse. + * + * If you wish to pass a `Phaser.GameObjects.Ellipse` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param ellipse The Ellipse to position the Game Objects on. + * @param startAngle Optional angle to start position from, in radians. Default 0. + * @param endAngle Optional angle to stop position at, in radians. Default 6.28. + */ + function PlaceOnEllipse(items: G, ellipse: Phaser.Geom.Ellipse, startAngle?: number, endAngle?: number): G; + + /** + * Positions an array of Game Objects on evenly spaced points of a Line. + * If the ease parameter is supplied, it will space the points based on that easing function along the line. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param line The Line to position the Game Objects on. + * @param ease An optional ease to use. This can be either a string from the EaseMap, or a custom function. + */ + function PlaceOnLine(items: G, line: Phaser.Geom.Line, ease?: string | Function): G; + + /** + * Takes an array of Game Objects and positions them on evenly spaced points around the perimeter of a Rectangle. + * + * Placement starts from the top-left of the rectangle, and proceeds in a clockwise direction. + * If the `shift` parameter is given you can offset where placement begins. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param rect The Rectangle to position the Game Objects on. + * @param shift An optional positional offset. Default 0. + */ + function PlaceOnRectangle(items: G, rect: Phaser.Geom.Rectangle, shift?: number): G; + + /** + * Takes an array of Game Objects and positions them on evenly spaced points around the edges of a Triangle. + * + * If you wish to pass a `Phaser.GameObjects.Triangle` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param triangle The Triangle to position the Game Objects on. + * @param stepRate An optional step rate, to increase or decrease the packing of the Game Objects on the lines. Default 1. + */ + function PlaceOnTriangle(items: G, triangle: Phaser.Geom.Triangle, stepRate?: number): G; + + /** + * Play an animation on all Game Objects in the array that have an Animation component. + * + * You can pass either an animation key, or an animation configuration object for more control over the playback. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If this animation is already playing then ignore this call. Default false. + */ + function PlayAnimation(items: G, key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): G; + + /** + * Takes an array of Game Objects, or any objects that have a public property as defined in `key`, + * and then adds the given value to it. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `PropertyValueInc(group.getChildren(), key, value, step)` + * @param items The array of items to be updated by this action. + * @param key The property to be updated. + * @param value The amount to be added to the property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function PropertyValueInc(items: G, key: string, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have a public property as defined in `key`, + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `PropertyValueSet(group.getChildren(), key, value, step)` + * @param items The array of items to be updated by this action. + * @param key The property to be updated. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function PropertyValueSet(items: G, key: string, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects and positions them at random locations within the Circle. + * + * If you wish to pass a `Phaser.GameObjects.Circle` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param circle The Circle to position the Game Objects within. + */ + function RandomCircle(items: G, circle: Phaser.Geom.Circle): G; + + /** + * Takes an array of Game Objects and positions them at random locations within the Ellipse. + * + * If you wish to pass a `Phaser.GameObjects.Ellipse` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param ellipse The Ellipse to position the Game Objects within. + */ + function RandomEllipse(items: G, ellipse: Phaser.Geom.Ellipse): G; + + /** + * Takes an array of Game Objects and positions them at random locations on the Line. + * + * If you wish to pass a `Phaser.GameObjects.Line` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param line The Line to position the Game Objects randomly on. + */ + function RandomLine(items: G, line: Phaser.Geom.Line): G; + + /** + * Takes an array of Game Objects and positions them at random locations within the Rectangle. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param rect The Rectangle to position the Game Objects within. + */ + function RandomRectangle(items: G, rect: Phaser.Geom.Rectangle): G; + + /** + * Takes an array of Game Objects and positions them at random locations within the Triangle. + * + * If you wish to pass a `Phaser.GameObjects.Triangle` Shape to this function, you should pass its `geom` property. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param triangle The Triangle to position the Game Objects within. + */ + function RandomTriangle(items: G, triangle: Phaser.Geom.Triangle): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `rotation` property, + * and then adds the given value to each of their `rotation` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `Rotate(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `rotation` property (in radians). + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function Rotate(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Rotates each item around the given point by the given angle. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param point Any object with public `x` and `y` properties. + * @param angle The angle to rotate by, in radians. + */ + function RotateAround(items: G, point: object, angle: number): G; + + /** + * Rotates an array of Game Objects around a point by the given angle and distance. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param point Any object with public `x` and `y` properties. + * @param angle The angle to rotate by, in radians. + * @param distance The distance from the point of rotation in pixels. + */ + function RotateAroundDistance(items: G, point: object, angle: number, distance: number): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `scaleX` property, + * and then adds the given value to each of their `scaleX` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `ScaleX(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `scaleX` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function ScaleX(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have public `scaleX` and `scaleY` properties, + * and then adds the given value to each of them. + * + * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `ScaleXY(group.getChildren(), scaleX, scaleY, stepX, stepY)` + * @param items The array of items to be updated by this action. + * @param scaleX The amount to be added to the `scaleX` property. + * @param scaleY The amount to be added to the `scaleY` property. If `undefined` or `null` it uses the `scaleX` value. + * @param stepX This is added to the `scaleX` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `scaleY` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function ScaleXY(items: G, scaleX: number, scaleY?: number, stepX?: number, stepY?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have a public `scaleY` property, + * and then adds the given value to each of their `scaleY` properties. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `ScaleY(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to be added to the `scaleY` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function ScaleY(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `alpha` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetAlpha(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetAlpha(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `blendMode` + * and then sets it to the given value. + * + * To use this with a Group: `SetBlendMode(group.getChildren(), value)` + * @param items The array of items to be updated by this action. + * @param value The Blend Mode to be set. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetBlendMode(items: G, value: Phaser.BlendModes | string | number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `depth` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetDepth(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetDepth(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Passes all provided Game Objects to the Input Manager to enable them for input with identical areas and callbacks. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param hitArea Either an input configuration object, or a geometric shape that defines the hit area for the Game Object. If not given it will try to create a Rectangle based on the texture frame. + * @param callback The callback that determines if the pointer is within the Hit Area shape or not. If you provide a shape you must also provide a callback. + */ + function SetHitArea(items: G, hitArea?: Phaser.Types.Input.InputConfiguration | any, callback?: Phaser.Types.Input.HitAreaCallback): G; + + /** + * Takes an array of Game Objects, or any objects that have the public properties `originX` and `originY` + * and then sets them to the given values. + * + * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetOrigin(group.getChildren(), originX, originY, stepX, stepY)` + * @param items The array of items to be updated by this action. + * @param originX The amount to set the `originX` property to. + * @param originY The amount to set the `originY` property to. If `undefined` or `null` it uses the `originX` value. + * @param stepX This is added to the `originX` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `originY` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetOrigin(items: G, originX: number, originY?: number, stepX?: number, stepY?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `rotation` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetRotation(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetRotation(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public properties `scaleX` and `scaleY` + * and then sets them to the given values. + * + * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetScale(group.getChildren(), scaleX, scaleY, stepX, stepY)` + * @param items The array of items to be updated by this action. + * @param scaleX The amount to set the `scaleX` property to. + * @param scaleY The amount to set the `scaleY` property to. If `undefined` or `null` it uses the `scaleX` value. + * @param stepX This is added to the `scaleX` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `scaleY` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetScale(items: G, scaleX: number, scaleY?: number, stepX?: number, stepY?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `scaleX` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetScaleX(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetScaleX(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `scaleY` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetScaleY(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetScaleY(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public properties `scrollFactorX` and `scrollFactorY` + * and then sets them to the given values. + * + * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetScrollFactor(group.getChildren(), scrollFactorX, scrollFactorY, stepX, stepY)` + * @param items The array of items to be updated by this action. + * @param scrollFactorX The amount to set the `scrollFactorX` property to. + * @param scrollFactorY The amount to set the `scrollFactorY` property to. If `undefined` or `null` it uses the `scrollFactorX` value. + * @param stepX This is added to the `scrollFactorX` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `scrollFactorY` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetScrollFactor(items: G, scrollFactorX: number, scrollFactorY?: number, stepX?: number, stepY?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `scrollFactorX` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetScrollFactorX(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetScrollFactorX(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `scrollFactorY` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetScrollFactorY(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetScrollFactorY(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public method setTint() and then updates it to the given value(s). You can specify tint color per corner or provide only one color value for `topLeft` parameter, in which case whole item will be tinted with that color. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param topLeft The tint being applied to top-left corner of item. If other parameters are given no value, this tint will be applied to whole item. + * @param topRight The tint to be applied to top-right corner of item. + * @param bottomLeft The tint to be applied to the bottom-left corner of item. + * @param bottomRight The tint to be applied to the bottom-right corner of item. + */ + function SetTint(items: G, topLeft: number, topRight?: number, bottomLeft?: number, bottomRight?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `visible` + * and then sets it to the given value. + * + * To use this with a Group: `SetVisible(group.getChildren(), value)` + * @param items The array of items to be updated by this action. + * @param value The value to set the property to. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetVisible(items: G, value: boolean, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `x` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetX(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetX(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public properties `x` and `y` + * and then sets them to the given values. + * + * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetXY(group.getChildren(), x, y, stepX, stepY)` + * @param items The array of items to be updated by this action. + * @param x The amount to set the `x` property to. + * @param y The amount to set the `y` property to. If `undefined` or `null` it uses the `x` value. Default x. + * @param stepX This is added to the `x` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `y` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetXY(items: G, x: number, y?: number, stepX?: number, stepY?: number, index?: number, direction?: number): G; + + /** + * Takes an array of Game Objects, or any objects that have the public property `y` + * and then sets it to the given value. + * + * The optional `step` property is applied incrementally, multiplied by each item in the array. + * + * To use this with a Group: `SetY(group.getChildren(), value, step)` + * @param items The array of items to be updated by this action. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + function SetY(items: G, value: number, step?: number, index?: number, direction?: number): G; + + /** + * Takes an array of items, such as Game Objects, or any objects with public `x` and + * `y` properties and then iterates through them. As this function iterates, it moves + * the position of the current element to be that of the previous entry in the array. + * This repeats until all items have been moved. + * + * The direction controls the order of iteration. A value of 0 (the default) assumes + * that the final item in the array is the 'head' item. + * + * A direction value of 1 assumes that the first item in the array is the 'head' item. + * + * The position of the 'head' item is set to the x/y values given to this function. + * Every other item in the array is then updated, in sequence, to be that of the + * previous (or next) entry in the array. + * + * The final x/y coords are returned, or set in the 'output' Vector2. + * + * Think of it as being like the game Snake, where the 'head' is moved and then + * each body piece is moved into the space of the previous piece. + * @param items An array of Game Objects, or objects with public x and y positions. The contents of this array are updated by this Action. + * @param x The x coordinate to place the head item at. + * @param y The y coordinate to place the head item at. + * @param direction The iteration direction. 0 = first to last and 1 = last to first. Default 0. + * @param output An optional Vec2Like object to store the final position in. + */ + function ShiftPosition(items: G, x: number, y: number, direction?: number, output?: O): O; + + /** + * Shuffles the array in place. The shuffled array is both modified and returned. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + */ + function Shuffle(items: G): G; + + /** + * Smootherstep is a sigmoid-like interpolation and clamping function. + * + * The function depends on three parameters, the input x, the "left edge" and the "right edge", with the left edge being assumed smaller than the right edge. The function receives a real number x as an argument and returns 0 if x is less than or equal to the left edge, 1 if x is greater than or equal to the right edge, and smoothly interpolates, using a Hermite polynomial, between 0 and 1 otherwise. The slope of the smoothstep function is zero at both edges. This is convenient for creating a sequence of transitions using smoothstep to interpolate each segment as an alternative to using more sophisticated or expensive interpolation techniques. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param property The property of the Game Object to interpolate. + * @param min The minimum interpolation value. + * @param max The maximum interpolation value. + * @param inc Should the values be incremented? `true` or set (`false`) Default false. + */ + function SmootherStep(items: G, property: string, min: number, max: number, inc?: boolean): G; + + /** + * Smoothstep is a sigmoid-like interpolation and clamping function. + * + * The function depends on three parameters, the input x, the "left edge" + * and the "right edge", with the left edge being assumed smaller than the right edge. + * + * The function receives a real number x as an argument and returns 0 if x is less than + * or equal to the left edge, 1 if x is greater than or equal to the right edge, and smoothly + * interpolates, using a Hermite polynomial, between 0 and 1 otherwise. The slope of the + * smoothstep function is zero at both edges. + * + * This is convenient for creating a sequence of transitions using smoothstep to interpolate + * each segment as an alternative to using more sophisticated or expensive interpolation techniques. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param property The property of the Game Object to interpolate. + * @param min The minimum interpolation value. + * @param max The maximum interpolation value. + * @param inc Should the property value be incremented (`true`) or set (`false`)? Default false. + */ + function SmoothStep(items: G, property: string, min: number, max: number, inc?: boolean): G; + + /** + * Takes an array of Game Objects and then modifies their `property` so the value equals, or is incremented, by the + * calculated spread value. + * + * The spread value is derived from the given `min` and `max` values and the total number of items in the array. + * + * For example, to cause an array of Sprites to change in alpha from 0 to 1 you could call: + * + * ```javascript + * Phaser.Actions.Spread(itemsArray, 'alpha', 0, 1); + * ``` + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param property The property of the Game Object to spread. + * @param min The minimum value. + * @param max The maximum value. + * @param inc Should the values be incremented? `true` or set (`false`) Default false. + */ + function Spread(items: G, property: string, min: number, max: number, inc?: boolean): G; + + /** + * Takes an array of Game Objects and toggles the visibility of each one. + * Those previously `visible = false` will become `visible = true`, and vice versa. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + */ + function ToggleVisible(items: G): G; + + /** + * Iterates through the given array and makes sure that each objects x and y + * properties are wrapped to keep them contained within the given Rectangles + * area. + * @param items An array of Game Objects. The contents of this array are updated by this Action. + * @param rect The rectangle which the objects will be wrapped to remain within. + * @param padding An amount added to each side of the rectangle during the operation. Default 0. + */ + function WrapInRectangle(items: G, rect: Phaser.Geom.Rectangle, padding?: number): G; + + } + + namespace Animations { + /** + * A Frame based Animation. + * + * Animations in Phaser consist of a sequence of `AnimationFrame` objects, which are managed by + * this class, along with properties that impact playback, such as the animations frame rate + * or delay. + * + * This class contains all of the properties and methods needed to handle playback of the animation + * directly to an `AnimationState` instance, which is owned by a Sprite, or similar Game Object. + * + * You don't typically create an instance of this class directly, but instead go via + * either the `AnimationManager` or the `AnimationState` and use their `create` methods, + * depending on if you need a global animation, or local to a specific Sprite. + */ + class Animation { + /** + * + * @param manager A reference to the global Animation Manager + * @param key The unique identifying string for this animation. + * @param config The Animation configuration. + */ + constructor(manager: Phaser.Animations.AnimationManager, key: string, config: Phaser.Types.Animations.Animation); + + /** + * A reference to the global Animation Manager. + */ + manager: Phaser.Animations.AnimationManager; + + /** + * The unique identifying string for this animation. + */ + key: string; + + /** + * A frame based animation (as opposed to a bone based animation) + */ + type: string; + + /** + * Extract all the frame data into the frames array. + */ + frames: Phaser.Animations.AnimationFrame[]; + + /** + * The frame rate of playback in frames per second (default 24 if duration is null) + */ + frameRate: number; + + /** + * How long the animation should play for, in milliseconds. + * If the `frameRate` property has been set then it overrides this value, + * otherwise the `frameRate` is derived from `duration`. + */ + duration: number; + + /** + * How many ms per frame, not including frame specific modifiers. + */ + msPerFrame: number; + + /** + * Skip frames if the time lags, or always advanced anyway? + */ + skipMissedFrames: boolean; + + /** + * The delay in ms before the playback will begin. + */ + delay: number; + + /** + * Number of times to repeat the animation. Set to -1 to repeat forever. + */ + repeat: number; + + /** + * The delay in ms before the a repeat play starts. + */ + repeatDelay: number; + + /** + * Should the animation yoyo (reverse back down to the start) before repeating? + */ + yoyo: boolean; + + /** + * If the animation has a delay set, before playback will begin, this + * controls when the first frame is set on the Sprite. If this property + * is 'false' then the frame is set only after the delay has expired. + * This is the default behavior. + */ + showBeforeDelay: boolean; + + /** + * Should the GameObject's `visible` property be set to `true` when the animation starts to play? + */ + showOnStart: boolean; + + /** + * Should the GameObject's `visible` property be set to `false` when the animation finishes? + */ + hideOnComplete: boolean; + + /** + * Start playback of this animation from a random frame? + */ + randomFrame: boolean; + + /** + * Global pause. All Game Objects using this Animation instance are impacted by this property. + */ + paused: boolean; + + /** + * Gets the total number of frames in this animation. + */ + getTotalFrames(): number; + + /** + * Calculates the duration, frame rate and msPerFrame values. + * @param target The target to set the values on. + * @param totalFrames The total number of frames in the animation. + * @param duration The duration to calculate the frame rate from. Pass `null` if you wish to set the `frameRate` instead. + * @param frameRate The frame rate to calculate the duration from. + */ + calculateDuration(target: Phaser.Animations.Animation, totalFrames: number, duration?: number | undefined, frameRate?: number | undefined): void; + + /** + * Add frames to the end of the animation. + * @param config Either a string, in which case it will use all frames from a texture with the matching key, or an array of Animation Frame configuration objects. + */ + addFrame(config: string | Phaser.Types.Animations.AnimationFrame[]): this; + + /** + * Add frame/s into the animation. + * @param index The index to insert the frame at within the animation. + * @param config Either a string, in which case it will use all frames from a texture with the matching key, or an array of Animation Frame configuration objects. + */ + addFrameAt(index: number, config: string | Phaser.Types.Animations.AnimationFrame[]): this; + + /** + * Check if the given frame index is valid. + * @param index The index to be checked. + */ + checkFrame(index: number): boolean; + + /** + * Called internally when this Animation first starts to play. + * Sets the accumulator and nextTick properties. + * @param state The Animation State belonging to the Game Object invoking this call. + */ + protected getFirstTick(state: Phaser.Animations.AnimationState): void; + + /** + * Returns the AnimationFrame at the provided index + * @param index The index in the AnimationFrame array + */ + getFrameAt(index: number): Phaser.Animations.AnimationFrame; + + /** + * Creates AnimationFrame instances based on the given frame data. + * @param textureManager A reference to the global Texture Manager. + * @param frames Either a string, in which case it will use all frames from a texture with the matching key, or an array of Animation Frame configuration objects. + * @param defaultTextureKey The key to use if no key is set in the frame configuration object. + */ + getFrames(textureManager: Phaser.Textures.TextureManager, frames: string | Phaser.Types.Animations.AnimationFrame[], defaultTextureKey?: string): Phaser.Animations.AnimationFrame[]; + + /** + * Called internally. Sets the accumulator and nextTick values of the current Animation. + * @param state The Animation State belonging to the Game Object invoking this call. + */ + getNextTick(state: Phaser.Animations.AnimationState): void; + + /** + * Returns the frame closest to the given progress value between 0 and 1. + * @param value A value between 0 and 1. + */ + getFrameByProgress(value: number): Phaser.Animations.AnimationFrame; + + /** + * Advance the animation frame. + * @param state The Animation State to advance. + */ + nextFrame(state: Phaser.Animations.AnimationState): void; + + /** + * Returns the animation last frame. + */ + getLastFrame(): Phaser.Animations.AnimationFrame; + + /** + * Called internally when the Animation is playing backwards. + * Sets the previous frame, causing a yoyo, repeat, complete or update, accordingly. + * @param state The Animation State belonging to the Game Object invoking this call. + */ + previousFrame(state: Phaser.Animations.AnimationState): void; + + /** + * Removes the given AnimationFrame from this Animation instance. + * This is a global action. Any Game Object using this Animation will be impacted by this change. + * @param frame The AnimationFrame to be removed. + */ + removeFrame(frame: Phaser.Animations.AnimationFrame): this; + + /** + * Removes a frame from the AnimationFrame array at the provided index + * and updates the animation accordingly. + * @param index The index in the AnimationFrame array + */ + removeFrameAt(index: number): this; + + /** + * Called internally during playback. Forces the animation to repeat, providing there are enough counts left + * in the repeat counter. + * @param state The Animation State belonging to the Game Object invoking this call. + */ + repeatAnimation(state: Phaser.Animations.AnimationState): void; + + /** + * Converts the animation data to JSON. + */ + toJSON(): Phaser.Types.Animations.JSONAnimation; + + /** + * Called internally whenever frames are added to, or removed from, this Animation. + */ + updateFrameSequence(): this; + + /** + * Pauses playback of this Animation. The paused state is set immediately. + */ + pause(): this; + + /** + * Resumes playback of this Animation. The paused state is reset immediately. + */ + resume(): this; + + /** + * Destroys this Animation instance. It will remove all event listeners, + * remove this animation and its key from the global Animation Manager, + * and then destroy all Animation Frames in turn. + */ + destroy(): void; + + } + + /** + * A single frame in an Animation sequence. + * + * An AnimationFrame consists of a reference to the Texture it uses for rendering, references to other + * frames in the animation, and index data. It also has the ability to modify the animation timing. + * + * AnimationFrames are generated automatically by the Animation class. + */ + class AnimationFrame { + /** + * + * @param textureKey The key of the Texture this AnimationFrame uses. + * @param textureFrame The key of the Frame within the Texture that this AnimationFrame uses. + * @param index The index of this AnimationFrame within the Animation sequence. + * @param frame A reference to the Texture Frame this AnimationFrame uses for rendering. + * @param isKeyFrame Is this Frame a Keyframe within the Animation? Default false. + */ + constructor(textureKey: string, textureFrame: string | number, index: number, frame: Phaser.Textures.Frame, isKeyFrame?: boolean); + + /** + * The key of the Texture this AnimationFrame uses. + */ + textureKey: string; + + /** + * The key of the Frame within the Texture that this AnimationFrame uses. + */ + textureFrame: string | number; + + /** + * The index of this AnimationFrame within the Animation sequence. + */ + index: number; + + /** + * A reference to the Texture Frame this AnimationFrame uses for rendering. + */ + frame: Phaser.Textures.Frame; + + /** + * Is this the first frame in an animation sequence? + */ + readonly isFirst: boolean; + + /** + * Is this the last frame in an animation sequence? + */ + readonly isLast: boolean; + + /** + * A reference to the AnimationFrame that comes before this one in the animation, if any. + */ + readonly prevFrame: Phaser.Animations.AnimationFrame | null; + + /** + * A reference to the AnimationFrame that comes after this one in the animation, if any. + */ + readonly nextFrame: Phaser.Animations.AnimationFrame | null; + + /** + * The duration, in ms, of this frame of the animation. + */ + duration: number; + + /** + * What % through the animation does this frame come? + * This value is generated when the animation is created and cached here. + */ + readonly progress: number; + + /** + * Is this Frame a KeyFrame within the Animation? + */ + isKeyFrame: boolean; + + /** + * Generates a JavaScript object suitable for converting to JSON. + */ + toJSON(): Phaser.Types.Animations.JSONAnimationFrame; + + /** + * Destroys this object by removing references to external resources and callbacks. + */ + destroy(): void; + + } + + /** + * The Animation Manager. + * + * Animations are managed by the global Animation Manager. This is a singleton class that is + * responsible for creating and delivering animations and their corresponding data to all Game Objects. + * Unlike plugins it is owned by the Game instance, not the Scene. + * + * Sprites and other Game Objects get the data they need from the AnimationManager. + */ + class AnimationManager extends Phaser.Events.EventEmitter { + /** + * + * @param game A reference to the Phaser.Game instance. + */ + constructor(game: Phaser.Game); + + /** + * A reference to the Phaser.Game instance. + */ + protected game: Phaser.Game; + + /** + * A reference to the Texture Manager. + */ + protected textureManager: Phaser.Textures.TextureManager; + + /** + * The global time scale of the Animation Manager. + * + * This scales the time delta between two frames, thus influencing the speed of time for the Animation Manager. + */ + globalTimeScale: number; + + /** + * The Animations registered in the Animation Manager. + * + * This map should be modified with the {@link #add} and {@link #create} methods of the Animation Manager. + */ + protected anims: Phaser.Structs.Map; + + /** + * A list of animation mix times. + * + * See the {@link #setMix} method for more details. + */ + mixes: Phaser.Structs.Map; + + /** + * Whether the Animation Manager is paused along with all of its Animations. + */ + paused: boolean; + + /** + * The name of this Animation Manager. + */ + name: string; + + /** + * Registers event listeners after the Game boots. + */ + boot(): void; + + /** + * Adds a mix between two animations. + * + * Mixing allows you to specify a unique delay between a pairing of animations. + * + * When playing Animation A on a Game Object, if you then play Animation B, and a + * mix exists, it will wait for the specified delay to be over before playing Animation B. + * + * This allows you to customise smoothing between different types of animation, such + * as blending between an idle and a walk state, or a running and a firing state. + * + * Note that mixing is only applied if you use the `Sprite.play` method. If you opt to use + * `playAfterRepeat` or `playAfterDelay` instead, those will take priority and the mix + * delay will not be used. + * + * To update an existing mix, just call this method with the new delay. + * + * To remove a mix pairing, see the `removeMix` method. + * @param animA The string-based key, or instance of, Animation A. + * @param animB The string-based key, or instance of, Animation B. + * @param delay The delay, in milliseconds, to wait when transitioning from Animation A to B. + */ + addMix(animA: string | Phaser.Animations.Animation, animB: string | Phaser.Animations.Animation, delay: number): this; + + /** + * Removes a mix between two animations. + * + * Mixing allows you to specify a unique delay between a pairing of animations. + * + * Calling this method lets you remove those pairings. You can either remove + * it between `animA` and `animB`, or if you do not provide the `animB` parameter, + * it will remove all `animA` mixes. + * + * If you wish to update an existing mix instead, call the `addMix` method with the + * new delay. + * @param animA The string-based key, or instance of, Animation A. + * @param animB The string-based key, or instance of, Animation B. If not given, all mixes for Animation A will be removed. + */ + removeMix(animA: string | Phaser.Animations.Animation, animB?: string | Phaser.Animations.Animation): this; + + /** + * Returns the mix delay between two animations. + * + * If no mix has been set-up, this method will return zero. + * + * If you wish to create, or update, a new mix, call the `addMix` method. + * If you wish to remove a mix, call the `removeMix` method. + * @param animA The string-based key, or instance of, Animation A. + * @param animB The string-based key, or instance of, Animation B. + */ + getMix(animA: string | Phaser.Animations.Animation, animB: string | Phaser.Animations.Animation): number; + + /** + * Adds an existing Animation to the Animation Manager. + * @param key The key under which the Animation should be added. The Animation will be updated with it. Must be unique. + * @param animation The Animation which should be added to the Animation Manager. + */ + add(key: string, animation: Phaser.Animations.Animation): this; + + /** + * Checks to see if the given key is already in use within the Animation Manager or not. + * + * Animations are global. Keys created in one scene can be used from any other Scene in your game. They are not Scene specific. + * @param key The key of the Animation to check. + */ + exists(key: string): boolean; + + /** + * Create one, or more animations from a loaded Aseprite JSON file. + * + * Aseprite is a powerful animated sprite editor and pixel art tool. + * + * You can find more details at https://www.aseprite.org/ + * + * To export a compatible JSON file in Aseprite, please do the following: + * + * 1. Go to "File - Export Sprite Sheet" + * + * 2. On the **Layout** tab: + * 2a. Set the "Sheet type" to "Packed" + * 2b. Set the "Constraints" to "None" + * 2c. Check the "Merge Duplicates" checkbox + * + * 3. On the **Sprite** tab: + * 3a. Set "Layers" to "Visible layers" + * 3b. Set "Frames" to "All frames", unless you only wish to export a sub-set of tags + * + * 4. On the **Borders** tab: + * 4a. Check the "Trim Sprite" and "Trim Cells" options + * 4b. Ensure "Border Padding", "Spacing" and "Inner Padding" are all > 0 (1 is usually enough) + * + * 5. On the **Output** tab: + * 5a. Check "Output File", give your image a name and make sure you choose "png files" as the file type + * 5b. Check "JSON Data" and give your json file a name + * 5c. The JSON Data type can be either a Hash or Array, Phaser doesn't mind. + * 5d. Make sure "Tags" is checked in the Meta options + * 5e. In the "Item Filename" input box, make sure it says just "{frame}" and nothing more. + * + * 6. Click export + * + * This was tested with Aseprite 1.2.25. + * + * This will export a png and json file which you can load using the Aseprite Loader, i.e.: + * + * ```javascript + * function preload () + * { + * this.load.path = 'assets/animations/aseprite/'; + * this.load.aseprite('paladin', 'paladin.png', 'paladin.json'); + * } + * ``` + * + * Once loaded, you can call this method from within a Scene with the 'atlas' key: + * + * ```javascript + * this.anims.createFromAseprite('paladin'); + * ``` + * + * Any animations defined in the JSON will now be available to use in Phaser and you play them + * via their Tag name. For example, if you have an animation called 'War Cry' on your Aseprite timeline, + * you can play it in Phaser using that Tag name: + * + * ```javascript + * this.add.sprite(400, 300).play('War Cry'); + * ``` + * + * When calling this method you can optionally provide an array of tag names, and only those animations + * will be created. For example: + * + * ```javascript + * this.anims.createFromAseprite('paladin', [ 'step', 'War Cry', 'Magnum Break' ]); + * ``` + * + * This will only create the 3 animations defined. Note that the tag names are case-sensitive. + * @param key The key of the loaded Aseprite atlas. It must have been loaded prior to calling this method. + * @param tags An array of Tag names. If provided, only animations found in this array will be created. + * @param target Create the animations on this target Sprite. If not given, they will be created globally in this Animation Manager. + */ + createFromAseprite(key: string, tags?: string[], target?: Phaser.Animations.AnimationManager | Phaser.GameObjects.GameObject): Phaser.Animations.Animation[]; + + /** + * Creates a new Animation and adds it to the Animation Manager. + * + * Animations are global. Once created, you can use them in any Scene in your game. They are not Scene specific. + * + * If an invalid key is given this method will return `false`. + * + * If you pass the key of an animation that already exists in the Animation Manager, that animation will be returned. + * + * A brand new animation is only created if the key is valid and not already in use. + * + * If you wish to re-use an existing key, call `AnimationManager.remove` first, then this method. + * @param config The configuration settings for the Animation. + */ + create(config: Phaser.Types.Animations.Animation): Phaser.Animations.Animation | false; + + /** + * Loads this Animation Manager's Animations and settings from a JSON object. + * @param data The JSON object to parse. + * @param clearCurrentAnimations If set to `true`, the current animations will be removed (`anims.clear()`). If set to `false` (default), the animations in `data` will be added. Default false. + */ + fromJSON(data: string | Phaser.Types.Animations.JSONAnimations | Phaser.Types.Animations.JSONAnimation, clearCurrentAnimations?: boolean): Phaser.Animations.Animation[]; + + /** + * Generate an array of {@link Phaser.Types.Animations.AnimationFrame} objects from a texture key and configuration object. + * + * Generates objects with string based frame names, as configured by the given {@link Phaser.Types.Animations.GenerateFrameNames}. + * + * It's a helper method, designed to make it easier for you to extract all of the frame names from texture atlases. + * + * If you're working with a sprite sheet, see the `generateFrameNumbers` method instead. + * + * Example: + * + * If you have a texture atlases loaded called `gems` and it contains 6 frames called `ruby_0001`, `ruby_0002`, and so on, + * then you can call this method using: `this.anims.generateFrameNames('gems', { prefix: 'ruby_', start: 1, end: 6, zeroPad: 4 })`. + * + * The `end` value tells it to select frames 1 through 6, incrementally numbered, all starting with the prefix `ruby_`. The `zeroPad` + * value tells it how many zeroes pad out the numbers. To create an animation using this method, you can do: + * + * ```javascript + * this.anims.create({ + * key: 'ruby', + * repeat: -1, + * frames: this.anims.generateFrameNames('gems', { + * prefix: 'ruby_', + * end: 6, + * zeroPad: 4 + * }) + * }); + * ``` + * + * Please see the animation examples for further details. + * @param key The key for the texture containing the animation frames. + * @param config The configuration object for the animation frame names. + */ + generateFrameNames(key: string, config?: Phaser.Types.Animations.GenerateFrameNames): Phaser.Types.Animations.AnimationFrame[]; + + /** + * Generate an array of {@link Phaser.Types.Animations.AnimationFrame} objects from a texture key and configuration object. + * + * Generates objects with numbered frame names, as configured by the given {@link Phaser.Types.Animations.GenerateFrameNumbers}. + * + * If you're working with a texture atlas, see the `generateFrameNames` method instead. + * + * It's a helper method, designed to make it easier for you to extract frames from sprite sheets. + * + * Example: + * + * If you have a sprite sheet loaded called `explosion` and it contains 12 frames, then you can call this method using: + * + * `this.anims.generateFrameNumbers('explosion', { start: 0, end: 11 })`. + * + * The `end` value of 11 tells it to stop after the 12th frame has been added, because it started at zero. + * + * To create an animation using this method, you can do: + * + * ```javascript + * this.anims.create({ + * key: 'boom', + * frames: this.anims.generateFrameNumbers('explosion', { + * start: 0, + * end: 11 + * }) + * }); + * ``` + * + * Note that `start` is optional and you don't need to include it if the animation starts from frame 0. + * + * To specify an animation in reverse, swap the `start` and `end` values. + * + * If the frames are not sequential, you may pass an array of frame numbers instead, for example: + * + * `this.anims.generateFrameNumbers('explosion', { frames: [ 0, 1, 2, 1, 2, 3, 4, 0, 1, 2 ] })` + * + * Please see the animation examples and `GenerateFrameNumbers` config docs for further details. + * @param key The key for the texture containing the animation frames. + * @param config The configuration object for the animation frames. + */ + generateFrameNumbers(key: string, config?: Phaser.Types.Animations.GenerateFrameNumbers): Phaser.Types.Animations.AnimationFrame[]; + + /** + * Get an Animation. + * @param key The key of the Animation to retrieve. + */ + get(key: string): Phaser.Animations.Animation; + + /** + * Returns an array of all Animation keys that are using the given + * Texture. Only Animations that have at least one AnimationFrame + * entry using this texture will be included in the result. + * @param key The unique string-based key of the Texture, or a Texture, or Frame instance. + */ + getAnimsFromTexture(key: string | Phaser.Textures.Texture | Phaser.Textures.Frame): string[]; + + /** + * Pause all animations. + */ + pauseAll(): this; + + /** + * Play an animation on the given Game Objects that have an Animation Component. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param children An array of Game Objects to play the animation on. They must have an Animation Component. + */ + play(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, children: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[]): this; + + /** + * Takes an array of Game Objects that have an Animation Component and then + * starts the given animation playing on them. The start time of each Game Object + * is offset, incrementally, by the `stagger` amount. + * + * For example, if you pass an array with 4 children and a stagger time of 1000, + * the delays will be: + * + * child 1: 1000ms delay + * child 2: 2000ms delay + * child 3: 3000ms delay + * child 4: 4000ms delay + * + * If you set the `staggerFirst` parameter to `false` they would be: + * + * child 1: 0ms delay + * child 2: 1000ms delay + * child 3: 2000ms delay + * child 4: 3000ms delay + * + * You can also set `stagger` to be a negative value. If it was -1000, the above would be: + * + * child 1: 3000ms delay + * child 2: 2000ms delay + * child 3: 1000ms delay + * child 4: 0ms delay + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param children An array of Game Objects to play the animation on. They must have an Animation Component. + * @param stagger The amount of time, in milliseconds, to offset each play time by. If a negative value is given, it's applied to the children in reverse order. + * @param staggerFirst Should the first child be staggered as well? Default true. + */ + staggerPlay(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, children: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], stagger: number, staggerFirst?: boolean): G; + + /** + * Removes an Animation from this Animation Manager, based on the given key. + * + * This is a global action. Once an Animation has been removed, no Game Objects + * can carry on using it. + * @param key The key of the animation to remove. + */ + remove(key: string): Phaser.Animations.Animation; + + /** + * Resume all paused animations. + */ + resumeAll(): this; + + /** + * Returns the Animation data as JavaScript object based on the given key. + * Or, if not key is defined, it will return the data of all animations as array of objects. + * @param key The animation to get the JSONAnimation data from. If not provided, all animations are returned as an array. + */ + toJSON(key?: string): Phaser.Types.Animations.JSONAnimations; + + /** + * Destroy this Animation Manager and clean up animation definitions and references to other objects. + * This method should not be called directly. It will be called automatically as a response to a `destroy` event from the Phaser.Game instance. + */ + destroy(): void; + + } + + /** + * The Animation State Component. + * + * This component provides features to apply animations to Game Objects. It is responsible for + * loading, queuing animations for later playback, mixing between animations and setting + * the current animation frame to the Game Object that owns this component. + * + * This component lives as an instance within any Game Object that has it defined, such as Sprites. + * + * You can access its properties and methods via the `anims` property, i.e. `Sprite.anims`. + * + * As well as playing animations stored in the global Animation Manager, this component + * can also create animations that are stored locally within it. See the `create` method + * for more details. + * + * Prior to Phaser 3.50 this component was called just `Animation` and lived in the + * `Phaser.GameObjects.Components` namespace. It was renamed to `AnimationState` + * in 3.50 to help better identify its true purpose when browsing the documentation. + */ + class AnimationState { + /** + * + * @param parent The Game Object to which this animation component belongs. + */ + constructor(parent: Phaser.GameObjects.GameObject); + + /** + * The Game Object to which this animation component belongs. + * + * You can typically access this component from the Game Object + * via the `this.anims` property. + */ + parent: Phaser.GameObjects.GameObject; + + /** + * A reference to the global Animation Manager. + */ + animationManager: Phaser.Animations.AnimationManager; + + /** + * A reference to the Texture Manager. + */ + protected textureManager: Phaser.Textures.TextureManager; + + /** + * The Animations stored locally in this Animation component. + * + * Do not modify the contents of this Map directly, instead use the + * `add`, `create` and `remove` methods of this class instead. + */ + protected anims: Phaser.Structs.Map; + + /** + * Is an animation currently playing or not? + */ + isPlaying: boolean; + + /** + * Has the current animation started playing, or is it waiting for a delay to expire? + */ + hasStarted: boolean; + + /** + * The current Animation loaded into this Animation component. + * + * Will by `null` if no animation is yet loaded. + */ + currentAnim: Phaser.Animations.Animation | null; + + /** + * The current AnimationFrame being displayed by this Animation component. + * + * Will by `null` if no animation is yet loaded. + */ + currentFrame: Phaser.Animations.AnimationFrame | null; + + /** + * The key, instance, or config of the next Animation to be loaded into this Animation component + * when the current animation completes. + * + * Will by `null` if no animation has been queued. + */ + nextAnim: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig | null; + + /** + * A queue of Animations to be loaded into this Animation component when the current animation completes. + * + * Populate this queue via the `chain` method. + */ + nextAnimsQueue: any[]; + + /** + * The Time Scale factor. + * + * You can adjust this value to modify the passage of time for the animation that is currently + * playing. For example, setting it to 2 will make the animation play twice as fast. Or setting + * it to 0.5 will slow the animation down. + * + * You can change this value at run-time, or set it via the `PlayAnimationConfig`. + * + * Prior to Phaser 3.50 this property was private and called `_timeScale`. + */ + timeScale: number; + + /** + * The frame rate of playback, of the current animation, in frames per second. + * + * This value is set when a new animation is loaded into this component and should + * be treated as read-only, as changing it once playback has started will not alter + * the animation. To change the frame rate, provide a new value in the `PlayAnimationConfig` object. + */ + frameRate: number; + + /** + * The duration of the current animation, in milliseconds. + * + * This value is set when a new animation is loaded into this component and should + * be treated as read-only, as changing it once playback has started will not alter + * the animation. To change the duration, provide a new value in the `PlayAnimationConfig` object. + */ + duration: number; + + /** + * The number of milliseconds per frame, not including frame specific modifiers that may be present in the + * Animation data. + * + * This value is calculated when a new animation is loaded into this component and should + * be treated as read-only. Changing it will not alter playback speed. + */ + msPerFrame: number; + + /** + * Skip frames if the time lags, or always advanced anyway? + */ + skipMissedFrames: boolean; + + /** + * Start playback of this animation from a random frame? + */ + randomFrame: boolean; + + /** + * The delay before starting playback of the current animation, in milliseconds. + * + * This value is set when a new animation is loaded into this component and should + * be treated as read-only, as changing it once playback has started will not alter + * the animation. To change the delay, provide a new value in the `PlayAnimationConfig` object. + * + * Prior to Phaser 3.50 this property was private and called `_delay`. + */ + delay: number; + + /** + * The number of times to repeat playback of the current animation. + * + * If -1, it means the animation will repeat forever. + * + * This value is set when a new animation is loaded into this component and should + * be treated as read-only, as changing it once playback has started will not alter + * the animation. To change the number of repeats, provide a new value in the `PlayAnimationConfig` object. + * + * Prior to Phaser 3.50 this property was private and called `_repeat`. + */ + repeat: number; + + /** + * The number of milliseconds to wait before starting the repeat playback of the current animation. + * + * This value is set when a new animation is loaded into this component, but can also be modified + * at run-time. + * + * You can change the repeat delay by providing a new value in the `PlayAnimationConfig` object. + * + * Prior to Phaser 3.50 this property was private and called `_repeatDelay`. + */ + repeatDelay: number; + + /** + * Should the current animation yoyo? An animation that yoyos will play in reverse, from the end + * to the start, before then repeating or completing. An animation that does not yoyo will just + * play from the start to the end. + * + * This value is set when a new animation is loaded into this component, but can also be modified + * at run-time. + * + * You can change the yoyo by providing a new value in the `PlayAnimationConfig` object. + * + * Prior to Phaser 3.50 this property was private and called `_yoyo`. + */ + yoyo: boolean; + + /** + * If the animation has a delay set, before playback will begin, this + * controls when the first frame is set on the Sprite. If this property + * is 'false' then the frame is set only after the delay has expired. + * This is the default behavior. + * + * If this property is 'true' then the first frame of this animation + * is set immediately, and then when the delay expires, playback starts. + */ + showBeforeDelay: boolean; + + /** + * Should the GameObject's `visible` property be set to `true` when the animation starts to play? + * + * This will happen _after_ any delay that may have been set. + * + * This value is set when a new animation is loaded into this component, but can also be modified + * at run-time, assuming the animation is currently delayed. + */ + showOnStart: boolean; + + /** + * Should the GameObject's `visible` property be set to `false` when the animation completes? + * + * This value is set when a new animation is loaded into this component, but can also be modified + * at run-time, assuming the animation is still actively playing. + */ + hideOnComplete: boolean; + + /** + * Is the playhead moving forwards (`true`) or in reverse (`false`) ? + */ + forward: boolean; + + /** + * An internal trigger that tells the component if it should plays the animation + * in reverse mode ('true') or not ('false'). This is used because `forward` can + * be changed by the `yoyo` feature. + * + * Prior to Phaser 3.50 this property was private and called `_reverse`. + */ + inReverse: boolean; + + /** + * Internal time overflow accumulator. + * + * This has the `delta` time added to it as part of the `update` step. + */ + accumulator: number; + + /** + * The time point at which the next animation frame will change. + * + * This value is compared against the `accumulator` as part of the `update` step. + */ + nextTick: number; + + /** + * A counter keeping track of how much delay time, in milliseconds, is left before playback begins. + * + * This is set via the `playAfterDelay` method, although it can be modified at run-time + * if required, as long as the animation has not already started playing. + */ + delayCounter: number; + + /** + * A counter that keeps track of how many repeats are left to run. + * + * This value is set when a new animation is loaded into this component, but can also be modified + * at run-time. + */ + repeatCounter: number; + + /** + * An internal flag keeping track of pending repeats. + */ + pendingRepeat: boolean; + + /** + * Sets an animation, or an array of animations, to be played in the future, after the current one completes or stops. + * + * The current animation must enter a 'completed' state for this to happen, i.e. finish all of its repeats, delays, etc, + * or have one of the `stop` methods called. + * + * An animation set to repeat forever will never enter a completed state unless stopped. + * + * You can chain a new animation at any point, including before the current one starts playing, during it, or when it ends (via its `animationcomplete` event). + * + * Chained animations are specific to a Game Object, meaning different Game Objects can have different chained animations without impacting the global animation they're playing. + * + * Call this method with no arguments to reset all currently chained animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object, or an array of them. + */ + chain(key?: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig | string[] | Phaser.Animations.Animation[] | Phaser.Types.Animations.PlayAnimationConfig[]): Phaser.GameObjects.GameObject; + + /** + * Returns the key of the animation currently loaded into this component. + * + * Prior to Phaser 3.50 this method was called `getCurrentKey`. + */ + getName(): string; + + /** + * Returns the key of the animation frame currently displayed by this component. + */ + getFrameName(): string; + + /** + * Internal method used to load an animation into this component. + * @param key The string-based key of the animation to play, or a `PlayAnimationConfig` object. + */ + protected load(key: string | Phaser.Types.Animations.PlayAnimationConfig): Phaser.GameObjects.GameObject; + + /** + * Pause the current animation and set the `isPlaying` property to `false`. + * You can optionally pause it at a specific frame. + * @param atFrame An optional frame to set after pausing the animation. + */ + pause(atFrame?: Phaser.Animations.AnimationFrame): Phaser.GameObjects.GameObject; + + /** + * Resumes playback of a paused animation and sets the `isPlaying` property to `true`. + * You can optionally tell it to start playback from a specific frame. + * @param fromFrame An optional frame to set before restarting playback. + */ + resume(fromFrame?: Phaser.Animations.AnimationFrame): Phaser.GameObjects.GameObject; + + /** + * Waits for the specified delay, in milliseconds, then starts playback of the given animation. + * + * If the animation _also_ has a delay value set in its config, it will be **added** to the delay given here. + * + * If an animation is already running and a new animation is given to this method, it will wait for + * the given delay before starting the new animation. + * + * If no animation is currently running, the given one begins after the delay. + * + * Prior to Phaser 3.50 this method was called 'delayedPlay' and the parameters were in the reverse order. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param delay The delay, in milliseconds, to wait before starting the animation playing. + */ + playAfterDelay(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, delay: number): Phaser.GameObjects.GameObject; + + /** + * Waits for the current animation to complete the `repeatCount` number of repeat cycles, then starts playback + * of the given animation. + * + * You can use this to ensure there are no harsh jumps between two sets of animations, i.e. going from an + * idle animation to a walking animation, by making them blend smoothly into each other. + * + * If no animation is currently running, the given one will start immediately. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param repeatCount How many times should the animation repeat before the next one starts? Default 1. + */ + playAfterRepeat(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, repeatCount?: number): Phaser.GameObjects.GameObject; + + /** + * Start playing the given animation on this Sprite. + * + * Animations in Phaser can either belong to the global Animation Manager, or specifically to this Sprite. + * + * The benefit of a global animation is that multiple Sprites can all play the same animation, without + * having to duplicate the data. You can just create it once and then play it on any Sprite. + * + * The following code shows how to create a global repeating animation. The animation will be created + * from all of the frames within the sprite sheet that was loaded with the key 'muybridge': + * + * ```javascript + * var config = { + * key: 'run', + * frames: 'muybridge', + * frameRate: 15, + * repeat: -1 + * }; + * + * // This code should be run from within a Scene: + * this.anims.create(config); + * ``` + * + * However, if you wish to create an animation that is unique to this Sprite, and this Sprite alone, + * you can call the `Animation.create` method instead. It accepts the exact same parameters as when + * creating a global animation, however the resulting data is kept locally in this Sprite. + * + * With the animation created, either globally or locally, you can now play it on this Sprite: + * + * ```javascript + * this.add.sprite(x, y).play('run'); + * ``` + * + * Alternatively, if you wish to run it at a different frame rate, for example, you can pass a config + * object instead: + * + * ```javascript + * this.add.sprite(x, y).play({ key: 'run', frameRate: 24 }); + * ``` + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * If you need a Sprite to be able to play both local and global animations, make sure they don't + * have conflicting keys. + * + * See the documentation for the `PlayAnimationConfig` config object for more details about this. + * + * Also, see the documentation in the Animation Manager for further details on creating animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If this animation is already playing then ignore this call. Default false. + */ + play(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): Phaser.GameObjects.GameObject; + + /** + * Start playing the given animation on this Sprite, in reverse. + * + * Animations in Phaser can either belong to the global Animation Manager, or specifically to this Sprite. + * + * The benefit of a global animation is that multiple Sprites can all play the same animation, without + * having to duplicate the data. You can just create it once and then play it on any Sprite. + * + * The following code shows how to create a global repeating animation. The animation will be created + * from all of the frames within the sprite sheet that was loaded with the key 'muybridge': + * + * ```javascript + * var config = { + * key: 'run', + * frames: 'muybridge', + * frameRate: 15, + * repeat: -1 + * }; + * + * // This code should be run from within a Scene: + * this.anims.create(config); + * ``` + * + * However, if you wish to create an animation that is unique to this Sprite, and this Sprite alone, + * you can call the `Animation.create` method instead. It accepts the exact same parameters as when + * creating a global animation, however the resulting data is kept locally in this Sprite. + * + * With the animation created, either globally or locally, you can now play it on this Sprite: + * + * ```javascript + * this.add.sprite(x, y).playReverse('run'); + * ``` + * + * Alternatively, if you wish to run it at a different frame rate, for example, you can pass a config + * object instead: + * + * ```javascript + * this.add.sprite(x, y).playReverse({ key: 'run', frameRate: 24 }); + * ``` + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * If you need a Sprite to be able to play both local and global animations, make sure they don't + * have conflicting keys. + * + * See the documentation for the `PlayAnimationConfig` config object for more details about this. + * + * Also, see the documentation in the Animation Manager for further details on creating animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If an animation is already playing then ignore this call. Default false. + */ + playReverse(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): Phaser.GameObjects.GameObject; + + /** + * Load the animation based on the key and set-up all of the internal values + * needed for playback to start. If there is no delay, it will also fire the start events. + * @param key The string-based key of the animation to play, or a `PlayAnimationConfig` object. + */ + startAnimation(key: string | Phaser.Types.Animations.PlayAnimationConfig): Phaser.GameObjects.GameObject; + + /** + * Reverse the Animation that is already playing on the Game Object. + */ + reverse(): Phaser.GameObjects.GameObject; + + /** + * Returns a value between 0 and 1 indicating how far this animation is through, ignoring repeats and yoyos. + * + * The value is based on the current frame and how far that is in the animation, it is not based on + * the duration of the animation. + */ + getProgress(): number; + + /** + * Takes a value between 0 and 1 and uses it to set how far this animation is through playback. + * + * Does not factor in repeats or yoyos, but does handle playing forwards or backwards. + * + * The value is based on the current frame and how far that is in the animation, it is not based on + * the duration of the animation. + * @param value The progress value, between 0 and 1. Default 0. + */ + setProgress(value?: number): Phaser.GameObjects.GameObject; + + /** + * Sets the number of times that the animation should repeat after its first play through. + * For example, if repeat is 1, the animation will play a total of twice: the initial play plus 1 repeat. + * + * To repeat indefinitely, use -1. + * The value should always be an integer. + * + * Calling this method only works if the animation is already running. Otherwise, any + * value specified here will be overwritten when the next animation loads in. To avoid this, + * use the `repeat` property of the `PlayAnimationConfig` object instead. + * @param value The number of times that the animation should repeat. + */ + setRepeat(value: number): Phaser.GameObjects.GameObject; + + /** + * Handle the removal of an animation from the Animation Manager. + * @param key The key of the removed Animation. + * @param animation The removed Animation. + */ + globalRemove(key?: string, animation?: Phaser.Animations.Animation): void; + + /** + * Restarts the current animation from its beginning. + * + * You can optionally reset the delay and repeat counters as well. + * + * Calling this will fire the `ANIMATION_RESTART` event immediately. + * + * If you `includeDelay` then it will also fire the `ANIMATION_START` event once + * the delay has expired, otherwise, playback will just begin immediately. + * @param includeDelay Whether to include the delay value of the animation when restarting. Default false. + * @param resetRepeats Whether to reset the repeat counter or not? Default false. + */ + restart(includeDelay?: boolean, resetRepeats?: boolean): Phaser.GameObjects.GameObject; + + /** + * The current animation has completed. This dispatches the `ANIMATION_COMPLETE` event. + * + * This method is called by the Animation instance and should not usually be invoked directly. + * + * If no animation is loaded, no events will be dispatched. + * + * If another animation has been queued for playback, it will be started after the events fire. + */ + complete(): Phaser.GameObjects.GameObject; + + /** + * Immediately stops the current animation from playing and dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing. + */ + stop(): Phaser.GameObjects.GameObject; + + /** + * Stops the current animation from playing after the specified time delay, given in milliseconds. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param delay The number of milliseconds to wait before stopping this animation. + */ + stopAfterDelay(delay: number): Phaser.GameObjects.GameObject; + + /** + * Stops the current animation from playing when it next repeats. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * + * Prior to Phaser 3.50 this method was called `stopOnRepeat` and had no parameters. + * @param repeatCount How many times should the animation repeat before stopping? Default 1. + */ + stopAfterRepeat(repeatCount?: number): Phaser.GameObjects.GameObject; + + /** + * Stops the current animation from playing when it next sets the given frame. + * If this frame doesn't exist within the animation it will not stop it from playing. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param frame The frame to check before stopping this animation. + */ + stopOnFrame(frame: Phaser.Animations.AnimationFrame): Phaser.GameObjects.GameObject; + + /** + * Returns the total number of frames in this animation, or returns zero if no + * animation has been loaded. + */ + getTotalFrames(): number; + + /** + * The internal update loop for the AnimationState Component. + * + * This is called automatically by the `Sprite.preUpdate` method. + * @param time The current timestamp. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Sets the given Animation Frame as being the current frame + * and applies it to the parent Game Object, adjusting size and origin as needed. + * @param animationFrame The animation frame to change to. + */ + setCurrentFrame(animationFrame: Phaser.Animations.AnimationFrame): Phaser.GameObjects.GameObject; + + /** + * Advances the animation to the next frame, regardless of the time or animation state. + * If the animation is set to repeat, or yoyo, this will still take effect. + * + * Calling this does not change the direction of the animation. I.e. if it was currently + * playing in reverse, calling this method doesn't then change the direction to forwards. + */ + nextFrame(): Phaser.GameObjects.GameObject; + + /** + * Advances the animation to the previous frame, regardless of the time or animation state. + * If the animation is set to repeat, or yoyo, this will still take effect. + * + * Calling this does not change the direction of the animation. I.e. if it was currently + * playing in forwards, calling this method doesn't then change the direction to backwards. + */ + previousFrame(): Phaser.GameObjects.GameObject; + + /** + * Get an Animation instance that has been created locally on this Sprite. + * + * See the `create` method for more details. + * @param key The key of the Animation to retrieve. + */ + get(key: string): Phaser.Animations.Animation; + + /** + * Checks to see if the given key is already used locally within the animations stored on this Sprite. + * @param key The key of the Animation to check. + */ + exists(key: string): boolean; + + /** + * Creates a new Animation that is local specifically to this Sprite. + * + * When a Sprite owns an animation, it is kept out of the global Animation Manager, which means + * you're free to use keys that may be already defined there. Unless you specifically need a Sprite + * to have a unique animation, you should favor using global animations instead, as they allow for + * the same animation to be used across multiple Sprites, saving on memory. However, if this Sprite + * is the only one to use this animation, it's sensible to create it here. + * + * If an invalid key is given this method will return `false`. + * + * If you pass the key of an animation that already exists locally, that animation will be returned. + * + * A brand new animation is only created if the key is valid and not already in use by this Sprite. + * + * If you wish to re-use an existing key, call the `remove` method first, then this method. + * @param config The configuration settings for the Animation. + */ + create(config: Phaser.Types.Animations.Animation): Phaser.Animations.Animation | false; + + /** + * Create one, or more animations from a loaded Aseprite JSON file. + * + * Aseprite is a powerful animated sprite editor and pixel art tool. + * + * You can find more details at https://www.aseprite.org/ + * + * To export a compatible JSON file in Aseprite, please do the following: + * + * 1. Go to "File - Export Sprite Sheet" + * + * 2. On the **Layout** tab: + * 2a. Set the "Sheet type" to "Packed" + * 2b. Set the "Constraints" to "None" + * 2c. Check the "Merge Duplicates" checkbox + * + * 3. On the **Sprite** tab: + * 3a. Set "Layers" to "Visible layers" + * 3b. Set "Frames" to "All frames", unless you only wish to export a sub-set of tags + * + * 4. On the **Borders** tab: + * 4a. Check the "Trim Sprite" and "Trim Cells" options + * 4b. Ensure "Border Padding", "Spacing" and "Inner Padding" are all > 0 (1 is usually enough) + * + * 5. On the **Output** tab: + * 5a. Check "Output File", give your image a name and make sure you choose "png files" as the file type + * 5b. Check "JSON Data" and give your json file a name + * 5c. The JSON Data type can be either a Hash or Array, Phaser doesn't mind. + * 5d. Make sure "Tags" is checked in the Meta options + * 5e. In the "Item Filename" input box, make sure it says just "{frame}" and nothing more. + * + * 6. Click export + * + * This was tested with Aseprite 1.2.25. + * + * This will export a png and json file which you can load using the Aseprite Loader, i.e.: + * + * ```javascript + * function preload () + * { + * this.load.path = 'assets/animations/aseprite/'; + * this.load.aseprite('paladin', 'paladin.png', 'paladin.json'); + * } + * ``` + * + * Once loaded, you can call this method on a Sprite with the 'atlas' key: + * + * ```javascript + * const sprite = this.add.sprite(400, 300); + * + * sprite.anims.createFromAseprite('paladin'); + * ``` + * + * Any animations defined in the JSON will now be available to use on this Sprite and you play them + * via their Tag name. For example, if you have an animation called 'War Cry' on your Aseprite timeline, + * you can play it on the Sprite using that Tag name: + * + * ```javascript + * const sprite = this.add.sprite(400, 300); + * + * sprite.anims.createFromAseprite('paladin'); + * + * sprite.play('War Cry'); + * ``` + * + * When calling this method you can optionally provide an array of tag names, and only those animations + * will be created. For example: + * + * ```javascript + * sprite.anims.createFromAseprite('paladin', [ 'step', 'War Cry', 'Magnum Break' ]); + * ``` + * + * This will only create the 3 animations defined. Note that the tag names are case-sensitive. + * @param key The key of the loaded Aseprite atlas. It must have been loaded prior to calling this method. + * @param tags An array of Tag names. If provided, only animations found in this array will be created. + */ + createFromAseprite(key: string, tags?: string[]): Phaser.Animations.Animation[]; + + /** + * Generate an array of {@link Phaser.Types.Animations.AnimationFrame} objects from a texture key and configuration object. + * + * Generates objects with string based frame names, as configured by the given {@link Phaser.Types.Animations.GenerateFrameNames}. + * + * It's a helper method, designed to make it easier for you to extract all of the frame names from texture atlases. + * If you're working with a sprite sheet, see the `generateFrameNumbers` method instead. + * + * Example: + * + * If you have a texture atlases loaded called `gems` and it contains 6 frames called `ruby_0001`, `ruby_0002`, and so on, + * then you can call this method using: `this.anims.generateFrameNames('gems', { prefix: 'ruby_', end: 6, zeroPad: 4 })`. + * + * The `end` value tells it to look for 6 frames, incrementally numbered, all starting with the prefix `ruby_`. The `zeroPad` + * value tells it how many zeroes pad out the numbers. To create an animation using this method, you can do: + * + * ```javascript + * this.anims.create({ + * key: 'ruby', + * repeat: -1, + * frames: this.anims.generateFrameNames('gems', { + * prefix: 'ruby_', + * end: 6, + * zeroPad: 4 + * }) + * }); + * ``` + * + * Please see the animation examples for further details. + * @param key The key for the texture containing the animation frames. + * @param config The configuration object for the animation frame names. + */ + generateFrameNames(key: string, config?: Phaser.Types.Animations.GenerateFrameNames): Phaser.Types.Animations.AnimationFrame[]; + + /** + * Generate an array of {@link Phaser.Types.Animations.AnimationFrame} objects from a texture key and configuration object. + * + * Generates objects with numbered frame names, as configured by the given {@link Phaser.Types.Animations.GenerateFrameNumbers}. + * + * If you're working with a texture atlas, see the `generateFrameNames` method instead. + * + * It's a helper method, designed to make it easier for you to extract frames from sprite sheets. + * If you're working with a texture atlas, see the `generateFrameNames` method instead. + * + * Example: + * + * If you have a sprite sheet loaded called `explosion` and it contains 12 frames, then you can call this method using: + * `this.anims.generateFrameNumbers('explosion', { start: 0, end: 11 })`. + * + * The `end` value tells it to stop after 12 frames. To create an animation using this method, you can do: + * + * ```javascript + * this.anims.create({ + * key: 'boom', + * frames: this.anims.generateFrameNumbers('explosion', { + * start: 0, + * end: 11 + * }) + * }); + * ``` + * + * Note that `start` is optional and you don't need to include it if the animation starts from frame 0. + * + * To specify an animation in reverse, swap the `start` and `end` values. + * + * If the frames are not sequential, you may pass an array of frame numbers instead, for example: + * + * `this.anims.generateFrameNumbers('explosion', { frames: [ 0, 1, 2, 1, 2, 3, 4, 0, 1, 2 ] })` + * + * Please see the animation examples and `GenerateFrameNumbers` config docs for further details. + * @param key The key for the texture containing the animation frames. + * @param config The configuration object for the animation frames. + */ + generateFrameNumbers(key: string, config?: Phaser.Types.Animations.GenerateFrameNumbers): Phaser.Types.Animations.AnimationFrame[]; + + /** + * Removes a locally created Animation from this Sprite, based on the given key. + * + * Once an Animation has been removed, this Sprite cannot play it again without re-creating it. + * @param key The key of the animation to remove. + */ + remove(key: string): Phaser.Animations.Animation; + + /** + * Destroy this Animation component. + * + * Unregisters event listeners and cleans up its references. + */ + destroy(): void; + + /** + * `true` if the current animation is paused, otherwise `false`. + */ + readonly isPaused: boolean; + + } + + namespace Events { + /** + * The Add Animation Event. + * + * This event is dispatched when a new animation is added to the global Animation Manager. + * + * This can happen either as a result of an animation instance being added to the Animation Manager, + * or the Animation Manager creating a new animation directly. + */ + const ADD_ANIMATION: string; + + /** + * The Animation Complete Event. + * + * This event is dispatched by a Sprite when an animation playing on it completes playback. + * This happens when the animation gets to the end of its sequence, factoring in any delays + * or repeats it may have to process. + * + * An animation that is set to loop, or repeat forever, will never fire this event, because + * it never actually completes. If you need to handle this, listen for the `ANIMATION_STOP` + * event instead, as this is emitted when the animation is stopped directly. + * + * Listen for it on the Sprite using `sprite.on('animationcomplete', listener)` + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_COMPLETE: string; + + /** + * The Animation Complete Dynamic Key Event. + * + * This event is dispatched by a Sprite when an animation playing on it completes playback. + * This happens when the animation gets to the end of its sequence, factoring in any delays + * or repeats it may have to process. + * + * An animation that is set to loop, or repeat forever, will never fire this event, because + * it never actually completes. If you need to handle this, listen for the `ANIMATION_STOP` + * event instead, as this is emitted when the animation is stopped directly. + * + * The difference between this and the `ANIMATION_COMPLETE` event is that this one has a + * dynamic event name that contains the name of the animation within it. For example, + * if you had an animation called `explode` you could listen for the completion of that + * specific animation by using: `sprite.on('animationcomplete-explode', listener)`. Or, if you + * wish to use types: `sprite.on(Phaser.Animations.Events.ANIMATION_COMPLETE_KEY + 'explode', listener)`. + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_COMPLETE_KEY: string; + + /** + * The Animation Repeat Event. + * + * This event is dispatched by a Sprite when an animation repeats playing on it. + * This happens if the animation was created, or played, with a `repeat` value specified. + * + * An animation will repeat when it reaches the end of its sequence. + * + * Listen for it on the Sprite using `sprite.on('animationrepeat', listener)` + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_REPEAT: string; + + /** + * The Animation Restart Event. + * + * This event is dispatched by a Sprite when an animation restarts playing on it. + * This only happens when the `Sprite.anims.restart` method is called. + * + * Listen for it on the Sprite using `sprite.on('animationrestart', listener)` + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_RESTART: string; + + /** + * The Animation Start Event. + * + * This event is dispatched by a Sprite when an animation starts playing on it. + * This happens when the animation is played, factoring in any delay that may have been specified. + * This event happens after the delay has expired and prior to the first update event. + * + * Listen for it on the Sprite using `sprite.on('animationstart', listener)` + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_START: string; + + /** + * The Animation Stop Event. + * + * This event is dispatched by a Sprite when an animation is stopped on it. An animation + * will only be stopeed if a method such as `Sprite.stop` or `Sprite.anims.stopAfterDelay` + * is called. It can also be emitted if a new animation is started before the current one completes. + * + * Listen for it on the Sprite using `sprite.on('animationstop', listener)` + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_STOP: string; + + /** + * The Animation Update Event. + * + * This event is dispatched by a Sprite when an animation playing on it updates. This happens when the animation changes frame. + * An animation will change frame based on the frame rate and other factors like `timeScale` and `delay`. It can also change + * frame when stopped or restarted. + * + * Listen for it on the Sprite using `sprite.on('animationupdate', listener)` + * + * If an animation is playing faster than the game frame-rate can handle, it's entirely possible for it to emit several + * update events in a single game frame, so please be aware of this in your code. The **final** event received that frame + * is the one that is rendered to the game. + * + * The animation event flow is as follows: + * + * 1. `ANIMATION_START` + * 2. `ANIMATION_UPDATE` (repeated for however many frames the animation has) + * 3. `ANIMATION_REPEAT` (only if the animation is set to repeat, it then emits more update events after this) + * 4. `ANIMATION_COMPLETE` (only if there is a finite, or zero, repeat count) + * 5. `ANIMATION_COMPLETE_KEY` (only if there is a finite, or zero, repeat count) + * + * If the animation is stopped directly, the `ANIMATION_STOP` event is dispatched instead of `ANIMATION_COMPLETE`. + * + * If the animation is restarted while it is already playing, `ANIMATION_RESTART` is emitted. + */ + const ANIMATION_UPDATE: string; + + /** + * The Pause All Animations Event. + * + * This event is dispatched when the global Animation Manager is told to pause. + * + * When this happens all current animations will stop updating, although it doesn't necessarily mean + * that the game has paused as well. + */ + const PAUSE_ALL: string; + + /** + * The Remove Animation Event. + * + * This event is dispatched when an animation is removed from the global Animation Manager. + */ + const REMOVE_ANIMATION: string; + + /** + * The Resume All Animations Event. + * + * This event is dispatched when the global Animation Manager resumes, having been previously paused. + * + * When this happens all current animations will continue updating again. + */ + const RESUME_ALL: string; + + } + + } + + namespace Cache { + /** + * The BaseCache is a base Cache class that can be used for storing references to any kind of data. + * + * Data can be added, retrieved and removed based on the given keys. + * + * Keys are string-based. + */ + class BaseCache { + /** + * The Map in which the cache objects are stored. + * + * You can query the Map directly or use the BaseCache methods. + */ + entries: Phaser.Structs.Map; + + /** + * An instance of EventEmitter used by the cache to emit related events. + */ + events: Phaser.Events.EventEmitter; + + /** + * Adds an item to this cache. The item is referenced by a unique string, which you are responsible + * for setting and keeping track of. The item can only be retrieved by using this string. + * @param key The unique key by which the data added to the cache will be referenced. + * @param data The data to be stored in the cache. + */ + add(key: string, data: any): this; + + /** + * Checks if this cache contains an item matching the given key. + * This performs the same action as `BaseCache.exists`. + * @param key The unique key of the item to be checked in this cache. + */ + has(key: string): boolean; + + /** + * Checks if this cache contains an item matching the given key. + * This performs the same action as `BaseCache.has` and is called directly by the Loader. + * @param key The unique key of the item to be checked in this cache. + */ + exists(key: string): boolean; + + /** + * Gets an item from this cache based on the given key. + * @param key The unique key of the item to be retrieved from this cache. + */ + get(key: string): any; + + /** + * Removes and item from this cache based on the given key. + * + * If an entry matching the key is found it is removed from the cache and a `remove` event emitted. + * No additional checks are done on the item removed. If other systems or parts of your game code + * are relying on this item, it is up to you to sever those relationships prior to removing the item. + * @param key The unique key of the item to remove from the cache. + */ + remove(key: string): this; + + /** + * Returns all keys in use in this cache. + */ + getKeys(): string[]; + + /** + * Destroys this cache and all items within it. + */ + destroy(): void; + + } + + /** + * The Cache Manager is the global cache owned and maintained by the Game instance. + * + * Various systems, such as the file Loader, rely on this cache in order to store the files + * it has loaded. The manager itself doesn't store any files, but instead owns multiple BaseCache + * instances, one per type of file. You can also add your own custom caches. + */ + class CacheManager { + /** + * + * @param game A reference to the Phaser.Game instance that owns this CacheManager. + */ + constructor(game: Phaser.Game); + + /** + * A reference to the Phaser.Game instance that owns this CacheManager. + */ + protected game: Phaser.Game; + + /** + * A Cache storing all binary files, typically added via the Loader. + */ + binary: Phaser.Cache.BaseCache; + + /** + * A Cache storing all bitmap font data files, typically added via the Loader. + * Only the font data is stored in this cache, the textures are part of the Texture Manager. + */ + bitmapFont: Phaser.Cache.BaseCache; + + /** + * A Cache storing all JSON data files, typically added via the Loader. + */ + json: Phaser.Cache.BaseCache; + + /** + * A Cache storing all physics data files, typically added via the Loader. + */ + physics: Phaser.Cache.BaseCache; + + /** + * A Cache storing all shader source files, typically added via the Loader. + */ + shader: Phaser.Cache.BaseCache; + + /** + * A Cache storing all non-streaming audio files, typically added via the Loader. + */ + audio: Phaser.Cache.BaseCache; + + /** + * A Cache storing all non-streaming video files, typically added via the Loader. + */ + video: Phaser.Cache.BaseCache; + + /** + * A Cache storing all text files, typically added via the Loader. + */ + text: Phaser.Cache.BaseCache; + + /** + * A Cache storing all html files, typically added via the Loader. + */ + html: Phaser.Cache.BaseCache; + + /** + * A Cache storing all WaveFront OBJ files, typically added via the Loader. + */ + obj: Phaser.Cache.BaseCache; + + /** + * A Cache storing all tilemap data files, typically added via the Loader. + * Only the data is stored in this cache, the textures are part of the Texture Manager. + */ + tilemap: Phaser.Cache.BaseCache; + + /** + * A Cache storing all xml data files, typically added via the Loader. + */ + xml: Phaser.Cache.BaseCache; + + /** + * An object that contains your own custom BaseCache entries. + * Add to this via the `addCustom` method. + */ + custom: {[key: string]: Phaser.Cache.BaseCache}; + + /** + * Add your own custom Cache for storing your own files. + * The cache will be available under `Cache.custom.key`. + * The cache will only be created if the key is not already in use. + * @param key The unique key of your custom cache. + */ + addCustom(key: string): Phaser.Cache.BaseCache; + + /** + * Removes all entries from all BaseCaches and destroys all custom caches. + */ + destroy(): void; + + } + + namespace Events { + /** + * The Cache Add Event. + * + * This event is dispatched by any Cache that extends the BaseCache each time a new object is added to it. + */ + const ADD: string; + + /** + * The Cache Remove Event. + * + * This event is dispatched by any Cache that extends the BaseCache each time an object is removed from it. + */ + const REMOVE: string; + + } + + } + + namespace Cameras { + namespace Scene2D { + /** + * A Base Camera class. + * + * The Camera is the way in which all games are rendered in Phaser. They provide a view into your game world, + * and can be positioned, rotated, zoomed and scrolled accordingly. + * + * A Camera consists of two elements: The viewport and the scroll values. + * + * The viewport is the physical position and size of the Camera within your game. Cameras, by default, are + * created the same size as your game, but their position and size can be set to anything. This means if you + * wanted to create a camera that was 320x200 in size, positioned in the bottom-right corner of your game, + * you'd adjust the viewport to do that (using methods like `setViewport` and `setSize`). + * + * If you wish to change where the Camera is looking in your game, then you scroll it. You can do this + * via the properties `scrollX` and `scrollY` or the method `setScroll`. Scrolling has no impact on the + * viewport, and changing the viewport has no impact on the scrolling. + * + * By default a Camera will render all Game Objects it can see. You can change this using the `ignore` method, + * allowing you to filter Game Objects out on a per-Camera basis. + * + * The Base Camera is extended by the Camera class, which adds in special effects including Fade, + * Flash and Camera Shake, as well as the ability to follow Game Objects. + * + * The Base Camera was introduced in Phaser 3.12. It was split off from the Camera class, to allow + * you to isolate special effects as needed. Therefore the 'since' values for properties of this class relate + * to when they were added to the Camera class. + */ + class BaseCamera extends Phaser.Events.EventEmitter implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.Visible { + /** + * + * @param x The x position of the Camera, relative to the top-left of the game canvas. + * @param y The y position of the Camera, relative to the top-left of the game canvas. + * @param width The width of the Camera, in pixels. + * @param height The height of the Camera, in pixels. + */ + constructor(x: number, y: number, width: number, height: number); + + /** + * A reference to the Scene this camera belongs to. + */ + scene: Phaser.Scene; + + /** + * A reference to the Game Scene Manager. + */ + sceneManager: Phaser.Scenes.SceneManager; + + /** + * A reference to the Game Scale Manager. + */ + scaleManager: Phaser.Scale.ScaleManager; + + /** + * A reference to the Scene's Camera Manager to which this Camera belongs. + */ + cameraManager: Phaser.Cameras.Scene2D.CameraManager; + + /** + * The Camera ID. Assigned by the Camera Manager and used to handle camera exclusion. + * This value is a bitmask. + */ + readonly id: number; + + /** + * The name of the Camera. This is left empty for your own use. + */ + name: string; + + /** + * Should this camera round its pixel values to integers? + */ + roundPixels: boolean; + + /** + * Is this Camera visible or not? + * + * A visible camera will render and perform input tests. + * An invisible camera will not render anything and will skip input tests. + */ + visible: boolean; + + /** + * Is this Camera using a bounds to restrict scrolling movement? + * + * Set this property along with the bounds via `Camera.setBounds`. + */ + useBounds: boolean; + + /** + * The World View is a Rectangle that defines the area of the 'world' the Camera is currently looking at. + * This factors in the Camera viewport size, zoom and scroll position and is updated in the Camera preRender step. + * If you have enabled Camera bounds the worldview will be clamped to those bounds accordingly. + * You can use it for culling or intersection checks. + */ + readonly worldView: Phaser.Geom.Rectangle; + + /** + * Is this Camera dirty? + * + * A dirty Camera has had either its viewport size, bounds, scroll, rotation or zoom levels changed since the last frame. + * + * This flag is cleared during the `postRenderCamera` method of the renderer. + */ + dirty: boolean; + + /** + * Does this Camera have a transparent background? + */ + transparent: boolean; + + /** + * The background color of this Camera. Only used if `transparent` is `false`. + */ + backgroundColor: Phaser.Display.Color; + + /** + * The Camera alpha value. Setting this property impacts every single object that this Camera + * renders. You can either set the property directly, i.e. via a Tween, to fade a Camera in or out, + * or via the chainable `setAlpha` method instead. + */ + alpha: number; + + /** + * Should the camera cull Game Objects before checking them for input hit tests? + * In some special cases it may be beneficial to disable this. + */ + disableCull: boolean; + + /** + * The mid-point of the Camera in 'world' coordinates. + * + * Use it to obtain exactly where in the world the center of the camera is currently looking. + * + * This value is updated in the preRender method, after the scroll values and follower + * have been processed. + */ + readonly midPoint: Phaser.Math.Vector2; + + /** + * The horizontal origin of rotation for this Camera. + * + * By default the camera rotates around the center of the viewport. + * + * Changing the origin allows you to adjust the point in the viewport from which rotation happens. + * A value of 0 would rotate from the top-left of the viewport. A value of 1 from the bottom right. + * + * See `setOrigin` to set both origins in a single, chainable call. + */ + originX: number; + + /** + * The vertical origin of rotation for this Camera. + * + * By default the camera rotates around the center of the viewport. + * + * Changing the origin allows you to adjust the point in the viewport from which rotation happens. + * A value of 0 would rotate from the top-left of the viewport. A value of 1 from the bottom right. + * + * See `setOrigin` to set both origins in a single, chainable call. + */ + originY: number; + + /** + * The Mask this Camera is using during render. + * Set the mask using the `setMask` method. Remove the mask using the `clearMask` method. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask | null; + + /** + * This array is populated with all of the Game Objects that this Camera has rendered + * in the previous (or current, depending on when you inspect it) frame. + * + * It is cleared at the start of `Camera.preUpdate`, or if the Camera is destroyed. + * + * You should not modify this array as it is used internally by the input system, + * however you can read it as required. Note that Game Objects may appear in this + * list multiple times if they belong to multiple non-exclusive Containers. + */ + renderList: Phaser.GameObjects.GameObject[]; + + /** + * Is this Camera a Scene Camera? (which is the default), or a Camera + * belonging to a Texture? + */ + isSceneCamera: boolean; + + /** + * Adds the given Game Object to this cameras render list. + * + * This is invoked during the rendering stage. Only objects that are actually rendered + * will appear in the render list. + * @param child The Game Object to add to the render list. + */ + addToRenderList(child: Phaser.GameObjects.GameObject): void; + + /** + * Set the Alpha level of this Camera. The alpha controls the opacity of the Camera as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The Camera alpha value. Default 1. + */ + setAlpha(value?: number): this; + + /** + * Sets the rotation origin of this Camera. + * + * The values are given in the range 0 to 1 and are only used when calculating Camera rotation. + * + * By default the camera rotates around the center of the viewport. + * + * Changing the origin allows you to adjust the point in the viewport from which rotation happens. + * A value of 0 would rotate from the top-left of the viewport. A value of 1 from the bottom right. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Calculates what the Camera.scrollX and scrollY values would need to be in order to move + * the Camera so it is centered on the given x and y coordinates, without actually moving + * the Camera there. The results are clamped based on the Camera bounds, if set. + * @param x The horizontal coordinate to center on. + * @param y The vertical coordinate to center on. + * @param out A Vector2 to store the values in. If not given a new Vector2 is created. + */ + getScroll(x: number, y: number, out?: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Moves the Camera horizontally so that it is centered on the given x coordinate, bounds allowing. + * Calling this does not change the scrollY value. + * @param x The horizontal coordinate to center on. + */ + centerOnX(x: number): this; + + /** + * Moves the Camera vertically so that it is centered on the given y coordinate, bounds allowing. + * Calling this does not change the scrollX value. + * @param y The vertical coordinate to center on. + */ + centerOnY(y: number): this; + + /** + * Moves the Camera so that it is centered on the given coordinates, bounds allowing. + * @param x The horizontal coordinate to center on. + * @param y The vertical coordinate to center on. + */ + centerOn(x: number, y: number): this; + + /** + * Moves the Camera so that it is looking at the center of the Camera Bounds, if enabled. + */ + centerToBounds(): this; + + /** + * Moves the Camera so that it is re-centered based on its viewport size. + */ + centerToSize(): this; + + /** + * Takes an array of Game Objects and returns a new array featuring only those objects + * visible by this camera. + * @param renderableObjects An array of Game Objects to cull. + */ + cull(renderableObjects: G): G; + + /** + * Converts the given `x` and `y` coordinates into World space, based on this Cameras transform. + * You can optionally provide a Vector2, or similar object, to store the results in. + * @param x The x position to convert to world space. + * @param y The y position to convert to world space. + * @param output An optional object to store the results in. If not provided a new Vector2 will be created. + */ + getWorldPoint(x: number, y: number, output?: O): O; + + /** + * Given a Game Object, or an array of Game Objects, it will update all of their camera filter settings + * so that they are ignored by this Camera. This means they will not be rendered by this Camera. + * @param entries The Game Object, or array of Game Objects, to be ignored by this Camera. + */ + ignore(entries: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[] | Phaser.GameObjects.Group | Phaser.GameObjects.Layer | Phaser.GameObjects.Layer[]): this; + + /** + * Internal preRender step. + */ + protected preRender(): void; + + /** + * Takes an x value and checks it's within the range of the Camera bounds, adjusting if required. + * Do not call this method if you are not using camera bounds. + * @param x The value to horizontally scroll clamp. + */ + clampX(x: number): number; + + /** + * Takes a y value and checks it's within the range of the Camera bounds, adjusting if required. + * Do not call this method if you are not using camera bounds. + * @param y The value to vertically scroll clamp. + */ + clampY(y: number): number; + + /** + * If this Camera has previously had movement bounds set on it, this will remove them. + */ + removeBounds(): this; + + /** + * Set the rotation of this Camera. This causes everything it renders to appear rotated. + * + * Rotating a camera does not rotate the viewport itself, it is applied during rendering. + * @param value The cameras angle of rotation, given in degrees. Default 0. + */ + setAngle(value?: number): this; + + /** + * Sets the background color for this Camera. + * + * By default a Camera has a transparent background but it can be given a solid color, with any level + * of transparency, via this method. + * + * The color value can be specified using CSS color notation, hex or numbers. + * @param color The color value. In CSS, hex or numeric color notation. Default 'rgba(0,0,0,0)'. + */ + setBackgroundColor(color?: string | number | Phaser.Types.Display.InputColorObject): this; + + /** + * Set the bounds of the Camera. The bounds are an axis-aligned rectangle. + * + * The Camera bounds controls where the Camera can scroll to, stopping it from scrolling off the + * edges and into blank space. It does not limit the placement of Game Objects, or where + * the Camera viewport can be positioned. + * + * Temporarily disable the bounds by changing the boolean `Camera.useBounds`. + * + * Clear the bounds entirely by calling `Camera.removeBounds`. + * + * If you set bounds that are smaller than the viewport it will stop the Camera from being + * able to scroll. The bounds can be positioned where-ever you wish. By default they are from + * 0x0 to the canvas width x height. This means that the coordinate 0x0 is the top left of + * the Camera bounds. However, you can position them anywhere. So if you wanted a game world + * that was 2048x2048 in size, with 0x0 being the center of it, you can set the bounds x/y + * to be -1024, -1024, with a width and height of 2048. Depending on your game you may find + * it easier for 0x0 to be the top-left of the bounds, or you may wish 0x0 to be the middle. + * @param x The top-left x coordinate of the bounds. + * @param y The top-left y coordinate of the bounds. + * @param width The width of the bounds, in pixels. + * @param height The height of the bounds, in pixels. + * @param centerOn If `true` the Camera will automatically be centered on the new bounds. Default false. + */ + setBounds(x: number, y: number, width: number, height: number, centerOn?: boolean): this; + + /** + * Returns a rectangle containing the bounds of the Camera. + * + * If the Camera does not have any bounds the rectangle will be empty. + * + * The rectangle is a copy of the bounds, so is safe to modify. + * @param out An optional Rectangle to store the bounds in. If not given, a new Rectangle will be created. + */ + getBounds(out?: Phaser.Geom.Rectangle): Phaser.Geom.Rectangle; + + /** + * Sets the name of this Camera. + * This value is for your own use and isn't used internally. + * @param value The name of the Camera. Default ''. + */ + setName(value?: string): this; + + /** + * Set the position of the Camera viewport within the game. + * + * This does not change where the camera is 'looking'. See `setScroll` to control that. + * @param x The top-left x coordinate of the Camera viewport. + * @param y The top-left y coordinate of the Camera viewport. Default x. + */ + setPosition(x: number, y?: number): this; + + /** + * Set the rotation of this Camera. This causes everything it renders to appear rotated. + * + * Rotating a camera does not rotate the viewport itself, it is applied during rendering. + * @param value The rotation of the Camera, in radians. Default 0. + */ + setRotation(value?: number): this; + + /** + * Should the Camera round pixel values to whole integers when rendering Game Objects? + * + * In some types of game, especially with pixel art, this is required to prevent sub-pixel aliasing. + * @param value `true` to round Camera pixels, `false` to not. + */ + setRoundPixels(value: boolean): this; + + /** + * Sets the Scene the Camera is bound to. + * @param scene The Scene the camera is bound to. + * @param isSceneCamera Is this Camera being used for a Scene (true) or a Texture? (false) Default true. + */ + setScene(scene: Phaser.Scene, isSceneCamera?: boolean): this; + + /** + * Set the position of where the Camera is looking within the game. + * You can also modify the properties `Camera.scrollX` and `Camera.scrollY` directly. + * Use this method, or the scroll properties, to move your camera around the game world. + * + * This does not change where the camera viewport is placed. See `setPosition` to control that. + * @param x The x coordinate of the Camera in the game world. + * @param y The y coordinate of the Camera in the game world. Default x. + */ + setScroll(x: number, y?: number): this; + + /** + * Set the size of the Camera viewport. + * + * By default a Camera is the same size as the game, but can be made smaller via this method, + * allowing you to create mini-cam style effects by creating and positioning a smaller Camera + * viewport within your game. + * @param width The width of the Camera viewport. + * @param height The height of the Camera viewport. Default width. + */ + setSize(width: number, height?: number): this; + + /** + * This method sets the position and size of the Camera viewport in a single call. + * + * If you're trying to change where the Camera is looking at in your game, then see + * the method `Camera.setScroll` instead. This method is for changing the viewport + * itself, not what the camera can see. + * + * By default a Camera is the same size as the game, but can be made smaller via this method, + * allowing you to create mini-cam style effects by creating and positioning a smaller Camera + * viewport within your game. + * @param x The top-left x coordinate of the Camera viewport. + * @param y The top-left y coordinate of the Camera viewport. + * @param width The width of the Camera viewport. + * @param height The height of the Camera viewport. Default width. + */ + setViewport(x: number, y: number, width: number, height?: number): this; + + /** + * Set the zoom value of the Camera. + * + * Changing to a smaller value, such as 0.5, will cause the camera to 'zoom out'. + * Changing to a larger value, such as 2, will cause the camera to 'zoom in'. + * + * A value of 1 means 'no zoom' and is the default. + * + * Changing the zoom does not impact the Camera viewport in any way, it is only applied during rendering. + * + * As of Phaser 3.50 you can now set the horizontal and vertical zoom values independently. + * @param x The horizontal zoom value of the Camera. The minimum it can be is 0.001. Default 1. + * @param y The vertical zoom value of the Camera. The minimum it can be is 0.001. Default x. + */ + setZoom(x?: number, y?: number): this; + + /** + * Sets the mask to be applied to this Camera during rendering. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * + * Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Camera it will be immediately replaced. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Camera will use when rendering. + * @param fixedPosition Should the mask translate along with the Camera, or be fixed in place and not impacted by the Cameras transform? Default true. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask, fixedPosition?: boolean): this; + + /** + * Clears the mask that this Camera was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Sets the visibility of this Camera. + * + * An invisible Camera will skip rendering and input tests of everything it can see. + * @param value The visible state of the Camera. + */ + setVisible(value: boolean): this; + + /** + * Returns an Object suitable for JSON storage containing all of the Camera viewport and rendering properties. + */ + toJSON(): Phaser.Types.Cameras.Scene2D.JSONCamera; + + /** + * Internal method called automatically by the Camera Manager. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected update(time: number, delta: number): void; + + /** + * Set if this Camera is being used as a Scene Camera, or a Texture + * Camera. + * @param value Is this being used as a Scene Camera, or a Texture camera? + */ + setIsSceneCamera(value: boolean): void; + + /** + * Destroys this Camera instance and its internal properties and references. + * Once destroyed you cannot use this Camera again, even if re-added to a Camera Manager. + * + * This method is called automatically by `CameraManager.remove` if that methods `runDestroy` argument is `true`, which is the default. + * + * Unless you have a specific reason otherwise, always use `CameraManager.remove` and allow it to handle the camera destruction, + * rather than calling this method directly. + */ + destroy(): void; + + /** + * The x position of the Camera viewport, relative to the top-left of the game canvas. + * The viewport is the area into which the camera renders. + * To adjust the position the camera is looking at in the game world, see the `scrollX` value. + */ + x: number; + + /** + * The y position of the Camera viewport, relative to the top-left of the game canvas. + * The viewport is the area into which the camera renders. + * To adjust the position the camera is looking at in the game world, see the `scrollY` value. + */ + y: number; + + /** + * The width of the Camera viewport, in pixels. + * + * The viewport is the area into which the Camera renders. Setting the viewport does + * not restrict where the Camera can scroll to. + */ + width: number; + + /** + * The height of the Camera viewport, in pixels. + * + * The viewport is the area into which the Camera renders. Setting the viewport does + * not restrict where the Camera can scroll to. + */ + height: number; + + /** + * The horizontal scroll position of this Camera. + * + * Change this value to cause the Camera to scroll around your Scene. + * + * Alternatively, setting the Camera to follow a Game Object, via the `startFollow` method, + * will automatically adjust the Camera scroll values accordingly. + * + * You can set the bounds within which the Camera can scroll via the `setBounds` method. + */ + scrollX: number; + + /** + * The vertical scroll position of this Camera. + * + * Change this value to cause the Camera to scroll around your Scene. + * + * Alternatively, setting the Camera to follow a Game Object, via the `startFollow` method, + * will automatically adjust the Camera scroll values accordingly. + * + * You can set the bounds within which the Camera can scroll via the `setBounds` method. + */ + scrollY: number; + + /** + * The Camera zoom value. Change this value to zoom in, or out of, a Scene. + * + * A value of 0.5 would zoom the Camera out, so you can now see twice as much + * of the Scene as before. A value of 2 would zoom the Camera in, so every pixel + * now takes up 2 pixels when rendered. + * + * Set to 1 to return to the default zoom level. + * + * Be careful to never set this value to zero. + */ + zoom: number; + + /** + * The Camera horizontal zoom value. Change this value to zoom in, or out of, a Scene. + * + * A value of 0.5 would zoom the Camera out, so you can now see twice as much + * of the Scene as before. A value of 2 would zoom the Camera in, so every pixel + * now takes up 2 pixels when rendered. + * + * Set to 1 to return to the default zoom level. + * + * Be careful to never set this value to zero. + */ + zoomX: number; + + /** + * The Camera vertical zoom value. Change this value to zoom in, or out of, a Scene. + * + * A value of 0.5 would zoom the Camera out, so you can now see twice as much + * of the Scene as before. A value of 2 would zoom the Camera in, so every pixel + * now takes up 2 pixels when rendered. + * + * Set to 1 to return to the default zoom level. + * + * Be careful to never set this value to zero. + */ + zoomY: number; + + /** + * The horizontal position of the center of the Camera's viewport, relative to the left of the game canvas. + */ + readonly centerX: number; + + /** + * The vertical position of the center of the Camera's viewport, relative to the top of the game canvas. + */ + readonly centerY: number; + + /** + * The displayed width of the camera viewport, factoring in the camera zoom level. + * + * If a camera has a viewport width of 800 and a zoom of 0.5 then its display width + * would be 1600, as it's displaying twice as many pixels as zoom level 1. + * + * Equally, a camera with a width of 800 and zoom of 2 would have a display width + * of 400 pixels. + */ + readonly displayWidth: number; + + /** + * The displayed height of the camera viewport, factoring in the camera zoom level. + * + * If a camera has a viewport height of 600 and a zoom of 0.5 then its display height + * would be 1200, as it's displaying twice as many pixels as zoom level 1. + * + * Equally, a camera with a height of 600 and zoom of 2 would have a display height + * of 300 pixels. + */ + readonly displayHeight: number; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + } + + /** + * A Camera. + * + * The Camera is the way in which all games are rendered in Phaser. They provide a view into your game world, + * and can be positioned, rotated, zoomed and scrolled accordingly. + * + * A Camera consists of two elements: The viewport and the scroll values. + * + * The viewport is the physical position and size of the Camera within your game. Cameras, by default, are + * created the same size as your game, but their position and size can be set to anything. This means if you + * wanted to create a camera that was 320x200 in size, positioned in the bottom-right corner of your game, + * you'd adjust the viewport to do that (using methods like `setViewport` and `setSize`). + * + * If you wish to change where the Camera is looking in your game, then you scroll it. You can do this + * via the properties `scrollX` and `scrollY` or the method `setScroll`. Scrolling has no impact on the + * viewport, and changing the viewport has no impact on the scrolling. + * + * By default a Camera will render all Game Objects it can see. You can change this using the `ignore` method, + * allowing you to filter Game Objects out on a per-Camera basis. + * + * A Camera also has built-in special effects including Fade, Flash and Camera Shake. + */ + class Camera extends Phaser.Cameras.Scene2D.BaseCamera implements Phaser.GameObjects.Components.PostPipeline { + /** + * + * @param x The x position of the Camera, relative to the top-left of the game canvas. + * @param y The y position of the Camera, relative to the top-left of the game canvas. + * @param width The width of the Camera, in pixels. + * @param height The height of the Camera, in pixels. + */ + constructor(x: number, y: number, width: number, height: number); + + /** + * Does this Camera allow the Game Objects it renders to receive input events? + */ + inputEnabled: boolean; + + /** + * The Camera Fade effect handler. + * To fade this camera see the `Camera.fade` methods. + */ + fadeEffect: Phaser.Cameras.Scene2D.Effects.Fade; + + /** + * The Camera Flash effect handler. + * To flash this camera see the `Camera.flash` method. + */ + flashEffect: Phaser.Cameras.Scene2D.Effects.Flash; + + /** + * The Camera Shake effect handler. + * To shake this camera see the `Camera.shake` method. + */ + shakeEffect: Phaser.Cameras.Scene2D.Effects.Shake; + + /** + * The Camera Pan effect handler. + * To pan this camera see the `Camera.pan` method. + */ + panEffect: Phaser.Cameras.Scene2D.Effects.Pan; + + /** + * The Camera Rotate To effect handler. + * To rotate this camera see the `Camera.rotateTo` method. + */ + rotateToEffect: Phaser.Cameras.Scene2D.Effects.RotateTo; + + /** + * The Camera Zoom effect handler. + * To zoom this camera see the `Camera.zoom` method. + */ + zoomEffect: Phaser.Cameras.Scene2D.Effects.Zoom; + + /** + * The linear interpolation value to use when following a target. + * + * Can also be set via `setLerp` or as part of the `startFollow` call. + * + * The default values of 1 means the camera will instantly snap to the target coordinates. + * A lower value, such as 0.1 means the camera will more slowly track the target, giving + * a smooth transition. You can set the horizontal and vertical values independently, and also + * adjust this value in real-time during your game. + * + * Be sure to keep the value between 0 and 1. A value of zero will disable tracking on that axis. + */ + lerp: Phaser.Math.Vector2; + + /** + * The values stored in this property are subtracted from the Camera targets position, allowing you to + * offset the camera from the actual target x/y coordinates by this amount. + * Can also be set via `setFollowOffset` or as part of the `startFollow` call. + */ + followOffset: Phaser.Math.Vector2; + + /** + * The Camera dead zone. + * + * The deadzone is only used when the camera is following a target. + * + * It defines a rectangular region within which if the target is present, the camera will not scroll. + * If the target moves outside of this area, the camera will begin scrolling in order to follow it. + * + * The `lerp` values that you can set for a follower target also apply when using a deadzone. + * + * You can directly set this property to be an instance of a Rectangle. Or, you can use the + * `setDeadzone` method for a chainable approach. + * + * The rectangle you provide can have its dimensions adjusted dynamically, however, please + * note that its position is updated every frame, as it is constantly re-centered on the cameras mid point. + * + * Calling `setDeadzone` with no arguments will reset an active deadzone, as will setting this property + * to `null`. + */ + deadzone: Phaser.Geom.Rectangle | null; + + /** + * Sets the Camera dead zone. + * + * The deadzone is only used when the camera is following a target. + * + * It defines a rectangular region within which if the target is present, the camera will not scroll. + * If the target moves outside of this area, the camera will begin scrolling in order to follow it. + * + * The deadzone rectangle is re-positioned every frame so that it is centered on the mid-point + * of the camera. This allows you to use the object for additional game related checks, such as + * testing if an object is within it or not via a Rectangle.contains call. + * + * The `lerp` values that you can set for a follower target also apply when using a deadzone. + * + * Calling this method with no arguments will reset an active deadzone. + * @param width The width of the deadzone rectangle in pixels. If not specified the deadzone is removed. + * @param height The height of the deadzone rectangle in pixels. + */ + setDeadzone(width?: number, height?: number): this; + + /** + * Fades the Camera in from the given color over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param red The amount to fade the red channel towards. A value between 0 and 255. Default 0. + * @param green The amount to fade the green channel towards. A value between 0 and 255. Default 0. + * @param blue The amount to fade the blue channel towards. A value between 0 and 255. Default 0. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + fadeIn(duration?: number, red?: number, green?: number, blue?: number, callback?: Function, context?: any): this; + + /** + * Fades the Camera out to the given color over the duration specified. + * This is an alias for Camera.fade that forces the fade to start, regardless of existing fades. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param red The amount to fade the red channel towards. A value between 0 and 255. Default 0. + * @param green The amount to fade the green channel towards. A value between 0 and 255. Default 0. + * @param blue The amount to fade the blue channel towards. A value between 0 and 255. Default 0. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + fadeOut(duration?: number, red?: number, green?: number, blue?: number, callback?: Function, context?: any): this; + + /** + * Fades the Camera from the given color to transparent over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param red The amount to fade the red channel towards. A value between 0 and 255. Default 0. + * @param green The amount to fade the green channel towards. A value between 0 and 255. Default 0. + * @param blue The amount to fade the blue channel towards. A value between 0 and 255. Default 0. + * @param force Force the effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + fadeFrom(duration?: number, red?: number, green?: number, blue?: number, force?: boolean, callback?: Function, context?: any): this; + + /** + * Fades the Camera from transparent to the given color over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param red The amount to fade the red channel towards. A value between 0 and 255. Default 0. + * @param green The amount to fade the green channel towards. A value between 0 and 255. Default 0. + * @param blue The amount to fade the blue channel towards. A value between 0 and 255. Default 0. + * @param force Force the effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + fade(duration?: number, red?: number, green?: number, blue?: number, force?: boolean, callback?: Function, context?: any): this; + + /** + * Flashes the Camera by setting it to the given color immediately and then fading it away again quickly over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 250. + * @param red The amount to fade the red channel towards. A value between 0 and 255. Default 255. + * @param green The amount to fade the green channel towards. A value between 0 and 255. Default 255. + * @param blue The amount to fade the blue channel towards. A value between 0 and 255. Default 255. + * @param force Force the effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + flash(duration?: number, red?: number, green?: number, blue?: number, force?: boolean, callback?: Function, context?: any): this; + + /** + * Shakes the Camera by the given intensity over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 100. + * @param intensity The intensity of the shake. Default 0.05. + * @param force Force the shake effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + shake(duration?: number, intensity?: number | Phaser.Math.Vector2, force?: boolean, callback?: Function, context?: any): this; + + /** + * This effect will scroll the Camera so that the center of its viewport finishes at the given destination, + * over the duration and with the ease specified. + * @param x The destination x coordinate to scroll the center of the Camera viewport to. + * @param y The destination y coordinate to scroll the center of the Camera viewport to. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param ease The ease to use for the pan. Can be any of the Phaser Easing constants or a custom function. Default 'Linear'. + * @param force Force the pan effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is, + * the current camera scroll x coordinate and the current camera scroll y coordinate. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + pan(x: number, y: number, duration?: number, ease?: string | Function, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraPanCallback, context?: any): this; + + /** + * This effect will rotate the Camera so that the viewport finishes at the given angle in radians, + * over the duration and with the ease specified. + * @param radians The destination angle in radians to rotate the Camera viewport to. If the angle is positive then the rotation is clockwise else anticlockwise + * @param shortestPath If shortest path is set to true the camera will rotate in the quickest direction clockwise or anti-clockwise. Default false. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param ease The ease to use for the rotation. Can be any of the Phaser Easing constants or a custom function. Default 'Linear'. + * @param force Force the rotation effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is, + * the current camera rotation angle in radians. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + rotateTo(radians: number, shortestPath?: boolean, duration?: number, ease?: string | Function, force?: boolean, callback?: CameraRotateCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * This effect will zoom the Camera to the given scale, over the duration and with the ease specified. + * @param zoom The target Camera zoom value. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param ease The ease to use for the pan. Can be any of the Phaser Easing constants or a custom function. Default 'Linear'. + * @param force Force the pan effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is, + * the current camera scroll x coordinate and the current camera scroll y coordinate. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + zoomTo(zoom: number, duration?: number, ease?: string | Function, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraPanCallback, context?: any): this; + + /** + * Internal preRender step. + */ + protected preRender(): void; + + /** + * Sets the linear interpolation value to use when following a target. + * + * The default values of 1 means the camera will instantly snap to the target coordinates. + * A lower value, such as 0.1 means the camera will more slowly track the target, giving + * a smooth transition. You can set the horizontal and vertical values independently, and also + * adjust this value in real-time during your game. + * + * Be sure to keep the value between 0 and 1. A value of zero will disable tracking on that axis. + * @param x The amount added to the horizontal linear interpolation of the follow target. Default 1. + * @param y The amount added to the vertical linear interpolation of the follow target. Default 1. + */ + setLerp(x?: number, y?: number): this; + + /** + * Sets the horizontal and vertical offset of the camera from its follow target. + * The values are subtracted from the targets position during the Cameras update step. + * @param x The horizontal offset from the camera follow target.x position. Default 0. + * @param y The vertical offset from the camera follow target.y position. Default 0. + */ + setFollowOffset(x?: number, y?: number): this; + + /** + * Sets the Camera to follow a Game Object. + * + * When enabled the Camera will automatically adjust its scroll position to keep the target Game Object + * in its center. + * + * You can set the linear interpolation value used in the follow code. + * Use low lerp values (such as 0.1) to automatically smooth the camera motion. + * + * If you find you're getting a slight "jitter" effect when following an object it's probably to do with sub-pixel + * rendering of the targets position. This can be rounded by setting the `roundPixels` argument to `true` to + * force full pixel rounding rendering. Note that this can still be broken if you have specified a non-integer zoom + * value on the camera. So be sure to keep the camera zoom to integers. + * @param target The target for the Camera to follow. + * @param roundPixels Round the camera position to whole integers to avoid sub-pixel rendering? Default false. + * @param lerpX A value between 0 and 1. This value specifies the amount of linear interpolation to use when horizontally tracking the target. The closer the value to 1, the faster the camera will track. Default 1. + * @param lerpY A value between 0 and 1. This value specifies the amount of linear interpolation to use when vertically tracking the target. The closer the value to 1, the faster the camera will track. Default 1. + * @param offsetX The horizontal offset from the camera follow target.x position. Default 0. + * @param offsetY The vertical offset from the camera follow target.y position. Default 0. + */ + startFollow(target: Phaser.GameObjects.GameObject | object, roundPixels?: boolean, lerpX?: number, lerpY?: number, offsetX?: number, offsetY?: number): this; + + /** + * Stops a Camera from following a Game Object, if previously set via `Camera.startFollow`. + */ + stopFollow(): this; + + /** + * Resets any active FX, such as a fade, flash or shake. Useful to call after a fade in order to + * remove the fade. + */ + resetFX(): this; + + /** + * Internal method called automatically by the Camera Manager. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected update(time: number, delta: number): void; + + /** + * Destroys this Camera instance. You rarely need to call this directly. + * + * Called by the Camera Manager. If you wish to destroy a Camera please use `CameraManager.remove` as + * cameras are stored in a pool, ready for recycling later, and calling this directly will prevent that. + */ + destroy(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + } + + /** + * The Camera Manager is a plugin that belongs to a Scene and is responsible for managing all of the Scene Cameras. + * + * By default you can access the Camera Manager from within a Scene using `this.cameras`, although this can be changed + * in your game config. + * + * Create new Cameras using the `add` method. Or extend the Camera class with your own addition code and then add + * the new Camera in using the `addExisting` method. + * + * Cameras provide a view into your game world, and can be positioned, rotated, zoomed and scrolled accordingly. + * + * A Camera consists of two elements: The viewport and the scroll values. + * + * The viewport is the physical position and size of the Camera within your game. Cameras, by default, are + * created the same size as your game, but their position and size can be set to anything. This means if you + * wanted to create a camera that was 320x200 in size, positioned in the bottom-right corner of your game, + * you'd adjust the viewport to do that (using methods like `setViewport` and `setSize`). + * + * If you wish to change where the Camera is looking in your game, then you scroll it. You can do this + * via the properties `scrollX` and `scrollY` or the method `setScroll`. Scrolling has no impact on the + * viewport, and changing the viewport has no impact on the scrolling. + * + * By default a Camera will render all Game Objects it can see. You can change this using the `ignore` method, + * allowing you to filter Game Objects out on a per-Camera basis. The Camera Manager can manage up to 31 unique + * 'Game Object ignore capable' Cameras. Any Cameras beyond 31 that you create will all be given a Camera ID of + * zero, meaning that they cannot be used for Game Object exclusion. This means if you need your Camera to ignore + * Game Objects, make sure it's one of the first 31 created. + * + * A Camera also has built-in special effects including Fade, Flash, Camera Shake, Pan and Zoom. + */ + class CameraManager { + /** + * + * @param scene The Scene that owns the Camera Manager plugin. + */ + constructor(scene: Phaser.Scene); + + /** + * The Scene that owns the Camera Manager plugin. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene.Systems handler for the Scene that owns the Camera Manager. + */ + systems: Phaser.Scenes.Systems; + + /** + * All Cameras created by, or added to, this Camera Manager, will have their `roundPixels` + * property set to match this value. By default it is set to match the value set in the + * game configuration, but can be changed at any point. Equally, individual cameras can + * also be changed as needed. + */ + roundPixels: boolean; + + /** + * An Array of the Camera objects being managed by this Camera Manager. + * The Cameras are updated and rendered in the same order in which they appear in this array. + * Do not directly add or remove entries to this array. However, you can move the contents + * around the array should you wish to adjust the display order. + */ + cameras: Phaser.Cameras.Scene2D.Camera[]; + + /** + * A handy reference to the 'main' camera. By default this is the first Camera the + * Camera Manager creates. You can also set it directly, or use the `makeMain` argument + * in the `add` and `addExisting` methods. It allows you to access it from your game: + * + * ```javascript + * var cam = this.cameras.main; + * ``` + * + * Also see the properties `camera1`, `camera2` and so on. + */ + main: Phaser.Cameras.Scene2D.Camera; + + /** + * A default un-transformed Camera that doesn't exist on the camera list and doesn't + * count towards the total number of cameras being managed. It exists for other + * systems, as well as your own code, should they require a basic un-transformed + * camera instance from which to calculate a view matrix. + */ + default: Phaser.Cameras.Scene2D.Camera; + + /** + * Adds a new Camera into the Camera Manager. The Camera Manager can support up to 31 different Cameras. + * + * Each Camera has its own viewport, which controls the size of the Camera and its position within the canvas. + * + * Use the `Camera.scrollX` and `Camera.scrollY` properties to change where the Camera is looking, or the + * Camera methods such as `centerOn`. Cameras also have built in special effects, such as fade, flash, shake, + * pan and zoom. + * + * By default Cameras are transparent and will render anything that they can see based on their `scrollX` + * and `scrollY` values. Game Objects can be set to be ignored by a Camera by using the `Camera.ignore` method. + * + * The Camera will have its `roundPixels` property set to whatever `CameraManager.roundPixels` is. You can change + * it after creation if required. + * + * See the Camera class documentation for more details. + * @param x The horizontal position of the Camera viewport. Default 0. + * @param y The vertical position of the Camera viewport. Default 0. + * @param width The width of the Camera viewport. If not given it'll be the game config size. + * @param height The height of the Camera viewport. If not given it'll be the game config size. + * @param makeMain Set this Camera as being the 'main' camera. This just makes the property `main` a reference to it. Default false. + * @param name The name of the Camera. Default ''. + */ + add(x?: number, y?: number, width?: number, height?: number, makeMain?: boolean, name?: string): Phaser.Cameras.Scene2D.Camera; + + /** + * Adds an existing Camera into the Camera Manager. + * + * The Camera should either be a `Phaser.Cameras.Scene2D.Camera` instance, or a class that extends from it. + * + * The Camera will have its `roundPixels` property set to whatever `CameraManager.roundPixels` is. You can change + * it after addition if required. + * + * The Camera will be assigned an ID, which is used for Game Object exclusion and then added to the + * manager. As long as it doesn't already exist in the manager it will be added then returned. + * + * If this method returns `null` then the Camera already exists in this Camera Manager. + * @param camera The Camera to be added to the Camera Manager. + * @param makeMain Set this Camera as being the 'main' camera. This just makes the property `main` a reference to it. Default false. + */ + addExisting(camera: Phaser.Cameras.Scene2D.Camera, makeMain?: boolean): Phaser.Cameras.Scene2D.Camera | null; + + /** + * Gets the total number of Cameras in this Camera Manager. + * + * If the optional `isVisible` argument is set it will only count Cameras that are currently visible. + * @param isVisible Set the `true` to only include visible Cameras in the total. Default false. + */ + getTotal(isVisible?: boolean): number; + + /** + * Populates this Camera Manager based on the given configuration object, or an array of config objects. + * + * See the `Phaser.Types.Cameras.Scene2D.CameraConfig` documentation for details of the object structure. + * @param config A Camera configuration object, or an array of them, to be added to this Camera Manager. + */ + fromJSON(config: Phaser.Types.Cameras.Scene2D.CameraConfig | Phaser.Types.Cameras.Scene2D.CameraConfig[]): this; + + /** + * Gets a Camera based on its name. + * + * Camera names are optional and don't have to be set, so this method is only of any use if you + * have given your Cameras unique names. + * @param name The name of the Camera. + */ + getCamera(name: string): Phaser.Cameras.Scene2D.Camera | null; + + /** + * Returns an array of all cameras below the given Pointer. + * + * The first camera in the array is the top-most camera in the camera list. + * @param pointer The Pointer to check against. + */ + getCamerasBelowPointer(pointer: Phaser.Input.Pointer): Phaser.Cameras.Scene2D.Camera[]; + + /** + * Removes the given Camera, or an array of Cameras, from this Camera Manager. + * + * If found in the Camera Manager it will be immediately removed from the local cameras array. + * If also currently the 'main' camera, 'main' will be reset to be camera 0. + * + * The removed Cameras are automatically destroyed if the `runDestroy` argument is `true`, which is the default. + * If you wish to re-use the cameras then set this to `false`, but know that they will retain their references + * and internal data until destroyed or re-added to a Camera Manager. + * @param camera The Camera, or an array of Cameras, to be removed from this Camera Manager. + * @param runDestroy Automatically call `Camera.destroy` on each Camera removed from this Camera Manager. Default true. + */ + remove(camera: Phaser.Cameras.Scene2D.Camera | Phaser.Cameras.Scene2D.Camera[], runDestroy?: boolean): number; + + /** + * The internal render method. This is called automatically by the Scene and should not be invoked directly. + * + * It will iterate through all local cameras and render them in turn, as long as they're visible and have + * an alpha level > 0. + * @param renderer The Renderer that will render the children to this camera. + * @param displayList The Display List for the Scene. + */ + protected render(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer, displayList: Phaser.GameObjects.DisplayList): void; + + /** + * Takes an array of Game Objects and a Camera and returns a new array + * containing only those Game Objects that pass the `willRender` test + * against the given Camera. + * @param children An array of Game Objects to be checked against the camera. + * @param camera The camera to filter the Game Objects against. + */ + getVisibleChildren(children: Phaser.GameObjects.GameObject[], camera: Phaser.Cameras.Scene2D.Camera): Phaser.GameObjects.GameObject[]; + + /** + * Resets this Camera Manager. + * + * This will iterate through all current Cameras, destroying them all, then it will reset the + * cameras array, reset the ID counter and create 1 new single camera using the default values. + */ + resetAll(): Phaser.Cameras.Scene2D.Camera; + + /** + * The main update loop. Called automatically when the Scene steps. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected update(time: number, delta: number): void; + + /** + * The event handler that manages the `resize` event dispatched by the Scale Manager. + * @param gameSize The default Game Size object. This is the un-modified game dimensions. + * @param baseSize The base Size object. The game dimensions. The canvas width / height values match this. + */ + onResize(gameSize: Phaser.Structs.Size, baseSize: Phaser.Structs.Size): void; + + /** + * Resizes all cameras to the given dimensions. + * @param width The new width of the camera. + * @param height The new height of the camera. + */ + resize(width: number, height: number): void; + + } + + namespace Effects { + /** + * A Camera Fade effect. + * + * This effect will fade the camera viewport to the given color, over the duration specified. + * + * Only the camera viewport is faded. None of the objects it is displaying are impacted, i.e. their colors do + * not change. + * + * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback, + * which is invoked each frame for the duration of the effect, if required. + */ + class Fade { + /** + * + * @param camera The camera this effect is acting upon. + */ + constructor(camera: Phaser.Cameras.Scene2D.Camera); + + /** + * The Camera this effect belongs to. + */ + readonly camera: Phaser.Cameras.Scene2D.Camera; + + /** + * Is this effect actively running? + */ + readonly isRunning: boolean; + + /** + * Has this effect finished running? + * + * This is different from `isRunning` because it remains set to `true` when the effect is over, + * until the effect is either reset or started again. + */ + readonly isComplete: boolean; + + /** + * The direction of the fade. + * `true` = fade out (transparent to color), `false` = fade in (color to transparent) + */ + readonly direction: boolean; + + /** + * The duration of the effect, in milliseconds. + */ + readonly duration: number; + + /** + * If this effect is running this holds the current percentage of the progress, a value between 0 and 1. + */ + progress: number; + + /** + * Fades the Camera to or from the given color over the duration specified. + * @param direction The direction of the fade. `true` = fade out (transparent to color), `false` = fade in (color to transparent) Default true. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param red The amount to fade the red channel towards. A value between 0 and 255. Default 0. + * @param green The amount to fade the green channel towards. A value between 0 and 255. Default 0. + * @param blue The amount to fade the blue channel towards. A value between 0 and 255. Default 0. + * @param force Force the effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + start(direction?: boolean, duration?: number, red?: number, green?: number, blue?: number, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraFadeCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * The main update loop for this effect. Called automatically by the Camera. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Called internally by the Canvas Renderer. + * @param ctx The Canvas context to render to. + */ + postRenderCanvas(ctx: CanvasRenderingContext2D): boolean; + + /** + * Called internally by the WebGL Renderer. + * @param pipeline The WebGL Pipeline to render to. Must provide the `drawFillRect` method. + * @param getTintFunction A function that will return the gl safe tint colors. + */ + postRenderWebGL(pipeline: Phaser.Renderer.WebGL.Pipelines.MultiPipeline, getTintFunction: Function): boolean; + + /** + * Called internally when the effect completes. + */ + effectComplete(): void; + + /** + * Resets this camera effect. + * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event. + */ + reset(): void; + + /** + * Destroys this effect, releasing it from the Camera. + */ + destroy(): void; + + } + + /** + * A Camera Flash effect. + * + * This effect will flash the camera viewport to the given color, over the duration specified. + * + * Only the camera viewport is flashed. None of the objects it is displaying are impacted, i.e. their colors do + * not change. + * + * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback, + * which is invoked each frame for the duration of the effect, if required. + */ + class Flash { + /** + * + * @param camera The camera this effect is acting upon. + */ + constructor(camera: Phaser.Cameras.Scene2D.Camera); + + /** + * The Camera this effect belongs to. + */ + readonly camera: Phaser.Cameras.Scene2D.Camera; + + /** + * Is this effect actively running? + */ + readonly isRunning: boolean; + + /** + * The duration of the effect, in milliseconds. + */ + readonly duration: number; + + /** + * The value of the alpha channel used during the flash effect. + * A value between 0 and 1. + */ + alpha: number; + + /** + * If this effect is running this holds the current percentage of the progress, a value between 0 and 1. + */ + progress: number; + + /** + * Flashes the Camera to or from the given color over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 250. + * @param red The amount to flash the red channel towards. A value between 0 and 255. Default 255. + * @param green The amount to flash the green channel towards. A value between 0 and 255. Default 255. + * @param blue The amount to flash the blue channel towards. A value between 0 and 255. Default 255. + * @param force Force the effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + start(duration?: number, red?: number, green?: number, blue?: number, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraFlashCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * The main update loop for this effect. Called automatically by the Camera. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Called internally by the Canvas Renderer. + * @param ctx The Canvas context to render to. + */ + postRenderCanvas(ctx: CanvasRenderingContext2D): boolean; + + /** + * Called internally by the WebGL Renderer. + * @param pipeline The WebGL Pipeline to render to. Must provide the `drawFillRect` method. + * @param getTintFunction A function that will return the gl safe tint colors. + */ + postRenderWebGL(pipeline: Phaser.Renderer.WebGL.Pipelines.MultiPipeline, getTintFunction: Function): boolean; + + /** + * Called internally when the effect completes. + */ + effectComplete(): void; + + /** + * Resets this camera effect. + * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event. + */ + reset(): void; + + /** + * Destroys this effect, releasing it from the Camera. + */ + destroy(): void; + + } + + /** + * A Camera Pan effect. + * + * This effect will scroll the Camera so that the center of its viewport finishes at the given destination, + * over the duration and with the ease specified. + * + * Only the camera scroll is moved. None of the objects it is displaying are impacted, i.e. their positions do + * not change. + * + * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback, + * which is invoked each frame for the duration of the effect if required. + */ + class Pan { + /** + * + * @param camera The camera this effect is acting upon. + */ + constructor(camera: Phaser.Cameras.Scene2D.Camera); + + /** + * The Camera this effect belongs to. + */ + readonly camera: Phaser.Cameras.Scene2D.Camera; + + /** + * Is this effect actively running? + */ + readonly isRunning: boolean; + + /** + * The duration of the effect, in milliseconds. + */ + readonly duration: number; + + /** + * The starting scroll coordinates to pan the camera from. + */ + source: Phaser.Math.Vector2; + + /** + * The constantly updated value based on zoom. + */ + current: Phaser.Math.Vector2; + + /** + * The destination scroll coordinates to pan the camera to. + */ + destination: Phaser.Math.Vector2; + + /** + * The ease function to use during the pan. + */ + ease: Function; + + /** + * If this effect is running this holds the current percentage of the progress, a value between 0 and 1. + */ + progress: number; + + /** + * This effect will scroll the Camera so that the center of its viewport finishes at the given destination, + * over the duration and with the ease specified. + * @param x The destination x coordinate to scroll the center of the Camera viewport to. + * @param y The destination y coordinate to scroll the center of the Camera viewport to. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param ease The ease to use for the pan. Can be any of the Phaser Easing constants or a custom function. Default 'Linear'. + * @param force Force the pan effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is, + * the current camera scroll x coordinate and the current camera scroll y coordinate. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + start(x: number, y: number, duration?: number, ease?: string | Function, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraPanCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * The main update loop for this effect. Called automatically by the Camera. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Called internally when the effect completes. + */ + effectComplete(): void; + + /** + * Resets this camera effect. + * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event. + */ + reset(): void; + + /** + * Destroys this effect, releasing it from the Camera. + */ + destroy(): void; + + } + + /** + * A Camera Rotate effect. + * + * This effect will rotate the Camera so that the its viewport finishes at the given angle in radians, + * over the duration and with the ease specified. + * + * Camera rotation always takes place based on the Camera viewport. By default, rotation happens + * in the center of the viewport. You can adjust this with the `originX` and `originY` properties. + * + * Rotation influences the rendering of _all_ Game Objects visible by this Camera. However, it does not + * rotate the Camera viewport itself, which always remains an axis-aligned rectangle. + * + * Only the camera is rotates. None of the objects it is displaying are impacted, i.e. their positions do + * not change. + * + * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback, + * which is invoked each frame for the duration of the effect if required. + */ + class RotateTo { + /** + * + * @param camera The camera this effect is acting upon. + */ + constructor(camera: Phaser.Cameras.Scene2D.Camera); + + /** + * The Camera this effect belongs to. + */ + readonly camera: Phaser.Cameras.Scene2D.Camera; + + /** + * Is this effect actively running? + */ + readonly isRunning: boolean; + + /** + * The duration of the effect, in milliseconds. + */ + readonly duration: number; + + /** + * The starting angle to rotate the camera from. + */ + source: number; + + /** + * The constantly updated value based on the force. + */ + current: number; + + /** + * The destination angle in radians to rotate the camera to. + */ + destination: number; + + /** + * The ease function to use during the Rotate. + */ + ease: Function; + + /** + * If this effect is running this holds the current percentage of the progress, a value between 0 and 1. + */ + progress: number; + + /** + * The direction of the rotation. + */ + clockwise: boolean; + + /** + * The shortest direction to the target rotation. + */ + shortestPath: boolean; + + /** + * This effect will scroll the Camera so that the center of its viewport finishes at the given angle, + * over the duration and with the ease specified. + * @param radians The destination angle in radians to rotate the Camera viewport to. If the angle is positive then the rotation is clockwise else anticlockwise + * @param shortestPath If shortest path is set to true the camera will rotate in the quickest direction clockwise or anti-clockwise. Default false. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param ease The ease to use for the Rotate. Can be any of the Phaser Easing constants or a custom function. Default 'Linear'. + * @param force Force the rotation effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is, + * the current camera scroll x coordinate and the current camera scroll y coordinate. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + start(radians: number, shortestPath?: boolean, duration?: number, ease?: string | Function, force?: boolean, callback?: CameraRotateCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * The main update loop for this effect. Called automatically by the Camera. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Called internally when the effect completes. + */ + effectComplete(): void; + + /** + * Resets this camera effect. + * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event. + */ + reset(): void; + + /** + * Destroys this effect, releasing it from the Camera. + */ + destroy(): void; + + } + + /** + * A Camera Shake effect. + * + * This effect will shake the camera viewport by a random amount, bounded by the specified intensity, each frame. + * + * Only the camera viewport is moved. None of the objects it is displaying are impacted, i.e. their positions do + * not change. + * + * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback, + * which is invoked each frame for the duration of the effect if required. + */ + class Shake { + /** + * + * @param camera The camera this effect is acting upon. + */ + constructor(camera: Phaser.Cameras.Scene2D.Camera); + + /** + * The Camera this effect belongs to. + */ + readonly camera: Phaser.Cameras.Scene2D.Camera; + + /** + * Is this effect actively running? + */ + readonly isRunning: boolean; + + /** + * The duration of the effect, in milliseconds. + */ + readonly duration: number; + + /** + * The intensity of the effect. Use small float values. The default when the effect starts is 0.05. + * This is a Vector2 object, allowing you to control the shake intensity independently across x and y. + * You can modify this value while the effect is active to create more varied shake effects. + */ + intensity: Phaser.Math.Vector2; + + /** + * If this effect is running this holds the current percentage of the progress, a value between 0 and 1. + */ + progress: number; + + /** + * Shakes the Camera by the given intensity over the duration specified. + * @param duration The duration of the effect in milliseconds. Default 100. + * @param intensity The intensity of the shake. Default 0.05. + * @param force Force the shake effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + start(duration?: number, intensity?: number | Phaser.Math.Vector2, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraShakeCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * The pre-render step for this effect. Called automatically by the Camera. + */ + preRender(): void; + + /** + * The main update loop for this effect. Called automatically by the Camera. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Called internally when the effect completes. + */ + effectComplete(): void; + + /** + * Resets this camera effect. + * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event. + */ + reset(): void; + + /** + * Destroys this effect, releasing it from the Camera. + */ + destroy(): void; + + } + + /** + * A Camera Zoom effect. + * + * This effect will zoom the Camera to the given scale, over the duration and with the ease specified. + * + * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback, + * which is invoked each frame for the duration of the effect if required. + */ + class Zoom { + /** + * + * @param camera The camera this effect is acting upon. + */ + constructor(camera: Phaser.Cameras.Scene2D.Camera); + + /** + * The Camera this effect belongs to. + */ + readonly camera: Phaser.Cameras.Scene2D.Camera; + + /** + * Is this effect actively running? + */ + readonly isRunning: boolean; + + /** + * The duration of the effect, in milliseconds. + */ + readonly duration: number; + + /** + * The starting zoom value; + */ + source: number; + + /** + * The destination zoom value. + */ + destination: number; + + /** + * The ease function to use during the zoom. + */ + ease: Function; + + /** + * If this effect is running this holds the current percentage of the progress, a value between 0 and 1. + */ + progress: number; + + /** + * This effect will zoom the Camera to the given scale, over the duration and with the ease specified. + * @param zoom The target Camera zoom value. + * @param duration The duration of the effect in milliseconds. Default 1000. + * @param ease The ease to use for the Zoom. Can be any of the Phaser Easing constants or a custom function. Default 'Linear'. + * @param force Force the zoom effect to start immediately, even if already running. Default false. + * @param callback This callback will be invoked every frame for the duration of the effect. + * It is sent three arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is, + * and the current camera zoom value. + * @param context The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs. + */ + start(zoom: number, duration?: number, ease?: string | Function, force?: boolean, callback?: Phaser.Types.Cameras.Scene2D.CameraZoomCallback, context?: any): Phaser.Cameras.Scene2D.Camera; + + /** + * The main update loop for this effect. Called automatically by the Camera. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Called internally when the effect completes. + */ + effectComplete(): void; + + /** + * Resets this camera effect. + * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event. + */ + reset(): void; + + /** + * Destroys this effect, releasing it from the Camera. + */ + destroy(): void; + + } + + } + + namespace Events { + /** + * The Destroy Camera Event. + * + * This event is dispatched by a Camera instance when it is destroyed by the Camera Manager. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('cameradestroy', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.DESTROY, () => {}); + * ``` + */ + const DESTROY: string; + + /** + * The Camera Fade In Complete Event. + * + * This event is dispatched by a Camera instance when the Fade In Effect completes. + * + * Listen to it from a Camera instance using `Camera.on('camerafadeincomplete', listener)`. + */ + const FADE_IN_COMPLETE: string; + + /** + * The Camera Fade In Start Event. + * + * This event is dispatched by a Camera instance when the Fade In Effect starts. + * + * Listen to it from a Camera instance using `Camera.on('camerafadeinstart', listener)`. + */ + const FADE_IN_START: string; + + /** + * The Camera Fade Out Complete Event. + * + * This event is dispatched by a Camera instance when the Fade Out Effect completes. + * + * Listen to it from a Camera instance using `Camera.on('camerafadeoutcomplete', listener)`. + */ + const FADE_OUT_COMPLETE: string; + + /** + * The Camera Fade Out Start Event. + * + * This event is dispatched by a Camera instance when the Fade Out Effect starts. + * + * Listen to it from a Camera instance using `Camera.on('camerafadeoutstart', listener)`. + */ + const FADE_OUT_START: string; + + /** + * The Camera Flash Complete Event. + * + * This event is dispatched by a Camera instance when the Flash Effect completes. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('cameraflashcomplete', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.FLASH_COMPLETE, () => {}); + * ``` + */ + const FLASH_COMPLETE: string; + + /** + * The Camera Flash Start Event. + * + * This event is dispatched by a Camera instance when the Flash Effect starts. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('cameraflashstart', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.FLASH_START, () => {}); + * ``` + */ + const FLASH_START: string; + + /** + * The Camera Follower Update Event. + * + * This event is dispatched by a Camera instance when it is following a + * Game Object and the Camera position has been updated as a result of + * that following. + * + * Listen to it from a Camera instance using: `camera.on('followupdate', listener)`. + */ + const FOLLOW_UPDATE: string; + + /** + * The Camera Pan Complete Event. + * + * This event is dispatched by a Camera instance when the Pan Effect completes. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerapancomplete', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.PAN_COMPLETE, () => {}); + * ``` + */ + const PAN_COMPLETE: string; + + /** + * The Camera Pan Start Event. + * + * This event is dispatched by a Camera instance when the Pan Effect starts. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerapanstart', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.PAN_START, () => {}); + * ``` + */ + const PAN_START: string; + + /** + * The Camera Post-Render Event. + * + * This event is dispatched by a Camera instance after is has finished rendering. + * It is only dispatched if the Camera is rendering to a texture. + * + * Listen to it from a Camera instance using: `camera.on('postrender', listener)`. + */ + const POST_RENDER: string; + + /** + * The Camera Pre-Render Event. + * + * This event is dispatched by a Camera instance when it is about to render. + * It is only dispatched if the Camera is rendering to a texture. + * + * Listen to it from a Camera instance using: `camera.on('prerender', listener)`. + */ + const PRE_RENDER: string; + + /** + * The Camera Rotate Complete Event. + * + * This event is dispatched by a Camera instance when the Rotate Effect completes. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerarotatecomplete', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.ROTATE_COMPLETE, () => {}); + * ``` + */ + const ROTATE_COMPLETE: string; + + /** + * The Camera Rotate Start Event. + * + * This event is dispatched by a Camera instance when the Rotate Effect starts. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerarotatestart', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.ROTATE_START, () => {}); + * ``` + */ + const ROTATE_START: string; + + /** + * The Camera Shake Complete Event. + * + * This event is dispatched by a Camera instance when the Shake Effect completes. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerashakecomplete', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.SHAKE_COMPLETE, () => {}); + * ``` + */ + const SHAKE_COMPLETE: string; + + /** + * The Camera Shake Start Event. + * + * This event is dispatched by a Camera instance when the Shake Effect starts. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerashakestart', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.SHAKE_START, () => {}); + * ``` + */ + const SHAKE_START: string; + + /** + * The Camera Zoom Complete Event. + * + * This event is dispatched by a Camera instance when the Zoom Effect completes. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerazoomcomplete', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.ZOOM_COMPLETE, () => {}); + * ``` + */ + const ZOOM_COMPLETE: string; + + /** + * The Camera Zoom Start Event. + * + * This event is dispatched by a Camera instance when the Zoom Effect starts. + * + * Listen for it via either of the following: + * + * ```js + * this.cameras.main.on('camerazoomstart', () => {}); + * ``` + * + * or use the constant, to avoid having to remember the correct event string: + * + * ```js + * this.cameras.main.on(Phaser.Cameras.Scene2D.Events.ZOOM_START, () => {}); + * ``` + */ + const ZOOM_START: string; + + } + + } + + namespace Controls { + /** + * A Fixed Key Camera Control. + * + * This allows you to control the movement and zoom of a camera using the defined keys. + * + * ```javascript + * var camControl = new FixedKeyControl({ + * camera: this.cameras.main, + * left: cursors.left, + * right: cursors.right, + * speed: float OR { x: 0, y: 0 } + * }); + * ``` + * + * Movement is precise and has no 'smoothing' applied to it. + * + * You must call the `update` method of this controller every frame. + */ + class FixedKeyControl { + /** + * + * @param config The Fixed Key Control configuration object. + */ + constructor(config: Phaser.Types.Cameras.Controls.FixedKeyControlConfig); + + /** + * The Camera that this Control will update. + */ + camera: Phaser.Cameras.Scene2D.Camera | null; + + /** + * The Key to be pressed that will move the Camera left. + */ + left: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will move the Camera right. + */ + right: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will move the Camera up. + */ + up: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will move the Camera down. + */ + down: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will zoom the Camera in. + */ + zoomIn: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will zoom the Camera out. + */ + zoomOut: Phaser.Input.Keyboard.Key | null; + + /** + * The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed. + */ + zoomSpeed: number; + + /** + * The smallest zoom value the camera will reach when zoomed out. + */ + minZoom: number; + + /** + * The largest zoom value the camera will reach when zoomed in. + */ + maxZoom: number; + + /** + * The horizontal speed the camera will move. + */ + speedX: number; + + /** + * The vertical speed the camera will move. + */ + speedY: number; + + /** + * A flag controlling if the Controls will update the Camera or not. + */ + active: boolean; + + /** + * Starts the Key Control running, providing it has been linked to a camera. + */ + start(): this; + + /** + * Stops this Key Control from running. Call `start` to start it again. + */ + stop(): this; + + /** + * Binds this Key Control to a camera. + * @param camera The camera to bind this Key Control to. + */ + setCamera(camera: Phaser.Cameras.Scene2D.Camera): this; + + /** + * Applies the results of pressing the control keys to the Camera. + * + * You must call this every step, it is not called automatically. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(delta: number): void; + + /** + * Destroys this Key Control. + */ + destroy(): void; + + } + + /** + * A Smoothed Key Camera Control. + * + * This allows you to control the movement and zoom of a camera using the defined keys. + * Unlike the Fixed Camera Control you can also provide physics values for acceleration, drag and maxSpeed for smoothing effects. + * + * ```javascript + * var controlConfig = { + * camera: this.cameras.main, + * left: cursors.left, + * right: cursors.right, + * up: cursors.up, + * down: cursors.down, + * zoomIn: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.Q), + * zoomOut: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.E), + * zoomSpeed: 0.02, + * acceleration: 0.06, + * drag: 0.0005, + * maxSpeed: 1.0 + * }; + * ``` + * + * You must call the `update` method of this controller every frame. + */ + class SmoothedKeyControl { + /** + * + * @param config The Smoothed Key Control configuration object. + */ + constructor(config: Phaser.Types.Cameras.Controls.SmoothedKeyControlConfig); + + /** + * The Camera that this Control will update. + */ + camera: Phaser.Cameras.Scene2D.Camera | null; + + /** + * The Key to be pressed that will move the Camera left. + */ + left: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will move the Camera right. + */ + right: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will move the Camera up. + */ + up: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will move the Camera down. + */ + down: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will zoom the Camera in. + */ + zoomIn: Phaser.Input.Keyboard.Key | null; + + /** + * The Key to be pressed that will zoom the Camera out. + */ + zoomOut: Phaser.Input.Keyboard.Key | null; + + /** + * The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed. + */ + zoomSpeed: number; + + /** + * The smallest zoom value the camera will reach when zoomed out. + */ + minZoom: number; + + /** + * The largest zoom value the camera will reach when zoomed in. + */ + maxZoom: number; + + /** + * The horizontal acceleration the camera will move. + */ + accelX: number; + + /** + * The vertical acceleration the camera will move. + */ + accelY: number; + + /** + * The horizontal drag applied to the camera when it is moving. + */ + dragX: number; + + /** + * The vertical drag applied to the camera when it is moving. + */ + dragY: number; + + /** + * The maximum horizontal speed the camera will move. + */ + maxSpeedX: number; + + /** + * The maximum vertical speed the camera will move. + */ + maxSpeedY: number; + + /** + * A flag controlling if the Controls will update the Camera or not. + */ + active: boolean; + + /** + * Starts the Key Control running, providing it has been linked to a camera. + */ + start(): this; + + /** + * Stops this Key Control from running. Call `start` to start it again. + */ + stop(): this; + + /** + * Binds this Key Control to a camera. + * @param camera The camera to bind this Key Control to. + */ + setCamera(camera: Phaser.Cameras.Scene2D.Camera): this; + + /** + * Applies the results of pressing the control keys to the Camera. + * + * You must call this every step, it is not called automatically. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(delta: number): void; + + /** + * Destroys this Key Control. + */ + destroy(): void; + + } + + } + + } + + /** + * Phaser Release Version + */ + const VERSION: string; + + /** + * This setting will auto-detect if the browser is capable of suppporting WebGL. + * If it is, it will use the WebGL Renderer. If not, it will fall back to the Canvas Renderer. + */ + const AUTO: number; + + /** + * Forces Phaser to only use the Canvas Renderer, regardless if the browser supports + * WebGL or not. + */ + const CANVAS: number; + + /** + * Forces Phaser to use the WebGL Renderer. If the browser does not support it, there is + * no fallback to Canvas with this setting, so you should trap it and display a suitable + * message to the user. + */ + const WEBGL: number; + + /** + * A Headless Renderer doesn't create either a Canvas or WebGL Renderer. However, it still + * absolutely relies on the DOM being present and available. This mode is meant for unit testing, + * not for running Phaser on the server, which is something you really shouldn't do. + */ + const HEADLESS: number; + + /** + * In Phaser the value -1 means 'forever' in lots of cases, this const allows you to use it instead + * to help you remember what the value is doing in your code. + */ + const FOREVER: number; + + /** + * Direction constant. + */ + const NONE: number; + + /** + * Direction constant. + */ + const UP: number; + + /** + * Direction constant. + */ + const DOWN: number; + + /** + * Direction constant. + */ + const LEFT: number; + + /** + * Direction constant. + */ + const RIGHT: number; + + /** + * The Phaser.Game instance is the main controller for the entire Phaser game. It is responsible + * for handling the boot process, parsing the configuration values, creating the renderer, + * and setting-up all of the global Phaser systems, such as sound and input. + * Once that is complete it will start the Scene Manager and then begin the main game loop. + * + * You should generally avoid accessing any of the systems created by Game, and instead use those + * made available to you via the Phaser.Scene Systems class instead. + */ + class Game { + /** + * + * @param GameConfig The configuration object for your Phaser Game instance. + */ + constructor(GameConfig?: Phaser.Types.Core.GameConfig); + + /** + * The parsed Game Configuration object. + * + * The values stored within this object are read-only and should not be changed at run-time. + */ + readonly config: Phaser.Core.Config; + + /** + * A reference to either the Canvas or WebGL Renderer that this Game is using. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * A reference to an HTML Div Element used as the DOM Element Container. + * + * Only set if `createDOMContainer` is `true` in the game config (by default it is `false`) and + * if you provide a parent element to insert the Phaser Game inside. + * + * See the DOM Element Game Object for more details. + */ + domContainer: HTMLDivElement; + + /** + * A reference to the HTML Canvas Element that Phaser uses to render the game. + * This is created automatically by Phaser unless you provide a `canvas` property + * in your Game Config. + */ + canvas: HTMLCanvasElement; + + /** + * A reference to the Rendering Context belonging to the Canvas Element this game is rendering to. + * If the game is running under Canvas it will be a 2d Canvas Rendering Context. + * If the game is running under WebGL it will be a WebGL Rendering Context. + * This context is created automatically by Phaser unless you provide a `context` property + * in your Game Config. + */ + context: CanvasRenderingContext2D | WebGLRenderingContext; + + /** + * A flag indicating when this Game instance has finished its boot process. + */ + readonly isBooted: boolean; + + /** + * A flag indicating if this Game is currently running its game step or not. + */ + readonly isRunning: boolean; + + /** + * An Event Emitter which is used to broadcast game-level events from the global systems. + */ + events: Phaser.Events.EventEmitter; + + /** + * An instance of the Animation Manager. + * + * The Animation Manager is a global system responsible for managing all animations used within your game. + */ + anims: Phaser.Animations.AnimationManager; + + /** + * An instance of the Texture Manager. + * + * The Texture Manager is a global system responsible for managing all textures being used by your game. + */ + textures: Phaser.Textures.TextureManager; + + /** + * An instance of the Cache Manager. + * + * The Cache Manager is a global system responsible for caching, accessing and releasing external game assets. + */ + cache: Phaser.Cache.CacheManager; + + /** + * An instance of the Data Manager. This is a global manager, available from any Scene + * and allows you to share and exchange your own game-level data or events without having + * to use an internal event system. + */ + registry: Phaser.Data.DataManager; + + /** + * An instance of the Input Manager. + * + * The Input Manager is a global system responsible for the capture of browser-level input events. + */ + input: Phaser.Input.InputManager; + + /** + * An instance of the Scene Manager. + * + * The Scene Manager is a global system responsible for creating, modifying and updating the Scenes in your game. + */ + scene: Phaser.Scenes.SceneManager; + + /** + * A reference to the Device inspector. + * + * Contains information about the device running this game, such as OS, browser vendor and feature support. + * Used by various systems to determine capabilities and code paths. + */ + device: Phaser.DeviceConf; + + /** + * An instance of the Scale Manager. + * + * The Scale Manager is a global system responsible for handling scaling of the game canvas. + */ + scale: Phaser.Scale.ScaleManager; + + /** + * An instance of the base Sound Manager. + * + * The Sound Manager is a global system responsible for the playback and updating of all audio in your game. + * + * You can disable the inclusion of the Sound Manager in your build by toggling the webpack `FEATURE_SOUND` flag. + */ + sound: Phaser.Sound.NoAudioSoundManager | Phaser.Sound.HTML5AudioSoundManager | Phaser.Sound.WebAudioSoundManager; + + /** + * An instance of the Time Step. + * + * The Time Step is a global system responsible for setting-up and responding to the browser frame events, processing + * them and calculating delta values. It then automatically calls the game step. + */ + loop: Phaser.Core.TimeStep; + + /** + * An instance of the Plugin Manager. + * + * The Plugin Manager is a global system that allows plugins to register themselves with it, and can then install + * those plugins into Scenes as required. + */ + plugins: Phaser.Plugins.PluginManager; + + /** + * An instance of the Facebook Instant Games Plugin. + * + * This will only be available if the plugin has been built into Phaser, + * or you're using the special Facebook Instant Games custom build. + */ + facebook: Phaser.FacebookInstantGamesPlugin; + + /** + * Does the window the game is running in currently have focus or not? + * This is modified by the VisibilityHandler. + */ + readonly hasFocus: boolean; + + /** + * Is the Game currently paused? This will stop everything from updating, + * except the `TimeStep` and related RequestAnimationFrame or setTimeout. + * Those will continue stepping, but the core Game step will be skipped. + */ + isPaused: boolean; + + /** + * This method is called automatically when the DOM is ready. It is responsible for creating the renderer, + * displaying the Debug Header, adding the game canvas to the DOM and emitting the 'boot' event. + * It listens for a 'ready' event from the base systems and once received it will call `Game.start`. + */ + protected boot(): void; + + /** + * Called automatically by Game.boot once all of the global systems have finished setting themselves up. + * By this point the Game is now ready to start the main loop running. + * It will also enable the Visibility Handler. + */ + protected start(): void; + + /** + * The main Game Step. Called automatically by the Time Step, once per browser frame (typically as a result of + * Request Animation Frame, or Set Timeout on very old browsers.) + * + * The step will update the global managers first, then proceed to update each Scene in turn, via the Scene Manager. + * + * It will then render each Scene in turn, via the Renderer. This process emits `prerender` and `postrender` events. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + step(time: number, delta: number): void; + + /** + * A special version of the Game Step for the HEADLESS renderer only. + * + * The main Game Step. Called automatically by the Time Step, once per browser frame (typically as a result of + * Request Animation Frame, or Set Timeout on very old browsers.) + * + * The step will update the global managers first, then proceed to update each Scene in turn, via the Scene Manager. + * + * This process emits `prerender` and `postrender` events, even though nothing actually displays. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + headlessStep(time: number, delta: number): void; + + /** + * Called automatically by the Visibility Handler. + * This will pause the main loop and then emit a pause event. + */ + protected onHidden(): void; + + /** + * This will pause the entire game and emit a `PAUSE` event. + * + * All of Phaser's internal systems will be paused and the game will not re-render. + * + * Note that it does not pause any Loader requests that are currently in-flight. + */ + pause(): void; + + /** + * Called automatically by the Visibility Handler. + * This will resume the main loop and then emit a resume event. + */ + protected onVisible(): void; + + /** + * This will resume the entire game and emit a `RESUME` event. + * + * All of Phaser's internal systems will be resumed and the game will start rendering again. + */ + resume(): void; + + /** + * Called automatically by the Visibility Handler. + * This will set the main loop into a 'blurred' state, which pauses it. + */ + protected onBlur(): void; + + /** + * Called automatically by the Visibility Handler. + * This will set the main loop into a 'focused' state, which resumes it. + */ + protected onFocus(): void; + + /** + * Returns the current game frame. + * + * When the game starts running, the frame is incremented every time Request Animation Frame, or Set Timeout, fires. + */ + getFrame(): number; + + /** + * Returns the time that the current game step started at, as based on `performance.now`. + */ + getTime(): number; + + /** + * Flags this Game instance as needing to be destroyed on the _next frame_, making this an asynchronous operation. + * + * It will wait until the current frame has completed and then call `runDestroy` internally. + * + * If you need to react to the games eventual destruction, listen for the `DESTROY` event. + * + * If you **do not** need to run Phaser again on the same web page you can set the `noReturn` argument to `true` and it will free-up + * memory being held by the core Phaser plugins. If you do need to create another game instance on the same page, leave this as `false`. + * @param removeCanvas Set to `true` if you would like the parent canvas element removed from the DOM, or `false` to leave it in place. + * @param noReturn If `true` all the core Phaser plugins are destroyed. You cannot create another instance of Phaser on the same web page if you do this. Default false. + */ + destroy(removeCanvas: boolean, noReturn?: boolean): void; + + } + + namespace Core { + /** + * The active game configuration settings, parsed from a {@link Phaser.Types.Core.GameConfig} object. + */ + class Config { + /** + * + * @param GameConfig The configuration object for your Phaser Game instance. + */ + constructor(GameConfig?: Phaser.Types.Core.GameConfig); + + /** + * The width of the underlying canvas, in pixels. + */ + readonly width: number | string; + + /** + * The height of the underlying canvas, in pixels. + */ + readonly height: number | string; + + /** + * The zoom factor, as used by the Scale Manager. + */ + readonly zoom: Phaser.Scale.ZoomType | number; + + /** + * A parent DOM element into which the canvas created by the renderer will be injected. + */ + readonly parent: any | null; + + /** + * The scale mode as used by the Scale Manager. The default is zero, which is no scaling. + */ + readonly scaleMode: Phaser.Scale.ScaleModeType; + + /** + * Is the Scale Manager allowed to adjust the CSS height property of the parent to be 100%? + */ + readonly expandParent: boolean; + + /** + * Automatically round the display and style sizes of the canvas. This can help with performance in lower-powered devices. + */ + readonly autoRound: boolean; + + /** + * Automatically center the canvas within the parent? + */ + readonly autoCenter: Phaser.Scale.CenterType; + + /** + * How many ms should elapse before checking if the browser size has changed? + */ + readonly resizeInterval: number; + + /** + * The DOM element that will be sent into full screen mode, or its `id`. If undefined Phaser will create its own div and insert the canvas into it when entering fullscreen mode. + */ + readonly fullscreenTarget: HTMLElement | string | null; + + /** + * The minimum width, in pixels, the canvas will scale down to. A value of zero means no minimum. + */ + readonly minWidth: number; + + /** + * The maximum width, in pixels, the canvas will scale up to. A value of zero means no maximum. + */ + readonly maxWidth: number; + + /** + * The minimum height, in pixels, the canvas will scale down to. A value of zero means no minimum. + */ + readonly minHeight: number; + + /** + * The maximum height, in pixels, the canvas will scale up to. A value of zero means no maximum. + */ + readonly maxHeight: number; + + /** + * The horizontal amount to snap the canvas by when the Scale Manager is resizing. A value of zero means no snapping. + */ + readonly snapWidth: number; + + /** + * The vertical amount to snap the canvas by when the Scale Manager is resizing. A value of zero means no snapping. + */ + readonly snapHeight: number; + + /** + * Force Phaser to use a specific renderer. Can be `CONST.CANVAS`, `CONST.WEBGL`, `CONST.HEADLESS` or `CONST.AUTO` (default) + */ + readonly renderType: number; + + /** + * Force Phaser to use your own Canvas element instead of creating one. + */ + readonly canvas: HTMLCanvasElement | null; + + /** + * Force Phaser to use your own Canvas context instead of creating one. + */ + readonly context: CanvasRenderingContext2D | WebGLRenderingContext | null; + + /** + * Optional CSS attributes to be set on the canvas object created by the renderer. + */ + readonly canvasStyle: string | null; + + /** + * Is Phaser running under a custom (non-native web) environment? If so, set this to `true` to skip internal Feature detection. If `true` the `renderType` cannot be left as `AUTO`. + */ + readonly customEnvironment: boolean; + + /** + * The default Scene configuration object. + */ + readonly sceneConfig: object | null; + + /** + * A seed which the Random Data Generator will use. If not given, a dynamic seed based on the time is used. + */ + readonly seed: string[]; + + /** + * The title of the game. + */ + readonly gameTitle: string; + + /** + * The URL of the game. + */ + readonly gameURL: string; + + /** + * The version of the game. + */ + readonly gameVersion: string; + + /** + * If `true` the window will automatically be given focus immediately and on any future mousedown event. + */ + readonly autoFocus: boolean; + + /** + * `false` or `0` = Use the built-in StableSort (needed for older browsers), `true` or `1` = Rely on ES2019 Array.sort being stable (modern browsers only), or `-1` = Try and determine this automatically based on browser inspection (not guaranteed to work, errs on side of caution). + */ + readonly stableSort: number | boolean; + + /** + * Should the game create a div element to act as a DOM Container? Only enable if you're using DOM Element objects. You must provide a parent object if you use this feature. + */ + readonly domCreateContainer: boolean | null; + + /** + * The default `pointerEvents` attribute set on the DOM Container. + */ + readonly domPointerEvents: string | null; + + /** + * Enable the Keyboard Plugin. This can be disabled in games that don't need keyboard input. + */ + readonly inputKeyboard: boolean; + + /** + * The DOM Target to listen for keyboard events on. Defaults to `window` if not specified. + */ + readonly inputKeyboardEventTarget: any; + + /** + * `preventDefault` will be called on every non-modified key which has a key code in this array. By default, it is empty. + */ + readonly inputKeyboardCapture: number[] | null; + + /** + * Enable the Mouse Plugin. This can be disabled in games that don't need mouse input. + */ + readonly inputMouse: boolean | object; + + /** + * The DOM Target to listen for mouse events on. Defaults to the game canvas if not specified. + */ + readonly inputMouseEventTarget: any | null; + + /** + * Should `mousedown` DOM events have `preventDefault` called on them? + */ + readonly inputMousePreventDefaultDown: boolean; + + /** + * Should `mouseup` DOM events have `preventDefault` called on them? + */ + readonly inputMousePreventDefaultUp: boolean; + + /** + * Should `mousemove` DOM events have `preventDefault` called on them? + */ + readonly inputMousePreventDefaultMove: boolean; + + /** + * Should `wheel` DOM events have `preventDefault` called on them? + */ + readonly inputMousePreventDefaultWheel: boolean; + + /** + * Enable the Touch Plugin. This can be disabled in games that don't need touch input. + */ + readonly inputTouch: boolean; + + /** + * The DOM Target to listen for touch events on. Defaults to the game canvas if not specified. + */ + readonly inputTouchEventTarget: any | null; + + /** + * Should touch events be captured? I.e. have prevent default called on them. + */ + readonly inputTouchCapture: boolean; + + /** + * The number of Pointer objects created by default. In a mouse-only, or non-multi touch game, you can leave this as 1. + */ + readonly inputActivePointers: number; + + /** + * The smoothing factor to apply during Pointer movement. See {@link Phaser.Input.Pointer#smoothFactor}. + */ + readonly inputSmoothFactor: number; + + /** + * Should Phaser listen for input events on the Window? If you disable this, events like 'POINTER_UP_OUTSIDE' will no longer fire. + */ + readonly inputWindowEvents: boolean; + + /** + * Enable the Gamepad Plugin. This can be disabled in games that don't need gamepad input. + */ + readonly inputGamepad: boolean; + + /** + * The DOM Target to listen for gamepad events on. Defaults to `window` if not specified. + */ + readonly inputGamepadEventTarget: any; + + /** + * Set to `true` to disable the right-click context menu. + */ + readonly disableContextMenu: boolean; + + /** + * The Audio Configuration object. + */ + readonly audio: Phaser.Types.Core.AudioConfig; + + /** + * Don't write the banner line to the console.log. + */ + readonly hideBanner: boolean; + + /** + * Omit Phaser's name and version from the banner. + */ + readonly hidePhaser: boolean; + + /** + * The color of the banner text. + */ + readonly bannerTextColor: string; + + /** + * The background colors of the banner. + */ + readonly bannerBackgroundColor: string[]; + + /** + * The Frame Rate Configuration object, as parsed by the Timestep class. + */ + readonly fps: Phaser.Types.Core.FPSConfig; + + /** + * Disables the automatic creation of the Pre FX Pipelines. If disabled, you cannot use the built-in Pre FX on Game Objects. + */ + readonly disablePreFX: boolean; + + /** + * Disables the automatic creation of the Post FX Pipelines. If disabled, you cannot use the built-in Post FX on Game Objects. + */ + readonly disablePostFX: boolean; + + /** + * An object mapping WebGL names to WebGLPipeline classes. These should be class constructors, not instances. + */ + readonly pipeline: Phaser.Types.Core.PipelineConfig | Phaser.Renderer.WebGL.WebGLPipeline[]; + + /** + * Automatically enable the Mobile Pipeline if iOS or Android detected? + */ + readonly autoMobilePipeline: boolean; + + /** + * The WebGL Pipeline that Game Objects will use by default. Set to 'MultiPipeline' as standard. See also 'autoMobilePipeline'. + */ + readonly defaultPipeline: string; + + /** + * When set to `true`, WebGL uses linear interpolation to draw scaled or rotated textures, giving a smooth appearance. When set to `false`, WebGL uses nearest-neighbor interpolation, giving a crisper appearance. `false` also disables antialiasing of the game canvas itself, if the browser supports it, when the game canvas is scaled. + */ + readonly antialias: boolean; + + /** + * Sets the `antialias` property when the WebGL context is created. Setting this value does not impact any subsequent textures that are created, or the canvas style attributes. + */ + readonly antialiasGL: boolean; + + /** + * Sets the mipmap magFilter to be used when creating WebGL textures. Don't set unless you wish to create mipmaps. Set to one of the following: 'NEAREST', 'LINEAR', 'NEAREST_MIPMAP_NEAREST', 'LINEAR_MIPMAP_NEAREST', 'NEAREST_MIPMAP_LINEAR' or 'LINEAR_MIPMAP_LINEAR'. + */ + readonly mipmapFilter: string; + + /** + * When set to `true` it will create a desynchronized context for both 2D and WebGL. See https://developers.google.com/web/updates/2019/05/desynchronized for details. + */ + readonly desynchronized: boolean; + + /** + * Draw texture-based Game Objects at only whole-integer positions. Game Objects without textures, like Graphics, ignore this property. + */ + readonly roundPixels: boolean; + + /** + * Prevent pixel art from becoming blurred when scaled. It will remain crisp (tells the WebGL renderer to automatically create textures using a linear filter mode). + */ + readonly pixelArt: boolean; + + /** + * Whether the game canvas will have a transparent background. + */ + readonly transparent: boolean; + + /** + * Whether the game canvas will be cleared between each rendering frame. You can disable this if you have a full-screen background image or game object. + */ + readonly clearBeforeRender: boolean; + + /** + * If the value is true the WebGL buffers will not be cleared and will preserve their values until cleared or overwritten by the author. + */ + readonly preserveDrawingBuffer: boolean; + + /** + * In WebGL mode, sets the drawing buffer to contain colors with pre-multiplied alpha. + */ + readonly premultipliedAlpha: boolean; + + /** + * Let the browser abort creating a WebGL context if it judges performance would be unacceptable. + */ + readonly failIfMajorPerformanceCaveat: boolean; + + /** + * "high-performance", "low-power" or "default". A hint to the browser on how much device power the game might use. + */ + readonly powerPreference: string; + + /** + * The default WebGL Batch size. Represents the number of _quads_ that can be added to a single batch. + */ + readonly batchSize: number; + + /** + * When in WebGL mode, this sets the maximum number of GPU Textures to use. The default, -1, will use all available units. The WebGL1 spec says all browsers should provide a minimum of 8. + */ + readonly maxTextures: number; + + /** + * The maximum number of lights allowed to be visible within range of a single Camera in the LightManager. + */ + readonly maxLights: number; + + /** + * The background color of the game canvas. The default is black. This value is ignored if `transparent` is set to `true`. + */ + readonly backgroundColor: Phaser.Display.Color; + + /** + * Called before Phaser boots. Useful for initializing anything not related to Phaser that Phaser may require while booting. + */ + readonly preBoot: Phaser.Types.Core.BootCallback; + + /** + * A function to run at the end of the boot sequence. At this point, all the game systems have started and plugins have been loaded. + */ + readonly postBoot: Phaser.Types.Core.BootCallback; + + /** + * The Physics Configuration object. + */ + readonly physics: Phaser.Types.Core.PhysicsConfig; + + /** + * The default physics system. It will be started for each scene. Either 'arcade', 'impact' or 'matter'. + */ + readonly defaultPhysicsSystem: boolean | string; + + /** + * A URL used to resolve paths given to the loader. Example: 'http://labs.phaser.io/assets/'. + */ + readonly loaderBaseURL: string; + + /** + * A URL path used to resolve relative paths given to the loader. Example: 'images/sprites/'. + */ + readonly loaderPath: string; + + /** + * Maximum parallel downloads allowed for resources (Default to 32). + */ + readonly loaderMaxParallelDownloads: number; + + /** + * 'anonymous', 'use-credentials', or `undefined`. If you're not making cross-origin requests, leave this as `undefined`. See {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes}. + */ + readonly loaderCrossOrigin: string | undefined; + + /** + * The response type of the XHR request, e.g. `blob`, `text`, etc. + */ + readonly loaderResponseType: string; + + /** + * Should the XHR request use async or not? + */ + readonly loaderAsync: boolean; + + /** + * Optional username for all XHR requests. + */ + readonly loaderUser: string; + + /** + * Optional password for all XHR requests. + */ + readonly loaderPassword: string; + + /** + * Optional XHR timeout value, in ms. + */ + readonly loaderTimeout: number; + + /** + * Optional XHR withCredentials value. + */ + readonly loaderWithCredentials: boolean; + + /** + * Optional load type for image, `XHR` is default, or `HTMLImageElement` for a lightweight way. + */ + readonly loaderImageLoadType: string; + + /** + * An array of schemes that the Loader considers as being 'local' files. Defaults to: `[ 'file://', 'capacitor://' ]`. + */ + readonly loaderLocalScheme: string[]; + + /** + * The quality of the Glow FX (defaults to 0.1) + */ + readonly glowFXQuality: number; + + /** + * The distance of the Glow FX (defaults to 10) + */ + readonly glowFXDistance: number; + + /** + * An array of global plugins to be installed. + */ + readonly installGlobalPlugins: any; + + /** + * An array of Scene level plugins to be installed. + */ + readonly installScenePlugins: any; + + /** + * The plugins installed into every Scene (in addition to CoreScene and Global). + */ + readonly defaultPlugins: any; + + /** + * A base64 encoded PNG that will be used as the default blank texture. + */ + readonly defaultImage: string; + + /** + * A base64 encoded PNG that will be used as the default texture when a texture is assigned that is missing or not loaded. + */ + readonly missingImage: string; + + /** + * A base64 encoded PNG that will be used as the default texture when a texture is assigned that is white or not loaded. + */ + readonly whiteImage: string; + + } + + /** + * Called automatically by Phaser.Game and responsible for creating the renderer it will use. + * + * Relies upon two webpack global flags to be defined: `WEBGL_RENDERER` and `CANVAS_RENDERER` during build time, but not at run-time. + * @param game The Phaser.Game instance on which the renderer will be set. + */ + function CreateRenderer(game: Phaser.Game): void; + + /** + * Called automatically by Phaser.Game and responsible for creating the console.log debug header. + * + * You can customize or disable the header via the Game Config object. + * @param game The Phaser.Game instance which will output this debug header. + */ + function DebugHeader(game: Phaser.Game): void; + + namespace Events { + /** + * The Game Blur Event. + * + * This event is dispatched by the Game Visibility Handler when the window in which the Game instance is embedded + * enters a blurred state. The blur event is raised when the window loses focus. This can happen if a user swaps + * tab, or if they simply remove focus from the browser to another app. + */ + const BLUR: string; + + /** + * The Game Boot Event. + * + * This event is dispatched when the Phaser Game instance has finished booting, but before it is ready to start running. + * The global systems use this event to know when to set themselves up, dispatching their own `ready` events as required. + */ + const BOOT: string; + + /** + * The Game Context Lost Event. + * + * This event is dispatched by the Game if the WebGL Renderer it is using encounters a WebGL Context Lost event from the browser. + * + * The renderer halts all rendering and cannot resume after this happens. + */ + const CONTEXT_LOST: string; + + /** + * The Game Destroy Event. + * + * This event is dispatched when the game instance has been told to destroy itself. + * Lots of internal systems listen to this event in order to clear themselves out. + * Custom plugins and game code should also do the same. + */ + const DESTROY: string; + + /** + * The Game Focus Event. + * + * This event is dispatched by the Game Visibility Handler when the window in which the Game instance is embedded + * enters a focused state. The focus event is raised when the window re-gains focus, having previously lost it. + */ + const FOCUS: string; + + /** + * The Game Hidden Event. + * + * This event is dispatched by the Game Visibility Handler when the document in which the Game instance is embedded + * enters a hidden state. Only browsers that support the Visibility API will cause this event to be emitted. + * + * In most modern browsers, when the document enters a hidden state, the Request Animation Frame and setTimeout, which + * control the main game loop, will automatically pause. There is no way to stop this from happening. It is something + * your game should account for in its own code, should the pause be an issue (i.e. for multiplayer games) + */ + const HIDDEN: string; + + /** + * The Game Pause Event. + * + * This event is dispatched when the Game loop enters a paused state, usually as a result of the Visibility Handler. + */ + const PAUSE: string; + + /** + * The Game Post-Render Event. + * + * This event is dispatched right at the end of the render process. + * + * Every Scene will have rendered and been drawn to the canvas by the time this event is fired. + * Use it for any last minute post-processing before the next game step begins. + */ + const POST_RENDER: string; + + /** + * The Game Post-Step Event. + * + * This event is dispatched after the Scene Manager has updated. + * Hook into it from plugins or systems that need to do things before the render starts. + */ + const POST_STEP: string; + + /** + * The Game Pre-Render Event. + * + * This event is dispatched immediately before any of the Scenes have started to render. + * + * The renderer will already have been initialized this frame, clearing itself and preparing to receive the Scenes for rendering, but it won't have actually drawn anything yet. + */ + const PRE_RENDER: string; + + /** + * The Game Pre-Step Event. + * + * This event is dispatched before the main Game Step starts. By this point in the game cycle none of the Scene updates have yet happened. + * Hook into it from plugins or systems that need to update before the Scene Manager does. + */ + const PRE_STEP: string; + + /** + * The Game Ready Event. + * + * This event is dispatched when the Phaser Game instance has finished booting, the Texture Manager is fully ready, + * and all local systems are now able to start. + */ + const READY: string; + + /** + * The Game Resume Event. + * + * This event is dispatched when the game loop leaves a paused state and resumes running. + */ + const RESUME: string; + + /** + * The Game Step Event. + * + * This event is dispatched after the Game Pre-Step and before the Scene Manager steps. + * Hook into it from plugins or systems that need to update before the Scene Manager does, but after the core Systems have. + */ + const STEP: string; + + /** + * This event is dispatched when the Scene Manager has created the System Scene, + * which other plugins and systems may use to initialize themselves. + * + * This event is dispatched just once by the Game instance. + */ + const SYSTEM_READY: string; + + /** + * The Game Visible Event. + * + * This event is dispatched by the Game Visibility Handler when the document in which the Game instance is embedded + * enters a visible state, previously having been hidden. + * + * Only browsers that support the Visibility API will cause this event to be emitted. + */ + const VISIBLE: string; + + } + + /** + * The core runner class that Phaser uses to handle the game loop. It can use either Request Animation Frame, + * or SetTimeout, based on browser support and config settings, to create a continuous loop within the browser. + * + * Each time the loop fires, `TimeStep.step` is called and this is then passed onto the core Game update loop, + * it is the core heartbeat of your game. It will fire as often as Request Animation Frame is capable of handling + * on the target device. + * + * Note that there are lots of situations where a browser will stop updating your game. Such as if the player + * switches tabs, or covers up the browser window with another application. In these cases, the 'heartbeat' + * of your game will pause, and only resume when focus is returned to it by the player. There is no way to avoid + * this situation, all you can do is use the visibility events the browser, and Phaser, provide to detect when + * it has happened and then gracefully recover. + */ + class TimeStep { + /** + * + * @param game A reference to the Phaser.Game instance that owns this Time Step. + */ + constructor(game: Phaser.Game, config: Phaser.Types.Core.FPSConfig); + + /** + * A reference to the Phaser.Game instance. + */ + readonly game: Phaser.Game; + + /** + * The Request Animation Frame DOM Event handler. + */ + readonly raf: Phaser.DOM.RequestAnimationFrame; + + /** + * A flag that is set once the TimeStep has started running and toggled when it stops. + */ + readonly started: boolean; + + /** + * A flag that is set once the TimeStep has started running and toggled when it stops. + * The difference between this value and `started` is that `running` is toggled when + * the TimeStep is sent to sleep, where-as `started` remains `true`, only changing if + * the TimeStep is actually stopped, not just paused. + */ + readonly running: boolean; + + /** + * The minimum fps rate you want the Time Step to run at. + * + * Setting this cannot guarantee the browser runs at this rate, it merely influences + * the internal timing values to help the Timestep know when it has gone out of sync. + */ + minFps: number; + + /** + * The target fps rate for the Time Step to run at. + * + * Setting this value will not actually change the speed at which the browser runs, that is beyond + * the control of Phaser. Instead, it allows you to determine performance issues and if the Time Step + * is spiraling out of control. + */ + targetFps: number; + + /** + * Enforce a frame rate limit. This forces how often the Game step will run. By default it is zero, + * which means it will run at whatever limit the browser (via RequestAnimationFrame) can handle, which + * is the optimum rate for fast-action or responsive games. + * + * However, if you are building a non-game app, like a graphics generator, or low-intensity game that doesn't + * require 60fps, then you can lower the step rate via this Game Config value: + * + * ```js + * fps: { + * limit: 30 + * } + * ``` + * + * Setting this _beyond_ the rate of RequestAnimationFrame will make no difference at all. + * + * Use it purely to _restrict_ updates in low-intensity situations only. + */ + fpsLimit: number; + + /** + * Is the FPS rate limited? + * + * This is set by setting the Game Config `limit` value to a value above zero. + * + * Consider this property as read-only. + */ + hasFpsLimit: boolean; + + /** + * An exponential moving average of the frames per second. + */ + readonly actualFps: number; + + /** + * The time at which the next fps rate update will take place. + * + * When an fps update happens, the `framesThisSecond` value is reset. + */ + readonly nextFpsUpdate: number; + + /** + * The number of frames processed this second. + */ + readonly framesThisSecond: number; + + /** + * A callback to be invoked each time the TimeStep steps. + */ + callback: Phaser.Types.Core.TimeStepCallback; + + /** + * You can force the TimeStep to use SetTimeOut instead of Request Animation Frame by setting + * the `forceSetTimeOut` property to `true` in the Game Configuration object. It cannot be changed at run-time. + */ + readonly forceSetTimeOut: boolean; + + /** + * The time, updated each step by adding the elapsed delta time to the previous value. + * + * This differs from the `TimeStep.now` value, which is the high resolution time value + * as provided by Request Animation Frame. + */ + time: number; + + /** + * The time at which the game started running. + * + * This value is adjusted if the game is then paused and resumes. + */ + startTime: number; + + /** + * The time of the previous step. + * + * This is typically a high resolution timer value, as provided by Request Animation Frame. + */ + lastTime: number; + + /** + * The current frame the game is on. This counter is incremented once every game step, regardless of how much + * time has passed and is unaffected by delta smoothing. + */ + readonly frame: number; + + /** + * Is the browser currently considered in focus by the Page Visibility API? + * + * This value is set in the `blur` method, which is called automatically by the Game instance. + */ + readonly inFocus: boolean; + + /** + * The delta time, in ms, since the last game step. This is a clamped and smoothed average value. + */ + delta: number; + + /** + * Internal index of the delta history position. + */ + deltaIndex: number; + + /** + * Internal array holding the previous delta values, used for delta smoothing. + */ + deltaHistory: number[]; + + /** + * The maximum number of delta values that are retained in order to calculate a smoothed moving average. + * + * This can be changed in the Game Config via the `fps.deltaHistory` property. The default is 10. + */ + deltaSmoothingMax: number; + + /** + * The number of frames that the cooldown is set to after the browser panics over the FPS rate, usually + * as a result of switching tabs and regaining focus. + * + * This can be changed in the Game Config via the `fps.panicMax` property. The default is 120. + */ + panicMax: number; + + /** + * The actual elapsed time in ms between one update and the next. + * + * Unlike with `delta`, no smoothing, capping, or averaging is applied to this value. + * So please be careful when using this value in math calculations. + */ + rawDelta: number; + + /** + * The time, set at the start of the current step. + * + * This is typically a high resolution timer value, as provided by Request Animation Frame. + * + * This can differ from the `time` value in that it isn't calculated based on the delta value. + */ + now: number; + + /** + * Apply smoothing to the delta value used within Phasers internal calculations? + * + * This can be changed in the Game Config via the `fps.smoothStep` property. The default is `true`. + * + * Smoothing helps settle down the delta values after browser tab switches, or other situations + * which could cause significant delta spikes or dips. By default it has been enabled in Phaser 3 + * since the first version, but is now exposed under this property (and the corresponding game config + * `smoothStep` value), to allow you to easily disable it, should you require. + */ + smoothStep: boolean; + + /** + * Called by the Game instance when the DOM window.onBlur event triggers. + */ + blur(): void; + + /** + * Called by the Game instance when the DOM window.onFocus event triggers. + */ + focus(): void; + + /** + * Called when the visibility API says the game is 'hidden' (tab switch out of view, etc) + */ + pause(): void; + + /** + * Called when the visibility API says the game is 'visible' again (tab switch back into view, etc) + */ + resume(): void; + + /** + * Resets the time, lastTime, fps averages and delta history. + * Called automatically when a browser sleeps them resumes. + */ + resetDelta(): void; + + /** + * Starts the Time Step running, if it is not already doing so. + * Called automatically by the Game Boot process. + * @param callback The callback to be invoked each time the Time Step steps. + */ + start(callback: Phaser.Types.Core.TimeStepCallback): void; + + /** + * Takes the delta value and smooths it based on the previous frames. + * + * Called automatically as part of the step. + * @param delta The delta value for this step. + */ + smoothDelta(delta: number): number; + + /** + * Update the estimate of the frame rate, `fps`. Every second, the number + * of frames that occurred in that second are included in an exponential + * moving average of all frames per second, with an alpha of 0.25. This + * means that more recent seconds affect the estimated frame rate more than + * older seconds. + * + * When a browser window is NOT minimized, but is covered up (i.e. you're using + * another app which has spawned a window over the top of the browser), then it + * will start to throttle the raf callback time. It waits for a while, and then + * starts to drop the frame rate at 1 frame per second until it's down to just over 1fps. + * So if the game was running at 60fps, and the player opens a new window, then + * after 60 seconds (+ the 'buffer time') it'll be down to 1fps, so rafin'g at 1Hz. + * + * When they make the game visible again, the frame rate is increased at a rate of + * approx. 8fps, back up to 60fps (or the max it can obtain) + * + * There is no easy way to determine if this drop in frame rate is because the + * browser is throttling raf, or because the game is struggling with performance + * because you're asking it to do too much on the device. + * + * Compute the new exponential moving average with an alpha of 0.25. + * @param time The timestamp passed in from RequestAnimationFrame or setTimeout. + */ + updateFPS(time: number): void; + + /** + * The main step method with an fps limiter. This is called each time the browser updates, either by Request Animation Frame, + * or by Set Timeout. It is responsible for calculating the delta values, frame totals, cool down history and more. + * You generally should never call this method directly. + * @param time The timestamp passed in from RequestAnimationFrame or setTimeout. + */ + stepLimitFPS(time: number): void; + + /** + * The main step method. This is called each time the browser updates, either by Request Animation Frame, + * or by Set Timeout. It is responsible for calculating the delta values, frame totals, cool down history and more. + * You generally should never call this method directly. + * @param time The timestamp passed in from RequestAnimationFrame or setTimeout. + */ + step(time: number): void; + + /** + * Manually calls `TimeStep.step`. + */ + tick(): void; + + /** + * Sends the TimeStep to sleep, stopping Request Animation Frame (or SetTimeout) and toggling the `running` flag to false. + */ + sleep(): void; + + /** + * Wakes-up the TimeStep, restarting Request Animation Frame (or SetTimeout) and toggling the `running` flag to true. + * The `seamless` argument controls if the wake-up should adjust the start time or not. + * @param seamless Adjust the startTime based on the lastTime values. Default false. + */ + wake(seamless?: boolean): void; + + /** + * Gets the duration which the game has been running, in seconds. + */ + getDuration(): number; + + /** + * Gets the duration which the game has been running, in ms. + */ + getDurationMS(): number; + + /** + * Stops the TimeStep running. + */ + stop(): this; + + /** + * Destroys the TimeStep. This will stop Request Animation Frame, stop the step, clear the callbacks and null + * any objects. + */ + destroy(): void; + + } + + /** + * The Visibility Handler is responsible for listening out for document level visibility change events. + * This includes `visibilitychange` if the browser supports it, and blur and focus events. It then uses + * the provided Event Emitter and fires the related events. + * @param game The Game instance this Visibility Handler is working on. + */ + function VisibilityHandler(game: Phaser.Game): void; + + } + + namespace Create { + /** + * Generates a texture based on the given Create configuration object. + * + * The texture is drawn using a fixed-size indexed palette of 16 colors, where the hex value in the + * data cells map to a single color. For example, if the texture config looked like this: + * + * ```javascript + * var star = [ + * '.....828.....', + * '....72227....', + * '....82228....', + * '...7222227...', + * '2222222222222', + * '8222222222228', + * '.72222222227.', + * '..787777787..', + * '..877777778..', + * '.78778887787.', + * '.27887.78872.', + * '.787.....787.' + * ]; + * + * this.textures.generate('star', { data: star, pixelWidth: 4 }); + * ``` + * + * Then it would generate a texture that is 52 x 48 pixels in size, because each cell of the data array + * represents 1 pixel multiplied by the `pixelWidth` value. The cell values, such as `8`, maps to color + * number 8 in the palette. If a cell contains a period character `.` then it is transparent. + * + * The default palette is Arne16, but you can specify your own using the `palette` property. + * @param config The Generate Texture Configuration object. + */ + function GenerateTexture(config: Phaser.Types.Create.GenerateTextureConfig): HTMLCanvasElement; + + namespace Palettes { + /** + * A 16 color palette by [Arne](http://androidarts.com/palette/16pal.htm) + */ + var ARNE16: Phaser.Types.Create.Palette; + + /** + * A 16 color palette inspired by the Commodore 64. + */ + var C64: Phaser.Types.Create.Palette; + + /** + * A 16 color CGA inspired palette by [Arne](http://androidarts.com/palette/16pal.htm) + */ + var CGA: Phaser.Types.Create.Palette; + + /** + * A 16 color JMP palette by [Arne](http://androidarts.com/palette/16pal.htm) + */ + var JMP: Phaser.Types.Create.Palette; + + /** + * A 16 color palette inspired by Japanese computers like the MSX. + */ + var MSX: Phaser.Types.Create.Palette; + + } + + } + + namespace Curves { + /** + * A higher-order Bézier curve constructed of four points. + */ + class CubicBezier extends Phaser.Curves.Curve { + /** + * + * @param p0 Start point, or an array of point pairs. + * @param p1 Control Point 1. + * @param p2 Control Point 2. + * @param p3 End Point. + */ + constructor(p0: Phaser.Math.Vector2 | Phaser.Math.Vector2[], p1: Phaser.Math.Vector2, p2: Phaser.Math.Vector2, p3: Phaser.Math.Vector2); + + /** + * The start point of this curve. + */ + p0: Phaser.Math.Vector2; + + /** + * The first control point of this curve. + */ + p1: Phaser.Math.Vector2; + + /** + * The second control point of this curve. + */ + p2: Phaser.Math.Vector2; + + /** + * The end point of this curve. + */ + p3: Phaser.Math.Vector2; + + /** + * Gets the starting point on the curve. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getStartPoint(out?: O): O; + + /** + * Returns the resolution of this curve. + * @param divisions The amount of divisions used by this curve. + */ + getResolution(divisions: number): number; + + /** + * Get point at relative position in curve according to length. + * @param t The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPoint(t: number, out?: O): O; + + /** + * Draws this curve to the specified graphics object. + * @param graphics The graphics object this curve should be drawn to. + * @param pointsTotal The number of intermediary points that make up this curve. A higher number of points will result in a smoother curve. Default 32. + */ + draw(graphics: G, pointsTotal?: number): G; + + /** + * Returns a JSON object that describes this curve. + */ + toJSON(): Phaser.Types.Curves.JSONCurve; + + /** + * Generates a curve from a JSON object. + * @param data The JSON object containing this curve data. + */ + static fromJSON(data: Phaser.Types.Curves.JSONCurve): Phaser.Curves.CubicBezier; + + } + + /** + * A Base Curve class, which all other curve types extend. + * + * Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog) + */ + class Curve { + /** + * + * @param type The curve type. + */ + constructor(type: string); + + /** + * String based identifier for the type of curve. + */ + type: string; + + /** + * The default number of divisions within the curve. + */ + defaultDivisions: number; + + /** + * The quantity of arc length divisions within the curve. + */ + arcLengthDivisions: number; + + /** + * An array of cached arc length values. + */ + cacheArcLengths: number[]; + + /** + * Does the data of this curve need updating? + */ + needsUpdate: boolean; + + /** + * For a curve on a Path, `false` means the Path will ignore this curve. + */ + active: boolean; + + /** + * Draws this curve on the given Graphics object. + * + * The curve is drawn using `Graphics.strokePoints` so will be drawn at whatever the present Graphics stroke color is. + * The Graphics object is not cleared before the draw, so the curve will appear on-top of anything else already rendered to it. + * @param graphics The Graphics instance onto which this curve will be drawn. + * @param pointsTotal The resolution of the curve. The higher the value the smoother it will render, at the cost of rendering performance. Default 32. + */ + draw(graphics: G, pointsTotal?: number): G; + + /** + * Returns a Rectangle where the position and dimensions match the bounds of this Curve. + * + * You can control the accuracy of the bounds. The value given is used to work out how many points + * to plot across the curve. Higher values are more accurate at the cost of calculation speed. + * @param out The Rectangle to store the bounds in. If falsey a new object will be created. + * @param accuracy The accuracy of the bounds calculations. Default 16. + */ + getBounds(out?: Phaser.Geom.Rectangle, accuracy?: number): Phaser.Geom.Rectangle; + + /** + * Returns an array of points, spaced out X distance pixels apart. + * The smaller the distance, the larger the array will be. + * @param distance The distance, in pixels, between each point along the curve. + */ + getDistancePoints(distance: number): Phaser.Geom.Point[]; + + /** + * Get a point at the end of the curve. + * @param out Optional Vector object to store the result in. + */ + getEndPoint(out?: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Get total curve arc length + */ + getLength(): number; + + /** + * Get a list of cumulative segment lengths. + * + * These lengths are + * + * - [0] 0 + * - [1] The first segment + * - [2] The first and second segment + * - ... + * - [divisions] All segments + * @param divisions The number of divisions or segments. + */ + getLengths(divisions?: number): number[]; + + /** + * Get a point at a relative position on the curve, by arc length. + * @param u The relative position, [0..1]. + * @param out A point to store the result in. + */ + getPointAt(u: number, out?: O): O; + + /** + * Get a sequence of evenly spaced points from the curve. + * + * You can pass `divisions`, `stepRate`, or neither. + * + * The number of divisions will be + * + * 1. `divisions`, if `divisions` > 0; or + * 2. `this.getLength / stepRate`, if `stepRate` > 0; or + * 3. `this.defaultDivisions` + * + * `1 + divisions` points will be returned. + * @param divisions The number of divisions to make. + * @param stepRate The curve distance between points, implying `divisions`. + * @param out An optional array to store the points in. + */ + getPoints(divisions?: number, stepRate?: number, out?: O): O; + + /** + * Get a random point from the curve. + * @param out A point object to store the result in. + */ + getRandomPoint(out?: O): O; + + /** + * Get a sequence of equally spaced points (by arc distance) from the curve. + * + * `1 + divisions` points will be returned. + * @param divisions The number of divisions to make. Default this.defaultDivisions. + * @param stepRate Step between points. Used to calculate the number of points to return when divisions is falsy. Ignored if divisions is positive. + * @param out An optional array to store the points in. + */ + getSpacedPoints(divisions?: number, stepRate?: number, out?: any[] | Phaser.Math.Vector2[]): Phaser.Math.Vector2[]; + + /** + * Get a point at the start of the curve. + * @param out A point to store the result in. + */ + getStartPoint(out?: O): O; + + /** + * Get a unit vector tangent at a relative position on the curve. + * In case any sub curve does not implement its tangent derivation, + * 2 points a small delta apart will be used to find its gradient + * which seems to give a reasonable approximation + * @param t The relative position on the curve, [0..1]. + * @param out A vector to store the result in. + */ + getTangent(t: number, out?: O): O; + + /** + * Get a unit vector tangent at a relative position on the curve, by arc length. + * @param u The relative position on the curve, [0..1]. + * @param out A vector to store the result in. + */ + getTangentAt(u: number, out?: O): O; + + /** + * Given a distance in pixels, get a t to find p. + * @param distance The distance, in pixels. + * @param divisions Optional amount of divisions. + */ + getTFromDistance(distance: number, divisions?: number): number; + + /** + * Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant. + * @param u A float between 0 and 1. + * @param distance The distance, in pixels. + * @param divisions Optional amount of divisions. + */ + getUtoTmapping(u: number, distance: number, divisions?: number): number; + + /** + * Calculate and cache the arc lengths. + */ + updateArcLengths(): void; + + } + + /** + * An Elliptical Curve derived from the Base Curve class. + * + * See https://en.wikipedia.org/wiki/Elliptic_curve for more details. + */ + class Ellipse extends Phaser.Curves.Curve { + /** + * + * @param x The x coordinate of the ellipse, or an Ellipse Curve configuration object. Default 0. + * @param y The y coordinate of the ellipse. Default 0. + * @param xRadius The horizontal radius of ellipse. Default 0. + * @param yRadius The vertical radius of ellipse. Default 0. + * @param startAngle The start angle of the ellipse, in degrees. Default 0. + * @param endAngle The end angle of the ellipse, in degrees. Default 360. + * @param clockwise Whether the ellipse angles are given as clockwise (`true`) or counter-clockwise (`false`). Default false. + * @param rotation The rotation of the ellipse, in degrees. Default 0. + */ + constructor(x?: number | Phaser.Types.Curves.EllipseCurveConfig, y?: number, xRadius?: number, yRadius?: number, startAngle?: number, endAngle?: number, clockwise?: boolean, rotation?: number); + + /** + * The center point of the ellipse. Used for calculating rotation. + */ + p0: Phaser.Math.Vector2; + + /** + * Gets the starting point on the curve. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getStartPoint(out?: O): O; + + /** + * Get the resolution of the curve. + * @param divisions Optional divisions value. + */ + getResolution(divisions: number): number; + + /** + * Get point at relative position in curve according to length. + * @param t The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPoint(t: number, out?: O): O; + + /** + * Sets the horizontal radius of this curve. + * @param value The horizontal radius of this curve. + */ + setXRadius(value: number): this; + + /** + * Sets the vertical radius of this curve. + * @param value The vertical radius of this curve. + */ + setYRadius(value: number): this; + + /** + * Sets the width of this curve. + * @param value The width of this curve. + */ + setWidth(value: number): this; + + /** + * Sets the height of this curve. + * @param value The height of this curve. + */ + setHeight(value: number): this; + + /** + * Sets the start angle of this curve. + * @param value The start angle of this curve, in radians. + */ + setStartAngle(value: number): this; + + /** + * Sets the end angle of this curve. + * @param value The end angle of this curve, in radians. + */ + setEndAngle(value: number): this; + + /** + * Sets if this curve extends clockwise or anti-clockwise. + * @param value The clockwise state of this curve. + */ + setClockwise(value: boolean): this; + + /** + * Sets the rotation of this curve. + * @param value The rotation of this curve, in radians. + */ + setRotation(value: number): this; + + /** + * The x coordinate of the center of the ellipse. + */ + x: number; + + /** + * The y coordinate of the center of the ellipse. + */ + y: number; + + /** + * The horizontal radius of the ellipse. + */ + xRadius: number; + + /** + * The vertical radius of the ellipse. + */ + yRadius: number; + + /** + * The start angle of the ellipse in degrees. + */ + startAngle: number; + + /** + * The end angle of the ellipse in degrees. + */ + endAngle: number; + + /** + * `true` if the ellipse rotation is clockwise or `false` if anti-clockwise. + */ + clockwise: boolean; + + /** + * The rotation of the ellipse, relative to the center, in degrees. + */ + angle: number; + + /** + * The rotation of the ellipse, relative to the center, in radians. + */ + rotation: number; + + /** + * JSON serialization of the curve. + */ + toJSON(): Phaser.Types.Curves.JSONEllipseCurve; + + /** + * Creates a curve from the provided Ellipse Curve Configuration object. + * @param data The JSON object containing this curve data. + */ + static fromJSON(data: Phaser.Types.Curves.JSONEllipseCurve): Phaser.Curves.Ellipse; + + } + + /** + * A LineCurve is a "curve" comprising exactly two points (a line segment). + */ + class Line extends Phaser.Curves.Curve { + /** + * + * @param p0 The first endpoint. + * @param p1 The second endpoint. + */ + constructor(p0: Phaser.Math.Vector2 | number[], p1?: Phaser.Math.Vector2); + + /** + * The first endpoint. + */ + p0: Phaser.Math.Vector2; + + /** + * The second endpoint. + */ + p1: Phaser.Math.Vector2; + + /** + * The quantity of arc length divisions within the curve. + */ + arcLengthDivisions: number; + + /** + * Returns a Rectangle where the position and dimensions match the bounds of this Curve. + * @param out A Rectangle object to store the bounds in. If not given a new Rectangle will be created. + */ + getBounds(out?: O): O; + + /** + * Gets the starting point on the curve. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getStartPoint(out?: O): O; + + /** + * Gets the resolution of the line. + * @param divisions The number of divisions to consider. Default 1. + */ + getResolution(divisions?: number): number; + + /** + * Get point at relative position in curve according to length. + * @param t The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPoint(t: number, out?: O): O; + + /** + * Gets a point at a given position on the line. + * @param u The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPointAt(u: number, out?: O): O; + + /** + * Gets the slope of the line as a unit vector. + * @param t The relative position on the line, [0..1]. + * @param out A vector to store the result in. + */ + getTangent(t?: number, out?: O): O; + + /** + * Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant. + * @param u A float between 0 and 1. + * @param distance The distance, in pixels. + * @param divisions Optional amount of divisions. + */ + getUtoTmapping(u: number, distance: number, divisions?: number): number; + + /** + * Draws this curve on the given Graphics object. + * + * The curve is drawn using `Graphics.lineBetween` so will be drawn at whatever the present Graphics line color is. + * The Graphics object is not cleared before the draw, so the curve will appear on-top of anything else already rendered to it. + * @param graphics The Graphics instance onto which this curve will be drawn. + */ + draw(graphics: G): G; + + /** + * Gets a JSON representation of the line. + */ + toJSON(): Phaser.Types.Curves.JSONCurve; + + /** + * Configures this line from a JSON representation. + * @param data The JSON object containing this curve data. + */ + static fromJSON(data: Phaser.Types.Curves.JSONCurve): Phaser.Curves.Line; + + } + + /** + * A MoveTo Curve is a very simple curve consisting of only a single point. + * Its intended use is to move the ending point in a Path. + */ + class MoveTo { + /** + * + * @param x `x` pixel coordinate. Default 0. + * @param y `y` pixel coordinate. Default 0. + */ + constructor(x?: number, y?: number); + + /** + * Denotes that this Curve does not influence the bounds, points, and drawing of its parent Path. Must be `false` or some methods in the parent Path will throw errors. + */ + active: boolean; + + /** + * The lone point which this curve consists of. + */ + p0: Phaser.Math.Vector2; + + /** + * Get point at relative position in curve according to length. + * @param t The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPoint(t: number, out?: O): O; + + /** + * Retrieves the point at given position in the curve. This will always return this curve's only point. + * @param u The position in the path to retrieve, between 0 and 1. Not used. + * @param out An optional vector in which to store the point. + */ + getPointAt(u: number, out?: O): O; + + /** + * Gets the resolution of this curve. + */ + getResolution(): number; + + /** + * Gets the length of this curve. + */ + getLength(): number; + + /** + * Converts this curve into a JSON-serializable object. + */ + toJSON(): Phaser.Types.Curves.JSONCurve; + + } + + /** + * A Path combines multiple Curves into one continuous compound curve. + * It does not matter how many Curves are in the Path or what type they are. + * + * A Curve in a Path does not have to start where the previous Curve ends - that is to say, a Path does not + * have to be an uninterrupted curve. Only the order of the Curves influences the actual points on the Path. + */ + class Path { + /** + * + * @param x The X coordinate of the Path's starting point or a {@link Phaser.Types.Curves.JSONPath}. Default 0. + * @param y The Y coordinate of the Path's starting point. Default 0. + */ + constructor(x?: number, y?: number); + + /** + * The name of this Path. + * Empty by default and never populated by Phaser, this is left for developers to use. + */ + name: string; + + /** + * The default number of divisions within a curve. + */ + defaultDivisions: number; + + /** + * The list of Curves which make up this Path. + */ + curves: Phaser.Curves.Curve[]; + + /** + * The cached length of each Curve in the Path. + * + * Used internally by {@link #getCurveLengths}. + */ + cacheLengths: number[]; + + /** + * Automatically closes the path. + */ + autoClose: boolean; + + /** + * The starting point of the Path. + * + * This is not necessarily equivalent to the starting point of the first Curve in the Path. In an empty Path, it's also treated as the ending point. + */ + startPoint: Phaser.Math.Vector2; + + /** + * Appends a Curve to the end of the Path. + * + * The Curve does not have to start where the Path ends or, for an empty Path, at its defined starting point. + * @param curve The Curve to append. + */ + add(curve: Phaser.Curves.Curve): this; + + /** + * Creates a circular Ellipse Curve positioned at the end of the Path. + * @param radius The radius of the circle. + * @param clockwise `true` to create a clockwise circle as opposed to a counter-clockwise circle. Default false. + * @param rotation The rotation of the circle in degrees. Default 0. + */ + circleTo(radius: number, clockwise?: boolean, rotation?: number): this; + + /** + * Ensures that the Path is closed. + * + * A closed Path starts and ends at the same point. If the Path is not closed, a straight Line Curve will be created from the ending point directly to the starting point. During the check, the actual starting point of the Path, i.e. the starting point of the first Curve, will be used as opposed to the Path's defined {@link startPoint}, which could differ. + * + * Calling this method on an empty Path will result in an error. + */ + closePath(): this; + + /** + * Creates a cubic bezier curve starting at the previous end point and ending at p3, using p1 and p2 as control points. + * @param x The x coordinate of the end point. Or, if a Vector2, the p1 value. + * @param y The y coordinate of the end point. Or, if a Vector2, the p2 value. + * @param control1X The x coordinate of the first control point. Or, if a Vector2, the p3 value. + * @param control1Y The y coordinate of the first control point. Not used if Vector2s are provided as the first 3 arguments. + * @param control2X The x coordinate of the second control point. Not used if Vector2s are provided as the first 3 arguments. + * @param control2Y The y coordinate of the second control point. Not used if Vector2s are provided as the first 3 arguments. + */ + cubicBezierTo(x: number | Phaser.Math.Vector2, y: number | Phaser.Math.Vector2, control1X: number | Phaser.Math.Vector2, control1Y?: number, control2X?: number, control2Y?: number): this; + + /** + * Creates a Quadratic Bezier Curve starting at the ending point of the Path. + * @param x The X coordinate of the second control point or, if it's a `Vector2`, the first control point. + * @param y The Y coordinate of the second control point or, if `x` is a `Vector2`, the second control point. + * @param controlX If `x` is not a `Vector2`, the X coordinate of the first control point. + * @param controlY If `x` is not a `Vector2`, the Y coordinate of the first control point. + */ + quadraticBezierTo(x: number | Phaser.Math.Vector2[], y?: number, controlX?: number, controlY?: number): this; + + /** + * Draws all Curves in the Path to a Graphics Game Object. + * @param graphics The Graphics Game Object to draw to. + * @param pointsTotal The number of points to draw for each Curve. Higher numbers result in a smoother curve but require more processing. Default 32. + */ + draw(graphics: Phaser.GameObjects.Graphics, pointsTotal?: number): G; + + /** + * Creates an ellipse curve positioned at the previous end point, using the given parameters. + * @param xRadius The horizontal radius of ellipse. Default 0. + * @param yRadius The vertical radius of ellipse. Default 0. + * @param startAngle The start angle of the ellipse, in degrees. Default 0. + * @param endAngle The end angle of the ellipse, in degrees. Default 360. + * @param clockwise Whether the ellipse angles are given as clockwise (`true`) or counter-clockwise (`false`). Default false. + * @param rotation The rotation of the ellipse, in degrees. Default 0. + */ + ellipseTo(xRadius?: number, yRadius?: number, startAngle?: number, endAngle?: number, clockwise?: boolean, rotation?: number): this; + + /** + * Creates a Path from a Path Configuration object. + * + * The provided object should be a {@link Phaser.Types.Curves.JSONPath}, as returned by {@link #toJSON}. Providing a malformed object may cause errors. + * @param data The JSON object containing the Path data. + */ + fromJSON(data: Phaser.Types.Curves.JSONPath): this; + + /** + * Returns a Rectangle with a position and size matching the bounds of this Path. + * @param out The Rectangle to store the bounds in. + * @param accuracy The accuracy of the bounds calculations. Higher values are more accurate at the cost of calculation speed. Default 16. + */ + getBounds(out?: O, accuracy?: number): O; + + /** + * Returns an array containing the length of the Path at the end of each Curve. + * + * The result of this method will be cached to avoid recalculating it in subsequent calls. The cache is only invalidated when the {@link #curves} array changes in length, leading to potential inaccuracies if a Curve in the Path is changed, or if a Curve is removed and another is added in its place. + */ + getCurveLengths(): number[]; + + /** + * Returns the Curve that forms the Path at the given normalized location (between 0 and 1). + * @param t The normalized location on the Path, between 0 and 1. + */ + getCurveAt(t: number): Phaser.Curves.Curve | null; + + /** + * Returns the ending point of the Path. + * + * A Path's ending point is equivalent to the ending point of the last Curve in the Path. For an empty Path, the ending point is at the Path's defined {@link #startPoint}. + * @param out The object to store the point in. + */ + getEndPoint(out?: O): O; + + /** + * Returns the total length of the Path. + */ + getLength(): number; + + /** + * Calculates the coordinates of the point at the given normalized location (between 0 and 1) on the Path. + * + * The location is relative to the entire Path, not to an individual Curve. A location of 0.5 is always in the middle of the Path and is thus an equal distance away from both its starting and ending points. In a Path with one Curve, it would be in the middle of the Curve; in a Path with two Curves, it could be anywhere on either one of them depending on their lengths. + * @param t The location of the point to return, between 0 and 1. + * @param out The object in which to store the calculated point. + */ + getPoint(t: number, out?: O): O; + + /** + * Get a sequence of points on the path. + * @param divisions The number of divisions to make per resolution per curve. + * @param stepRate The curve distance between points per curve, implying `divisions`. + */ + getPoints(divisions?: number, stepRate?: number): Phaser.Math.Vector2[]; + + /** + * Returns a randomly chosen point anywhere on the path. This follows the same rules as `getPoint` in that it may return a point on any Curve inside this path. + * + * When calling this method multiple times, the points are not guaranteed to be equally spaced spatially. + * @param out `Vector2` instance that should be used for storing the result. If `undefined` a new `Vector2` will be created. + */ + getRandomPoint(out?: O): O; + + /** + * Divides this Path into a set of equally spaced points, + * + * The resulting points are equally spaced with respect to the points' position on the path, but not necessarily equally spaced spatially. + * @param divisions The amount of points to divide this Path into. Default 40. + */ + getSpacedPoints(divisions?: number): Phaser.Math.Vector2[]; + + /** + * Returns the starting point of the Path. + * @param out `Vector2` instance that should be used for storing the result. If `undefined` a new `Vector2` will be created. + */ + getStartPoint(out?: O): O; + + /** + * Gets a unit vector tangent at a relative position on the path. + * @param t The relative position on the path, [0..1]. + * @param out A vector to store the result in. + */ + getTangent(t: number, out?: O): O; + + /** + * Creates a line curve from the previous end point to x/y. + * @param x The X coordinate of the line's end point, or a `Vector2` / `Vector2Like` containing the entire end point. + * @param y The Y coordinate of the line's end point, if a number was passed as the X parameter. + */ + lineTo(x: number | Phaser.Math.Vector2 | Phaser.Types.Math.Vector2Like, y?: number): this; + + /** + * Creates a spline curve starting at the previous end point, using the given points on the curve. + * @param points The points the newly created spline curve should consist of. + */ + splineTo(points: Phaser.Math.Vector2[]): this; + + /** + * Creates a "gap" in this path from the path's current end point to the given coordinates. + * + * After calling this function, this Path's end point will be equal to the given coordinates + * @param x The X coordinate of the position to move the path's end point to, or a `Vector2` / `Vector2Like` containing the entire new end point. + * @param y The Y coordinate of the position to move the path's end point to, if a number was passed as the X coordinate. + */ + moveTo(x: number | Phaser.Math.Vector2 | Phaser.Types.Math.Vector2Like, y?: number): this; + + /** + * Converts this Path to a JSON object containing the path information and its constituent curves. + */ + toJSON(): Phaser.Types.Curves.JSONPath; + + /** + * cacheLengths must be recalculated. + */ + updateArcLengths(): void; + + /** + * Disposes of this Path, clearing its internal references to objects so they can be garbage-collected. + */ + destroy(): void; + + } + + /** + * A quadratic Bézier curve constructed from two control points. + */ + class QuadraticBezier extends Phaser.Curves.Curve { + /** + * + * @param p0 Start point, or an array of point pairs. + * @param p1 Control Point 1. + * @param p2 Control Point 2. + */ + constructor(p0: Phaser.Math.Vector2 | number[], p1: Phaser.Math.Vector2, p2: Phaser.Math.Vector2); + + /** + * The start point. + */ + p0: Phaser.Math.Vector2; + + /** + * The first control point. + */ + p1: Phaser.Math.Vector2; + + /** + * The second control point. + */ + p2: Phaser.Math.Vector2; + + /** + * Gets the starting point on the curve. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getStartPoint(out?: O): O; + + /** + * Get the resolution of the curve. + * @param divisions Optional divisions value. + */ + getResolution(divisions: number): number; + + /** + * Get point at relative position in curve according to length. + * @param t The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPoint(t: number, out?: O): O; + + /** + * Draws this curve on the given Graphics object. + * + * The curve is drawn using `Graphics.strokePoints` so will be drawn at whatever the present Graphics stroke color is. + * The Graphics object is not cleared before the draw, so the curve will appear on-top of anything else already rendered to it. + * @param graphics `Graphics` object to draw onto. + * @param pointsTotal Number of points to be used for drawing the curve. Higher numbers result in smoother curve but require more processing. Default 32. + */ + draw(graphics: G, pointsTotal?: number): G; + + /** + * Converts the curve into a JSON compatible object. + */ + toJSON(): Phaser.Types.Curves.JSONCurve; + + /** + * Creates a curve from a JSON object, e. g. created by `toJSON`. + * @param data The JSON object containing this curve data. + */ + static fromJSON(data: Phaser.Types.Curves.JSONCurve): Phaser.Curves.QuadraticBezier; + + } + + /** + * Create a smooth 2d spline curve from a series of points. + */ + class Spline extends Phaser.Curves.Curve { + /** + * + * @param points The points that configure the curve. + */ + constructor(points?: Phaser.Math.Vector2[] | number[] | number[][]); + + /** + * The Vector2 points that configure the curve. + */ + points: Phaser.Math.Vector2[]; + + /** + * Add a list of points to the current list of Vector2 points of the curve. + * @param points The points that configure the curve. + */ + addPoints(points: Phaser.Math.Vector2[] | number[] | number[][]): this; + + /** + * Add a point to the current list of Vector2 points of the curve. + * @param x The x coordinate of this curve + * @param y The y coordinate of this curve + */ + addPoint(x: number, y: number): Phaser.Math.Vector2; + + /** + * Gets the starting point on the curve. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getStartPoint(out?: O): O; + + /** + * Get the resolution of the curve. + * @param divisions Optional divisions value. + */ + getResolution(divisions: number): number; + + /** + * Get point at relative position in curve according to length. + * @param t The position along the curve to return. Where 0 is the start and 1 is the end. + * @param out A Vector2 object to store the result in. If not given will be created. + */ + getPoint(t: number, out?: O): O; + + /** + * Exports a JSON object containing this curve data. + */ + toJSON(): Phaser.Types.Curves.JSONCurve; + + /** + * Imports a JSON object containing this curve data. + * @param data The JSON object containing this curve data. + */ + static fromJSON(data: Phaser.Types.Curves.JSONCurve): Phaser.Curves.Spline; + + } + + } + + namespace Data { + /** + * The Data Manager Component features a means to store pieces of data specific to a Game Object, System or Plugin. + * You can then search, query it, and retrieve the data. The parent must either extend EventEmitter, + * or have a property called `events` that is an instance of it. + */ + class DataManager { + /** + * + * @param parent The object that this DataManager belongs to. + * @param eventEmitter The DataManager's event emitter. + */ + constructor(parent: object, eventEmitter?: Phaser.Events.EventEmitter); + + /** + * The object that this DataManager belongs to. + */ + parent: any; + + /** + * The DataManager's event emitter. + */ + events: Phaser.Events.EventEmitter; + + /** + * The data list. + */ + list: {[key: string]: any}; + + /** + * The public values list. You can use this to access anything you have stored + * in this Data Manager. For example, if you set a value called `gold` you can + * access it via: + * + * ```javascript + * this.data.values.gold; + * ``` + * + * You can also modify it directly: + * + * ```javascript + * this.data.values.gold += 1000; + * ``` + * + * Doing so will emit a `setdata` event from the parent of this Data Manager. + * + * Do not modify this object directly. Adding properties directly to this object will not + * emit any events. Always use `DataManager.set` to create new items the first time around. + */ + values: {[key: string]: any}; + + /** + * Retrieves the value for the given key, or undefined if it doesn't exist. + * + * You can also access values via the `values` object. For example, if you had a key called `gold` you can do either: + * + * ```javascript + * this.data.get('gold'); + * ``` + * + * Or access the value directly: + * + * ```javascript + * this.data.values.gold; + * ``` + * + * You can also pass in an array of keys, in which case an array of values will be returned: + * + * ```javascript + * this.data.get([ 'gold', 'armor', 'health' ]); + * ``` + * + * This approach is useful for destructuring arrays in ES6. + * @param key The key of the value to retrieve, or an array of keys. + */ + get(key: string | string[]): any; + + /** + * Retrieves all data values in a new object. + */ + getAll(): {[key: string]: any}; + + /** + * Queries the DataManager for the values of keys matching the given regular expression. + * @param search A regular expression object. If a non-RegExp object obj is passed, it is implicitly converted to a RegExp by using new RegExp(obj). + */ + query(search: RegExp): {[key: string]: any}; + + /** + * Sets a value for the given key. If the key doesn't already exist in the Data Manager then it is created. + * + * ```javascript + * data.set('name', 'Red Gem Stone'); + * ``` + * + * You can also pass in an object of key value pairs as the first argument: + * + * ```javascript + * data.set({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 }); + * ``` + * + * To get a value back again you can call `get`: + * + * ```javascript + * data.get('gold'); + * ``` + * + * Or you can access the value directly via the `values` property, where it works like any other variable: + * + * ```javascript + * data.values.gold += 50; + * ``` + * + * When the value is first set, a `setdata` event is emitted. + * + * If the key already exists, a `changedata` event is emitted instead, along an event named after the key. + * For example, if you updated an existing key called `PlayerLives` then it would emit the event `changedata-PlayerLives`. + * These events will be emitted regardless if you use this method to set the value, or the direct `values` setter. + * + * Please note that the data keys are case-sensitive and must be valid JavaScript Object property strings. + * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager. + * @param key The key to set the value for. Or an object of key value pairs. If an object the `data` argument is ignored. + * @param data The value to set for the given key. If an object is provided as the key this argument is ignored. + */ + set(key: (string|T), data?: any): this; + + /** + * Increase a value for the given key. If the key doesn't already exist in the Data Manager then it is increased from 0. + * + * When the value is first set, a `setdata` event is emitted. + * @param key The key to change the value for. + * @param amount The amount to increase the given key by. Pass a negative value to decrease the key. Default 1. + */ + inc(key: string, amount?: number): this; + + /** + * Toggle a boolean value for the given key. If the key doesn't already exist in the Data Manager then it is toggled from false. + * + * When the value is first set, a `setdata` event is emitted. + * @param key The key to toggle the value for. + */ + toggle(key: string): this; + + /** + * Passes all data entries to the given callback. + * @param callback The function to call. + * @param context Value to use as `this` when executing callback. + * @param args Additional arguments that will be passed to the callback, after the game object, key, and data. + */ + each(callback: DataEachCallback, context?: any, ...args: any[]): this; + + /** + * Merge the given object of key value pairs into this DataManager. + * + * Any newly created values will emit a `setdata` event. Any updated values (see the `overwrite` argument) + * will emit a `changedata` event. + * @param data The data to merge. + * @param overwrite Whether to overwrite existing data. Defaults to true. Default true. + */ + merge(data: {[key: string]: any}, overwrite?: boolean): this; + + /** + * Remove the value for the given key. + * + * If the key is found in this Data Manager it is removed from the internal lists and a + * `removedata` event is emitted. + * + * You can also pass in an array of keys, in which case all keys in the array will be removed: + * + * ```javascript + * this.data.remove([ 'gold', 'armor', 'health' ]); + * ``` + * @param key The key to remove, or an array of keys to remove. + */ + remove(key: string | string[]): this; + + /** + * Retrieves the data associated with the given 'key', deletes it from this Data Manager, then returns it. + * @param key The key of the value to retrieve and delete. + */ + pop(key: string): any; + + /** + * Determines whether the given key is set in this Data Manager. + * + * Please note that the keys are case-sensitive and must be valid JavaScript Object property strings. + * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager. + * @param key The key to check. + */ + has(key: string): boolean; + + /** + * Freeze or unfreeze this Data Manager. A frozen Data Manager will block all attempts + * to create new values or update existing ones. + * @param value Whether to freeze or unfreeze the Data Manager. + */ + setFreeze(value: boolean): this; + + /** + * Delete all data in this Data Manager and unfreeze it. + */ + reset(): this; + + /** + * Destroy this data manager. + */ + destroy(): void; + + /** + * Gets or sets the frozen state of this Data Manager. + * A frozen Data Manager will block all attempts to create new values or update existing ones. + */ + freeze: boolean; + + /** + * Return the total number of entries in this Data Manager. + */ + count: number; + + } + + /** + * The Data Component features a means to store pieces of data specific to a Game Object, System or Plugin. + * You can then search, query it, and retrieve the data. The parent must either extend EventEmitter, + * or have a property called `events` that is an instance of it. + */ + class DataManagerPlugin extends Phaser.Data.DataManager { + /** + * + * @param scene A reference to the Scene that this DataManager belongs to. + */ + constructor(scene: Phaser.Scene); + + /** + * A reference to the Scene that this DataManager belongs to. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene's Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * The Scene that owns this plugin is being destroyed. + * We need to shutdown and then kill off all external references. + */ + destroy(): void; + + } + + namespace Events { + /** + * The Change Data Event. + * + * This event is dispatched by a Data Manager when an item in the data store is changed. + * + * Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for + * a change data event from a Game Object you would use: `sprite.on('changedata', listener)`. + * + * This event is dispatched for all items that change in the Data Manager. + * To listen for the change of a specific item, use the `CHANGE_DATA_KEY_EVENT` event. + */ + const CHANGE_DATA: string; + + /** + * The Change Data Key Event. + * + * This event is dispatched by a Data Manager when an item in the data store is changed. + * + * Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for + * the change of a specific data item from a Game Object you would use: `sprite.on('changedata-key', listener)`, + * where `key` is the unique string key of the data item. For example, if you have a data item stored called `gold` + * then you can listen for `sprite.on('changedata-gold')`. + */ + const CHANGE_DATA_KEY: string; + + /** + * The Data Manager Destroy Event. + * + * The Data Manager will listen for the destroy event from its parent, and then close itself down. + */ + const DESTROY: string; + + /** + * The Remove Data Event. + * + * This event is dispatched by a Data Manager when an item is removed from it. + * + * Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for + * the removal of a data item on a Game Object you would use: `sprite.on('removedata', listener)`. + */ + const REMOVE_DATA: string; + + /** + * The Set Data Event. + * + * This event is dispatched by a Data Manager when a new item is added to the data store. + * + * Game Objects with data enabled have an instance of a Data Manager under the `data` property. So, to listen for + * the addition of a new data item on a Game Object you would use: `sprite.on('setdata', listener)`. + */ + const SET_DATA: string; + + } + + } + + namespace Device { + /** + * Determines the audio playback capabilities of the device running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.audio` from within any Scene. + */ + type Audio = { + /** + * Can this device play HTML Audio tags? + */ + audioData: boolean; + /** + * Can this device play EC-3 Dolby Digital Plus files? + */ + dolby: boolean; + /** + * Can this device can play m4a files. + */ + m4a: boolean; + /** + * Can this device can play aac files. + */ + aac: boolean; + /** + * Can this device can play flac files. + */ + flac: boolean; + /** + * Can this device play mp3 files? + */ + mp3: boolean; + /** + * Can this device play ogg files? + */ + ogg: boolean; + /** + * Can this device play opus files? + */ + opus: boolean; + /** + * Can this device play wav files? + */ + wav: boolean; + /** + * Does this device have the Web Audio API? + */ + webAudio: boolean; + /** + * Can this device play webm files? + */ + webm: boolean; + }; + + /** + * Determines the browser type and version running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.browser` from within any Scene. + */ + type Browser = { + /** + * Set to true if running in Chrome. + */ + chrome: boolean; + /** + * Set to true if running in Microsoft Edge browser. + */ + edge: boolean; + /** + * Set to true if running in Firefox. + */ + firefox: boolean; + /** + * Set to true if running in Internet Explorer 11 or less (not Edge). + */ + ie: boolean; + /** + * Set to true if running in Mobile Safari. + */ + mobileSafari: boolean; + /** + * Set to true if running in Opera. + */ + opera: boolean; + /** + * Set to true if running in Safari. + */ + safari: boolean; + /** + * Set to true if running in the Silk browser (as used on the Amazon Kindle) + */ + silk: boolean; + /** + * Set to true if running a Trident version of Internet Explorer (IE11+) + */ + trident: boolean; + /** + * If running in Chrome this will contain the major version number. + */ + chromeVersion: number; + /** + * If running in Firefox this will contain the major version number. + */ + firefoxVersion: number; + /** + * If running in Internet Explorer this will contain the major version number. Beyond IE10 you should use Browser.trident and Browser.tridentVersion. + */ + ieVersion: number; + /** + * If running in Safari this will contain the major version number. + */ + safariVersion: number; + /** + * If running in Internet Explorer 11 this will contain the major version number. See {@link http://msdn.microsoft.com/en-us/library/ie/ms537503(v=vs.85).aspx} + */ + tridentVersion: number; + }; + + /** + * Determines the canvas features of the browser running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.canvasFeatures` from within any Scene. + */ + type CanvasFeatures = { + /** + * Set to true if the browser supports inversed alpha. + */ + supportInverseAlpha: boolean; + /** + * Set to true if the browser supports new canvas blend modes. + */ + supportNewBlendModes: boolean; + }; + + /** + * Determines the features of the browser running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.features` from within any Scene. + */ + type Features = { + /** + * Is canvas available? + */ + canvas: boolean; + /** + * True if canvas supports a 'copy' bitblt onto itself when the source and destination regions overlap. + */ + canvasBitBltShift: boolean | null; + /** + * Is file available? + */ + file: boolean; + /** + * Is fileSystem available? + */ + fileSystem: boolean; + /** + * Does the device support the getUserMedia API? + */ + getUserMedia: boolean; + /** + * Is the device big or little endian? (only detected if the browser supports TypedArrays) + */ + littleEndian: boolean; + /** + * Is localStorage available? + */ + localStorage: boolean; + /** + * Is Pointer Lock available? + */ + pointerLock: boolean; + /** + * Is Array.sort stable? + */ + stableSort: boolean; + /** + * Does the device context support 32bit pixel manipulation using array buffer views? + */ + support32bit: boolean; + /** + * Does the device support the Vibration API? + */ + vibration: boolean; + /** + * Is webGL available? + */ + webGL: boolean; + /** + * Is worker available? + */ + worker: boolean; + }; + + /** + * Determines the full screen support of the browser running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.fullscreen` from within any Scene. + */ + type Fullscreen = { + /** + * Does the browser support the Full Screen API? + */ + available: boolean; + /** + * Does the browser support access to the Keyboard during Full Screen mode? + */ + keyboard: boolean; + /** + * If the browser supports the Full Screen API this holds the call you need to use to cancel it. + */ + cancel: string; + /** + * If the browser supports the Full Screen API this holds the call you need to use to activate it. + */ + request: string; + }; + + /** + * Determines the input support of the browser running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.input` from within any Scene. + */ + type Input = { + /** + * The newest type of Wheel/Scroll event supported: 'wheel', 'mousewheel', 'DOMMouseScroll' + */ + wheelType: string | null; + /** + * Is navigator.getGamepads available? + */ + gamepads: boolean; + /** + * Is mspointer available? + */ + mspointer: boolean; + /** + * Is touch available? + */ + touch: boolean; + }; + + /** + * Determines the operating system of the device running this Phaser Game instance. + * These values are read-only and populated during the boot sequence of the game. + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.os` from within any Scene. + */ + type OS = { + /** + * Is running on android? + */ + android: boolean; + /** + * Is running on chromeOS? + */ + chromeOS: boolean; + /** + * Is the game running under Apache Cordova? + */ + cordova: boolean; + /** + * Is the game running under the Intel Crosswalk XDK? + */ + crosswalk: boolean; + /** + * Is running on a desktop? + */ + desktop: boolean; + /** + * Is the game running under Ejecta? + */ + ejecta: boolean; + /** + * Is the game running under GitHub Electron? + */ + electron: boolean; + /** + * Is running on iOS? + */ + iOS: boolean; + /** + * Is running on iPad? + */ + iPad: boolean; + /** + * Is running on iPhone? + */ + iPhone: boolean; + /** + * Is running on an Amazon Kindle? + */ + kindle: boolean; + /** + * Is running on linux? + */ + linux: boolean; + /** + * Is running on macOS? + */ + macOS: boolean; + /** + * Is the game running under Node.js? + */ + node: boolean; + /** + * Is the game running under Node-Webkit? + */ + nodeWebkit: boolean; + /** + * Set to true if running as a WebApp, i.e. within a WebView + */ + webApp: boolean; + /** + * Is running on windows? + */ + windows: boolean; + /** + * Is running on a Windows Phone? + */ + windowsPhone: boolean; + /** + * If running in iOS this will contain the major version number. + */ + iOSVersion: number; + /** + * PixelRatio of the host device? + */ + pixelRatio: number; + }; + + /** + * Determines the video support of the browser running this Phaser Game instance. + * + * These values are read-only and populated during the boot sequence of the game. + * + * They are then referenced by internal game systems and are available for you to access + * via `this.sys.game.device.video` from within any Scene. + * + * In Phaser 3.20 the properties were renamed to drop the 'Video' suffix. + */ + type Video = { + /** + * Can this device play h264 mp4 video files? + */ + h264: boolean; + /** + * Can this device play hls video files? + */ + hls: boolean; + /** + * Can this device play h264 mp4 video files? + */ + mp4: boolean; + /** + * Can this device play m4v (typically mp4) video files? + */ + m4v: boolean; + /** + * Can this device play ogg video files? + */ + ogg: boolean; + /** + * Can this device play vp9 video files? + */ + vp9: boolean; + /** + * Can this device play webm video files? + */ + webm: boolean; + /** + * Returns the first video URL that can be played by this browser. + */ + getVideoURL: Function; + }; + + } + + type DeviceConf = { + /** + * The OS Device functions. + */ + os: Phaser.Device.OS; + /** + * The Browser Device functions. + */ + browser: Phaser.Device.Browser; + /** + * The Features Device functions. + */ + features: Phaser.Device.Features; + /** + * The Input Device functions. + */ + input: Phaser.Device.Input; + /** + * The Audio Device functions. + */ + audio: Phaser.Device.Audio; + /** + * The Video Device functions. + */ + video: Phaser.Device.Video; + /** + * The Fullscreen Device functions. + */ + fullscreen: Phaser.Device.Fullscreen; + /** + * The Canvas Device functions. + */ + canvasFeatures: Phaser.Device.CanvasFeatures; + }; + + namespace Display { + namespace Align { + /** + * A constant representing a top-left alignment or position. + */ + const TOP_LEFT: number; + + /** + * A constant representing a top-center alignment or position. + */ + const TOP_CENTER: number; + + /** + * A constant representing a top-right alignment or position. + */ + const TOP_RIGHT: number; + + /** + * A constant representing a left-top alignment or position. + */ + const LEFT_TOP: number; + + /** + * A constant representing a left-center alignment or position. + */ + const LEFT_CENTER: number; + + /** + * A constant representing a left-bottom alignment or position. + */ + const LEFT_BOTTOM: number; + + /** + * A constant representing a center alignment or position. + */ + const CENTER: number; + + /** + * A constant representing a right-top alignment or position. + */ + const RIGHT_TOP: number; + + /** + * A constant representing a right-center alignment or position. + */ + const RIGHT_CENTER: number; + + /** + * A constant representing a right-bottom alignment or position. + */ + const RIGHT_BOTTOM: number; + + /** + * A constant representing a bottom-left alignment or position. + */ + const BOTTOM_LEFT: number; + + /** + * A constant representing a bottom-center alignment or position. + */ + const BOTTOM_CENTER: number; + + /** + * A constant representing a bottom-right alignment or position. + */ + const BOTTOM_RIGHT: number; + + namespace In { + /** + * Takes given Game Object and aligns it so that it is positioned in the bottom center of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function BottomCenter(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the bottom left of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function BottomLeft(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the bottom right of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function BottomRight(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the center of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function Center(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the left center of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function LeftCenter(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned relative to the other. + * The alignment used is based on the `position` argument, which is an `ALIGN_CONST` value, such as `LEFT_CENTER` or `TOP_RIGHT`. + * @param child The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param position The position to align the Game Object with. This is an align constant, such as `ALIGN_CONST.LEFT_CENTER`. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function QuickSet(child: G, alignIn: Phaser.GameObjects.GameObject, position: number, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the right center of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function RightCenter(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the top center of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function TopCenter(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the top left of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function TopLeft(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned in the top right of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignIn The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function TopRight(gameObject: G, alignIn: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + } + + namespace To { + /** + * Takes given Game Object and aligns it so that it is positioned next to the bottom center position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function BottomCenter(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the bottom left position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function BottomLeft(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the bottom right position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function BottomRight(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the left bottom position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function LeftBottom(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the left center position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function LeftCenter(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the left top position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function LeftTop(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes a Game Object and aligns it next to another, at the given position. + * The alignment used is based on the `position` argument, which is a `Phaser.Display.Align` property such as `LEFT_CENTER` or `TOP_RIGHT`. + * @param child The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param position The position to align the Game Object with. This is an align constant, such as `Phaser.Display.Align.LEFT_CENTER`. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function QuickSet(child: G, alignTo: Phaser.GameObjects.GameObject, position: number, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the right bottom position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function RightBottom(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the right center position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function RightCenter(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the right top position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function RightTop(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the top center position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function TopCenter(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the top left position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function TopLeft(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + /** + * Takes given Game Object and aligns it so that it is positioned next to the top right position of the other. + * @param gameObject The Game Object that will be positioned. + * @param alignTo The Game Object to base the alignment position on. + * @param offsetX Optional horizontal offset from the position. Default 0. + * @param offsetY Optional vertical offset from the position. Default 0. + */ + function TopRight(gameObject: G, alignTo: Phaser.GameObjects.GameObject, offsetX?: number, offsetY?: number): G; + + } + + } + + namespace Bounds { + /** + * Positions the Game Object so that it is centered on the given coordinates. + * @param gameObject The Game Object that will be re-positioned. + * @param x The horizontal coordinate to position the Game Object on. + * @param y The vertical coordinate to position the Game Object on. + */ + function CenterOn(gameObject: G, x: number, y: number): G; + + /** + * Returns the bottom coordinate from the bounds of the Game Object. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetBottom(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the unrotated bounds of the Game Object as a rectangle. + * @param gameObject The Game Object to get the bounds value from. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + function GetBounds(gameObject: Phaser.GameObjects.GameObject, output?: Phaser.Geom.Rectangle | object): Phaser.Geom.Rectangle | object; + + /** + * Returns the center x coordinate from the bounds of the Game Object. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetCenterX(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the center y coordinate from the bounds of the Game Object. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetCenterY(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the left coordinate from the bounds of the Game Object. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetLeft(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the amount the Game Object is visually offset from its x coordinate. + * This is the same as `width * origin.x`. + * This value will only be > 0 if `origin.x` is not equal to zero. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetOffsetX(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the amount the Game Object is visually offset from its y coordinate. + * This is the same as `width * origin.y`. + * This value will only be > 0 if `origin.y` is not equal to zero. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetOffsetY(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the right coordinate from the bounds of the Game Object. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetRight(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Returns the top coordinate from the bounds of the Game Object. + * @param gameObject The Game Object to get the bounds value from. + */ + function GetTop(gameObject: Phaser.GameObjects.GameObject): number; + + /** + * Positions the Game Object so that the bottom of its bounds aligns with the given coordinate. + * @param gameObject The Game Object that will be re-positioned. + * @param value The coordinate to position the Game Object bounds on. + */ + function SetBottom(gameObject: G, value: number): G; + + /** + * Positions the Game Object so that the center top of its bounds aligns with the given coordinate. + * @param gameObject The Game Object that will be re-positioned. + * @param x The coordinate to position the Game Object bounds on. + */ + function SetCenterX(gameObject: G, x: number): G; + + /** + * Positions the Game Object so that the center top of its bounds aligns with the given coordinate. + * @param gameObject The Game Object that will be re-positioned. + * @param y The coordinate to position the Game Object bounds on. + */ + function SetCenterY(gameObject: G, y: number): G; + + /** + * Positions the Game Object so that the left of its bounds aligns with the given coordinate. + * @param gameObject The Game Object that will be re-positioned. + * @param value The coordinate to position the Game Object bounds on. + */ + function SetLeft(gameObject: G, value: number): G; + + /** + * Positions the Game Object so that the left of its bounds aligns with the given coordinate. + * @param gameObject The Game Object that will be re-positioned. + * @param value The coordinate to position the Game Object bounds on. + */ + function SetRight(gameObject: G, value: number): G; + + /** + * Positions the Game Object so that the top of its bounds aligns with the given coordinate. + * @param gameObject The Game Object that will be re-positioned. + * @param value The coordinate to position the Game Object bounds on. + */ + function SetTop(gameObject: G, value: number): G; + + } + + namespace Canvas { + namespace CanvasInterpolation { + /** + * Sets the CSS image-rendering property on the given canvas to be 'crisp' (aka 'optimize contrast' on webkit). + * @param canvas The canvas object to have the style set on. + */ + function setCrisp(canvas: HTMLCanvasElement): HTMLCanvasElement; + + /** + * Sets the CSS image-rendering property on the given canvas to be 'bicubic' (aka 'auto'). + * @param canvas The canvas object to have the style set on. + */ + function setBicubic(canvas: HTMLCanvasElement): HTMLCanvasElement; + + } + + /** + * The CanvasPool is a global static object, that allows Phaser to recycle and pool 2D Context Canvas DOM elements. + * It does not pool WebGL Contexts, because once the context options are set they cannot be modified again, + * which is useless for some of the Phaser pipelines / renderer. + * + * This singleton is instantiated as soon as Phaser loads, before a Phaser.Game instance has even been created. + * Which means all instances of Phaser Games on the same page can share the one single pool. + */ + namespace CanvasPool { + /** + * Creates a new Canvas DOM element, or pulls one from the pool if free. + * @param parent The parent of the Canvas object. + * @param width The width of the Canvas. Default 1. + * @param height The height of the Canvas. Default 1. + * @param canvasType The type of the Canvas. Either `Phaser.CANVAS` or `Phaser.WEBGL`. Default Phaser.CANVAS. + * @param selfParent Use the generated Canvas element as the parent? Default false. + */ + function create(parent: any, width?: number, height?: number, canvasType?: number, selfParent?: boolean): HTMLCanvasElement; + + /** + * Creates a new Canvas DOM element, or pulls one from the pool if free. + * @param parent The parent of the Canvas object. + * @param width The width of the Canvas. Default 1. + * @param height The height of the Canvas. Default 1. + */ + function create2D(parent: any, width?: number, height?: number): HTMLCanvasElement; + + /** + * Creates a new Canvas DOM element, or pulls one from the pool if free. + * @param parent The parent of the Canvas object. + * @param width The width of the Canvas. Default 1. + * @param height The height of the Canvas. Default 1. + */ + function createWebGL(parent: any, width?: number, height?: number): HTMLCanvasElement; + + /** + * Gets the first free canvas index from the pool. + * @param canvasType The type of the Canvas. Either `Phaser.CANVAS` or `Phaser.WEBGL`. Default Phaser.CANVAS. + */ + function first(canvasType?: number): HTMLCanvasElement; + + /** + * Looks up a canvas based on its parent, and if found puts it back in the pool, freeing it up for re-use. + * The canvas has its width and height set to 1, and its parent attribute nulled. + * @param parent The canvas or the parent of the canvas to free. + */ + function remove(parent: any): void; + + /** + * Gets the total number of used canvas elements in the pool. + */ + function total(): number; + + /** + * Gets the total number of free canvas elements in the pool. + */ + function free(): number; + + /** + * Disable context smoothing on any new Canvas element created. + */ + function disableSmoothing(): void; + + /** + * Enable context smoothing on any new Canvas element created. + */ + function enableSmoothing(): void; + + } + + namespace Smoothing { + /** + * Gets the Smoothing Enabled vendor prefix being used on the given context, or null if not set. + * @param context The canvas context to check. + */ + function getPrefix(context: CanvasRenderingContext2D | WebGLRenderingContext): string; + + /** + * Sets the Image Smoothing property on the given context. Set to false to disable image smoothing. + * By default browsers have image smoothing enabled, which isn't always what you visually want, especially + * when using pixel art in a game. Note that this sets the property on the context itself, so that any image + * drawn to the context will be affected. This sets the property across all current browsers but support is + * patchy on earlier browsers, especially on mobile. + * @param context The context on which to enable smoothing. + */ + function enable(context: CanvasRenderingContext2D | WebGLRenderingContext): CanvasRenderingContext2D | WebGLRenderingContext; + + /** + * Sets the Image Smoothing property on the given context. Set to false to disable image smoothing. + * By default browsers have image smoothing enabled, which isn't always what you visually want, especially + * when using pixel art in a game. Note that this sets the property on the context itself, so that any image + * drawn to the context will be affected. This sets the property across all current browsers but support is + * patchy on earlier browsers, especially on mobile. + * @param context The context on which to disable smoothing. + */ + function disable(context: CanvasRenderingContext2D | WebGLRenderingContext): CanvasRenderingContext2D | WebGLRenderingContext; + + /** + * Returns `true` if the given context has image smoothing enabled, otherwise returns `false`. + * Returns null if no smoothing prefix is available. + * @param context The context to check. + */ + function isEnabled(context: CanvasRenderingContext2D | WebGLRenderingContext): boolean | null; + + } + + /** + * Sets the touch-action property on the canvas style. Can be used to disable default browser touch actions. + * @param canvas The canvas element to have the style applied to. + * @param value The touch action value to set on the canvas. Set to `none` to disable touch actions. Default 'none'. + */ + function TouchAction(canvas: HTMLCanvasElement, value?: string): HTMLCanvasElement; + + /** + * Sets the user-select property on the canvas style. Can be used to disable default browser selection actions. + * @param canvas The canvas element to have the style applied to. + * @param value The touch callout value to set on the canvas. Set to `none` to disable touch callouts. Default 'none'. + */ + function UserSelect(canvas: HTMLCanvasElement, value?: string): HTMLCanvasElement; + + } + + namespace Color { + namespace Interpolate { + /** + * Interpolates between the two given color ranges over the length supplied. + * @param r1 Red value. + * @param g1 Blue value. + * @param b1 Green value. + * @param r2 Red value. + * @param g2 Blue value. + * @param b2 Green value. + * @param length Distance to interpolate over. Default 100. + * @param index Index to start from. Default 0. + */ + function RGBWithRGB(r1: number, g1: number, b1: number, r2: number, g2: number, b2: number, length?: number, index?: number): Phaser.Types.Display.ColorObject; + + /** + * Interpolates between the two given color objects over the length supplied. + * @param color1 The first Color object. + * @param color2 The second Color object. + * @param length Distance to interpolate over. Default 100. + * @param index Index to start from. Default 0. + */ + function ColorWithColor(color1: Phaser.Display.Color, color2: Phaser.Display.Color, length?: number, index?: number): Phaser.Types.Display.ColorObject; + + /** + * Interpolates between the Color object and color values over the length supplied. + * @param color1 The first Color object. + * @param r Red value. + * @param g Blue value. + * @param b Green value. + * @param length Distance to interpolate over. Default 100. + * @param index Index to start from. Default 0. + */ + function ColorWithRGB(color1: Phaser.Display.Color, r: number, g: number, b: number, length?: number, index?: number): Phaser.Types.Display.ColorObject; + + } + + } + + /** + * The Color class holds a single color value and allows for easy modification and reading of it. + */ + class Color { + /** + * + * @param red The red color value. A number between 0 and 255. Default 0. + * @param green The green color value. A number between 0 and 255. Default 0. + * @param blue The blue color value. A number between 0 and 255. Default 0. + * @param alpha The alpha value. A number between 0 and 255. Default 255. + */ + constructor(red?: number, green?: number, blue?: number, alpha?: number); + + /** + * An array containing the calculated color values for WebGL use. + */ + gl: number[]; + + /** + * Sets this color to be transparent. Sets all values to zero. + */ + transparent(): Phaser.Display.Color; + + /** + * Sets the color of this Color component. + * @param red The red color value. A number between 0 and 255. + * @param green The green color value. A number between 0 and 255. + * @param blue The blue color value. A number between 0 and 255. + * @param alpha The alpha value. A number between 0 and 255. Default 255. + * @param updateHSV Update the HSV values after setting the RGB values? Default true. + */ + setTo(red: number, green: number, blue: number, alpha?: number, updateHSV?: boolean): Phaser.Display.Color; + + /** + * Sets the red, green, blue and alpha GL values of this Color component. + * @param red The red color value. A number between 0 and 1. + * @param green The green color value. A number between 0 and 1. + * @param blue The blue color value. A number between 0 and 1. + * @param alpha The alpha value. A number between 0 and 1. Default 1. + */ + setGLTo(red: number, green: number, blue: number, alpha?: number): Phaser.Display.Color; + + /** + * Sets the color based on the color object given. + * @param color An object containing `r`, `g`, `b` and optionally `a` values in the range 0 to 255. + */ + setFromRGB(color: Phaser.Types.Display.InputColorObject): Phaser.Display.Color; + + /** + * Sets the color based on the hue, saturation and lightness values given. + * @param h The hue, in the range 0 - 1. This is the base color. + * @param s The saturation, in the range 0 - 1. This controls how much of the hue will be in the final color, where 1 is fully saturated and 0 will give you white. + * @param v The value, in the range 0 - 1. This controls how dark the color is. Where 1 is as bright as possible and 0 is black. + */ + setFromHSV(h: number, s: number, v: number): Phaser.Display.Color; + + /** + * Returns a new Color component using the values from this one. + */ + clone(): Phaser.Display.Color; + + /** + * Sets this Color object to be grayscaled based on the shade value given. + * @param shade A value between 0 and 255. + */ + gray(shade: number): Phaser.Display.Color; + + /** + * Sets this Color object to be a random color between the `min` and `max` values given. + * @param min The minimum random color value. Between 0 and 255. Default 0. + * @param max The maximum random color value. Between 0 and 255. Default 255. + */ + random(min?: number, max?: number): Phaser.Display.Color; + + /** + * Sets this Color object to be a random grayscale color between the `min` and `max` values given. + * @param min The minimum random color value. Between 0 and 255. Default 0. + * @param max The maximum random color value. Between 0 and 255. Default 255. + */ + randomGray(min?: number, max?: number): Phaser.Display.Color; + + /** + * Increase the saturation of this Color by the percentage amount given. + * The saturation is the amount of the base color in the hue. + * @param amount The percentage amount to change this color by. A value between 0 and 100. + */ + saturate(amount: number): Phaser.Display.Color; + + /** + * Decrease the saturation of this Color by the percentage amount given. + * The saturation is the amount of the base color in the hue. + * @param amount The percentage amount to change this color by. A value between 0 and 100. + */ + desaturate(amount: number): Phaser.Display.Color; + + /** + * Increase the lightness of this Color by the percentage amount given. + * @param amount The percentage amount to change this color by. A value between 0 and 100. + */ + lighten(amount: number): Phaser.Display.Color; + + /** + * Decrease the lightness of this Color by the percentage amount given. + * @param amount The percentage amount to change this color by. A value between 0 and 100. + */ + darken(amount: number): Phaser.Display.Color; + + /** + * Brighten this Color by the percentage amount given. + * @param amount The percentage amount to change this color by. A value between 0 and 100. + */ + brighten(amount: number): Phaser.Display.Color; + + /** + * The color of this Color component, not including the alpha channel. + */ + readonly color: number; + + /** + * The color of this Color component, including the alpha channel. + */ + readonly color32: number; + + /** + * The color of this Color component as a string which can be used in CSS color values. + */ + readonly rgba: string; + + /** + * The red color value, normalized to the range 0 to 1. + */ + redGL: number; + + /** + * The green color value, normalized to the range 0 to 1. + */ + greenGL: number; + + /** + * The blue color value, normalized to the range 0 to 1. + */ + blueGL: number; + + /** + * The alpha color value, normalized to the range 0 to 1. + */ + alphaGL: number; + + /** + * The red color value, normalized to the range 0 to 255. + */ + red: number; + + /** + * The green color value, normalized to the range 0 to 255. + */ + green: number; + + /** + * The blue color value, normalized to the range 0 to 255. + */ + blue: number; + + /** + * The alpha color value, normalized to the range 0 to 255. + */ + alpha: number; + + /** + * The hue color value. A number between 0 and 1. + * This is the base color. + */ + h: number; + + /** + * The saturation color value. A number between 0 and 1. + * This controls how much of the hue will be in the final color, where 1 is fully saturated and 0 will give you white. + */ + s: number; + + /** + * The lightness color value. A number between 0 and 1. + * This controls how dark the color is. Where 1 is as bright as possible and 0 is black. + */ + v: number; + + /** + * Return an array of Colors in a Color Spectrum. + * + * The spectrum colors flow in the order: red, yellow, green, blue. + * + * By default this function will return an array with 1024 elements in. + * + * However, you can reduce this to a smaller quantity if needed, by specitying the `limit` parameter. + * @param limit How many colors should be returned? The maximum is 1024 but you can set a smaller quantity if required. Default 1024. + */ + static ColorSpectrum(limit?: number): Phaser.Types.Display.ColorObject[]; + + /** + * Converts the given color value into an Object containing r,g,b and a properties. + * @param color A color value, optionally including the alpha value. + */ + static ColorToRGBA(color: number): Phaser.Types.Display.ColorObject; + + /** + * Returns a string containing a hex representation of the given color component. + * @param color The color channel to get the hex value for, must be a value between 0 and 255. + */ + static ComponentToHex(color: number): string; + + /** + * Given 3 separate color values this will return an integer representation of it. + * @param red The red color value. A number between 0 and 255. + * @param green The green color value. A number between 0 and 255. + * @param blue The blue color value. A number between 0 and 255. + */ + static GetColor(red: number, green: number, blue: number): number; + + /** + * Given an alpha and 3 color values this will return an integer representation of it. + * @param red The red color value. A number between 0 and 255. + * @param green The green color value. A number between 0 and 255. + * @param blue The blue color value. A number between 0 and 255. + * @param alpha The alpha color value. A number between 0 and 255. + */ + static GetColor32(red: number, green: number, blue: number, alpha: number): number; + + /** + * Converts a hex string into a Phaser Color object. + * + * The hex string can supplied as `'#0033ff'` or the short-hand format of `'#03f'`; it can begin with an optional "#" or "0x", or be unprefixed. + * + * An alpha channel is _not_ supported. + * @param hex The hex color value to convert, such as `#0033ff` or the short-hand format: `#03f`. + */ + static HexStringToColor(hex: string): Phaser.Display.Color; + + /** + * Converts HSL (hue, saturation and lightness) values to a Phaser Color object. + * @param h The hue value in the range 0 to 1. + * @param s The saturation value in the range 0 to 1. + * @param l The lightness value in the range 0 to 1. + */ + static HSLToColor(h: number, s: number, l: number): Phaser.Display.Color; + + /** + * Generates an HSV color wheel which is an array of 360 Color objects, for each step of the wheel. + * @param s The saturation, in the range 0 - 1. Default 1. + * @param v The value, in the range 0 - 1. Default 1. + */ + static HSVColorWheel(s?: number, v?: number): Phaser.Types.Display.ColorObject[]; + + /** + * Converts a HSV (hue, saturation and value) color set to RGB. + * + * Conversion formula from https://en.wikipedia.org/wiki/HSL_and_HSV + * + * Assumes HSV values are contained in the set [0, 1]. + * @param h The hue, in the range 0 - 1. This is the base color. + * @param s The saturation, in the range 0 - 1. This controls how much of the hue will be in the final color, where 1 is fully saturated and 0 will give you white. + * @param v The value, in the range 0 - 1. This controls how dark the color is. Where 1 is as bright as possible and 0 is black. + * @param out A Color object to store the results in. If not given a new ColorObject will be created. + */ + static HSVToRGB(h: number, s: number, v: number, out?: Phaser.Types.Display.ColorObject | Phaser.Display.Color): Phaser.Types.Display.ColorObject | Phaser.Display.Color; + + /** + * Converts a hue to an RGB color. + * Based on code by Michael Jackson (https://github.com/mjijackson) + */ + static HueToComponent(p: number, q: number, t: number): number; + + /** + * Converts the given color value into an instance of a Color object. + * @param input The color value to convert into a Color object. + */ + static IntegerToColor(input: number): Phaser.Display.Color; + + /** + * Return the component parts of a color as an Object with the properties alpha, red, green, blue. + * + * Alpha will only be set if it exists in the given color (0xAARRGGBB) + * @param input The color value to convert into a Color object. + */ + static IntegerToRGB(input: number): Phaser.Types.Display.ColorObject; + + /** + * Converts an object containing `r`, `g`, `b` and `a` properties into a Color class instance. + * @param input An object containing `r`, `g`, `b` and `a` properties in the range 0 to 255. + */ + static ObjectToColor(input: Phaser.Types.Display.InputColorObject): Phaser.Display.Color; + + /** + * Creates a new Color object where the r, g, and b values have been set to random values + * based on the given min max values. + * @param min The minimum value to set the random range from (between 0 and 255) Default 0. + * @param max The maximum value to set the random range from (between 0 and 255) Default 255. + */ + static RandomRGB(min?: number, max?: number): Phaser.Display.Color; + + /** + * Converts a CSS 'web' string into a Phaser Color object. + * + * The web string can be in the format `'rgb(r,g,b)'` or `'rgba(r,g,b,a)'` where r/g/b are in the range [0..255] and a is in the range [0..1]. + * @param rgb The CSS format color string, using the `rgb` or `rgba` format. + */ + static RGBStringToColor(rgb: string): Phaser.Display.Color; + + /** + * Converts an RGB color value to HSV (hue, saturation and value). + * Conversion formula from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes RGB values are contained in the set [0, 255] and returns h, s and v in the set [0, 1]. + * Based on code by Michael Jackson (https://github.com/mjijackson) + * @param r The red color value. A number between 0 and 255. + * @param g The green color value. A number between 0 and 255. + * @param b The blue color value. A number between 0 and 255. + * @param out An object to store the color values in. If not given an HSV Color Object will be created. + */ + static RGBToHSV(r: number, g: number, b: number, out?: Phaser.Types.Display.HSVColorObject | Phaser.Display.Color): Phaser.Types.Display.HSVColorObject | Phaser.Display.Color; + + /** + * Converts the color values into an HTML compatible color string, prefixed with either `#` or `0x`. + * @param r The red color value. A number between 0 and 255. + * @param g The green color value. A number between 0 and 255. + * @param b The blue color value. A number between 0 and 255. + * @param a The alpha value. A number between 0 and 255. Default 255. + * @param prefix The prefix of the string. Either `#` or `0x`. Default #. + */ + static RGBToString(r: number, g: number, b: number, a?: number, prefix?: string): string; + + /** + * Converts the given source color value into an instance of a Color class. + * The value can be either a string, prefixed with `rgb` or a hex string, a number or an Object. + * @param input The source color value to convert. + */ + static ValueToColor(input: string | number | Phaser.Types.Display.InputColorObject): Phaser.Display.Color; + + } + + /** + * The ColorMatrix class creates a 5x4 matrix that can be used in shaders and graphics + * operations. It provides methods required to modify the color values, such as adjusting + * the brightness, setting a sepia tone, hue rotation and more. + * + * Use the method `getData` to return a Float32Array containing the current color values. + */ + class ColorMatrix { + /** + * The value that determines how much of the original color is used + * when mixing the colors. A value between 0 (all original) and 1 (all final) + */ + alpha: number; + + /** + * Sets this ColorMatrix from the given array of color values. + * @param value The ColorMatrix values to set. Must have 20 elements. + */ + set(value: number[] | Float32Array): this; + + /** + * Resets the ColorMatrix to default values and also resets + * the `alpha` property back to 1. + */ + reset(): this; + + /** + * Gets the ColorMatrix as a Float32Array. + * + * Can be used directly as a 1fv shader uniform value. + */ + getData(): Float32Array; + + /** + * Changes the brightness of this ColorMatrix by the given amount. + * @param value The amount of brightness to apply to this ColorMatrix. Between 0 (black) and 1. Default 0. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + brightness(value?: number, multiply?: boolean): this; + + /** + * Changes the saturation of this ColorMatrix by the given amount. + * @param value The amount of saturation to apply to this ColorMatrix. Default 0. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + saturate(value?: number, multiply?: boolean): this; + + /** + * Desaturates this ColorMatrix (removes color from it). + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + saturation(multiply?: boolean): this; + + /** + * Rotates the hues of this ColorMatrix by the value given. + * @param rotation The amount of hue rotation to apply to this ColorMatrix, in degrees. Default 0. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + hue(rotation?: number, multiply?: boolean): this; + + /** + * Sets this ColorMatrix to be grayscale. + * @param value The grayscale scale (0 is black). Default 1. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + grayscale(value?: number, multiply?: boolean): this; + + /** + * Sets this ColorMatrix to be black and white. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + blackWhite(multiply?: boolean): this; + + /** + * Change the contrast of this ColorMatrix by the amount given. + * @param value The amount of contrast to apply to this ColorMatrix. Default 0. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + contrast(value?: number, multiply?: boolean): this; + + /** + * Converts this ColorMatrix to have negative values. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + negative(multiply?: boolean): this; + + /** + * Apply a desaturated luminance to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + desaturateLuminance(multiply?: boolean): this; + + /** + * Applies a sepia tone to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + sepia(multiply?: boolean): this; + + /** + * Applies a night vision tone to this ColorMatrix. + * @param intensity The intensity of this effect. Default 0.1. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + night(intensity?: number, multiply?: boolean): this; + + /** + * Applies a trippy color tone to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + lsd(multiply?: boolean): this; + + /** + * Applies a brown tone to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + brown(multiply?: boolean): this; + + /** + * Applies a vintage pinhole color effect to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + vintagePinhole(multiply?: boolean): this; + + /** + * Applies a kodachrome color effect to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + kodachrome(multiply?: boolean): this; + + /** + * Applies a technicolor color effect to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + technicolor(multiply?: boolean): this; + + /** + * Applies a polaroid color effect to this ColorMatrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + polaroid(multiply?: boolean): this; + + /** + * Shifts the values of this ColorMatrix into BGR order. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + shiftToBGR(multiply?: boolean): this; + + /** + * Multiplies the two given matrices. + * @param a The 5x4 array to multiply with ColorMatrix._matrix. + * @param multiply Multiply the resulting ColorMatrix (`true`), or set it (`false`) ? Default false. + */ + multiply(a: number[], multiply?: boolean): this; + + /** + * A constant array used by the ColorMatrix class for black_white operations. + */ + static readonly BLACK_WHITE: number[]; + + /** + * A constant array used by the ColorMatrix class for negative operations. + */ + static readonly NEGATIVE: number[]; + + /** + * A constant array used by the ColorMatrix class for desatured luminance operations. + */ + static readonly DESATURATE_LUMINANCE: number[]; + + /** + * A constant array used by the ColorMatrix class for sepia operations. + */ + static readonly SEPIA: number[]; + + /** + * A constant array used by the ColorMatrix class for lsd operations. + */ + static readonly LSD: number[]; + + /** + * A constant array used by the ColorMatrix class for brown operations. + */ + static readonly BROWN: number[]; + + /** + * A constant array used by the ColorMatrix class for vintage pinhole operations. + */ + static readonly VINTAGE: number[]; + + /** + * A constant array used by the ColorMatrix class for kodachrome operations. + */ + static readonly KODACHROME: number[]; + + /** + * A constant array used by the ColorMatrix class for technicolor operations. + */ + static readonly TECHNICOLOR: number[]; + + /** + * A constant array used by the ColorMatrix class for polaroid shift operations. + */ + static readonly POLAROID: number[]; + + /** + * A constant array used by the ColorMatrix class for shift BGR operations. + */ + static readonly SHIFT_BGR: number[]; + + } + + namespace Masks { + /** + * A Bitmap Mask combines the alpha (opacity) of a masked pixel with the alpha of another pixel. + * Unlike the Geometry Mask, which is a clipping path, a Bitmap Mask behaves like an alpha mask, + * not a clipping path. It is only available when using the WebGL Renderer. + * + * A Bitmap Mask can use any Game Object or Dynamic Texture to determine the alpha of each pixel of the masked Game Object(s). + * For any given point of a masked Game Object's texture, the pixel's alpha will be multiplied by the alpha + * of the pixel at the same position in the Bitmap Mask's Game Object. The color of the pixel from the + * Bitmap Mask doesn't matter. + * + * For example, if a pure blue pixel with an alpha of 0.95 is masked with a pure red pixel with an + * alpha of 0.5, the resulting pixel will be pure blue with an alpha of 0.475. Naturally, this means + * that a pixel in the mask with an alpha of 0 will hide the corresponding pixel in all masked Game Objects. + * A pixel with an alpha of 1 in the masked Game Object will receive the same alpha as the + * corresponding pixel in the mask. + * + * Note: You cannot combine Bitmap Masks and Blend Modes on the same Game Object. You can, however, + * combine Geometry Masks and Blend Modes together. + * + * The Bitmap Mask's location matches the location of its Game Object, not the location of the + * masked objects. Moving or transforming the underlying Game Object will change the mask + * (and affect the visibility of any masked objects), whereas moving or transforming a masked object + * will not affect the mask. + * + * The Bitmap Mask will not render its Game Object by itself. If the Game Object is not in a + * Scene's display list, it will only be used for the mask and its full texture will not be directly + * visible. Adding the underlying Game Object to a Scene will not cause any problems - it will + * render as a normal Game Object and will also serve as a mask. + */ + class BitmapMask { + /** + * + * @param scene The Scene to which this mask is being added. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame); + + /** + * The Game Object that is used as the mask. Must use a texture, such as a Sprite. + */ + bitmapMask: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture; + + /** + * Whether to invert the masks alpha. + * + * If `true`, the alpha of the masking pixel will be inverted before it's multiplied with the masked pixel. + * + * Essentially, this means that a masked area will be visible only if the corresponding area in the mask is invisible. + */ + invertAlpha: boolean; + + /** + * Is this mask a stencil mask? This is false by default and should not be changed. + */ + readonly isStencil: boolean; + + /** + * Sets a new Game Object or Dynamic Texture for this Bitmap Mask to use. + * + * If a Game Object it must have a texture, such as a Sprite. + * + * You can update the source of the mask as often as you like. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If a Game Object, it must have a texture, such as a Sprite. + */ + setBitmap(maskObject: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture): void; + + /** + * Prepares the WebGL Renderer to render a Game Object with this mask applied. + * + * This renders the masking Game Object to the mask framebuffer and switches to the main framebuffer so that the masked Game Object will be rendered to it instead of being rendered directly to the frame. + * @param renderer The WebGL Renderer to prepare. + * @param maskedObject The masked Game Object which will be drawn. + * @param camera The Camera to render to. + */ + preRenderWebGL(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer, maskedObject: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Finalizes rendering of a masked Game Object. + * + * This resets the previously bound framebuffer and switches the WebGL Renderer to the Bitmap Mask Pipeline, which uses a special fragment shader to apply the masking effect. + * @param renderer The WebGL Renderer to clean up. + * @param camera The Camera to render to. + * @param renderTarget Optional WebGL RenderTarget. + */ + postRenderWebGL(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer, camera: Phaser.Cameras.Scene2D.Camera, renderTarget?: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * This is a NOOP method. Bitmap Masks are not supported by the Canvas Renderer. + * @param renderer The Canvas Renderer which would be rendered to. + * @param mask The masked Game Object which would be rendered. + * @param camera The Camera to render to. + */ + preRenderCanvas(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer, mask: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * This is a NOOP method. Bitmap Masks are not supported by the Canvas Renderer. + * @param renderer The Canvas Renderer which would be rendered to. + */ + postRenderCanvas(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer): void; + + /** + * Destroys this BitmapMask and nulls any references it holds. + * + * Note that if a Game Object is currently using this mask it will _not_ automatically detect you have destroyed it, + * so be sure to call `clearMask` on any Game Object using it, before destroying it. + */ + destroy(): void; + + } + + /** + * A Geometry Mask can be applied to a Game Object to hide any pixels of it which don't intersect + * a visible pixel from the geometry mask. The mask is essentially a clipping path which can only + * make a masked pixel fully visible or fully invisible without changing its alpha (opacity). + * + * A Geometry Mask uses a Graphics Game Object to determine which pixels of the masked Game Object(s) + * should be clipped. For any given point of a masked Game Object's texture, the pixel will only be displayed + * if the Graphics Game Object of the Geometry Mask has a visible pixel at the same position. The color and + * alpha of the pixel from the Geometry Mask do not matter. + * + * The Geometry Mask's location matches the location of its Graphics object, not the location of the masked objects. + * Moving or transforming the underlying Graphics object will change the mask (and affect the visibility + * of any masked objects), whereas moving or transforming a masked object will not affect the mask. + * You can think of the Geometry Mask (or rather, of its Graphics object) as an invisible curtain placed + * in front of all masked objects which has its own visual properties and, naturally, respects the camera's + * visual properties, but isn't affected by and doesn't follow the masked objects by itself. + */ + class GeometryMask { + /** + * + * @param scene This parameter is not used. + * @param graphicsGeometry The Graphics Game Object to use for the Geometry Mask. Doesn't have to be in the Display List. + */ + constructor(scene: Phaser.Scene, graphicsGeometry: Phaser.GameObjects.Graphics); + + /** + * The Graphics object which describes the Geometry Mask. + */ + geometryMask: Phaser.GameObjects.Graphics; + + /** + * Similar to the BitmapMasks invertAlpha setting this to true will then hide all pixels + * drawn to the Geometry Mask. + * + * This is a WebGL only feature. + */ + invertAlpha: boolean; + + /** + * Is this mask a stencil mask? + */ + readonly isStencil: boolean; + + /** + * The current stencil level. This can change dynamically at runtime + * and is set in the applyStencil method. + */ + level: boolean; + + /** + * Sets a new Graphics object for the Geometry Mask. + * @param graphicsGeometry The Graphics object which will be used for the Geometry Mask. + */ + setShape(graphicsGeometry: Phaser.GameObjects.Graphics): this; + + /** + * Sets the `invertAlpha` property of this Geometry Mask. + * + * Inverting the alpha essentially flips the way the mask works. + * + * This is a WebGL only feature. + * @param value Invert the alpha of this mask? Default true. + */ + setInvertAlpha(value?: boolean): this; + + /** + * Renders the Geometry Mask's underlying Graphics object to the OpenGL stencil buffer and enables the stencil test, which clips rendered pixels according to the mask. + * @param renderer The WebGL Renderer instance to draw to. + * @param child The Game Object being rendered. + * @param camera The camera the Game Object is being rendered through. + */ + preRenderWebGL(renderer: Phaser.Renderer.WebGL.WebGLRenderer, child: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Applies the current stencil mask to the renderer. + * @param renderer The WebGL Renderer instance to draw to. + * @param camera The camera the Game Object is being rendered through. + * @param inc Is this an INCR stencil or a DECR stencil? + */ + applyStencil(renderer: Phaser.Renderer.WebGL.WebGLRenderer, camera: Phaser.Cameras.Scene2D.Camera, inc: boolean): void; + + /** + * Flushes all rendered pixels and disables the stencil test of a WebGL context, thus disabling the mask for it. + * @param renderer The WebGL Renderer instance to draw flush. + */ + postRenderWebGL(renderer: Phaser.Renderer.WebGL.WebGLRenderer): void; + + /** + * Sets the clipping path of a 2D canvas context to the Geometry Mask's underlying Graphics object. + * @param renderer The Canvas Renderer instance to set the clipping path on. + * @param mask The Game Object being rendered. + * @param camera The camera the Game Object is being rendered through. + */ + preRenderCanvas(renderer: Phaser.Renderer.Canvas.CanvasRenderer, mask: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Restore the canvas context's previous clipping path, thus turning off the mask for it. + * @param renderer The Canvas Renderer instance being restored. + */ + postRenderCanvas(renderer: Phaser.Renderer.Canvas.CanvasRenderer): void; + + /** + * Destroys this GeometryMask and nulls any references it holds. + * + * Note that if a Game Object is currently using this mask it will _not_ automatically detect you have destroyed it, + * so be sure to call `clearMask` on any Game Object using it, before destroying it. + */ + destroy(): void; + + } + + } + + /** + * The RGB class holds a single color value and allows for easy modification and reading of it, + * with optional on-change callback notification and a dirty flag. + */ + class RGB { + /** + * + * @param red The red color value. A number between 0 and 1. Default 0. + * @param green The green color value. A number between 0 and 1. Default 0. + * @param blue The blue color value. A number between 0 and 1. Default 0. + */ + constructor(red?: number, green?: number, blue?: number); + + /** + * This callback will be invoked each time one of the RGB color values change. + * + * The callback is sent the new color values as the parameters. + */ + onChangeCallback: Function; + + /** + * Is this color dirty? + */ + dirty: boolean; + + /** + * Sets the red, green and blue values of this RGB object, flags it as being + * dirty and then invokes the `onChangeCallback`, if set. + * @param red The red color value. A number between 0 and 1. Default 0. + * @param green The green color value. A number between 0 and 1. Default 0. + * @param blue The blue color value. A number between 0 and 1. Default 0. + */ + set(red?: number, green?: number, blue?: number): this; + + /** + * Compares the given rgb parameters with those in this object and returns + * a boolean `true` value if they are equal, otherwise it returns `false`. + * @param red The red value to compare with this object. + * @param green The green value to compare with this object. + * @param blue The blue value to compare with this object. + */ + equals(red: number, green: number, blue: number): boolean; + + /** + * Internal on change handler. Sets this object as being dirty and + * then invokes the `onChangeCallback`, if set, passing in the + * new RGB values. + */ + onChange(): void; + + /** + * The red color value. Between 0 and 1. + * + * Changing this property will flag this RGB object as being dirty + * and invoke the `onChangeCallback` , if set. + */ + r: number; + + /** + * The green color value. Between 0 and 1. + * + * Changing this property will flag this RGB object as being dirty + * and invoke the `onChangeCallback` , if set. + */ + g: number; + + /** + * The blue color value. Between 0 and 1. + * + * Changing this property will flag this RGB object as being dirty + * and invoke the `onChangeCallback` , if set. + */ + b: number; + + /** + * Nulls any external references this object contains. + */ + destroy(): void; + + } + + /** + * A BaseShader is a small resource class that contains the data required for a WebGL Shader to be created. + * + * It contains the raw source code to the fragment and vertex shader, as well as an object that defines + * the uniforms the shader requires, if any. + * + * BaseShaders are stored in the Shader Cache, available in a Scene via `this.cache.shaders` and are referenced + * by a unique key-based string. Retrieve them via `this.cache.shaders.get(key)`. + * + * BaseShaders are created automatically by the GLSL File Loader when loading an external shader resource. + * They can also be created at runtime, allowing you to use dynamically generated shader source code. + * + * Default fragment and vertex source is used if not provided in the constructor, setting-up a basic shader, + * suitable for debug rendering. + */ + class BaseShader { + /** + * + * @param key The key of this shader. Must be unique within the shader cache. + * @param fragmentSrc The fragment source for the shader. + * @param vertexSrc The vertex source for the shader. + * @param uniforms Optional object defining the uniforms the shader uses. + */ + constructor(key: string, fragmentSrc?: string, vertexSrc?: string, uniforms?: any); + + /** + * The key of this shader, unique within the shader cache of this Phaser game instance. + */ + key: string; + + /** + * The source code, as a string, of the fragment shader being used. + */ + fragmentSrc: string; + + /** + * The source code, as a string, of the vertex shader being used. + */ + vertexSrc: string; + + /** + * The default uniforms for this shader. + */ + uniforms: any | null; + + } + + } + + namespace DOM { + /** + * Adds the given element to the DOM. If a parent is provided the element is added as a child of the parent, providing it was able to access it. + * If no parent was given it falls back to using `document.body`. + * @param element The element to be added to the DOM. Usually a Canvas object. + * @param parent The parent in which to add the element. Can be a string which is passed to `getElementById` or an actual DOM object. + */ + function AddToDOM(element: HTMLElement, parent?: string | HTMLElement): HTMLElement; + + /** + * Inspects the readyState of the document. If the document is already complete then it invokes the given callback. + * If not complete it sets up several event listeners such as `deviceready`, and once those fire, it invokes the callback. + * Called automatically by the Phaser.Game instance. Should not usually be accessed directly. + * @param callback The callback to be invoked when the device is ready and the DOM content is loaded. + */ + function DOMContentLoaded(callback: ContentLoadedCallback): void; + + /** + * Attempts to determine the document inner height across iOS and standard devices. + * Based on code by @tylerjpeterson + * @param iOS Is this running on iOS? + */ + function GetInnerHeight(iOS: boolean): number; + + /** + * Attempts to determine the screen orientation using the Orientation API. + * @param width The width of the viewport. + * @param height The height of the viewport. + */ + function GetScreenOrientation(width: number, height: number): string; + + /** + * Attempts to get the target DOM element based on the given value, which can be either + * a string, in which case it will be looked-up by ID, or an element node. If nothing + * can be found it will return a reference to the document.body. + * @param element The DOM element to look-up. + */ + function GetTarget(element: HTMLElement): void; + + /** + * Takes the given data string and parses it as XML. + * First tries to use the window.DOMParser and reverts to the Microsoft.XMLDOM if that fails. + * The parsed XML object is returned, or `null` if there was an error while parsing the data. + * @param data The XML source stored in a string. + */ + function ParseXML(data: string): DOMParser | ActiveXObject | null; + + /** + * Attempts to remove the element from its parentNode in the DOM. + * @param element The DOM element to remove from its parent node. + */ + function RemoveFromDOM(element: HTMLElement): void; + + /** + * Abstracts away the use of RAF or setTimeOut for the core game update loop. + * + * This is invoked automatically by the Phaser.Game instance. + */ + class RequestAnimationFrame { + /** + * True if RequestAnimationFrame is running, otherwise false. + */ + isRunning: boolean; + + /** + * The callback to be invoked each step. + */ + callback: FrameRequestCallback; + + /** + * True if the step is using setTimeout instead of RAF. + */ + isSetTimeOut: boolean; + + /** + * The setTimeout or RAF callback ID used when canceling them. + */ + timeOutID: number | null; + + /** + * The delay rate in ms for setTimeOut. + */ + delay: number; + + /** + * The RAF step function. + * + * Invokes the callback and schedules another call to requestAnimationFrame. + */ + step: FrameRequestCallback; + + /** + * The SetTimeout step function. + * + * Invokes the callback and schedules another call to setTimeout. + */ + stepTimeout: Function; + + /** + * Starts the requestAnimationFrame or setTimeout process running. + * @param callback The callback to invoke each step. + * @param forceSetTimeOut Should it use SetTimeout, even if RAF is available? + * @param delay The setTimeout delay rate in ms. + */ + start(callback: FrameRequestCallback, forceSetTimeOut: boolean, delay: number): void; + + /** + * Stops the requestAnimationFrame or setTimeout from running. + */ + stop(): void; + + /** + * Stops the step from running and clears the callback reference. + */ + destroy(): void; + + } + + } + + namespace Events { + /** + * EventEmitter is a Scene Systems plugin compatible version of eventemitter3. + */ + class EventEmitter { + /** + * Removes all listeners. + */ + shutdown(): void; + + /** + * Removes all listeners. + */ + destroy(): void; + + /** + * Return an array listing the events for which the emitter has registered listeners. + */ + eventNames(): (string|symbol)[]; + + /** + * Return the listeners registered for a given event. + * @param event The event name. + */ + listeners(event: string | symbol): Function[]; + + /** + * Return the number of listeners listening to a given event. + * @param event The event name. + */ + listenerCount(event: string | symbol): number; + + /** + * Calls each of the listeners registered for a given event. + * @param event The event name. + * @param args Additional arguments that will be passed to the event handler. + */ + emit(event: string | symbol, ...args: any[]): boolean; + + /** + * Add a listener for a given event. + * @param event The event name. + * @param fn The listener function. + * @param context The context to invoke the listener with. Default this. + */ + on(event: string | symbol, fn: Function, context?: any): this; + + /** + * Add a listener for a given event. + * @param event The event name. + * @param fn The listener function. + * @param context The context to invoke the listener with. Default this. + */ + addListener(event: string | symbol, fn: Function, context?: any): this; + + /** + * Add a one-time listener for a given event. + * @param event The event name. + * @param fn The listener function. + * @param context The context to invoke the listener with. Default this. + */ + once(event: string | symbol, fn: Function, context?: any): this; + + /** + * Remove the listeners of a given event. + * @param event The event name. + * @param fn Only remove the listeners that match this function. + * @param context Only remove the listeners that have this context. + * @param once Only remove one-time listeners. + */ + removeListener(event: string | symbol, fn?: Function, context?: any, once?: boolean): this; + + /** + * Remove the listeners of a given event. + * @param event The event name. + * @param fn Only remove the listeners that match this function. + * @param context Only remove the listeners that have this context. + * @param once Only remove one-time listeners. + */ + off(event: string | symbol, fn?: Function, context?: any, once?: boolean): this; + + /** + * Remove all listeners, or those of the specified event. + * @param event The event name. + */ + removeAllListeners(event?: string | symbol): this; + + } + + } + + namespace FX { + /** + * The Barrel FX Controller. + * + * This FX controller manages the barrel distortion effect for a Game Object. + * + * A barrel effect allows you to apply either a 'pinch' or 'expand' distortion to + * a Game Object. The amount of the effect can be modified in real-time. + * + * A Barrel effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addBarrel(); + * sprite.postFX.addBarrel(); + * ``` + */ + class Barrel extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param amount The amount of distortion applied to the barrel effect. A value of 1 is no distortion. Typically keep this within +- 1. Default 1. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, amount?: number); + + /** + * The amount of distortion applied to the barrel effect. + * + * Typically keep this within the range 1 (no distortion) to +- 1. + */ + amount: number; + + } + + /** + * The Bloom FX Controller. + * + * This FX controller manages the bloom effect for a Game Object. + * + * Bloom is an effect used to reproduce an imaging artifact of real-world cameras. + * The effect produces fringes of light extending from the borders of bright areas in an image, + * contributing to the illusion of an extremely bright light overwhelming the + * camera or eye capturing the scene. + * + * A Bloom effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addBloom(); + * sprite.postFX.addBloom(); + * ``` + */ + class Bloom extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param color The color of the Bloom, as a hex value. Default 0xffffff. + * @param offsetX The horizontal offset of the bloom effect. Default 1. + * @param offsetY The vertical offset of the bloom effect. Default 1. + * @param blurStrength The strength of the blur process of the bloom effect. Default 1. + * @param strength The strength of the blend process of the bloom effect. Default 1. + * @param steps The number of steps to run the Bloom effect for. This value should always be an integer. Default 4. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, color?: number, offsetX?: number, offsetY?: number, blurStrength?: number, strength?: number, steps?: number); + + /** + * The number of steps to run the Bloom effect for. + * + * This value should always be an integer. + * + * It defaults to 4. The higher the value, the smoother the Bloom, + * but at the cost of exponentially more gl operations. + * + * Keep this to the lowest possible number you can have it, while + * still looking correct for your game. + */ + steps: number; + + /** + * The horizontal offset of the bloom effect. + */ + offsetX: number; + + /** + * The vertical offset of the bloom effect. + */ + offsetY: number; + + /** + * The strength of the blur process of the bloom effect. + */ + blurStrength: number; + + /** + * The strength of the blend process of the bloom effect. + */ + strength: number; + + /** + * The internal gl color array. + */ + glcolor: number[]; + + /** + * The color of the bloom as a number value. + */ + color: number; + + } + + /** + * The Blur FX Controller. + * + * This FX controller manages the blur effect for a Game Object. + * + * A Gaussian blur is the result of blurring an image by a Gaussian function. It is a widely used effect, + * typically to reduce image noise and reduce detail. The visual effect of this blurring technique is a + * smooth blur resembling that of viewing the image through a translucent screen, distinctly different + * from the bokeh effect produced by an out-of-focus lens or the shadow of an object under usual illumination. + * + * A Blur effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addBlur(); + * sprite.postFX.addBlur(); + * ``` + */ + class Blur extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param quality The quality of the blur effect. Can be either 0 for Low Quality, 1 for Medium Quality or 2 for High Quality. Default 0. + * @param x The horizontal offset of the blur effect. Default 2. + * @param y The vertical offset of the blur effect. Default 2. + * @param strength The strength of the blur effect. Default 1. + * @param color The color of the blur, as a hex value. Default 0xffffff. + * @param steps The number of steps to run the blur effect for. This value should always be an integer. Default 4. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, quality?: number, x?: number, y?: number, strength?: number, color?: number, steps?: number); + + /** + * The quality of the blur effect. + * + * This can be: + * + * 0 for Low Quality + * 1 for Medium Quality + * 2 for High Quality + * + * The higher the quality, the more complex shader is used + * and the more processing time is spent on the GPU calculating + * the final blur. This value is used in conjunction with the + * `steps` value, as one has a direct impact on the other. + * + * Keep this value as low as you can, while still achieving the + * desired effect you need for your game. + */ + quality: number; + + /** + * The horizontal offset of the blur effect. + */ + x: number; + + /** + * The vertical offset of the blur effect. + */ + y: number; + + /** + * The number of steps to run the Blur effect for. + * + * This value should always be an integer. + * + * It defaults to 4. The higher the value, the smoother the blur, + * but at the cost of exponentially more gl operations. + * + * Keep this to the lowest possible number you can have it, while + * still looking correct for your game. + */ + steps: number; + + /** + * The strength of the blur effect. + */ + strength: number; + + /** + * The internal gl color array. + */ + glcolor: number[]; + + /** + * The color of the blur as a number value. + */ + color: number; + + } + + /** + * The Bokeh FX Controller. + * + * This FX controller manages the bokeh effect for a Game Object. + * + * Bokeh refers to a visual effect that mimics the photographic technique of creating a shallow depth of field. + * This effect is used to emphasize the game's main subject or action, by blurring the background or foreground + * elements, resulting in a more immersive and visually appealing experience. It is achieved through rendering + * techniques that simulate the out-of-focus areas, giving a sense of depth and realism to the game's graphics. + * + * This effect can also be used to generate a Tilt Shift effect, which is a technique used to create a miniature + * effect by blurring everything except a small area of the image. This effect is achieved by blurring the + * top and bottom elements, while keeping the center area in focus. + * + * A Bokeh effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addBokeh(); + * sprite.postFX.addBokeh(); + * ``` + */ + class Bokeh extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param radius The radius of the bokeh effect. Default 0.5. + * @param amount The amount of the bokeh effect. Default 1. + * @param contrast The color contrast of the bokeh effect. Default 0.2. + * @param isTiltShift Is this a bokeh or Tile Shift effect? Default false. + * @param blurX If Tilt Shift, the amount of horizontal blur. Default 1. + * @param blurY If Tilt Shift, the amount of vertical blur. Default 1. + * @param strength If Tilt Shift, the strength of the blur. Default 1. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, radius?: number, amount?: number, contrast?: number, isTiltShift?: boolean, blurX?: number, blurY?: number, strength?: number); + + /** + * The radius of the bokeh effect. + * + * This is a float value, where a radius of 0 will result in no effect being applied, + * and a radius of 1 will result in a strong bokeh. However, you can exceed this value + * for even stronger effects. + */ + radius: number; + + /** + * The amount, or strength, of the bokeh effect. Defaults to 1. + */ + amount: number; + + /** + * The color contrast, or brightness, of the bokeh effect. Defaults to 0.2. + */ + contrast: number; + + /** + * Is this a Tilt Shift effect or a standard bokeh effect? + */ + isTiltShift: boolean; + + /** + * If a Tilt Shift effect this controls the strength of the blur. + * + * Setting this value on a non-Tilt Shift effect will have no effect. + */ + strength: number; + + /** + * If a Tilt Shift effect this controls the amount of horizontal blur. + * + * Setting this value on a non-Tilt Shift effect will have no effect. + */ + blurX: number; + + /** + * If a Tilt Shift effect this controls the amount of vertical blur. + * + * Setting this value on a non-Tilt Shift effect will have no effect. + */ + blurY: number; + + } + + /** + * The Circle FX Controller. + * + * This FX controller manages the circle effect for a Game Object. + * + * This effect will draw a circle around the texture of the Game Object, effectively masking off + * any area outside of the circle without the need for an actual mask. You can control the thickness + * of the circle, the color of the circle and the color of the background, should the texture be + * transparent. You can also control the feathering applied to the circle, allowing for a harsh or soft edge. + * + * Please note that adding this effect to a Game Object will not change the input area or physics body of + * the Game Object, should it have one. + * + * A Circle effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addCircle(); + * sprite.postFX.addCircle(); + * ``` + */ + class Circle extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param thickness The width of the circle around the texture, in pixels. Default 8. + * @param color The color of the circular ring, given as a number value. Default 0xfeedb6. + * @param backgroundColor The color of the background, behind the texture, given as a number value. Default 0xff0000. + * @param scale The scale of the circle. The default scale is 1, which is a circle the full size of the underlying texture. Default 1. + * @param feather The amount of feathering to apply to the circle from the ring. Default 0.005. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, thickness?: number, color?: number, backgroundColor?: number, scale?: number, feather?: number); + + /** + * The scale of the circle. The default scale is 1, which is a circle + * the full size of the underlying texture. Reduce this value to create + * a smaller circle, or increase it to create a circle that extends off + * the edges of the texture. + */ + scale: number; + + /** + * The amount of feathering to apply to the circle from the ring, + * extending into the middle of the circle. The default is 0.005, + * which is a very low amount of feathering just making sure the ring + * has a smooth edge. Increase this amount to a value such as 0.5 + * or 0.025 for larger amounts of feathering. + */ + feather: number; + + /** + * The width of the circle around the texture, in pixels. This value + * doesn't factor in the feather, which can extend the thickness + * internally depending on its value. + */ + thickness: number; + + /** + * The internal gl color array for the ring color. + */ + glcolor: number[]; + + /** + * The internal gl color array for the background color. + */ + glcolor2: number[]; + + /** + * The color of the circular ring, given as a number value. + */ + color: number; + + /** + * The color of the background, behind the texture, given as a number value. + */ + backgroundColor: number; + + /** + * The alpha of the background, behind the texture, given as a number value. + */ + backgroundAlpha: number; + + } + + /** + * The ColorMatrix FX Controller. + * + * This FX controller manages the color matrix effect for a Game Object. + * + * The color matrix effect is a visual technique that involves manipulating the colors of an image + * or scene using a mathematical matrix. This process can adjust hue, saturation, brightness, and contrast, + * allowing developers to create various stylistic appearances or mood settings within the game. + * Common applications include simulating different lighting conditions, applying color filters, + * or achieving a specific visual style. + * + * A ColorMatrix effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addColorMatrix(); + * sprite.postFX.addColorMatrix(); + * ``` + */ + class ColorMatrix extends Phaser.Display.ColorMatrix { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + */ + constructor(gameObject: Phaser.GameObjects.GameObject); + + /** + * The FX_CONST type of this effect. + */ + type: number; + + /** + * A reference to the Game Object that owns this effect. + */ + gameObject: Phaser.GameObjects.GameObject; + + /** + * Toggle this boolean to enable or disable this effect, + * without removing and adding it from the Game Object. + */ + active: boolean; + + } + + /** + * The Glow FX. + */ + const GLOW: number; + + /** + * The Shadow FX. + */ + const SHADOW: number; + + /** + * The Pixelate FX. + */ + const PIXELATE: number; + + /** + * The Vignette FX. + */ + const VIGNETTE: number; + + /** + * The Shine FX. + */ + const SHINE: number; + + /** + * The Blur FX. + */ + const BLUR: number; + + /** + * The Gradient FX. + */ + const GRADIENT: number; + + /** + * The Bloom FX. + */ + const BLOOM: number; + + /** + * The Color Matrix FX. + */ + const COLOR_MATRIX: number; + + /** + * The Circle FX. + */ + const CIRCLE: number; + + /** + * The Barrel FX. + */ + const BARREL: number; + + /** + * The Displacement FX. + */ + const DISPLACEMENT: number; + + /** + * The Wipe FX. + */ + const WIPE: number; + + /** + * The Bokeh and Tilt Shift FX. + */ + const BOKEH: number; + + /** + * FX Controller is the base class that all built-in FX use. + * + * You should not normally create an instance of this class directly, but instead use one of the built-in FX that extend it. + */ + class Controller { + /** + * + * @param type The FX Type constant. + * @param gameObject A reference to the Game Object that has this fx. + */ + constructor(type: number, gameObject: Phaser.GameObjects.GameObject); + + /** + * The FX_CONST type of this effect. + */ + type: number; + + /** + * A reference to the Game Object that owns this effect. + */ + gameObject: Phaser.GameObjects.GameObject; + + /** + * Toggle this boolean to enable or disable this effect, + * without removing and adding it from the Game Object. + * + * Only works for Pre FX. + * + * Post FX are always active. + */ + active: boolean; + + /** + * Sets the active state of this FX Controller. + * + * A disabled FX Controller will not be updated. + * @param value `true` to enable this FX Controller, or `false` to disable it. + */ + setActive(value: boolean): this; + + /** + * Destroys this FX Controller. + */ + destroy(): void; + + } + + /** + * The Displacement FX Controller. + * + * This FX controller manages the displacement effect for a Game Object. + * + * The displacement effect is a visual technique that alters the position of pixels in an image + * or texture based on the values of a displacement map. This effect is used to create the illusion + * of depth, surface irregularities, or distortion in otherwise flat elements. It can be applied to + * characters, objects, or backgrounds to enhance realism, convey movement, or achieve various + * stylistic appearances. + * + * A Displacement effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addDisplacement(); + * sprite.postFX.addDisplacement(); + * ``` + */ + class Displacement extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param texture The unique string-based key of the texture to use for displacement, which must exist in the Texture Manager. Default '__WHITE'. + * @param x The amount of horizontal displacement to apply. A very small float number, such as 0.005. Default 0.005. + * @param y The amount of vertical displacement to apply. A very small float number, such as 0.005. Default 0.005. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, texture?: string, x?: number, y?: number); + + /** + * The amount of horizontal displacement to apply. + */ + x: number; + + /** + * The amount of vertical displacement to apply. + */ + y: number; + + /** + * The underlying texture used for displacement. + */ + glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Sets the Texture to be used for the displacement effect. + * + * You can only use a whole texture, not a frame from a texture atlas or sprite sheet. + * @param texture The unique string-based key of the texture to use for displacement, which must exist in the Texture Manager. Default '__WHITE'. + */ + setTexture(texture?: string): this; + + } + + /** + * The Glow FX Controller. + * + * This FX controller manages the glow effect for a Game Object. + * + * The glow effect is a visual technique that creates a soft, luminous halo around game objects, + * characters, or UI elements. This effect is used to emphasize importance, enhance visual appeal, + * or convey a sense of energy, magic, or otherworldly presence. The effect can also be set on + * the inside of the Game Object. The color and strength of the glow can be modified. + * + * A Glow effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addGlow(); + * sprite.postFX.addGlow(); + * ``` + */ + class Glow extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param color The color of the glow effect as a number value. Default 0xffffff. + * @param outerStrength The strength of the glow outward from the edge of the Sprite. Default 4. + * @param innerStrength The strength of the glow inward from the edge of the Sprite. Default 0. + * @param knockout If `true` only the glow is drawn, not the texture itself. Default false. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, color?: number, outerStrength?: number, innerStrength?: number, knockout?: boolean); + + /** + * The strength of the glow outward from the edge of the Sprite. + */ + outerStrength: number; + + /** + * The strength of the glow inward from the edge of the Sprite. + */ + innerStrength: number; + + /** + * If `true` only the glow is drawn, not the texture itself. + */ + knockout: number; + + /** + * A 4 element array of gl color values. + */ + glcolor: number[]; + + /** + * The color of the glow as a number value. + */ + color: number; + + } + + /** + * The Gradient FX Controller. + * + * This FX controller manages the gradient effect for a Game Object. + * + * The gradient overlay effect is a visual technique where a smooth color transition is applied over Game Objects, + * such as sprites or UI components. This effect is used to enhance visual appeal, emphasize depth, or create + * stylistic and atmospheric variations. It can also be utilized to convey information, such as representing + * progress or health status through color changes. + * + * A Gradient effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addGradient(); + * sprite.postFX.addGradient(); + * ``` + */ + class Gradient extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param color1 The first gradient color, given as a number value. Default 0xff0000. + * @param color2 The second gradient color, given as a number value. Default 0x00ff00. + * @param alpha The alpha value of the gradient effect. Default 0.2. + * @param fromX The horizontal position the gradient will start from. This value is normalized, between 0 and 1, and is not in pixels. Default 0. + * @param fromY The vertical position the gradient will start from. This value is normalized, between 0 and 1, and is not in pixels. Default 0. + * @param toX The horizontal position the gradient will end at. This value is normalized, between 0 and 1, and is not in pixels. Default 0. + * @param toY The vertical position the gradient will end at. This value is normalized, between 0 and 1, and is not in pixels. Default 1. + * @param size How many 'chunks' the gradient is divided in to, as spread over the entire height of the texture. Leave this at zero for a smooth gradient, or set higher for a more retro chunky effect. Default 0. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, color1?: number, color2?: number, alpha?: number, fromX?: number, fromY?: number, toX?: number, toY?: number, size?: number); + + /** + * The alpha value of the gradient effect. + */ + alpha: number; + + /** + * Sets how many 'chunks' the gradient is divided in to, as spread over the + * entire height of the texture. Leave this at zero for a smooth gradient, + * or set to a higher number to split the gradient into that many sections, giving + * a more banded 'retro' effect. + */ + size: number; + + /** + * The horizontal position the gradient will start from. This value is normalized, between 0 and 1 and is not in pixels. + */ + fromX: number; + + /** + * The vertical position the gradient will start from. This value is normalized, between 0 and 1 and is not in pixels. + */ + fromY: number; + + /** + * The horizontal position the gradient will end. This value is normalized, between 0 and 1 and is not in pixels. + */ + toX: number; + + /** + * The vertical position the gradient will end. This value is normalized, between 0 and 1 and is not in pixels. + */ + toY: number; + + /** + * The internal gl color array for the starting color. + */ + glcolor1: number[]; + + /** + * The internal gl color array for the ending color. + */ + glcolor2: number[]; + + /** + * The first gradient color, given as a number value. + */ + color1: number; + + /** + * The second gradient color, given as a number value. + */ + color2: number; + + } + + /** + * The Pixelate FX Controller. + * + * This FX controller manages the pixelate effect for a Game Object. + * + * The pixelate effect is a visual technique that deliberately reduces the resolution or detail of an image, + * creating a blocky or mosaic appearance composed of large, visible pixels. This effect can be used for stylistic + * purposes, as a homage to retro gaming, or as a means to obscure certain elements within the game, such as + * during a transition or to censor specific content. + * + * A Pixelate effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addPixelate(); + * sprite.postFX.addPixelate(); + * ``` + */ + class Pixelate extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param amount The amount of pixelation to apply. Default 1. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, amount?: number); + + /** + * The amount of pixelation to apply. + */ + amount: number; + + } + + /** + * The Shadow FX Controller. + * + * This FX controller manages the shadow effect for a Game Object. + * + * The shadow effect is a visual technique used to create the illusion of depth and realism by adding darker, + * offset silhouettes or shapes beneath game objects, characters, or environments. These simulated shadows + * help to enhance the visual appeal and immersion, making the 2D game world appear more dynamic and three-dimensional. + * + * A Shadow effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addShadow(); + * sprite.postFX.addShadow(); + * ``` + */ + class Shadow extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param x The horizontal offset of the shadow effect. Default 0. + * @param y The vertical offset of the shadow effect. Default 0. + * @param decay The amount of decay for shadow effect. Default 0.1. + * @param power The power of the shadow effect. Default 1. + * @param color The color of the shadow. Default 0x000000. + * @param samples The number of samples that the shadow effect will run for. An integer between 1 and 12. Default 6. + * @param intensity The intensity of the shadow effect. Default 1. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, x?: number, y?: number, decay?: number, power?: number, color?: number, samples?: number, intensity?: number); + + /** + * The horizontal offset of the shadow effect. + */ + x: number; + + /** + * The vertical offset of the shadow effect. + */ + y: number; + + /** + * The amount of decay for the shadow effect. + */ + decay: number; + + /** + * The power of the shadow effect. + */ + power: number; + + /** + * The internal gl color array. + */ + glcolor: number[]; + + /** + * The number of samples that the shadow effect will run for. + * + * This should be an integer with a minimum value of 1 and a maximum of 12. + */ + samples: number; + + /** + * The intensity of the shadow effect. + */ + intensity: number; + + /** + * The color of the shadow. + */ + color: number; + + } + + /** + * The Shine FX Controller. + * + * This FX controller manages the shift effect for a Game Object. + * + * The shine effect is a visual technique that simulates the appearance of reflective + * or glossy surfaces by passing a light beam across a Game Object. This effect is used to + * enhance visual appeal, emphasize certain features, and create a sense of depth or + * material properties. + * + * A Shine effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addShine(); + * sprite.postFX.addShine(); + * ``` + */ + class Shine extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param speed The speed of the Shine effect. Default 0.5. + * @param lineWidth The line width of the Shine effect. Default 0.5. + * @param gradient The gradient of the Shine effect. Default 3. + * @param reveal Does this Shine effect reveal or get added to its target? Default false. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, speed?: number, lineWidth?: number, gradient?: number, reveal?: boolean); + + /** + * The speed of the Shine effect. + */ + speed: number; + + /** + * The line width of the Shine effect. + */ + lineWidth: number; + + /** + * The gradient of the Shine effect. + */ + gradient: number; + + /** + * Does this Shine effect reveal or get added to its target? + */ + reveal: boolean; + + } + + /** + * The Vignette FX Controller. + * + * This FX controller manages the vignette effect for a Game Object. + * + * The vignette effect is a visual technique where the edges of the screen, or a Game Object, gradually darken or blur, + * creating a frame-like appearance. This effect is used to draw the player's focus towards the central action or subject, + * enhance immersion, and provide a cinematic or artistic quality to the game's visuals. + * + * A Vignette effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addVignette(); + * sprite.postFX.addVignette(); + * ``` + */ + class Vignette extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param x The horizontal offset of the vignette effect. This value is normalized to the range 0 to 1. Default 0.5. + * @param y The vertical offset of the vignette effect. This value is normalized to the range 0 to 1. Default 0.5. + * @param radius The radius of the vignette effect. This value is normalized to the range 0 to 1. Default 0.5. + * @param strength The strength of the vignette effect. Default 0.5. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, x?: number, y?: number, radius?: number, strength?: number); + + /** + * The horizontal offset of the vignette effect. This value is normalized to the range 0 to 1. + */ + x: number; + + /** + * The vertical offset of the vignette effect. This value is normalized to the range 0 to 1. + */ + y: number; + + /** + * The radius of the vignette effect. This value is normalized to the range 0 to 1. + */ + radius: number; + + /** + * The strength of the vignette effect. + */ + strength: number; + + } + + /** + * The Wipe FX Controller. + * + * This FX controller manages the wipe effect for a Game Object. + * + * The wipe or reveal effect is a visual technique that gradually uncovers or conceals elements + * in the game, such as images, text, or scene transitions. This effect is often used to create + * a sense of progression, reveal hidden content, or provide a smooth and visually appealing transition + * between game states. + * + * You can set both the direction and the axis of the wipe effect. The following combinations are possible: + * + * * left to right: direction 0, axis 0 + * * right to left: direction 1, axis 0 + * * top to bottom: direction 1, axis 1 + * * bottom to top: direction 1, axis 0 + * + * It is up to you to set the `progress` value yourself, i.e. via a Tween, in order to transition the effect. + * + * A Wipe effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.preFX.addWipe(); + * sprite.postFX.addWipe(); + * sprite.preFX.addReveal(); + * sprite.postFX.addReveal(); + * ``` + */ + class Wipe extends Phaser.FX.Controller { + /** + * + * @param gameObject A reference to the Game Object that has this fx. + * @param wipeWidth The width of the wipe effect. This value is normalized in the range 0 to 1. Default 0.1. + * @param direction The direction of the wipe effect. Either 0 or 1. Set in conjunction with the axis property. Default 0. + * @param axis The axis of the wipe effect. Either 0 or 1. Set in conjunction with the direction property. Default 0. + * @param reveal Is this a reveal (true) or a fade (false) effect? Default false. + */ + constructor(gameObject: Phaser.GameObjects.GameObject, wipeWidth?: number, direction?: number, axis?: number, reveal?: boolean); + + /** + * The progress of the Wipe effect. This value is normalized to the range 0 to 1. + * + * Adjust this value to make the wipe transition (i.e. via a Tween) + */ + progress: number; + + /** + * The width of the wipe effect. This value is normalized in the range 0 to 1. + */ + wipeWidth: number; + + /** + * The direction of the wipe effect. Either 0 or 1. Set in conjunction with the axis property. + */ + direction: number; + + /** + * The axis of the wipe effect. Either 0 or 1. Set in conjunction with the direction property. + */ + axis: number; + + /** + * Is this a reveal (true) or a fade (false) effect? + */ + reveal: boolean; + + } + + } + + namespace GameObjects { + /** + * BitmapText objects work by taking a texture file and an XML or JSON file that describes the font structure. + * + * During rendering for each letter of the text is rendered to the display, proportionally spaced out and aligned to + * match the font structure. + * + * Dynamic Bitmap Text objects are different from Static Bitmap Text in that they invoke a callback for each + * letter being rendered during the render pass. This callback allows you to manipulate the properties of + * each letter being rendered, such as its position, scale or tint, allowing you to create interesting effects + * like jiggling text, which can't be done with Static text. This means that Dynamic Text takes more processing + * time, so only use them if you require the callback ability they have. + * + * BitmapText objects are less flexible than Text objects, in that they have less features such as shadows, fills and the ability + * to use Web Fonts, however you trade this flexibility for rendering speed. You can also create visually compelling BitmapTexts by + * processing the font texture in an image editor, applying fills and any other effects required. + * + * To create multi-line text insert \r, \n or \r\n escape codes into the text string. + * + * To create a BitmapText data files you need a 3rd party app such as: + * + * BMFont (Windows, free): {@link http://www.angelcode.com/products/bmfont/|http://www.angelcode.com/products/bmfont/} + * Glyph Designer (OS X, commercial): {@link http://www.71squared.com/en/glyphdesigner|http://www.71squared.com/en/glyphdesigner} + * Snow BMF (Web-based, free): {@link https://snowb.org//|https://snowb.org/} + * Littera (Flash-based, free): {@link http://kvazars.com/littera/|http://kvazars.com/littera/} + * + * For most use cases it is recommended to use XML. If you wish to use JSON, the formatting should be equal to the result of + * converting a valid XML file through the popular X2JS library. An online tool for conversion can be found here: {@link http://codebeautify.org/xmltojson|http://codebeautify.org/xmltojson} + */ + class DynamicBitmapText extends Phaser.GameObjects.BitmapText { + /** + * + * @param scene The Scene to which this Game Object belongs. It can only belong to one Scene at any given time. + * @param x The x coordinate of this Game Object in world space. + * @param y The y coordinate of this Game Object in world space. + * @param font The key of the font to use from the Bitmap Font cache. + * @param text The string, or array of strings, to be set as the content of this Bitmap Text. + * @param size The font size of this Bitmap Text. + * @param align The alignment of the text in a multi-line BitmapText object. Default 0. + */ + constructor(scene: Phaser.Scene, x: number, y: number, font: string, text?: string | string[], size?: number, align?: number); + + /** + * The horizontal scroll position of the Bitmap Text. + */ + scrollX: number; + + /** + * The vertical scroll position of the Bitmap Text. + */ + scrollY: number; + + /** + * The crop width of the Bitmap Text. + */ + cropWidth: number; + + /** + * The crop height of the Bitmap Text. + */ + cropHeight: number; + + /** + * A callback that alters how each character of the Bitmap Text is rendered. + */ + displayCallback: Phaser.Types.GameObjects.BitmapText.DisplayCallback; + + /** + * The data object that is populated during rendering, then passed to the displayCallback. + * You should modify this object then return it back from the callback. It's updated values + * will be used to render the specific glyph. + * + * Please note that if you need a reference to this object locally in your game code then you + * should shallow copy it, as it's updated and re-used for every glyph in the text. + */ + callbackData: Phaser.Types.GameObjects.BitmapText.DisplayCallbackConfig; + + /** + * Set the crop size of this Bitmap Text. + * @param width The width of the crop. + * @param height The height of the crop. + */ + setSize(width: number, height: number): this; + + /** + * Set a callback that alters how each character of the Bitmap Text is rendered. + * + * The callback receives a {@link Phaser.Types.GameObjects.BitmapText.DisplayCallbackConfig} object that contains information about the character that's + * about to be rendered. + * + * It should return an object with `x`, `y`, `scale` and `rotation` properties that will be used instead of the + * usual values when rendering. + * @param callback The display callback to set. + */ + setDisplayCallback(callback: Phaser.Types.GameObjects.BitmapText.DisplayCallback): this; + + /** + * Set the horizontal scroll position of this Bitmap Text. + * @param value The horizontal scroll position to set. + */ + setScrollX(value: number): this; + + /** + * Set the vertical scroll position of this Bitmap Text. + * @param value The vertical scroll position to set. + */ + setScrollY(value: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + namespace RetroFont { + /** + * Text Set 1 = !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ + */ + var TEXT_SET1: string; + + /** + * Text Set 2 = !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ + */ + var TEXT_SET2: string; + + /** + * Text Set 3 = ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 + */ + var TEXT_SET3: string; + + /** + * Text Set 4 = ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 + */ + var TEXT_SET4: string; + + /** + * Text Set 5 = ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/() '!?-*:0123456789 + */ + var TEXT_SET5: string; + + /** + * Text Set 6 = ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;0123456789"(),-.' + */ + var TEXT_SET6: string; + + /** + * Text Set 7 = AGMSY+:4BHNTZ!;5CIOU.?06DJPV,(17EKQW")28FLRX-'39 + */ + var TEXT_SET7: string; + + /** + * Text Set 8 = 0123456789 .ABCDEFGHIJKLMNOPQRSTUVWXYZ + */ + var TEXT_SET8: string; + + /** + * Text Set 9 = ABCDEFGHIJKLMNOPQRSTUVWXYZ()-0123456789.:,'"?! + */ + var TEXT_SET9: string; + + /** + * Text Set 10 = ABCDEFGHIJKLMNOPQRSTUVWXYZ + */ + var TEXT_SET10: string; + + /** + * Text Set 11 = ABCDEFGHIJKLMNOPQRSTUVWXYZ.,"-+!?()':;0123456789 + */ + var TEXT_SET11: string; + + /** + * Parses a Retro Font configuration object so you can pass it to the BitmapText constructor + * and create a BitmapText object using a fixed-width retro font. + * @param scene A reference to the Phaser Scene. + * @param config The font configuration object. + */ + function Parse(scene: Phaser.Scene, config: Phaser.Types.GameObjects.BitmapText.RetroFontConfig): Phaser.Types.GameObjects.BitmapText.BitmapFontData; + + } + + /** + * BitmapText objects work by taking a texture file and an XML or JSON file that describes the font structure. + * + * During rendering for each letter of the text is rendered to the display, proportionally spaced out and aligned to + * match the font structure. + * + * BitmapText objects are less flexible than Text objects, in that they have less features such as shadows, fills and the ability + * to use Web Fonts, however you trade this flexibility for rendering speed. You can also create visually compelling BitmapTexts by + * processing the font texture in an image editor, applying fills and any other effects required. + * + * To create multi-line text insert \r, \n or \r\n escape codes into the text string. + * + * To create a BitmapText data files you need a 3rd party app such as: + * + * BMFont (Windows, free): {@link http://www.angelcode.com/products/bmfont/|http://www.angelcode.com/products/bmfont/} + * Glyph Designer (OS X, commercial): {@link http://www.71squared.com/en/glyphdesigner|http://www.71squared.com/en/glyphdesigner} + * Snow BMF (Web-based, free): {@link https://snowb.org//|https://snowb.org/} + * Littera (Flash-based, free): {@link http://kvazars.com/littera/|http://kvazars.com/littera/} + * + * For most use cases it is recommended to use XML. If you wish to use JSON, the formatting should be equal to the result of + * converting a valid XML file through the popular X2JS library. An online tool for conversion can be found here: {@link http://codebeautify.org/xmltojson|http://codebeautify.org/xmltojson} + */ + class BitmapText extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. It can only belong to one Scene at any given time. + * @param x The x coordinate of this Game Object in world space. + * @param y The y coordinate of this Game Object in world space. + * @param font The key of the font to use from the Bitmap Font cache. + * @param text The string, or array of strings, to be set as the content of this Bitmap Text. + * @param size The font size of this Bitmap Text. + * @param align The alignment of the text in a multi-line BitmapText object. Default 0. + */ + constructor(scene: Phaser.Scene, x: number, y: number, font: string, text?: string | string[], size?: number, align?: number); + + /** + * The key of the Bitmap Font used by this Bitmap Text. + * To change the font after creation please use `setFont`. + */ + readonly font: string; + + /** + * The data of the Bitmap Font used by this Bitmap Text. + */ + readonly fontData: Phaser.Types.GameObjects.BitmapText.BitmapFontData; + + /** + * The character code used to detect for word wrapping. + * Defaults to 32 (a space character). + */ + wordWrapCharCode: number; + + /** + * The horizontal offset of the drop shadow. + * + * You can set this directly, or use `Phaser.GameObjects.BitmapText#setDropShadow`. + */ + dropShadowX: number; + + /** + * The vertical offset of the drop shadow. + * + * You can set this directly, or use `Phaser.GameObjects.BitmapText#setDropShadow`. + */ + dropShadowY: number; + + /** + * The color of the drop shadow. + * + * You can set this directly, or use `Phaser.GameObjects.BitmapText#setDropShadow`. + */ + dropShadowColor: number; + + /** + * The alpha value of the drop shadow. + * + * You can set this directly, or use `Phaser.GameObjects.BitmapText#setDropShadow`. + */ + dropShadowAlpha: number; + + /** + * Indicates whether the font texture is from an atlas or not. + */ + readonly fromAtlas: boolean; + + /** + * Set the lines of text in this BitmapText to be left-aligned. + * This only has any effect if this BitmapText contains more than one line of text. + */ + setLeftAlign(): this; + + /** + * Set the lines of text in this BitmapText to be center-aligned. + * This only has any effect if this BitmapText contains more than one line of text. + */ + setCenterAlign(): this; + + /** + * Set the lines of text in this BitmapText to be right-aligned. + * This only has any effect if this BitmapText contains more than one line of text. + */ + setRightAlign(): this; + + /** + * Set the font size of this Bitmap Text. + * @param size The font size to set. + */ + setFontSize(size: number): this; + + /** + * Sets the letter spacing between each character of this Bitmap Text. + * Can be a positive value to increase the space, or negative to reduce it. + * Spacing is applied after the kerning values have been set. + * @param spacing The amount of horizontal space to add between each character. Default 0. + */ + setLetterSpacing(spacing?: number): this; + + /** + * Sets the line spacing value. This value is added to the font height to + * calculate the overall line height. + * + * Spacing can be a negative or positive number. + * + * Only has an effect if this BitmapText object contains multiple lines of text. + * @param spacing The amount of space to add between each line in multi-line text. Default 0. + */ + setLineSpacing(spacing?: number): this; + + /** + * Set the textual content of this BitmapText. + * + * An array of strings will be converted into multi-line text. Use the align methods to change multi-line alignment. + * @param value The string, or array of strings, to be set as the content of this BitmapText. + */ + setText(value: string | string[]): this; + + /** + * Sets a drop shadow effect on this Bitmap Text. + * + * This is a WebGL only feature and only works with Static Bitmap Text, not Dynamic. + * + * You can set the vertical and horizontal offset of the shadow, as well as the color and alpha. + * + * Once a shadow has been enabled you can modify the `dropShadowX` and `dropShadowY` properties of this + * Bitmap Text directly to adjust the position of the shadow in real-time. + * + * If you wish to clear the shadow, call this method with no parameters specified. + * @param x The horizontal offset of the drop shadow. Default 0. + * @param y The vertical offset of the drop shadow. Default 0. + * @param color The color of the drop shadow, given as a hex value, i.e. `0x000000` for black. Default 0x000000. + * @param alpha The alpha of the drop shadow, given as a float between 0 and 1. This is combined with the Bitmap Text alpha as well. Default 0.5. + */ + setDropShadow(x?: number, y?: number, color?: number, alpha?: number): this; + + /** + * Sets a tint on a range of characters in this Bitmap Text, starting from the `start` parameter index + * and running for `length` quantity of characters. + * + * The `start` parameter can be negative. In this case, it starts at the end of the text and counts + * backwards `start` places. + * + * You can also pass in -1 as the `length` and it will tint all characters from `start` + * up until the end of the string. + * Remember that spaces and punctuation count as characters. + * + * This is a WebGL only feature and only works with Static Bitmap Text, not Dynamic. + * + * The tint works by taking the pixel color values from the Bitmap Text texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole character will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the character range. + * + * To swap this from being an additive tint to a fill based tint, set the `tintFill` parameter to `true`. + * + * To modify the tint color once set, call this method again with new color values. + * + * Using `setWordTint` can override tints set by this function, and vice versa. + * + * To remove a tint call this method with just the `start`, and optionally, the `length` parameters defined. + * @param start The starting character to begin the tint at. If negative, it counts back from the end of the text. Default 0. + * @param length The number of characters to tint. Remember that spaces count as a character too. Pass -1 to tint all characters from `start` onwards. Default 1. + * @param tintFill Use a fill-based tint (true), or an additive tint (false) Default false. + * @param topLeft The tint being applied to the top-left of the character. If not other values are given this value is applied evenly, tinting the whole character. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the character. + * @param bottomLeft The tint being applied to the bottom-left of the character. + * @param bottomRight The tint being applied to the bottom-right of the character. + */ + setCharacterTint(start?: number, length?: number, tintFill?: boolean, topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a tint on a matching word within this Bitmap Text. + * + * The `word` parameter can be either a string or a number. + * + * If a string, it will run a string comparison against the text contents, and if matching, + * it will tint the whole word. + * + * If a number, if till that word, based on its offset within the text contents. + * + * The `count` parameter controls how many words are replaced. Pass in -1 to replace them all. + * + * This parameter is ignored if you pass a number as the `word` to be searched for. + * + * This is a WebGL only feature and only works with Static Bitmap Text, not Dynamic. + * + * The tint works by taking the pixel color values from the Bitmap Text texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole character will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the character range. + * + * To swap this from being an additive tint to a fill based tint, set the `tintFill` parameter to `true`. + * + * To modify the tint color once set, call this method again with new color values. + * + * Using `setCharacterTint` can override tints set by this function, and vice versa. + * @param word The word to search for. Either a string, or an index of the word in the words array. + * @param count The number of matching words to tint. Pass -1 to tint all matching words. Default 1. + * @param tintFill Use a fill-based tint (true), or an additive tint (false) Default false. + * @param topLeft The tint being applied to the top-left of the word. If not other values are given this value is applied evenly, tinting the whole word. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the word. + * @param bottomLeft The tint being applied to the bottom-left of the word. + * @param bottomRight The tint being applied to the bottom-right of the word. + */ + setWordTint(word: string | number, count?: number, tintFill?: boolean, topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Calculate the bounds of this Bitmap Text. + * + * An object is returned that contains the position, width and height of the Bitmap Text in local and global + * contexts. + * + * Local size is based on just the font size and a [0, 0] position. + * + * Global size takes into account the Game Object's scale, world position and display origin. + * + * Also in the object is data regarding the length of each line, should this be a multi-line BitmapText. + * @param round Whether to round the results up to the nearest integer. Default false. + */ + getTextBounds(round?: boolean): Phaser.Types.GameObjects.BitmapText.BitmapTextSize; + + /** + * Gets the character located at the given x/y coordinate within this Bitmap Text. + * + * The coordinates you pass in are translated into the local space of the + * Bitmap Text, however, it is up to you to first translate the input coordinates to world space. + * + * If you wish to use this in combination with an input event, be sure + * to pass in `Pointer.worldX` and `worldY` so they are in world space. + * + * In some cases, based on kerning, characters can overlap. When this happens, + * the first character in the word is returned. + * + * Note that this does not work for DynamicBitmapText if you have changed the + * character positions during render. It will only scan characters in their un-translated state. + * @param x The x position to check. + * @param y The y position to check. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getCharacterAt(x: number, y: number, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Types.GameObjects.BitmapText.BitmapTextCharacter; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * Changes the font this BitmapText is using to render. + * + * The new texture is loaded and applied to the BitmapText. The existing text, size and alignment are preserved, + * unless overridden via the arguments. + * @param font The key of the font to use from the Bitmap Font cache. + * @param size The font size of this Bitmap Text. If not specified the current size will be used. + * @param align The alignment of the text in a multi-line BitmapText object. If not specified the current alignment will be used. Default 0. + */ + setFont(font: string, size?: number, align?: number): this; + + /** + * Sets the maximum display width of this BitmapText in pixels. + * + * If `BitmapText.text` is longer than `maxWidth` then the lines will be automatically wrapped + * based on the previous whitespace character found in the line. + * + * If no whitespace was found then no wrapping will take place and consequently the `maxWidth` value will not be honored. + * + * Disable maxWidth by setting the value to 0. + * + * You can set the whitespace character to be searched for by setting the `wordWrapCharCode` parameter or property. + * @param value The maximum display width of this BitmapText in pixels. Set to zero to disable. + * @param wordWrapCharCode The character code to check for when word wrapping. Defaults to 32 (the space character). + */ + setMaxWidth(value: number, wordWrapCharCode?: number): this; + + /** + * Controls the alignment of each line of text in this BitmapText object. + * + * Only has any effect when this BitmapText contains multiple lines of text, split with carriage-returns. + * Has no effect with single-lines of text. + * + * See the methods `setLeftAlign`, `setCenterAlign` and `setRightAlign`. + * + * 0 = Left aligned (default) + * 1 = Middle aligned + * 2 = Right aligned + * + * The alignment position is based on the longest line of text. + */ + align: number; + + /** + * The text that this Bitmap Text object displays. + * + * You can also use the method `setText` if you want a chainable way to change the text content. + */ + text: string; + + /** + * The font size of this Bitmap Text. + * + * You can also use the method `setFontSize` if you want a chainable way to change the font size. + */ + fontSize: number; + + /** + * Adds / Removes spacing between characters. + * + * Can be a negative or positive number. + * + * You can also use the method `setLetterSpacing` if you want a chainable way to change the letter spacing. + */ + letterSpacing: number; + + /** + * Adds / Removes spacing between lines. + * + * Can be a negative or positive number. + * + * You can also use the method `setLineSpacing` if you want a chainable way to change the line spacing. + */ + lineSpacing: number; + + /** + * The maximum display width of this BitmapText in pixels. + * + * If BitmapText.text is longer than maxWidth then the lines will be automatically wrapped + * based on the last whitespace character found in the line. + * + * If no whitespace was found then no wrapping will take place and consequently the maxWidth value will not be honored. + * + * Disable maxWidth by setting the value to 0. + */ + maxWidth: number; + + /** + * The width of this Bitmap Text. + * + * This property is read-only. + */ + readonly width: number; + + /** + * The height of this Bitmap text. + * + * This property is read-only. + */ + readonly height: number; + + /** + * The displayed width of this Bitmap Text. + * + * This value takes into account the scale factor. + * + * This property is read-only. + */ + readonly displayWidth: number; + + /** + * The displayed height of this Bitmap Text. + * + * This value takes into account the scale factor. + * + * This property is read-only. + */ + readonly displayHeight: number; + + /** + * Build a JSON representation of this Bitmap Text. + */ + toJSON(): Phaser.Types.GameObjects.BitmapText.JSONBitmapText; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * Left align the text characters in a multi-line BitmapText object. + */ + static ALIGN_LEFT: number; + + /** + * Center align the text characters in a multi-line BitmapText object. + */ + static ALIGN_CENTER: number; + + /** + * Right align the text characters in a multi-line BitmapText object. + */ + static ALIGN_RIGHT: number; + + /** + * Parse an XML Bitmap Font from an Atlas. + * + * Adds the parsed Bitmap Font data to the cache with the `fontName` key. + * @param scene The Scene to parse the Bitmap Font for. + * @param fontName The key of the font to add to the Bitmap Font cache. + * @param textureKey The key of the BitmapFont's texture. + * @param frameKey The key of the BitmapFont texture's frame. + * @param xmlKey The key of the XML data of the font to parse. + * @param xSpacing The x-axis spacing to add between each letter. + * @param ySpacing The y-axis spacing to add to the line height. + */ + static ParseFromAtlas(scene: Phaser.Scene, fontName: string, textureKey: string, frameKey: string, xmlKey: string, xSpacing?: number, ySpacing?: number): boolean; + + /** + * Parse an XML font to Bitmap Font data for the Bitmap Font cache. + * @param xml The XML Document to parse the font from. + * @param frame The texture frame to take into account when creating the uv data. + * @param xSpacing The x-axis spacing to add between each letter. Default 0. + * @param ySpacing The y-axis spacing to add to the line height. Default 0. + */ + static ParseXMLBitmapFont(xml: XMLDocument, frame: Phaser.Textures.Frame, xSpacing?: number, ySpacing?: number): Phaser.Types.GameObjects.BitmapText.BitmapFontData; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Blitter Game Object. + * + * The Blitter Game Object is a special kind of container that creates, updates and manages Bob objects. + * Bobs are designed for rendering speed rather than flexibility. They consist of a texture, or frame from a texture, + * a position and an alpha value. You cannot scale or rotate them. They use a batched drawing method for speed + * during rendering. + * + * A Blitter Game Object has one texture bound to it. Bobs created by the Blitter can use any Frame from this + * Texture to render with, but they cannot use any other Texture. It is this single texture-bind that allows + * them their speed. + * + * If you have a need to blast a large volume of frames around the screen then Blitter objects are well worth + * investigating. They are especially useful for using as a base for your own special effects systems. + */ + class Blitter extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. It can only belong to one Scene at any given time. + * @param x The x coordinate of this Game Object in world space. Default 0. + * @param y The y coordinate of this Game Object in world space. Default 0. + * @param texture The key of the texture this Game Object will use for rendering. The Texture must already exist in the Texture Manager. Default '__DEFAULT'. + * @param frame The Frame of the Texture that this Game Object will use. Only set if the Texture has multiple frames, such as a Texture Atlas or Sprite Sheet. Default 0. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, texture?: string, frame?: string | number); + + /** + * The children of this Blitter. + * This List contains all of the Bob objects created by the Blitter. + */ + children: Phaser.Structs.List; + + /** + * Is the Blitter considered dirty? + * A 'dirty' Blitter has had its child count changed since the last frame. + */ + dirty: boolean; + + /** + * Creates a new Bob in this Blitter. + * + * The Bob is created at the given coordinates, relative to the Blitter and uses the given frame. + * A Bob can use any frame belonging to the texture bound to the Blitter. + * @param x The x position of the Bob. Bob coordinate are relative to the position of the Blitter object. + * @param y The y position of the Bob. Bob coordinate are relative to the position of the Blitter object. + * @param frame The Frame the Bob will use. It _must_ be part of the Texture the parent Blitter object is using. + * @param visible Should the created Bob render or not? Default true. + * @param index The position in the Blitters Display List to add the new Bob at. Defaults to the top of the list. + */ + create(x: number, y: number, frame?: string | number | Phaser.Textures.Frame, visible?: boolean, index?: number): Phaser.GameObjects.Bob; + + /** + * Creates multiple Bob objects within this Blitter and then passes each of them to the specified callback. + * @param callback The callback to invoke after creating a bob. It will be sent two arguments: The Bob and the index of the Bob. + * @param quantity The quantity of Bob objects to create. + * @param frame The Frame the Bobs will use. It must be part of the Blitter Texture. + * @param visible Should the created Bob render or not? Default true. + */ + createFromCallback(callback: CreateCallback, quantity: number, frame?: string | number | Phaser.Textures.Frame | string[] | number[] | Phaser.Textures.Frame[], visible?: boolean): Phaser.GameObjects.Bob[]; + + /** + * Creates multiple Bobs in one call. + * + * The amount created is controlled by a combination of the `quantity` argument and the number of frames provided. + * + * If the quantity is set to 10 and you provide 2 frames, then 20 Bobs will be created. 10 with the first + * frame and 10 with the second. + * @param quantity The quantity of Bob objects to create. + * @param frame The Frame the Bobs will use. It must be part of the Blitter Texture. + * @param visible Should the created Bob render or not? Default true. + */ + createMultiple(quantity: number, frame?: string | number | Phaser.Textures.Frame | string[] | number[] | Phaser.Textures.Frame[], visible?: boolean): Phaser.GameObjects.Bob[]; + + /** + * Checks if the given child can render or not, by checking its `visible` and `alpha` values. + * @param child The Bob to check for rendering. + */ + childCanRender(child: Phaser.GameObjects.Bob): boolean; + + /** + * Returns an array of Bobs to be rendered. + * If the Blitter is dirty then a new list is generated and stored in `renderList`. + */ + getRenderList(): Phaser.GameObjects.Bob[]; + + /** + * Removes all Bobs from the children List and clears the dirty flag. + */ + clear(): void; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Bob Game Object. + * + * A Bob belongs to a Blitter Game Object. The Blitter is responsible for managing and rendering this object. + * + * A Bob has a position, alpha value and a frame from a texture that it uses to render with. You can also toggle + * the flipped and visible state of the Bob. The Frame the Bob uses to render can be changed dynamically, but it + * must be a Frame within the Texture used by the parent Blitter. + * + * Bob positions are relative to the Blitter parent. So if you move the Blitter parent, all Bob children will + * have their positions impacted by this change as well. + * + * You can manipulate Bob objects directly from your game code, but the creation and destruction of them should be + * handled via the Blitter parent. + */ + class Bob { + /** + * + * @param blitter The parent Blitter object is responsible for updating this Bob. + * @param x The horizontal position of this Game Object in the world, relative to the parent Blitter position. + * @param y The vertical position of this Game Object in the world, relative to the parent Blitter position. + * @param frame The Frame this Bob will render with, as defined in the Texture the parent Blitter is using. + * @param visible Should the Bob render visible or not to start with? + */ + constructor(blitter: Phaser.GameObjects.Blitter, x: number, y: number, frame: string | number, visible: boolean); + + /** + * The Blitter object that this Bob belongs to. + */ + parent: Phaser.GameObjects.Blitter; + + /** + * The x position of this Bob, relative to the x position of the Blitter. + */ + x: number; + + /** + * The y position of this Bob, relative to the y position of the Blitter. + */ + y: number; + + /** + * The frame that the Bob uses to render with. + * To change the frame use the `Bob.setFrame` method. + */ + protected frame: Phaser.Textures.Frame; + + /** + * A blank object which can be used to store data related to this Bob in. + */ + data: object; + + /** + * The tint value of this Bob. + */ + tint: number; + + /** + * The horizontally flipped state of the Bob. + * A Bob that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Bob. + * A Bob that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture. + */ + flipY: boolean; + + /** + * Changes the Texture Frame being used by this Bob. + * The frame must be part of the Texture the parent Blitter is using. + * If no value is given it will use the default frame of the Blitter parent. + * @param frame The frame to be used during rendering. + */ + setFrame(frame?: string | number | Phaser.Textures.Frame): this; + + /** + * Resets the horizontal and vertical flipped state of this Bob back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Resets this Bob. + * + * Changes the position to the values given, and optionally changes the frame. + * + * Also resets the flipX and flipY values, sets alpha back to 1 and visible to true. + * @param x The x position of the Bob. Bob coordinate are relative to the position of the Blitter object. + * @param y The y position of the Bob. Bob coordinate are relative to the position of the Blitter object. + * @param frame The Frame the Bob will use. It _must_ be part of the Texture the parent Blitter object is using. + */ + reset(x: number, y: number, frame?: string | number | Phaser.Textures.Frame): this; + + /** + * Changes the position of this Bob to the values given. + * @param x The x position of the Bob. Bob coordinate are relative to the position of the Blitter object. + * @param y The y position of the Bob. Bob coordinate are relative to the position of the Blitter object. + */ + setPosition(x: number, y: number): this; + + /** + * Sets the horizontal flipped state of this Bob. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Bob. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Bob. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Sets the visibility of this Bob. + * + * An invisible Bob will skip rendering. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * Set the Alpha level of this Bob. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * A Bob with alpha 0 will skip rendering. + * @param value The alpha value used for this Bob. Between 0 and 1. + */ + setAlpha(value: number): this; + + /** + * Sets the tint of this Bob. + * @param value The tint value used for this Bob. Between 0 and 0xffffff. + */ + setTint(value: number): this; + + /** + * Destroys this Bob instance. + * Removes itself from the Blitter and clears the parent, frame and data properties. + */ + destroy(): void; + + /** + * The visible state of the Bob. + * + * An invisible Bob will skip rendering. + */ + visible: boolean; + + /** + * The alpha value of the Bob, between 0 and 1. + * + * A Bob with alpha 0 will skip rendering. + */ + alpha: number; + + } + + /** + * Builds a Game Object using the provided configuration object. + * @param scene A reference to the Scene. + * @param gameObject The initial GameObject. + * @param config The config to build the GameObject with. + */ + function BuildGameObject(scene: Phaser.Scene, gameObject: Phaser.GameObjects.GameObject, config: Phaser.Types.GameObjects.GameObjectConfig): Phaser.GameObjects.GameObject; + + /** + * Adds an Animation component to a Sprite and populates it based on the given config. + * @param sprite The sprite to add an Animation component to. + * @param config The animation config. + */ + function BuildGameObjectAnimation(sprite: Phaser.GameObjects.Sprite, config: object): Phaser.GameObjects.Sprite; + + namespace Components { + /** + * Provides methods used for setting the alpha properties of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Alpha { + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + } + + /** + * Provides methods used for setting the alpha property of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface AlphaSingle { + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + } + + /** + * Provides methods used for setting the blend mode of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface BlendMode { + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + } + + /** + * Provides methods used for calculating and setting the size of a non-Frame based Game Object. + * Should be applied as a mixin and not used directly. + */ + interface ComputedSize { + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + } + + /** + * Provides methods used for getting and setting the texture of a Game Object. + */ + interface Crop { + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + } + + /** + * Provides methods used for setting the depth of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Depth { + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + } + + /** + * Provides methods used for visually flipping a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Flip { + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + } + + interface FX { + /** + * A reference to the Game Object that owns this FX Component. + */ + readonly gameObject: Phaser.GameObjects.GameObject; + /** + * Is this a Post FX Controller? or a Pre FX Controller? + */ + readonly isPost: boolean; + /** + * Has this FX Component been enabled? + * + * You should treat this property as read-only, although it is toggled + * automaticaly during internal use. + */ + enabled: boolean; + /** + * An array containing all of the Pre FX Controllers that + * have been added to this FX Component. They are processed in + * the order they are added. + * + * This array is empty if this is a Post FX Component. + */ + list: Phaser.FX.Controller[]; + /** + * The amount of extra padding to be applied to this Game Object + * when it is being rendered by a PreFX Pipeline. + * + * Lots of FX require additional spacing added to the texture the + * Game Object uses, for example a glow or shadow effect, and this + * method allows you to control how much extra padding is included + * in addition to the texture size. + * + * You do not need to set this if you're only using Post FX. + */ + padding: number; + /** + * Sets the amount of extra padding to be applied to this Game Object + * when it is being rendered by a PreFX Pipeline. + * + * Lots of FX require additional spacing added to the texture the + * Game Object uses, for example a glow or shadow effect, and this + * method allows you to control how much extra padding is included + * in addition to the texture size. + * + * You do not need to set this if you're only using Post FX. + * @param padding The amount of padding to add to this Game Object. Default 0. + */ + setPadding(padding?: number): this; + /** + * This callback is invoked when this Game Object is copied by a PreFX Pipeline. + * + * This happens when the pipeline uses its `copySprite` method. + * + * It's invoked prior to the copy, allowing you to set shader uniforms, etc on the pipeline. + * @param pipeline The PreFX Pipeline that invoked this callback. + */ + onFXCopy(pipeline: Phaser.Renderer.WebGL.Pipelines.PreFXPipeline): void; + /** + * This callback is invoked when this Game Object is rendered by a PreFX Pipeline. + * + * This happens when the pipeline uses its `drawSprite` method. + * + * It's invoked prior to the draw, allowing you to set shader uniforms, etc on the pipeline. + * @param pipeline The PreFX Pipeline that invoked this callback. + */ + onFX(pipeline: Phaser.Renderer.WebGL.Pipelines.PreFXPipeline): void; + /** + * Enables this FX Component and applies the FXPipeline to the parent Game Object. + * + * This is called automatically whenever you call a method such as `addBloom`, etc. + * + * You can check the `enabled` property to see if the Game Object is already enabled, or not. + * + * This only applies to Pre FX. Post FX are always enabled. + * @param padding The amount of padding to add to this Game Object. Default 0. + */ + enable(padding?: number): void; + /** + * Destroys and removes all FX Controllers that are part of this FX Component, + * then disables it. + * + * If this is a Pre FX Component it will only remove Pre FX. + * If this is a Post FX Component it will only remove Post FX. + * + * To remove both at once use the `GameObject.clearFX` method instead. + */ + clear(): this; + /** + * Searches for the given FX Controller within this FX Component. + * + * If found, the controller is removed from this component and then destroyed. + * @param fx The FX Controller to remove from this FX Component. + */ + remove(fx: T): this; + /** + * Disables this FX Component. + * + * This will reset the pipeline on the Game Object that owns this component back to its + * default and flag this component as disabled. + * + * You can re-enable it again by calling `enable` for Pre FX or by adding an FX for Post FX. + * + * Optionally, set `clear` to destroy all current FX Controllers. + * @param clear Destroy and remove all FX Controllers that are part of this component. Default false. + */ + disable(clear?: boolean): this; + /** + * Adds the given FX Controler to this FX Component. + * + * Note that adding an FX Controller does not remove any existing FX. They all stack-up + * on-top of each other. If you don't want this, make sure to call either `remove` or + * `clear` first. + * @param fx The FX Controller to add to this FX Component. + * @param config Optional configuration object that is passed to the pipeline during instantiation. + */ + add(fx: T, config?: object): Phaser.FX.Controller; + /** + * Adds a Glow effect. + * + * The glow effect is a visual technique that creates a soft, luminous halo around game objects, + * characters, or UI elements. This effect is used to emphasize importance, enhance visual appeal, + * or convey a sense of energy, magic, or otherworldly presence. The effect can also be set on + * the inside of the Game Object. The color and strength of the glow can be modified. + * @param color The color of the glow effect as a number value. Default 0xffffff. + * @param outerStrength The strength of the glow outward from the edge of the Sprite. Default 4. + * @param innerStrength The strength of the glow inward from the edge of the Sprite. Default 0. + * @param knockout If `true` only the glow is drawn, not the texture itself. Default false. + * @param quality Only available for PostFX. Sets the quality of this Glow effect. Default is 0.1. Cannot be changed post-creation. Default 0.1. + * @param distance Only available for PostFX. Sets the distance of this Glow effect. Default is 10. Cannot be changed post-creation. Default 10. + */ + addGlow(color?: number, outerStrength?: number, innerStrength?: number, knockout?: boolean, quality?: number, distance?: number): Phaser.FX.Glow; + /** + * Adds a Shadow effect. + * + * The shadow effect is a visual technique used to create the illusion of depth and realism by adding darker, + * offset silhouettes or shapes beneath game objects, characters, or environments. These simulated shadows + * help to enhance the visual appeal and immersion, making the 2D game world appear more dynamic and three-dimensional. + * @param x The horizontal offset of the shadow effect. Default 0. + * @param y The vertical offset of the shadow effect. Default 0. + * @param decay The amount of decay for shadow effect. Default 0.1. + * @param power The power of the shadow effect. Default 1. + * @param color The color of the shadow. Default 0x000000. + * @param samples The number of samples that the shadow effect will run for. An integer between 1 and 12. Default 6. + * @param intensity The intensity of the shadow effect. Default 1. + */ + addShadow(x?: number, y?: number, decay?: number, power?: number, color?: number, samples?: number, intensity?: number): Phaser.FX.Shadow; + /** + * Adds a Pixelate effect. + * + * The pixelate effect is a visual technique that deliberately reduces the resolution or detail of an image, + * creating a blocky or mosaic appearance composed of large, visible pixels. This effect can be used for stylistic + * purposes, as a homage to retro gaming, or as a means to obscure certain elements within the game, such as + * during a transition or to censor specific content. + * @param amount The amount of pixelation to apply. Default 1. + */ + addPixelate(amount?: number): Phaser.FX.Pixelate; + /** + * Adds a Vignette effect. + * + * The vignette effect is a visual technique where the edges of the screen, or a Game Object, gradually darken or blur, + * creating a frame-like appearance. This effect is used to draw the player's focus towards the central action or subject, + * enhance immersion, and provide a cinematic or artistic quality to the game's visuals. + * @param x The horizontal offset of the vignette effect. This value is normalized to the range 0 to 1. Default 0.5. + * @param y The vertical offset of the vignette effect. This value is normalized to the range 0 to 1. Default 0.5. + * @param radius The radius of the vignette effect. This value is normalized to the range 0 to 1. Default 0.5. + * @param strength The strength of the vignette effect. Default 0.5. + */ + addVignette(x?: number, y?: number, radius?: number, strength?: number): Phaser.FX.Vignette; + /** + * Adds a Shine effect. + * + * The shine effect is a visual technique that simulates the appearance of reflective + * or glossy surfaces by passing a light beam across a Game Object. This effect is used to + * enhance visual appeal, emphasize certain features, and create a sense of depth or + * material properties. + * @param speed The speed of the Shine effect. Default 0.5. + * @param lineWidth The line width of the Shine effect. Default 0.5. + * @param gradient The gradient of the Shine effect. Default 3. + * @param reveal Does this Shine effect reveal or get added to its target? Default false. + */ + addShine(speed?: number, lineWidth?: number, gradient?: number, reveal?: boolean): Phaser.FX.Shine; + /** + * Adds a Blur effect. + * + * A Gaussian blur is the result of blurring an image by a Gaussian function. It is a widely used effect, + * typically to reduce image noise and reduce detail. The visual effect of this blurring technique is a + * smooth blur resembling that of viewing the image through a translucent screen, distinctly different + * from the bokeh effect produced by an out-of-focus lens or the shadow of an object under usual illumination. + * @param quality The quality of the blur effect. Can be either 0 for Low Quality, 1 for Medium Quality or 2 for High Quality. Default 0. + * @param x The horizontal offset of the blur effect. Default 2. + * @param y The vertical offset of the blur effect. Default 2. + * @param strength The strength of the blur effect. Default 1. + * @param color The color of the blur, as a hex value. Default 0xffffff. + * @param steps The number of steps to run the blur effect for. This value should always be an integer. Default 4. + */ + addBlur(quality?: number, x?: number, y?: number, strength?: number, color?: number, steps?: number): Phaser.FX.Blur; + /** + * Adds a Gradient effect. + * + * The gradient overlay effect is a visual technique where a smooth color transition is applied over Game Objects, + * such as sprites or UI components. This effect is used to enhance visual appeal, emphasize depth, or create + * stylistic and atmospheric variations. It can also be utilized to convey information, such as representing + * progress or health status through color changes. + * @param color1 The first gradient color, given as a number value. Default 0xff0000. + * @param color2 The second gradient color, given as a number value. Default 0x00ff00. + * @param alpha The alpha value of the gradient effect. Default 0.2. + * @param fromX The horizontal position the gradient will start from. This value is normalized, between 0 and 1, and is not in pixels. Default 0. + * @param fromY The vertical position the gradient will start from. This value is normalized, between 0 and 1, and is not in pixels. Default 0. + * @param toX The horizontal position the gradient will end at. This value is normalized, between 0 and 1, and is not in pixels. Default 0. + * @param toY The vertical position the gradient will end at. This value is normalized, between 0 and 1, and is not in pixels. Default 1. + * @param size How many 'chunks' the gradient is divided in to, as spread over the entire height of the texture. Leave this at zero for a smooth gradient, or set higher for a more retro chunky effect. Default 0. + */ + addGradient(color1?: number, color2?: number, alpha?: number, fromX?: number, fromY?: number, toX?: number, toY?: number, size?: number): Phaser.FX.Gradient; + /** + * Adds a Bloom effect. + * + * Bloom is an effect used to reproduce an imaging artifact of real-world cameras. + * The effect produces fringes of light extending from the borders of bright areas in an image, + * contributing to the illusion of an extremely bright light overwhelming the + * camera or eye capturing the scene. + * @param color The color of the Bloom, as a hex value. + * @param offsetX The horizontal offset of the bloom effect. Default 1. + * @param offsetY The vertical offset of the bloom effect. Default 1. + * @param blurStrength The strength of the blur process of the bloom effect. Default 1. + * @param strength The strength of the blend process of the bloom effect. Default 1. + * @param steps The number of steps to run the Bloom effect for. This value should always be an integer. Default 4. + */ + addBloom(color?: number, offsetX?: number, offsetY?: number, blurStrength?: number, strength?: number, steps?: number): Phaser.FX.Bloom; + /** + * Adds a ColorMatrix effect. + * + * The color matrix effect is a visual technique that involves manipulating the colors of an image + * or scene using a mathematical matrix. This process can adjust hue, saturation, brightness, and contrast, + * allowing developers to create various stylistic appearances or mood settings within the game. + * Common applications include simulating different lighting conditions, applying color filters, + * or achieving a specific visual style. + */ + addColorMatrix(): Phaser.FX.ColorMatrix; + /** + * Adds a Circle effect. + * + * This effect will draw a circle around the texture of the Game Object, effectively masking off + * any area outside of the circle without the need for an actual mask. You can control the thickness + * of the circle, the color of the circle and the color of the background, should the texture be + * transparent. You can also control the feathering applied to the circle, allowing for a harsh or soft edge. + * + * Please note that adding this effect to a Game Object will not change the input area or physics body of + * the Game Object, should it have one. + * @param thickness The width of the circle around the texture, in pixels. Default 8. + * @param color The color of the circular ring, given as a number value. Default 0xfeedb6. + * @param backgroundColor The color of the background, behind the texture, given as a number value. Default 0xff0000. + * @param scale The scale of the circle. The default scale is 1, which is a circle the full size of the underlying texture. Default 1. + * @param feather The amount of feathering to apply to the circle from the ring. Default 0.005. + */ + addCircle(thickness?: number, color?: number, backgroundColor?: number, scale?: number, feather?: number): Phaser.FX.Circle; + /** + * Adds a Barrel effect. + * + * A barrel effect allows you to apply either a 'pinch' or 'expand' distortion to + * a Game Object. The amount of the effect can be modified in real-time. + * @param amount The amount of distortion applied to the barrel effect. A value of 1 is no distortion. Typically keep this within +- 1. Default 1. + */ + addBarrel(amount?: number): Phaser.FX.Barrel; + /** + * Adds a Displacement effect. + * + * The displacement effect is a visual technique that alters the position of pixels in an image + * or texture based on the values of a displacement map. This effect is used to create the illusion + * of depth, surface irregularities, or distortion in otherwise flat elements. It can be applied to + * characters, objects, or backgrounds to enhance realism, convey movement, or achieve various + * stylistic appearances. + * @param texture The unique string-based key of the texture to use for displacement, which must exist in the Texture Manager. Default '__WHITE'. + * @param x The amount of horizontal displacement to apply. A very small float number, such as 0.005. Default 0.005. + * @param y The amount of vertical displacement to apply. A very small float number, such as 0.005. Default 0.005. + */ + addDisplacement(texture?: string, x?: number, y?: number): Phaser.FX.Displacement; + /** + * Adds a Wipe effect. + * + * The wipe or reveal effect is a visual technique that gradually uncovers or conceals elements + * in the game, such as images, text, or scene transitions. This effect is often used to create + * a sense of progression, reveal hidden content, or provide a smooth and visually appealing transition + * between game states. + * + * You can set both the direction and the axis of the wipe effect. The following combinations are possible: + * + * * left to right: direction 0, axis 0 + * * right to left: direction 1, axis 0 + * * top to bottom: direction 1, axis 1 + * * bottom to top: direction 1, axis 0 + * + * It is up to you to set the `progress` value yourself, i.e. via a Tween, in order to transition the effect. + * @param wipeWidth The width of the wipe effect. This value is normalized in the range 0 to 1. Default 0.1. + * @param direction The direction of the wipe effect. Either 0 or 1. Set in conjunction with the axis property. Default 0. + * @param axis The axis of the wipe effect. Either 0 or 1. Set in conjunction with the direction property. Default 0. + */ + addWipe(wipeWidth?: number, direction?: number, axis?: number): Phaser.FX.Wipe; + /** + * Adds a Reveal Wipe effect. + * + * The wipe or reveal effect is a visual technique that gradually uncovers or conceals elements + * in the game, such as images, text, or scene transitions. This effect is often used to create + * a sense of progression, reveal hidden content, or provide a smooth and visually appealing transition + * between game states. + * + * You can set both the direction and the axis of the wipe effect. The following combinations are possible: + * + * * left to right: direction 0, axis 0 + * * right to left: direction 1, axis 0 + * * top to bottom: direction 1, axis 1 + * * bottom to top: direction 1, axis 0 + * + * It is up to you to set the `progress` value yourself, i.e. via a Tween, in order to transition the effect. + * @param wipeWidth The width of the wipe effect. This value is normalized in the range 0 to 1. Default 0.1. + * @param direction The direction of the wipe effect. Either 0 or 1. Set in conjunction with the axis property. Default 0. + * @param axis The axis of the wipe effect. Either 0 or 1. Set in conjunction with the direction property. Default 0. + */ + addReveal(wipeWidth?: number, direction?: number, axis?: number): Phaser.FX.Wipe; + /** + * Adds a Bokeh effect. + * + * Bokeh refers to a visual effect that mimics the photographic technique of creating a shallow depth of field. + * This effect is used to emphasize the game's main subject or action, by blurring the background or foreground + * elements, resulting in a more immersive and visually appealing experience. It is achieved through rendering + * techniques that simulate the out-of-focus areas, giving a sense of depth and realism to the game's graphics. + * + * See also Tilt Shift. + * @param radius The radius of the bokeh effect. Default 0.5. + * @param amount The amount of the bokeh effect. Default 1. + * @param contrast The color contrast of the bokeh effect. Default 0.2. + */ + addBokeh(radius?: number, amount?: number, contrast?: number): Phaser.FX.Bokeh; + /** + * Adds a Tilt Shift effect. + * + * This Bokeh effect can also be used to generate a Tilt Shift effect, which is a technique used to create a miniature + * effect by blurring everything except a small area of the image. This effect is achieved by blurring the + * top and bottom elements, while keeping the center area in focus. + * + * See also Bokeh. + * @param radius The radius of the bokeh effect. Default 0.5. + * @param amount The amount of the bokeh effect. Default 1. + * @param contrast The color contrast of the bokeh effect. Default 0.2. + * @param blurX The amount of horizontal blur. Default 1. + * @param blurY The amount of vertical blur. Default 1. + * @param strength The strength of the blur. Default 1. + */ + addTiltShift(radius?: number, amount?: number, contrast?: number, blurX?: number, blurY?: number, strength?: number): Phaser.FX.Bokeh; + /** + * Destroys this FX Component. + * + * Called automatically when Game Objects are destroyed. + */ + destroy(): void; + } + + /** + * Provides methods used for obtaining the bounds of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface GetBounds { + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + } + + /** + * Provides methods used for getting and setting the mask of a Game Object. + */ + interface Mask { + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + } + + /** + * Provides methods used for getting and setting the origin of a Game Object. + * Values are normalized, given in the range 0 to 1. + * Display values contain the calculated pixel values. + * Should be applied as a mixin and not used directly. + */ + interface Origin { + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + } + + /** + * Provides methods used for managing a Game Object following a Path. + * Should be applied as a mixin and not used directly. + */ + interface PathFollower { + /** + * The Path this PathFollower is following. It can only follow one Path at a time. + */ + path: Phaser.Curves.Path; + /** + * Should the PathFollower automatically rotate to point in the direction of the Path? + */ + rotateToPath: boolean; + /** + * Set the Path that this PathFollower should follow. + * + * Optionally accepts {@link Phaser.Types.GameObjects.PathFollower.PathConfig} settings. + * @param path The Path this PathFollower is following. It can only follow one Path at a time. + * @param config Settings for the PathFollower. + */ + setPath(path: Phaser.Curves.Path, config?: number | Phaser.Types.GameObjects.PathFollower.PathConfig | Phaser.Types.Tweens.NumberTweenBuilderConfig): this; + /** + * Set whether the PathFollower should automatically rotate to point in the direction of the Path. + * @param value Whether the PathFollower should automatically rotate to point in the direction of the Path. + * @param offset Rotation offset in degrees. Default 0. + */ + setRotateToPath(value: boolean, offset?: number): this; + /** + * Is this PathFollower actively following a Path or not? + * + * To be considered as `isFollowing` it must be currently moving on a Path, and not paused. + */ + isFollowing(): boolean; + /** + * Starts this PathFollower following its given Path. + * @param config The duration of the follow, or a PathFollower config object. Default {}. + * @param startAt Optional start position of the follow, between 0 and 1. Default 0. + */ + startFollow(config?: number | Phaser.Types.GameObjects.PathFollower.PathConfig | Phaser.Types.Tweens.NumberTweenBuilderConfig, startAt?: number): this; + /** + * Pauses this PathFollower. It will still continue to render, but it will remain motionless at the + * point on the Path at which you paused it. + */ + pauseFollow(): this; + /** + * Resumes a previously paused PathFollower. + * + * If the PathFollower was not paused this has no effect. + */ + resumeFollow(): this; + /** + * Stops this PathFollower from following the path any longer. + * + * This will invoke any 'stop' conditions that may exist on the Path, or for the follower. + */ + stopFollow(): this; + /** + * Internal update handler that advances this PathFollower along the path. + * + * Called automatically by the Scene step, should not typically be called directly. + */ + pathUpdate(): void; + } + + /** + * Provides methods used for setting the WebGL rendering pipeline of a Game Object. + */ + interface Pipeline { + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + } + + /** + * Provides methods used for setting the WebGL rendering post pipeline of a Game Object. + */ + interface PostPipeline { + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + } + + /** + * Provides methods used for getting and setting the Scroll Factor of a Game Object. + */ + interface ScrollFactor { + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + } + + /** + * Provides methods used for getting and setting the size of a Game Object. + */ + interface Size { + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + } + + /** + * Provides methods used for getting and setting the texture of a Game Object. + */ + interface Texture { + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + } + + /** + * Provides methods used for getting and setting the texture of a Game Object. + */ + interface TextureCrop { + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + } + + /** + * Provides methods used for setting the tint of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Tint { + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + } + + /** + * Build a JSON representation of the given Game Object. + * + * This is typically extended further by Game Object specific implementations. + */ + interface ToJSON { + } + + /** + * Provides methods used for getting and setting the position, scale and rotation of a Game Object. + */ + interface Transform { + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + /** + * The x position of this Game Object. + */ + x: number; + /** + * The y position of this Game Object. + */ + y: number; + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + /** + * The w position of this Game Object. + */ + w: number; + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + } + + /** + * A Matrix used for display transformations for rendering. + * + * It is represented like so: + * + * ``` + * | a | c | tx | + * | b | d | ty | + * | 0 | 0 | 1 | + * ``` + */ + class TransformMatrix { + /** + * + * @param a The Scale X value. Default 1. + * @param b The Skew Y value. Default 0. + * @param c The Skew X value. Default 0. + * @param d The Scale Y value. Default 1. + * @param tx The Translate X value. Default 0. + * @param ty The Translate Y value. Default 0. + */ + constructor(a?: number, b?: number, c?: number, d?: number, tx?: number, ty?: number); + + /** + * The matrix values. + */ + matrix: Float32Array; + + /** + * The decomposed matrix. + */ + decomposedMatrix: object; + + /** + * The temporary quad value cache. + */ + quad: Float32Array; + + /** + * The Scale X value. + */ + a: number; + + /** + * The Skew Y value. + */ + b: number; + + /** + * The Skew X value. + */ + c: number; + + /** + * The Scale Y value. + */ + d: number; + + /** + * The Translate X value. + */ + e: number; + + /** + * The Translate Y value. + */ + f: number; + + /** + * The Translate X value. + */ + tx: number; + + /** + * The Translate Y value. + */ + ty: number; + + /** + * The rotation of the Matrix. Value is in radians. + */ + readonly rotation: number; + + /** + * The rotation of the Matrix, normalized to be within the Phaser right-handed + * clockwise rotation space. Value is in radians. + */ + readonly rotationNormalized: number; + + /** + * The decomposed horizontal scale of the Matrix. This value is always positive. + */ + readonly scaleX: number; + + /** + * The decomposed vertical scale of the Matrix. This value is always positive. + */ + readonly scaleY: number; + + /** + * Reset the Matrix to an identity matrix. + */ + loadIdentity(): this; + + /** + * Translate the Matrix. + * @param x The horizontal translation value. + * @param y The vertical translation value. + */ + translate(x: number, y: number): this; + + /** + * Scale the Matrix. + * @param x The horizontal scale value. + * @param y The vertical scale value. + */ + scale(x: number, y: number): this; + + /** + * Rotate the Matrix. + * @param angle The angle of rotation in radians. + */ + rotate(angle: number): this; + + /** + * Multiply this Matrix by the given Matrix. + * + * If an `out` Matrix is given then the results will be stored in it. + * If it is not given, this matrix will be updated in place instead. + * Use an `out` Matrix if you do not wish to mutate this matrix. + * @param rhs The Matrix to multiply by. + * @param out An optional Matrix to store the results in. + */ + multiply(rhs: Phaser.GameObjects.Components.TransformMatrix, out?: Phaser.GameObjects.Components.TransformMatrix): this | Phaser.GameObjects.Components.TransformMatrix; + + /** + * Multiply this Matrix by the matrix given, including the offset. + * + * The offsetX is added to the tx value: `offsetX * a + offsetY * c + tx`. + * The offsetY is added to the ty value: `offsetY * b + offsetY * d + ty`. + * @param src The source Matrix to copy from. + * @param offsetX Horizontal offset to factor in to the multiplication. + * @param offsetY Vertical offset to factor in to the multiplication. + */ + multiplyWithOffset(src: Phaser.GameObjects.Components.TransformMatrix, offsetX: number, offsetY: number): this; + + /** + * Transform the Matrix. + * @param a The Scale X value. + * @param b The Shear Y value. + * @param c The Shear X value. + * @param d The Scale Y value. + * @param tx The Translate X value. + * @param ty The Translate Y value. + */ + transform(a: number, b: number, c: number, d: number, tx: number, ty: number): this; + + /** + * Transform a point in to the local space of this Matrix. + * @param x The x coordinate of the point to transform. + * @param y The y coordinate of the point to transform. + * @param point Optional Point object to store the transformed coordinates in. + */ + transformPoint(x: number, y: number, point?: Phaser.Types.Math.Vector2Like): Phaser.Types.Math.Vector2Like; + + /** + * Invert the Matrix. + */ + invert(): this; + + /** + * Set the values of this Matrix to copy those of the matrix given. + * @param src The source Matrix to copy from. + */ + copyFrom(src: Phaser.GameObjects.Components.TransformMatrix): this; + + /** + * Set the values of this Matrix to copy those of the array given. + * Where array indexes 0, 1, 2, 3, 4 and 5 are mapped to a, b, c, d, e and f. + * @param src The array of values to set into this matrix. + */ + copyFromArray(src: any[]): this; + + /** + * Copy the values from this Matrix to the given Canvas Rendering Context. + * This will use the Context.transform method. + * @param ctx The Canvas Rendering Context to copy the matrix values to. + */ + copyToContext(ctx: CanvasRenderingContext2D): CanvasRenderingContext2D; + + /** + * Copy the values from this Matrix to the given Canvas Rendering Context. + * This will use the Context.setTransform method. + * @param ctx The Canvas Rendering Context to copy the matrix values to. + */ + setToContext(ctx: CanvasRenderingContext2D): CanvasRenderingContext2D; + + /** + * Copy the values in this Matrix to the array given. + * + * Where array indexes 0, 1, 2, 3, 4 and 5 are mapped to a, b, c, d, e and f. + * @param out The array to copy the matrix values in to. + */ + copyToArray(out?: any[]): any[]; + + /** + * Set the values of this Matrix. + * @param a The Scale X value. + * @param b The Shear Y value. + * @param c The Shear X value. + * @param d The Scale Y value. + * @param tx The Translate X value. + * @param ty The Translate Y value. + */ + setTransform(a: number, b: number, c: number, d: number, tx: number, ty: number): this; + + /** + * Decompose this Matrix into its translation, scale and rotation values using QR decomposition. + * + * The result must be applied in the following order to reproduce the current matrix: + * + * translate -> rotate -> scale + */ + decomposeMatrix(): Phaser.Types.GameObjects.DecomposeMatrixResults; + + /** + * Apply the identity, translate, rotate and scale operations on the Matrix. + * @param x The horizontal translation. + * @param y The vertical translation. + * @param rotation The angle of rotation in radians. + * @param scaleX The horizontal scale. + * @param scaleY The vertical scale. + */ + applyITRS(x: number, y: number, rotation: number, scaleX: number, scaleY: number): this; + + /** + * Takes the `x` and `y` values and returns a new position in the `output` vector that is the inverse of + * the current matrix with its transformation applied. + * + * Can be used to translate points from world to local space. + * @param x The x position to translate. + * @param y The y position to translate. + * @param output A Vector2, or point-like object, to store the results in. + */ + applyInverse(x: number, y: number, output?: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Performs the 8 calculations required to create the vertices of + * a quad based on this matrix and the given x/y/xw/yh values. + * + * The result is stored in `TransformMatrix.quad`, which is returned + * from this method. + * @param x The x value. + * @param y The y value. + * @param xw The xw value. + * @param yh The yh value. + * @param roundPixels Pass the results via Math.round? Default false. + * @param quad Optional Float32Array to store the results in. Otherwises uses the local quad array. + */ + setQuad(x: number, y: number, xw: number, yh: number, roundPixels?: boolean, quad?: Float32Array): Float32Array; + + /** + * Returns the X component of this matrix multiplied by the given values. + * This is the same as `x * a + y * c + e`. + * @param x The x value. + * @param y The y value. + */ + getX(x: number, y: number): number; + + /** + * Returns the Y component of this matrix multiplied by the given values. + * This is the same as `x * b + y * d + f`. + * @param x The x value. + * @param y The y value. + */ + getY(x: number, y: number): number; + + /** + * Returns the X component of this matrix multiplied by the given values. + * + * This is the same as `x * a + y * c + e`, optionally passing via `Math.round`. + * @param x The x value. + * @param y The y value. + * @param round Math.round the resulting value? Default false. + */ + getXRound(x: number, y: number, round?: boolean): number; + + /** + * Returns the Y component of this matrix multiplied by the given values. + * + * This is the same as `x * b + y * d + f`, optionally passing via `Math.round`. + * @param x The x value. + * @param y The y value. + * @param round Math.round the resulting value? Default false. + */ + getYRound(x: number, y: number, round?: boolean): number; + + /** + * Returns a string that can be used in a CSS Transform call as a `matrix` property. + */ + getCSSMatrix(): string; + + /** + * Destroys this Transform Matrix. + */ + destroy(): void; + + } + + /** + * Provides methods used for setting the visibility of a Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Visible { + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + } + + } + + /** + * A Container Game Object. + * + * A Container, as the name implies, can 'contain' other types of Game Object. + * When a Game Object is added to a Container, the Container becomes responsible for the rendering of it. + * By default it will be removed from the Display List and instead added to the Containers own internal list. + * + * The position of the Game Object automatically becomes relative to the position of the Container. + * + * The transform point of a Container is 0x0 (in local space) and that cannot be changed. The children you add to the + * Container should be positioned with this value in mind. I.e. you should treat 0x0 as being the center of + * the Container, and position children positively and negative around it as required. + * + * When the Container is rendered, all of its children are rendered as well, in the order in which they exist + * within the Container. Container children can be repositioned using methods such as `MoveUp`, `MoveDown` and `SendToBack`. + * + * If you modify a transform property of the Container, such as `Container.x` or `Container.rotation` then it will + * automatically influence all children as well. + * + * Containers can include other Containers for deeply nested transforms. + * + * Containers can have masks set on them and can be used as a mask too. However, Container children cannot be masked. + * The masks do not 'stack up'. Only a Container on the root of the display list will use its mask. + * + * Containers can be enabled for input. Because they do not have a texture you need to provide a shape for them + * to use as their hit area. Container children can also be enabled for input, independent of the Container. + * + * If input enabling a _child_ you should not set both the `origin` and a **negative** scale factor on the child, + * or the input area will become misaligned. + * + * Containers can be given a physics body for either Arcade Physics, Impact Physics or Matter Physics. However, + * if Container _children_ are enabled for physics you may get unexpected results, such as offset bodies, + * if the Container itself, or any of its ancestors, is positioned anywhere other than at 0 x 0. Container children + * with physics do not factor in the Container due to the excessive extra calculations needed. Please structure + * your game to work around this. + * + * It's important to understand the impact of using Containers. They add additional processing overhead into + * every one of their children. The deeper you nest them, the more the cost escalates. This is especially true + * for input events. You also loose the ability to set the display depth of Container children in the same + * flexible manner as those not within them. In short, don't use them for the sake of it. You pay a small cost + * every time you create one, try to structure your game around avoiding that where possible. + */ + class Container extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.ComputedSize, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param children An optional array of Game Objects to add to this Container. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, children?: Phaser.GameObjects.GameObject[]); + + /** + * An array holding the children of this Container. + */ + list: Phaser.GameObjects.GameObject[]; + + /** + * Does this Container exclusively manage its children? + * + * The default is `true` which means a child added to this Container cannot + * belong in another Container, which includes the Scene display list. + * + * If you disable this then this Container will no longer exclusively manage its children. + * This allows you to create all kinds of interesting graphical effects, such as replicating + * Game Objects without reparenting them all over the Scene. + * However, doing so will prevent children from receiving any kind of input event or have + * their physics bodies work by default, as they're no longer a single entity on the + * display list, but are being replicated where-ever this Container is. + */ + exclusive: boolean; + + /** + * Containers can have an optional maximum size. If set to anything above 0 it + * will constrict the addition of new Game Objects into the Container, capping off + * the maximum limit the Container can grow in size to. + */ + maxSize: number; + + /** + * The cursor position. + */ + position: number; + + /** + * Internal Transform Matrix used for local space conversion. + */ + localTransform: Phaser.GameObjects.Components.TransformMatrix; + + /** + * The horizontal scroll factor of this Container. + * + * The scroll factor controls the influence of the movement of a Camera upon this Container. + * + * When a camera scrolls it will change the location at which this Container is rendered on-screen. + * It does not change the Containers actual position values. + * + * For a Container, setting this value will only update the Container itself, not its children. + * If you wish to change the scrollFactor of the children as well, use the `setScrollFactor` method. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Container. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Container. + * + * The scroll factor controls the influence of the movement of a Camera upon this Container. + * + * When a camera scrolls it will change the location at which this Container is rendered on-screen. + * It does not change the Containers actual position values. + * + * For a Container, setting this value will only update the Container itself, not its children. + * If you wish to change the scrollFactor of the children as well, use the `setScrollFactor` method. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Container. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Internal value to allow Containers to be used for input and physics. + * Do not change this value. It has no effect other than to break things. + */ + readonly originX: number; + + /** + * Internal value to allow Containers to be used for input and physics. + * Do not change this value. It has no effect other than to break things. + */ + readonly originY: number; + + /** + * Internal value to allow Containers to be used for input and physics. + * Do not change this value. It has no effect other than to break things. + */ + readonly displayOriginX: number; + + /** + * Internal value to allow Containers to be used for input and physics. + * Do not change this value. It has no effect other than to break things. + */ + readonly displayOriginY: number; + + /** + * Does this Container exclusively manage its children? + * + * The default is `true` which means a child added to this Container cannot + * belong in another Container, which includes the Scene display list. + * + * If you disable this then this Container will no longer exclusively manage its children. + * This allows you to create all kinds of interesting graphical effects, such as replicating + * Game Objects without reparenting them all over the Scene. + * However, doing so will prevent children from receiving any kind of input event or have + * their physics bodies work by default, as they're no longer a single entity on the + * display list, but are being replicated where-ever this Container is. + * @param value The exclusive state of this Container. Default true. + */ + setExclusive(value?: boolean): this; + + /** + * Gets the bounds of this Container. It works by iterating all children of the Container, + * getting their respective bounds, and then working out a min-max rectangle from that. + * It does not factor in if the children render or not, all are included. + * + * Some children are unable to return their bounds, such as Graphics objects, in which case + * they are skipped. + * + * Depending on the quantity of children in this Container it could be a really expensive call, + * so cache it and only poll it as needed. + * + * The values are stored and returned in a Rectangle object. + * @param output A Geom.Rectangle object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: Phaser.Geom.Rectangle): Phaser.Geom.Rectangle; + + /** + * Takes a Point-like object, such as a Vector2, Geom.Point or object with public x and y properties, + * and transforms it into the space of this Container, then returns it in the output object. + * @param source The Source Point to be transformed. + * @param output A destination object to store the transformed point in. If none given a Vector2 will be created and returned. + */ + pointToContainer(source: Phaser.Types.Math.Vector2Like, output?: Phaser.Types.Math.Vector2Like): Phaser.Types.Math.Vector2Like; + + /** + * Returns the world transform matrix as used for Bounds checks. + * + * The returned matrix is temporal and shouldn't be stored. + */ + getBoundsTransformMatrix(): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Adds the given Game Object, or array of Game Objects, to this Container. + * + * Each Game Object must be unique within the Container. + * @param child The Game Object, or array of Game Objects, to add to the Container. + */ + add(child: (T|T[])): this; + + /** + * Adds the given Game Object, or array of Game Objects, to this Container at the specified position. + * + * Existing Game Objects in the Container are shifted up. + * + * Each Game Object must be unique within the Container. + * @param child The Game Object, or array of Game Objects, to add to the Container. + * @param index The position to insert the Game Object/s at. Default 0. + */ + addAt(child: (T|T[]), index?: number): this; + + /** + * Returns the Game Object at the given position in this Container. + * @param index The position to get the Game Object from. + */ + getAt(index: number): T; + + /** + * Returns the index of the given Game Object in this Container. + * @param child The Game Object to search for in this Container. + */ + getIndex(child: T): number; + + /** + * Sort the contents of this Container so the items are in order based on the given property. + * For example: `sort('alpha')` would sort the elements based on the value of their `alpha` property. + * @param property The property to lexically sort by. + * @param handler Provide your own custom handler function. Will receive 2 children which it should compare and return a boolean. + */ + sort(property: string, handler?: Function): this; + + /** + * Searches for the first instance of a child with its `name` property matching the given argument. + * Should more than one child have the same name only the first is returned. + * @param name The name to search for. + */ + getByName(name: string): T; + + /** + * Returns a random Game Object from this Container. + * @param startIndex An optional start index. Default 0. + * @param length An optional length, the total number of elements (from the startIndex) to choose from. + */ + getRandom(startIndex?: number, length?: number): T; + + /** + * Gets the first Game Object in this Container. + * + * You can also specify a property and value to search for, in which case it will return the first + * Game Object in this Container with a matching property and / or value. + * + * For example: `getFirst('visible', true)` would return the first Game Object that had its `visible` property set. + * + * You can limit the search to the `startIndex` - `endIndex` range. + * @param property The property to test on each Game Object in the Container. + * @param value The value to test the property against. Must pass a strict (`===`) comparison check. + * @param startIndex An optional start index to search from. Default 0. + * @param endIndex An optional end index to search up to (but not included) Default Container.length. + */ + getFirst(property: string, value: any, startIndex?: number, endIndex?: number): T; + + /** + * Returns all Game Objects in this Container. + * + * You can optionally specify a matching criteria using the `property` and `value` arguments. + * + * For example: `getAll('body')` would return only Game Objects that have a body property. + * + * You can also specify a value to compare the property to: + * + * `getAll('visible', true)` would return only Game Objects that have their visible property set to `true`. + * + * Optionally you can specify a start and end index. For example if this Container had 100 Game Objects, + * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only + * the first 50 Game Objects. + * @param property The property to test on each Game Object in the Container. + * @param value If property is set then the `property` must strictly equal this value to be included in the results. + * @param startIndex An optional start index to search from. Default 0. + * @param endIndex An optional end index to search up to (but not included) Default Container.length. + */ + getAll(property?: string, value?: any, startIndex?: number, endIndex?: number): T[]; + + /** + * Returns the total number of Game Objects in this Container that have a property + * matching the given value. + * + * For example: `count('visible', true)` would count all the elements that have their visible property set. + * + * You can optionally limit the operation to the `startIndex` - `endIndex` range. + * @param property The property to check. + * @param value The value to check. + * @param startIndex An optional start index to search from. Default 0. + * @param endIndex An optional end index to search up to (but not included) Default Container.length. + */ + count(property: string, value: any, startIndex?: number, endIndex?: number): number; + + /** + * Swaps the position of two Game Objects in this Container. + * Both Game Objects must belong to this Container. + * @param child1 The first Game Object to swap. + * @param child2 The second Game Object to swap. + */ + swap(child1: T, child2: T): this; + + /** + * Moves a Game Object to a new position within this Container. + * + * The Game Object must already be a child of this Container. + * + * The Game Object is removed from its old position and inserted into the new one. + * Therefore the Container size does not change. Other children will change position accordingly. + * @param child The Game Object to move. + * @param index The new position of the Game Object in this Container. + */ + moveTo(child: T, index: number): this; + + /** + * Moves a Game Object above another one within this Container. + * + * These 2 Game Objects must already be children of this Container. + * @param child1 The Game Object to move above base Game Object. + * @param child2 The base Game Object. + */ + moveAbove(child1: T, child2: T): this; + + /** + * Moves a Game Object below another one within this Container. + * + * These 2 Game Objects must already be children of this Container. + * @param child1 The Game Object to move below base Game Object. + * @param child2 The base Game Object. + */ + moveBelow(child1: T, child2: T): this; + + /** + * Removes the given Game Object, or array of Game Objects, from this Container. + * + * The Game Objects must already be children of this Container. + * + * You can also optionally call `destroy` on each Game Object that is removed from the Container. + * @param child The Game Object, or array of Game Objects, to be removed from the Container. + * @param destroyChild Optionally call `destroy` on each child successfully removed from this Container. Default false. + */ + remove(child: (T|T[]), destroyChild?: boolean): this; + + /** + * Removes the Game Object at the given position in this Container. + * + * You can also optionally call `destroy` on the Game Object, if one is found. + * @param index The index of the Game Object to be removed. + * @param destroyChild Optionally call `destroy` on the Game Object if successfully removed from this Container. Default false. + */ + removeAt(index: number, destroyChild?: boolean): this; + + /** + * Removes the Game Objects between the given positions in this Container. + * + * You can also optionally call `destroy` on each Game Object that is removed from the Container. + * @param startIndex An optional start index to search from. Default 0. + * @param endIndex An optional end index to search up to (but not included) Default Container.length. + * @param destroyChild Optionally call `destroy` on each Game Object successfully removed from this Container. Default false. + */ + removeBetween(startIndex?: number, endIndex?: number, destroyChild?: boolean): this; + + /** + * Removes all Game Objects from this Container. + * + * You can also optionally call `destroy` on each Game Object that is removed from the Container. + * @param destroyChild Optionally call `destroy` on each Game Object successfully removed from this Container. Default false. + */ + removeAll(destroyChild?: boolean): this; + + /** + * Brings the given Game Object to the top of this Container. + * This will cause it to render on-top of any other objects in the Container. + * @param child The Game Object to bring to the top of the Container. + */ + bringToTop(child: T): this; + + /** + * Sends the given Game Object to the bottom of this Container. + * This will cause it to render below any other objects in the Container. + * @param child The Game Object to send to the bottom of the Container. + */ + sendToBack(child: T): this; + + /** + * Moves the given Game Object up one place in this Container, unless it's already at the top. + * @param child The Game Object to be moved in the Container. + */ + moveUp(child: T): this; + + /** + * Moves the given Game Object down one place in this Container, unless it's already at the bottom. + * @param child The Game Object to be moved in the Container. + */ + moveDown(child: T): this; + + /** + * Reverses the order of all Game Objects in this Container. + */ + reverse(): this; + + /** + * Shuffles the all Game Objects in this Container using the Fisher-Yates implementation. + */ + shuffle(): this; + + /** + * Replaces a Game Object in this Container with the new Game Object. + * The new Game Object cannot already be a child of this Container. + * @param oldChild The Game Object in this Container that will be replaced. + * @param newChild The Game Object to be added to this Container. + * @param destroyChild Optionally call `destroy` on the Game Object if successfully removed from this Container. Default false. + */ + replace(oldChild: T, newChild: T, destroyChild?: boolean): this; + + /** + * Returns `true` if the given Game Object is a direct child of this Container. + * + * This check does not scan nested Containers. + * @param child The Game Object to check for within this Container. + */ + exists(child: T): boolean; + + /** + * Sets the property to the given value on all Game Objects in this Container. + * + * Optionally you can specify a start and end index. For example if this Container had 100 Game Objects, + * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only + * the first 50 Game Objects. + * @param property The property that must exist on the Game Object. + * @param value The value to get the property to. + * @param startIndex An optional start index to search from. Default 0. + * @param endIndex An optional end index to search up to (but not included) Default Container.length. + */ + setAll(property: string, value: any, startIndex?: number, endIndex?: number): this; + + /** + * Passes all Game Objects in this Container to the given callback. + * + * A copy of the Container is made before passing each entry to your callback. + * This protects against the callback itself modifying the Container. + * + * If you know for sure that the callback will not change the size of this Container + * then you can use the more performant `Container.iterate` method instead. + * @param callback The function to call. + * @param context Value to use as `this` when executing callback. + * @param args Additional arguments that will be passed to the callback, after the child. + */ + each(callback: Function, context?: object, ...args: any[]): this; + + /** + * Passes all Game Objects in this Container to the given callback. + * + * Only use this method when you absolutely know that the Container will not be modified during + * the iteration, i.e. by removing or adding to its contents. + * @param callback The function to call. + * @param context Value to use as `this` when executing callback. + * @param args Additional arguments that will be passed to the callback, after the child. + */ + iterate(callback: Function, context?: object, ...args: any[]): this; + + /** + * Sets the scroll factor of this Container and optionally all of its children. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + * @param updateChildren Apply this scrollFactor to all Container children as well? Default false. + */ + setScrollFactor(x: number, y?: number, updateChildren?: boolean): this; + + /** + * The number of Game Objects inside this Container. + */ + readonly length: number; + + /** + * Returns the first Game Object within the Container, or `null` if it is empty. + * + * You can move the cursor by calling `Container.next` and `Container.previous`. + */ + readonly first: Phaser.GameObjects.GameObject | null; + + /** + * Returns the last Game Object within the Container, or `null` if it is empty. + * + * You can move the cursor by calling `Container.next` and `Container.previous`. + */ + readonly last: Phaser.GameObjects.GameObject | null; + + /** + * Returns the next Game Object within the Container, or `null` if it is empty. + * + * You can move the cursor by calling `Container.next` and `Container.previous`. + */ + readonly next: Phaser.GameObjects.GameObject | null; + + /** + * Returns the previous Game Object within the Container, or `null` if it is empty. + * + * You can move the cursor by calling `Container.next` and `Container.previous`. + */ + readonly previous: Phaser.GameObjects.GameObject | null; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * Internal handler, called when a child is destroyed. + */ + protected onChildDestroyed(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Display List plugin. + * + * Display Lists belong to a Scene and maintain the list of Game Objects to render every frame. + * + * Some of these Game Objects may also be part of the Scene's [Update List]{@link Phaser.GameObjects.UpdateList}, for updating. + */ + class DisplayList extends Phaser.Structs.List { + /** + * + * @param scene The Scene that this Display List belongs to. + */ + constructor(scene: Phaser.Scene); + + /** + * The flag the determines whether Game Objects should be sorted when `depthSort()` is called. + */ + sortChildrenFlag: boolean; + + /** + * The Scene that this Display List belongs to. + */ + scene: Phaser.Scene; + + /** + * The Scene's Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * The Scene's Event Emitter. + */ + events: Phaser.Events.EventEmitter; + + /** + * Force a sort of the display list on the next call to depthSort. + */ + queueDepthSort(): void; + + /** + * Immediately sorts the display list if the flag is set. + */ + depthSort(): void; + + /** + * Compare the depth of two Game Objects. + * @param childA The first Game Object. + * @param childB The second Game Object. + */ + sortByDepth(childA: Phaser.GameObjects.GameObject, childB: Phaser.GameObjects.GameObject): number; + + /** + * Returns an array which contains all objects currently on the Display List. + * This is a reference to the main list array, not a copy of it, so be careful not to modify it. + */ + getChildren(): Phaser.GameObjects.GameObject[]; + + } + + /** + * DOM Element Game Objects are a way to control and manipulate HTML Elements over the top of your game. + * + * In order for DOM Elements to display you have to enable them by adding the following to your game + * configuration object: + * + * ```javascript + * dom { + * createContainer: true + * } + * ``` + * + * You must also have a parent container for Phaser. This is specified by the `parent` property in the + * game config. + * + * When these two things are added, Phaser will automatically create a DOM Container div that is positioned + * over the top of the game canvas. This div is sized to match the canvas, and if the canvas size changes, + * as a result of settings within the Scale Manager, the dom container is resized accordingly. + * + * If you have not already done so, you have to provide a `parent` in the Game Configuration, or the DOM + * Container will fail to be created. + * + * You can create a DOM Element by either passing in DOMStrings, or by passing in a reference to an existing + * Element that you wish to be placed under the control of Phaser. For example: + * + * ```javascript + * this.add.dom(x, y, 'div', 'background-color: lime; width: 220px; height: 100px; font: 48px Arial', 'Phaser'); + * ``` + * + * The above code will insert a div element into the DOM Container at the given x/y coordinate. The DOMString in + * the 4th argument sets the initial CSS style of the div and the final argument is the inner text. In this case, + * it will create a lime colored div that is 220px by 100px in size with the text Phaser in it, in an Arial font. + * + * You should nearly always, without exception, use explicitly sized HTML Elements, in order to fully control + * alignment and positioning of the elements next to regular game content. + * + * Rather than specify the CSS and HTML directly you can use the `load.html` File Loader to load it into the + * cache and then use the `createFromCache` method instead. You can also use `createFromHTML` and various other + * methods available in this class to help construct your elements. + * + * Once the element has been created you can then control it like you would any other Game Object. You can set its + * position, scale, rotation, alpha and other properties. It will move as the main Scene Camera moves and be clipped + * at the edge of the canvas. It's important to remember some limitations of DOM Elements: The obvious one is that + * they appear above or below your game canvas. You cannot blend them into the display list, meaning you cannot have + * a DOM Element, then a Sprite, then another DOM Element behind it. + * + * They also cannot be enabled for input. To do that, you have to use the `addListener` method to add native event + * listeners directly. The final limitation is to do with cameras. The DOM Container is sized to match the game canvas + * entirely and clipped accordingly. DOM Elements respect camera scrolling and scrollFactor settings, but if you + * change the size of the camera so it no longer matches the size of the canvas, they won't be clipped accordingly. + * + * DOM Game Objects can be added to a Phaser Container, however you should only nest them **one level deep**. + * Any further down the chain and they will ignore all root container properties. + * + * Also, all DOM Elements are inserted into the same DOM Container, regardless of which Scene they are created in. + * + * Note that you should only have DOM Elements in a Scene with a _single_ Camera. If you require multiple cameras, + * use parallel scenes to achieve this. + * + * DOM Elements are a powerful way to align native HTML with your Phaser Game Objects. For example, you can insert + * a login form for a multiplayer game directly into your title screen. Or a text input box for a highscore table. + * Or a banner ad from a 3rd party service. Or perhaps you'd like to use them for high resolution text display and + * UI. The choice is up to you, just remember that you're dealing with standard HTML and CSS floating over the top + * of your game, and should treat it accordingly. + */ + class DOMElement extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this DOM Element in the world. Default 0. + * @param y The vertical position of this DOM Element in the world. Default 0. + * @param element An existing DOM element, or a string. If a string starting with a # it will do a `getElementById` look-up on the string (minus the hash). Without a hash, it represents the type of element to create, i.e. 'div'. + * @param style If a string, will be set directly as the elements `style` property value. If a plain object, will be iterated and the values transferred. In both cases the values replacing whatever CSS styles may have been previously set. + * @param innerText If given, will be set directly as the elements `innerText` property value, replacing whatever was there before. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, element?: Element | string, style?: string | any, innerText?: string); + + /** + * A reference to the parent DOM Container that the Game instance created when it started. + */ + parent: Element; + + /** + * A reference to the HTML Cache. + */ + cache: Phaser.Cache.BaseCache; + + /** + * The actual DOM Element that this Game Object is bound to. For example, if you've created a `
    ` + * then this property is a direct reference to that element within the dom. + */ + node: Element; + + /** + * By default a DOM Element will have its transform, display, opacity, zIndex and blend mode properties + * updated when its rendered. If, for some reason, you don't want any of these changed other than the + * CSS transform, then set this flag to `true`. When `true` only the CSS Transform is applied and it's + * up to you to keep track of and set the other properties as required. + * + * This can be handy if, for example, you've a nested DOM Element and you don't want the opacity to be + * picked-up by any of its children. + */ + transformOnly: boolean; + + /** + * The angle, in radians, by which to skew the DOM Element on the horizontal axis. + * + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform + */ + skewX: number; + + /** + * The angle, in radians, by which to skew the DOM Element on the vertical axis. + * + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform + */ + skewY: number; + + /** + * A Vector4 that contains the 3D rotation of this DOM Element around a fixed axis in 3D space. + * + * All values in the Vector4 are treated as degrees, unless the `rotate3dAngle` property is changed. + * + * For more details see the following MDN page: + * + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/rotate3d + */ + rotate3d: Phaser.Math.Vector4; + + /** + * The unit that represents the 3D rotation values. By default this is `deg` for degrees, but can + * be changed to any supported unit. See this page for further details: + * + * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/rotate3d + */ + rotate3dAngle: string; + + /** + * Sets the CSS `pointerEvents` attribute on the DOM Element during rendering. + * + * This is 'auto' by default. Changing it may have unintended side-effects with + * internal Phaser input handling, such as dragging, so only change this if you + * understand the implications. + */ + pointerEvents: string; + + /** + * The native (un-scaled) width of this Game Object. + * + * For a DOM Element this property is read-only. + * + * The property `displayWidth` holds the computed bounds of this DOM Element, factoring in scaling. + */ + readonly width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * For a DOM Element this property is read-only. + * + * The property `displayHeight` holds the computed bounds of this DOM Element, factoring in scaling. + */ + readonly height: number; + + /** + * The computed display width of this Game Object, based on the `getBoundingClientRect` DOM call. + * + * The property `width` holds the un-scaled width of this DOM Element. + */ + readonly displayWidth: number; + + /** + * The computed display height of this Game Object, based on the `getBoundingClientRect` DOM call. + * + * The property `height` holds the un-scaled height of this DOM Element. + */ + readonly displayHeight: number; + + /** + * Sets the horizontal and vertical skew values of this DOM Element. + * + * For more information see: https://developer.mozilla.org/en-US/docs/Web/CSS/transform + * @param x The angle, in radians, by which to skew the DOM Element on the horizontal axis. Default 0. + * @param y The angle, in radians, by which to skew the DOM Element on the vertical axis. Default x. + */ + setSkew(x?: number, y?: number): this; + + /** + * Sets the perspective CSS property of the _parent DOM Container_. This determines the distance between the z=0 + * plane and the user in order to give a 3D-positioned element some perspective. Each 3D element with + * z > 0 becomes larger; each 3D-element with z < 0 becomes smaller. The strength of the effect is determined + * by the value of this property. + * + * For more information see: https://developer.mozilla.org/en-US/docs/Web/CSS/perspective + * + * **Changing this value changes it globally for all DOM Elements, as they all share the same parent container.** + * @param value The perspective value, in pixels, that determines the distance between the z plane and the user. + */ + setPerspective(value: number): this; + + /** + * The perspective CSS property value of the _parent DOM Container_. This determines the distance between the z=0 + * plane and the user in order to give a 3D-positioned element some perspective. Each 3D element with + * z > 0 becomes larger; each 3D-element with z < 0 becomes smaller. The strength of the effect is determined + * by the value of this property. + * + * For more information see: https://developer.mozilla.org/en-US/docs/Web/CSS/perspective + * + * **Changing this value changes it globally for all DOM Elements, as they all share the same parent container.** + */ + perspective: number; + + /** + * Adds one or more native DOM event listeners onto the underlying Element of this Game Object. + * The event is then dispatched via this Game Objects standard event emitter. + * + * For example: + * + * ```javascript + * var div = this.add.dom(x, y, element); + * + * div.addListener('click'); + * + * div.on('click', handler); + * ``` + * @param events The DOM event/s to listen for. You can specify multiple events by separating them with spaces. + */ + addListener(events: string): this; + + /** + * Removes one or more native DOM event listeners from the underlying Element of this Game Object. + * @param events The DOM event/s to stop listening for. You can specify multiple events by separating them with spaces. + */ + removeListener(events: string): this; + + /** + * Creates a native DOM Element, adds it to the parent DOM Container and then binds it to this Game Object, + * so you can control it. The `tagName` should be a string and is passed to `document.createElement`: + * + * ```javascript + * this.add.dom().createElement('div'); + * ``` + * + * For more details on acceptable tag names see: https://developer.mozilla.org/en-US/docs/Web/API/Document/createElement + * + * You can also pass in a DOMString or style object to set the CSS on the created element, and an optional `innerText` + * value as well. Here is an example of a DOMString: + * + * ```javascript + * this.add.dom().createElement('div', 'background-color: lime; width: 220px; height: 100px; font: 48px Arial', 'Phaser'); + * ``` + * + * And using a style object: + * + * ```javascript + * var style = { + * 'background-color': 'lime'; + * 'width': '200px'; + * 'height': '100px'; + * 'font': '48px Arial'; + * }; + * + * this.add.dom().createElement('div', style, 'Phaser'); + * ``` + * + * If this Game Object already has an Element, it is removed from the DOM entirely first. + * Any event listeners you may have previously created will need to be re-created after this call. + * @param tagName A string that specifies the type of element to be created. The nodeName of the created element is initialized with the value of tagName. Don't use qualified names (like "html:a") with this method. + * @param style Either a DOMString that holds the CSS styles to be applied to the created element, or an object the styles will be ready from. + * @param innerText A DOMString that holds the text that will be set as the innerText of the created element. + */ + createElement(tagName: string, style?: string | any, innerText?: string): this; + + /** + * Binds a new DOM Element to this Game Object. If this Game Object already has an Element it is removed from the DOM + * entirely first. Any event listeners you may have previously created will need to be re-created on the new element. + * + * The `element` argument you pass to this method can be either a string tagName: + * + * ```javascript + *

    Phaser

    + * + * this.add.dom().setElement('heading'); + * ``` + * + * Or a reference to an Element instance: + * + * ```javascript + *

    Phaser

    + * + * var h1 = document.getElementById('heading'); + * + * this.add.dom().setElement(h1); + * ``` + * + * You can also pass in a DOMString or style object to set the CSS on the created element, and an optional `innerText` + * value as well. Here is an example of a DOMString: + * + * ```javascript + * this.add.dom().setElement(h1, 'background-color: lime; width: 220px; height: 100px; font: 48px Arial', 'Phaser'); + * ``` + * + * And using a style object: + * + * ```javascript + * var style = { + * 'background-color': 'lime'; + * 'width': '200px'; + * 'height': '100px'; + * 'font': '48px Arial'; + * }; + * + * this.add.dom().setElement(h1, style, 'Phaser'); + * ``` + * @param element If a string it is passed to `getElementById()`, or it should be a reference to an existing Element. + * @param style Either a DOMString that holds the CSS styles to be applied to the created element, or an object the styles will be ready from. + * @param innerText A DOMString that holds the text that will be set as the innerText of the created element. + */ + setElement(element: string | Element, style?: string | any, innerText?: string): this; + + /** + * Takes a block of html from the HTML Cache, that has previously been preloaded into the game, and then + * creates a DOM Element from it. The loaded HTML is set as the `innerHTML` property of the created + * element. + * + * Assume the following html is stored in a file called `loginform.html`: + * + * ```html + * + * + * ``` + * + * Which is loaded into your game using the cache key 'login': + * + * ```javascript + * this.load.html('login', 'assets/loginform.html'); + * ``` + * + * You can create a DOM Element from it using the cache key: + * + * ```javascript + * this.add.dom().createFromCache('login'); + * ``` + * + * The optional `elementType` argument controls the container that is created, into which the loaded html is inserted. + * The default is a plain `div` object, but any valid tagName can be given. + * + * If this Game Object already has an Element, it is removed from the DOM entirely first. + * Any event listeners you may have previously created will need to be re-created after this call. + * @param The key of the html cache entry to use for this DOM Element. + * @param tagName The tag name of the element into which all of the loaded html will be inserted. Defaults to a plain div tag. Default 'div'. + */ + createFromCache(The: string, tagName?: string): this; + + /** + * Takes a string of html and then creates a DOM Element from it. The HTML is set as the `innerHTML` + * property of the created element. + * + * ```javascript + * let form = ` + * + * + * `; + * ``` + * + * You can create a DOM Element from it using the string: + * + * ```javascript + * this.add.dom().createFromHTML(form); + * ``` + * + * The optional `elementType` argument controls the type of container that is created, into which the html is inserted. + * The default is a plain `div` object, but any valid tagName can be given. + * + * If this Game Object already has an Element, it is removed from the DOM entirely first. + * Any event listeners you may have previously created will need to be re-created after this call. + * @param html A string of html to be set as the `innerHTML` property of the created element. + * @param tagName The tag name of the element into which all of the html will be inserted. Defaults to a plain div tag. Default 'div'. + */ + createFromHTML(html: string, tagName?: string): this; + + /** + * Removes the current DOM Element bound to this Game Object from the DOM entirely and resets the + * `node` property of this Game Object to be `null`. + */ + removeElement(): this; + + /** + * Internal method that calls `getBoundingClientRect` on the `node` and then sets the bounds width + * and height into the `displayWidth` and `displayHeight` properties, and the `clientWidth` and `clientHeight` + * values into the `width` and `height` properties respectively. + * + * This is called automatically whenever a new element is created or set. + */ + updateSize(): this; + + /** + * Gets all children from this DOM Elements node, using `querySelectorAll('*')` and then iterates through + * them, looking for the first one that has a property matching the given key and value. It then returns this child + * if found, or `null` if not. + * @param property The property to search the children for. + * @param value The value the property must strictly equal. + */ + getChildByProperty(property: string, value: string): Element | null; + + /** + * Gets all children from this DOM Elements node, using `querySelectorAll('*')` and then iterates through + * them, looking for the first one that has a matching id. It then returns this child if found, or `null` if not. + * + * Be aware that class and id names are case-sensitive. + * @param id The id to search the children for. + */ + getChildByID(id: string): Element | null; + + /** + * Gets all children from this DOM Elements node, using `querySelectorAll('*')` and then iterates through + * them, looking for the first one that has a matching name. It then returns this child if found, or `null` if not. + * + * Be aware that class and id names are case-sensitive. + * @param name The name to search the children for. + */ + getChildByName(name: string): Element | null; + + /** + * Sets the `className` property of the DOM Element node and updates the internal sizes. + * @param className A string representing the class or space-separated classes of the element. + */ + setClassName(className: string): this; + + /** + * Sets the `innerText` property of the DOM Element node and updates the internal sizes. + * + * Note that only certain types of Elements can have `innerText` set on them. + * @param text A DOMString representing the rendered text content of the element. + */ + setText(text: string): this; + + /** + * Sets the `innerHTML` property of the DOM Element node and updates the internal sizes. + * @param html A DOMString of html to be set as the `innerHTML` property of the element. + */ + setHTML(html: string): this; + + /** + * Compares the renderMask with the renderFlags to see if this Game Object will render or not. + * + * DOMElements always return `true` as they need to still set values during the render pass, even if not visible. + */ + willRender(): boolean; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + namespace Events { + /** + * The Game Object Added to Scene Event. + * + * This event is dispatched when a Game Object is added to a Scene. + * + * Listen for it on a Game Object instance using `GameObject.on('addedtoscene', listener)`. + */ + const ADDED_TO_SCENE: string; + + /** + * The Game Object Destroy Event. + * + * This event is dispatched when a Game Object instance is being destroyed. + * + * Listen for it on a Game Object instance using `GameObject.on('destroy', listener)`. + */ + const DESTROY: string; + + /** + * The Game Object Removed from Scene Event. + * + * This event is dispatched when a Game Object is removed from a Scene. + * + * Listen for it on a Game Object instance using `GameObject.on('removedfromscene', listener)`. + */ + const REMOVED_FROM_SCENE: string; + + /** + * The Video Game Object Complete Event. + * + * This event is dispatched when a Video finishes playback by reaching the end of its duration. It + * is also dispatched if a video marker sequence is being played and reaches the end. + * + * Note that not all videos can fire this event. Live streams, for example, have no fixed duration, + * so never technically 'complete'. + * + * If a video is stopped from playback, via the `Video.stop` method, it will emit the + * `VIDEO_STOP` event instead of this one. + * + * Listen for it from a Video Game Object instance using `Video.on('complete', listener)`. + */ + const VIDEO_COMPLETE: string; + + /** + * The Video Game Object Created Event. + * + * This event is dispatched when the texture for a Video has been created. This happens + * when enough of the video source has been loaded that the browser is able to render a + * frame from it. + * + * Listen for it from a Video Game Object instance using `Video.on('created', listener)`. + */ + const VIDEO_CREATED: string; + + /** + * The Video Game Object Error Event. + * + * This event is dispatched when a Video tries to play a source that does not exist, or is the wrong file type. + * + * Listen for it from a Video Game Object instance using `Video.on('error', listener)`. + */ + const VIDEO_ERROR: string; + + /** + * The Video Game Object Locked Event. + * + * This event is dispatched when a Video was attempted to be played, but the browser prevented it + * from doing so due to the Media Engagement Interaction policy. + * + * If you get this event you will need to wait for the user to interact with the browser before + * the video will play. This is a browser security measure to prevent autoplaying videos with + * audio. An interaction includes a mouse click, a touch, or a key press. + * + * Listen for it from a Video Game Object instance using `Video.on('locked', listener)`. + */ + const VIDEO_LOCKED: string; + + /** + * The Video Game Object Loop Event. + * + * This event is dispatched when a Video that is currently playing has looped. This only + * happens if the `loop` parameter was specified, or the `setLoop` method was called, + * and if the video has a fixed duration. Video streams, for example, cannot loop, as + * they have no duration. + * + * Looping is based on the result of the Video `timeupdate` event. This event is not + * frame-accurate, due to the way browsers work, so please do not rely on this loop + * event to be time or frame precise. + * + * Listen for it from a Video Game Object instance using `Video.on('loop', listener)`. + */ + const VIDEO_LOOP: string; + + /** + * The Video Game Object Metadata Event. + * + * This event is dispatched when a Video has access to the metadata. + * + * Listen for it from a Video Game Object instance using `Video.on('metadata', listener)`. + */ + const VIDEO_METADATA: string; + + /** + * The Video Game Object Playing Event. + * + * The playing event is fired after playback is first started, + * and whenever it is restarted. For example it is fired when playback + * resumes after having been paused or delayed due to lack of data. + * + * Listen for it from a Video Game Object instance using `Video.on('playing', listener)`. + */ + const VIDEO_PLAYING: string; + + /** + * The Video Game Object Play Event. + * + * This event is dispatched when a Video begins playback. For videos that do not require + * interaction unlocking, this is usually as soon as the `Video.play` method is called. + * However, for videos that require unlocking, it is fired once playback begins after + * they've been unlocked. + * + * Listen for it from a Video Game Object instance using `Video.on('play', listener)`. + */ + const VIDEO_PLAY: string; + + /** + * The Video Game Object Seeked Event. + * + * This event is dispatched when a Video completes seeking to a new point in its timeline. + * + * Listen for it from a Video Game Object instance using `Video.on('seeked', listener)`. + */ + const VIDEO_SEEKED: string; + + /** + * The Video Game Object Seeking Event. + * + * This event is dispatched when a Video _begins_ seeking to a new point in its timeline. + * When the seek is complete, it will dispatch the `VIDEO_SEEKED` event to conclude. + * + * Listen for it from a Video Game Object instance using `Video.on('seeking', listener)`. + */ + const VIDEO_SEEKING: string; + + /** + * The Video Game Object Stalled Event. + * + * This event is dispatched by a Video Game Object when the video playback stalls. + * + * This can happen if the video is buffering. + * + * If will fire for any of the following native DOM events: + * + * `stalled` + * `suspend` + * `waiting` + * + * Listen for it from a Video Game Object instance using `Video.on('stalled', listener)`. + * + * Note that being stalled isn't always a negative thing. A video can be stalled if it + * has downloaded enough data in to its buffer to not need to download any more until + * the current batch of frames have rendered. + */ + const VIDEO_STALLED: string; + + /** + * The Video Game Object Stopped Event. + * + * This event is dispatched when a Video is stopped from playback via a call to the `Video.stop` method, + * either directly via game code, or indirectly as the result of changing a video source or destroying it. + * + * Listen for it from a Video Game Object instance using `Video.on('stop', listener)`. + */ + const VIDEO_STOP: string; + + /** + * The Video Game Object Texture Ready Event. + * + * This event is dispatched by a Video Game Object when it has finished creating its texture. + * + * This happens when the video has finished loading enough data for its first frame. + * + * If you wish to use the Video texture elsewhere in your game, such as as a Sprite texture, + * then you should listen for this event first, before creating the Sprites that use it. + * + * Listen for it from a Video Game Object instance using `Video.on('textureready', listener)`. + */ + const VIDEO_TEXTURE: string; + + /** + * The Video Game Object Unlocked Event. + * + * This event is dispatched when a Video that was prevented from playback due to the browsers + * Media Engagement Interaction policy, is unlocked by a user gesture. + * + * Listen for it from a Video Game Object instance using `Video.on('unlocked', listener)`. + */ + const VIDEO_UNLOCKED: string; + + /** + * The Video Game Object Unsupported Event. + * + * This event is dispatched by a Video Game Object if the media source + * (which may be specified as a MediaStream, MediaSource, Blob, or File, + * for example) doesn't represent a supported media format. + * + * Listen for it from a Video Game Object instance using `Video.on('unsupported', listener)`. + */ + const VIDEO_UNSUPPORTED: string; + + } + + /** + * An Extern Game Object is a special type of Game Object that allows you to pass + * rendering off to a 3rd party. + * + * When you create an Extern and place it in the display list of a Scene, the renderer will + * process the list as usual. When it finds an Extern it will flush the current batch, + * clear down the pipeline and prepare a transform matrix which your render function can + * take advantage of, if required. + * + * The WebGL context is then left in a 'clean' state, ready for you to bind your own shaders, + * or draw to it, whatever you wish to do. This should all take place in the `render` method. + * The correct way to deploy an Extern object is to create a class that extends it, then + * override the `render` (and optionally `preUpdate`) methods and pass off control to your + * 3rd party libraries or custom WebGL code there. + * + * Once you've finished, you should free-up any of your resources. + * The Extern will then rebind the Phaser pipeline and carry on rendering the display list. + * + * Although this object has lots of properties such as Alpha, Blend Mode and Tint, none of + * them are used during rendering unless you take advantage of them in your own render code. + */ + class Extern extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + */ + constructor(scene: Phaser.Scene); + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The base class that all Game Objects extend. + * You don't create GameObjects directly and they cannot be added to the display list. + * Instead, use them as the base for your own custom classes. + */ + class GameObject extends Phaser.Events.EventEmitter { + /** + * + * @param scene The Scene to which this Game Object belongs. + * @param type A textual representation of the type of Game Object, i.e. `sprite`. + */ + constructor(scene: Phaser.Scene, type: string); + + /** + * A reference to the Scene to which this Game Object belongs. + * + * Game Objects can only belong to one Scene. + * + * You should consider this property as being read-only. You cannot move a + * Game Object to another Scene by simply changing it. + */ + scene: Phaser.Scene; + + /** + * Holds a reference to the Display List that contains this Game Object. + * + * This is set automatically when this Game Object is added to a Scene or Layer. + * + * You should treat this property as being read-only. + */ + displayList: Phaser.GameObjects.DisplayList | Phaser.GameObjects.Layer; + + /** + * A textual representation of this Game Object, i.e. `sprite`. + * Used internally by Phaser but is available for your own custom classes to populate. + */ + type: string; + + /** + * The current state of this Game Object. + * + * Phaser itself will never modify this value, although plugins may do so. + * + * Use this property to track the state of a Game Object during its lifetime. For example, it could change from + * a state of 'moving', to 'attacking', to 'dead'. The state value should be an integer (ideally mapped to a constant + * in your game code), or a string. These are recommended to keep it light and simple, with fast comparisons. + * If you need to store complex data about your Game Object, look at using the Data Component instead. + */ + state: number | string; + + /** + * The parent Container of this Game Object, if it has one. + */ + parentContainer: Phaser.GameObjects.Container; + + /** + * The name of this Game Object. + * Empty by default and never populated by Phaser, this is left for developers to use. + */ + name: string; + + /** + * The active state of this Game Object. + * A Game Object with an active state of `true` is processed by the Scenes UpdateList, if added to it. + * An active object is one which is having its logic and internal systems updated. + */ + active: boolean; + + /** + * The Tab Index of the Game Object. + * Reserved for future use by plugins and the Input Manager. + */ + tabIndex: number; + + /** + * A Data Manager. + * It allows you to store, query and get key/value paired information specific to this Game Object. + * `null` by default. Automatically created if you use `getData` or `setData` or `setDataEnabled`. + */ + data: Phaser.Data.DataManager; + + /** + * The flags that are compared against `RENDER_MASK` to determine if this Game Object will render or not. + * The bits are 0001 | 0010 | 0100 | 1000 set by the components Visible, Alpha, Transform and Texture respectively. + * If those components are not used by your custom class then you can use this bitmask as you wish. + */ + renderFlags: number; + + /** + * A bitmask that controls if this Game Object is drawn by a Camera or not. + * Not usually set directly, instead call `Camera.ignore`, however you can + * set this property directly using the Camera.id property: + */ + cameraFilter: number; + + /** + * If this Game Object is enabled for input then this property will contain an InteractiveObject instance. + * Not usually set directly. Instead call `GameObject.setInteractive()`. + */ + input: Phaser.Types.Input.InteractiveObject | null; + + /** + * If this Game Object is enabled for Arcade or Matter Physics then this property will contain a reference to a Physics Body. + */ + body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody | MatterJS.BodyType | null; + + /** + * This Game Object will ignore all calls made to its destroy method if this flag is set to `true`. + * This includes calls that may come from a Group, Container or the Scene itself. + * While it allows you to persist a Game Object across Scenes, please understand you are entirely + * responsible for managing references to and from this Game Object. + */ + ignoreDestroy: boolean; + + /** + * Sets the `active` property of this Game Object and returns this Game Object for further chaining. + * A Game Object with its `active` property set to `true` will be updated by the Scenes UpdateList. + * @param value True if this Game Object should be set as active, false if not. + */ + setActive(value: boolean): this; + + /** + * Sets the `name` property of this Game Object and returns this Game Object for further chaining. + * The `name` property is not populated by Phaser and is presented for your own use. + * @param value The name to be given to this Game Object. + */ + setName(value: string): this; + + /** + * Sets the current state of this Game Object. + * + * Phaser itself will never modify the State of a Game Object, although plugins may do so. + * + * For example, a Game Object could change from a state of 'moving', to 'attacking', to 'dead'. + * The state value should typically be an integer (ideally mapped to a constant + * in your game code), but could also be a string. It is recommended to keep it light and simple. + * If you need to store complex data about your Game Object, look at using the Data Component instead. + * @param value The state of the Game Object. + */ + setState(value: number | string): this; + + /** + * Adds a Data Manager component to this Game Object. + */ + setDataEnabled(): this; + + /** + * Allows you to store a key value pair within this Game Objects Data Manager. + * + * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled + * before setting the value. + * + * If the key doesn't already exist in the Data Manager then it is created. + * + * ```javascript + * sprite.setData('name', 'Red Gem Stone'); + * ``` + * + * You can also pass in an object of key value pairs as the first argument: + * + * ```javascript + * sprite.setData({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 }); + * ``` + * + * To get a value back again you can call `getData`: + * + * ```javascript + * sprite.getData('gold'); + * ``` + * + * Or you can access the value directly via the `values` property, where it works like any other variable: + * + * ```javascript + * sprite.data.values.gold += 50; + * ``` + * + * When the value is first set, a `setdata` event is emitted from this Game Object. + * + * If the key already exists, a `changedata` event is emitted instead, along an event named after the key. + * For example, if you updated an existing key called `PlayerLives` then it would emit the event `changedata-PlayerLives`. + * These events will be emitted regardless if you use this method to set the value, or the direct `values` setter. + * + * Please note that the data keys are case-sensitive and must be valid JavaScript Object property strings. + * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager. + * @param key The key to set the value for. Or an object of key value pairs. If an object the `data` argument is ignored. + * @param data The value to set for the given key. If an object is provided as the key this argument is ignored. + */ + setData(key: (string|T), data?: any): this; + + /** + * Increase a value for the given key within this Game Objects Data Manager. If the key doesn't already exist in the Data Manager then it is increased from 0. + * + * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled + * before setting the value. + * + * If the key doesn't already exist in the Data Manager then it is created. + * + * When the value is first set, a `setdata` event is emitted from this Game Object. + * @param key The key to change the value for. + * @param amount The amount to increase the given key by. Pass a negative value to decrease the key. Default 1. + */ + incData(key: string, amount?: number): this; + + /** + * Toggle a boolean value for the given key within this Game Objects Data Manager. If the key doesn't already exist in the Data Manager then it is toggled from false. + * + * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled + * before setting the value. + * + * If the key doesn't already exist in the Data Manager then it is created. + * + * When the value is first set, a `setdata` event is emitted from this Game Object. + * @param key The key to toggle the value for. + */ + toggleData(key: string): this; + + /** + * Retrieves the value for the given key in this Game Objects Data Manager, or undefined if it doesn't exist. + * + * You can also access values via the `values` object. For example, if you had a key called `gold` you can do either: + * + * ```javascript + * sprite.getData('gold'); + * ``` + * + * Or access the value directly: + * + * ```javascript + * sprite.data.values.gold; + * ``` + * + * You can also pass in an array of keys, in which case an array of values will be returned: + * + * ```javascript + * sprite.getData([ 'gold', 'armor', 'health' ]); + * ``` + * + * This approach is useful for destructuring arrays in ES6. + * @param key The key of the value to retrieve, or an array of keys. + */ + getData(key: string | string[]): any; + + /** + * Pass this Game Object to the Input Manager to enable it for Input. + * + * Input works by using hit areas, these are nearly always geometric shapes, such as rectangles or circles, that act as the hit area + * for the Game Object. However, you can provide your own hit area shape and callback, should you wish to handle some more advanced + * input detection. + * + * If no arguments are provided it will try and create a rectangle hit area based on the texture frame the Game Object is using. If + * this isn't a texture-bound object, such as a Graphics or BitmapText object, this will fail, and you'll need to provide a specific + * shape for it to use. + * + * You can also provide an Input Configuration Object as the only argument to this method. + * @param hitArea Either an input configuration object, or a geometric shape that defines the hit area for the Game Object. If not given it will try to create a Rectangle based on the texture frame. + * @param callback The callback that determines if the pointer is within the Hit Area shape or not. If you provide a shape you must also provide a callback. + * @param dropZone Should this Game Object be treated as a drop zone target? Default false. + */ + setInteractive(hitArea?: Phaser.Types.Input.InputConfiguration | any, callback?: Phaser.Types.Input.HitAreaCallback, dropZone?: boolean): this; + + /** + * If this Game Object has previously been enabled for input, this will disable it. + * + * An object that is disabled for input stops processing or being considered for + * input events, but can be turned back on again at any time by simply calling + * `setInteractive()` with no arguments provided. + * + * If want to completely remove interaction from this Game Object then use `removeInteractive` instead. + */ + disableInteractive(): this; + + /** + * If this Game Object has previously been enabled for input, this will queue it + * for removal, causing it to no longer be interactive. The removal happens on + * the next game step, it is not immediate. + * + * The Interactive Object that was assigned to this Game Object will be destroyed, + * removed from the Input Manager and cleared from this Game Object. + * + * If you wish to re-enable this Game Object at a later date you will need to + * re-create its InteractiveObject by calling `setInteractive` again. + * + * If you wish to only temporarily stop an object from receiving input then use + * `disableInteractive` instead, as that toggles the interactive state, where-as + * this erases it completely. + * + * If you wish to resize a hit area, don't remove and then set it as being + * interactive. Instead, access the hitarea object directly and resize the shape + * being used. I.e.: `sprite.input.hitArea.setSize(width, height)` (assuming the + * shape is a Rectangle, which it is by default.) + */ + removeInteractive(): this; + + /** + * This callback is invoked when this Game Object is added to a Scene. + * + * Can be overriden by custom Game Objects, but be aware of some Game Objects that + * will use this, such as Sprites, to add themselves into the Update List. + * + * You can also listen for the `ADDED_TO_SCENE` event from this Game Object. + */ + addedToScene(): void; + + /** + * This callback is invoked when this Game Object is removed from a Scene. + * + * Can be overriden by custom Game Objects, but be aware of some Game Objects that + * will use this, such as Sprites, to removed themselves from the Update List. + * + * You can also listen for the `REMOVED_FROM_SCENE` event from this Game Object. + */ + removedFromScene(): void; + + /** + * To be overridden by custom GameObjects. Allows base objects to be used in a Pool. + * @param args args + */ + update(...args: any[]): void; + + /** + * Returns a JSON representation of the Game Object. + */ + toJSON(): Phaser.Types.GameObjects.JSONGameObject; + + /** + * Compares the renderMask with the renderFlags to see if this Game Object will render or not. + * Also checks the Game Object against the given Cameras exclusion list. + * @param camera The Camera to check against this Game Object. + */ + willRender(camera: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Returns an array containing the display list index of either this Game Object, or if it has one, + * its parent Container. It then iterates up through all of the parent containers until it hits the + * root of the display list (which is index 0 in the returned array). + * + * Used internally by the InputPlugin but also useful if you wish to find out the display depth of + * this Game Object and all of its ancestors. + */ + getIndexList(): number[]; + + /** + * Adds this Game Object to the given Display List. + * + * If no Display List is specified, it will default to the Display List owned by the Scene to which + * this Game Object belongs. + * + * A Game Object can only exist on one Display List at any given time, but may move freely between them. + * + * If this Game Object is already on another Display List when this method is called, it will first + * be removed from it, before being added to the new list. + * + * You can query which list it is on by looking at the `Phaser.GameObjects.GameObject#displayList` property. + * + * If a Game Object isn't on any display list, it will not be rendered. If you just wish to temporarly + * disable it from rendering, consider using the `setVisible` method, instead. + * @param displayList The Display List to add to. Defaults to the Scene Display List. + */ + addToDisplayList(displayList?: Phaser.GameObjects.DisplayList | Phaser.GameObjects.Layer): this; + + /** + * Adds this Game Object to the Update List belonging to the Scene. + * + * When a Game Object is added to the Update List it will have its `preUpdate` method called + * every game frame. This method is passed two parameters: `delta` and `time`. + * + * If you wish to run your own logic within `preUpdate` then you should always call + * `super.preUpdate(delta, time)` within it, or it may fail to process required operations, + * such as Sprite animations. + */ + addToUpdateList(): this; + + /** + * Removes this Game Object from the Display List it is currently on. + * + * A Game Object can only exist on one Display List at any given time, but may move freely removed + * and added back at a later stage. + * + * You can query which list it is on by looking at the `Phaser.GameObjects.GameObject#displayList` property. + * + * If a Game Object isn't on any Display List, it will not be rendered. If you just wish to temporarly + * disable it from rendering, consider using the `setVisible` method, instead. + */ + removeFromDisplayList(): this; + + /** + * Removes this Game Object from the Scene's Update List. + * + * When a Game Object is on the Update List, it will have its `preUpdate` method called + * every game frame. Calling this method will remove it from the list, preventing this. + * + * Removing a Game Object from the Update List will stop most internal functions working. + * For example, removing a Sprite from the Update List will prevent it from being able to + * run animations. + */ + removeFromUpdateList(): this; + + /** + * Destroys this Game Object removing it from the Display List and Update List and + * severing all ties to parent resources. + * + * Also removes itself from the Input Manager and Physics Manager if previously enabled. + * + * Use this to remove a Game Object from your game if you don't ever plan to use it again. + * As long as no reference to it exists within your own code it should become free for + * garbage collection by the browser. + * + * If you just want to temporarily disable an object then look at using the + * Game Object Pool instead of destroying it, as destroyed objects cannot be resurrected. + * @param fromScene `True` if this Game Object is being destroyed by the Scene, `false` if not. Default false. + */ + destroy(fromScene?: boolean): void; + + /** + * The bitmask that `GameObject.renderFlags` is compared against to determine if the Game Object will render or not. + */ + static readonly RENDER_MASK: number; + + } + + /** + * The Game Object Creator is a Scene plugin that allows you to quickly create many common + * types of Game Objects and return them using a configuration object, rather than + * having to specify a limited set of parameters such as with the GameObjectFactory. + * + * Game Objects made via this class are automatically added to the Scene and Update List + * unless you explicitly set the `add` property in the configuration object to `false`. + */ + class GameObjectCreator { + /** + * + * @param scene The Scene to which this Game Object Factory belongs. + */ + constructor(scene: Phaser.Scene); + + /** + * Creates a new Dynamic Bitmap Text Game Object and returns it. + * + * Note: This method will only be available if the Dynamic Bitmap Text Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + dynamicBitmapText(config: Phaser.Types.GameObjects.BitmapText.BitmapTextConfig, addToScene?: boolean): Phaser.GameObjects.DynamicBitmapText; + + /** + * Creates a new Bitmap Text Game Object and returns it. + * + * Note: This method will only be available if the Bitmap Text Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + bitmapText(config: Phaser.Types.GameObjects.BitmapText.BitmapTextConfig, addToScene?: boolean): Phaser.GameObjects.BitmapText; + + /** + * Creates a new Blitter Game Object and returns it. + * + * Note: This method will only be available if the Blitter Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + blitter(config: Phaser.Types.GameObjects.Sprite.SpriteConfig, addToScene?: boolean): Phaser.GameObjects.Blitter; + + /** + * Creates a new Container Game Object and returns it. + * + * Note: This method will only be available if the Container Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + container(config: Phaser.Types.GameObjects.Container.ContainerConfig, addToScene?: boolean): Phaser.GameObjects.Container; + + /** + * The Scene to which this Game Object Creator belongs. + */ + protected scene: Phaser.Scene; + + /** + * A reference to the Scene.Systems. + */ + protected systems: Phaser.Scenes.Systems; + + /** + * A reference to the Scene Event Emitter. + */ + protected events: Phaser.Events.EventEmitter; + + /** + * A reference to the Scene Display List. + */ + protected displayList: Phaser.GameObjects.DisplayList; + + /** + * A reference to the Scene Update List. + */ + protected updateList: Phaser.GameObjects.UpdateList; + + /** + * Static method called directly by the Game Object creator functions. + * With this method you can register a custom GameObject factory in the GameObjectCreator, + * providing a name (`factoryType`) and the constructor (`factoryFunction`) in order + * to be called when you invoke Phaser.Scene.make[ factoryType ] method. + * @param factoryType The key of the factory that you will use to call to Phaser.Scene.make[ factoryType ] method. + * @param factoryFunction The constructor function to be called when you invoke to the Phaser.Scene.make method. + */ + static register(factoryType: string, factoryFunction: Function): void; + + /** + * Static method called directly by the Game Object Creator functions. + * + * With this method you can remove a custom Game Object Creator that has been previously + * registered in the Game Object Creator. Pass in its `factoryType` in order to remove it. + * @param factoryType The key of the factory that you want to remove from the GameObjectCreator. + */ + static remove(factoryType: string): void; + + /** + * Creates a new Graphics Game Object and returns it. + * + * Note: This method will only be available if the Graphics Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + graphics(config?: Phaser.Types.GameObjects.Graphics.Options, addToScene?: boolean): Phaser.GameObjects.Graphics; + + /** + * Creates a new Group Game Object and returns it. + * + * Note: This method will only be available if the Group Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + */ + group(config: Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig): Phaser.GameObjects.Group; + + /** + * Creates a new Image Game Object and returns it. + * + * Note: This method will only be available if the Image Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + image(config: Phaser.Types.GameObjects.Sprite.SpriteConfig, addToScene?: boolean): Phaser.GameObjects.Image; + + /** + * Creates a new Layer Game Object and returns it. + * + * Note: This method will only be available if the Layer Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + layer(config: Phaser.Types.GameObjects.Sprite.SpriteConfig, addToScene?: boolean): Phaser.GameObjects.Layer; + + /** + * Creates a new Mesh Game Object and returns it. + * + * Note: This method will only be available if the Mesh Game Object and WebGL support have been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + mesh(config: Phaser.Types.GameObjects.Mesh.MeshConfig, addToScene?: boolean): Phaser.GameObjects.Mesh; + + /** + * Creates a new Nine Slice Game Object and returns it. + * + * Note: This method will only be available if the Nine Slice Game Object and WebGL support have been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + nineslice(config: Phaser.Types.GameObjects.NineSlice.NineSliceConfig, addToScene?: boolean): Phaser.GameObjects.NineSlice; + + /** + * Creates a new Particle Emitter Game Object and returns it. + * + * Prior to Phaser v3.60 this function would create a `ParticleEmitterManager`. These were removed + * in v3.60 and replaced with creating a `ParticleEmitter` instance directly. Please see the + * updated function parameters and class documentation for more details. + * + * Note: This method will only be available if the Particles Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + particles(config: Phaser.Types.GameObjects.Particles.ParticleEmitterCreatorConfig, addToScene?: boolean): Phaser.GameObjects.Particles.ParticleEmitter; + + /** + * Creates a new Plane Game Object and returns it. + * + * Note: This method will only be available if the Plane Game Object and WebGL support have been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + plane(config: Phaser.Types.GameObjects.Plane.PlaneConfig, addToScene?: boolean): Phaser.GameObjects.Plane; + + /** + * Creates a new Point Light Game Object and returns it. + * + * Note: This method will only be available if the Point Light Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + pointlight(config: object, addToScene?: boolean): Phaser.GameObjects.PointLight; + + /** + * Creates a new Render Texture Game Object and returns it. + * + * Note: This method will only be available if the Render Texture Game Object has been built into Phaser. + * + * A Render Texture is a combination of Dynamic Texture and an Image Game Object, that uses the + * Dynamic Texture to display itself with. + * + * A Dynamic Texture is a special texture that allows you to draw textures, frames and most kind of + * Game Objects directly to it. + * + * You can take many complex objects and draw them to this one texture, which can then be used as the + * base texture for other Game Objects, such as Sprites. Should you then update this texture, all + * Game Objects using it will instantly be updated as well, reflecting the changes immediately. + * + * It's a powerful way to generate dynamic textures at run-time that are WebGL friendly and don't invoke + * expensive GPU uploads on each change. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + renderTexture(config: Phaser.Types.GameObjects.RenderTexture.RenderTextureConfig, addToScene?: boolean): Phaser.GameObjects.RenderTexture; + + /** + * Creates a new Rope Game Object and returns it. + * + * Note: This method will only be available if the Rope Game Object and WebGL support have been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + rope(config: Phaser.Types.GameObjects.Rope.RopeConfig, addToScene?: boolean): Phaser.GameObjects.Rope; + + /** + * Creates a new Shader Game Object and returns it. + * + * Note: This method will only be available if the Shader Game Object and WebGL support have been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + shader(config: Phaser.Types.GameObjects.Shader.ShaderConfig, addToScene?: boolean): Phaser.GameObjects.Shader; + + /** + * Creates a new Sprite Game Object and returns it. + * + * Note: This method will only be available if the Sprite Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. Default true. + */ + sprite(config: Phaser.Types.GameObjects.Sprite.SpriteConfig, addToScene?: boolean): Phaser.GameObjects.Sprite; + + /** + * Creates a new Text Game Object and returns it. + * + * Note: This method will only be available if the Text Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + text(config: Phaser.Types.GameObjects.Text.TextConfig, addToScene?: boolean): Phaser.GameObjects.Text; + + /** + * Creates a new TileSprite Game Object and returns it. + * + * Note: This method will only be available if the TileSprite Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + tileSprite(config: Phaser.Types.GameObjects.TileSprite.TileSpriteConfig, addToScene?: boolean): Phaser.GameObjects.TileSprite; + + /** + * Creates a new Video Game Object and returns it. + * + * Note: This method will only be available if the Video Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + * @param addToScene Add this Game Object to the Scene after creating it? If set this argument overrides the `add` property in the config object. + */ + video(config: Phaser.Types.GameObjects.Video.VideoConfig, addToScene?: boolean): Phaser.GameObjects.Video; + + /** + * Creates a new Zone Game Object and returns it. + * + * Note: This method will only be available if the Zone Game Object has been built into Phaser. + * @param config The configuration object this Game Object will use to create itself. + */ + zone(config: Phaser.Types.GameObjects.Zone.ZoneConfig): Phaser.GameObjects.Zone; + + /** + * Creates a Tilemap from the given key or data, or creates a blank Tilemap if no key/data provided. + * When loading from CSV or a 2D array, you should specify the tileWidth & tileHeight. When parsing + * from a map from Tiled, the tileWidth, tileHeight, width & height will be pulled from the map + * data. For an empty map, you should specify tileWidth, tileHeight, width & height. + * @param config The config options for the Tilemap. + */ + tilemap(config?: Phaser.Types.Tilemaps.TilemapConfig): Phaser.Tilemaps.Tilemap; + + /** + * Creates a new Tween object and returns it. + * + * Note: This method will only be available if Tweens have been built into Phaser. + * @param config A Tween Configuration object, or a Tween or TweenChain instance. + */ + tween(config: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenChainBuilderConfig | Phaser.Tweens.Tween | Phaser.Tweens.TweenChain): Phaser.Tweens.Tween; + + /** + * Creates a new TweenChain object and returns it, without adding it to the Tween Manager. + * + * Note: This method will only be available if Tweens have been built into Phaser. + * @param config The TweenChain configuration. + */ + tweenchain(config: Phaser.Types.Tweens.TweenBuilderConfig | object): Phaser.Tweens.TweenChain; + + } + + /** + * The Game Object Factory is a Scene plugin that allows you to quickly create many common + * types of Game Objects and have them automatically registered with the Scene. + * + * Game Objects directly register themselves with the Factory and inject their own creation + * methods into the class. + */ + class GameObjectFactory { + /** + * + * @param scene The Scene to which this Game Object Factory belongs. + */ + constructor(scene: Phaser.Scene); + + /** + * Creates a new Path Object. + * @param x The horizontal position of this Path. + * @param y The vertical position of this Path. + */ + path(x: number, y: number): Phaser.Curves.Path; + + /** + * A Bitmap Mask combines the alpha (opacity) of a masked pixel with the alpha of another pixel. + * Unlike the Geometry Mask, which is a clipping path, a Bitmap Mask behaves like an alpha mask, + * not a clipping path. It is only available when using the WebGL Renderer. + * + * A Bitmap Mask can use any Game Object, or Dynamic Texture, to determine the alpha of each pixel of the masked Game Object(s). + * For any given point of a masked Game Object's texture, the pixel's alpha will be multiplied by the alpha + * of the pixel at the same position in the Bitmap Mask's Game Object. The color of the pixel from the + * Bitmap Mask doesn't matter. + * + * For example, if a pure blue pixel with an alpha of 0.95 is masked with a pure red pixel with an + * alpha of 0.5, the resulting pixel will be pure blue with an alpha of 0.475. Naturally, this means + * that a pixel in the mask with an alpha of 0 will hide the corresponding pixel in all masked Game Objects + * A pixel with an alpha of 1 in the masked Game Object will receive the same alpha as the + * corresponding pixel in the mask. + * + * Note: You cannot combine Bitmap Masks and Blend Modes on the same Game Object. You can, however, + * combine Geometry Masks and Blend Modes together. + * + * The Bitmap Mask's location matches the location of its Game Object, not the location of the + * masked objects. Moving or transforming the underlying Game Object will change the mask + * (and affect the visibility of any masked objects), whereas moving or transforming a masked object + * will not affect the mask. + * + * The Bitmap Mask will not render its Game Object by itself. If the Game Object is not in a + * Scene's display list, it will only be used for the mask and its full texture will not be directly + * visible. Adding the underlying Game Object to a Scene will not cause any problems - it will + * render as a normal Game Object and will also serve as a mask. + * @param maskObject The Game Object or Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + bitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates a new Dynamic Bitmap Text Game Object and adds it to the Scene. + * + * BitmapText objects work by taking a texture file and an XML or JSON file that describes the font structure. + * + * During rendering for each letter of the text is rendered to the display, proportionally spaced out and aligned to + * match the font structure. + * + * Dynamic Bitmap Text objects are different from Static Bitmap Text in that they invoke a callback for each + * letter being rendered during the render pass. This callback allows you to manipulate the properties of + * each letter being rendered, such as its position, scale or tint, allowing you to create interesting effects + * like jiggling text, which can't be done with Static text. This means that Dynamic Text takes more processing + * time, so only use them if you require the callback ability they have. + * + * BitmapText objects are less flexible than Text objects, in that they have less features such as shadows, fills and the ability + * to use Web Fonts, however you trade this flexibility for rendering speed. You can also create visually compelling BitmapTexts by + * processing the font texture in an image editor, applying fills and any other effects required. + * + * To create multi-line text insert \r, \n or \r\n escape codes into the text string. + * + * To create a BitmapText data files you need a 3rd party app such as: + * + * BMFont (Windows, free): http://www.angelcode.com/products/bmfont/ + * Glyph Designer (OS X, commercial): http://www.71squared.com/en/glyphdesigner + * Littera (Web-based, free): http://kvazars.com/littera/ + * + * For most use cases it is recommended to use XML. If you wish to use JSON, the formatting should be equal to the result of + * converting a valid XML file through the popular X2JS library. An online tool for conversion can be found here: http://codebeautify.org/xmltojson + * + * Note: This method will only be available if the Dynamic Bitmap Text Game Object has been built into Phaser. + * @param x The x position of the Game Object. + * @param y The y position of the Game Object. + * @param font The key of the font to use from the BitmapFont cache. + * @param text The string, or array of strings, to be set as the content of this Bitmap Text. + * @param size The font size to set. + */ + dynamicBitmapText(x: number, y: number, font: string, text?: string | string[], size?: number): Phaser.GameObjects.DynamicBitmapText; + + /** + * Creates a new Bitmap Text Game Object and adds it to the Scene. + * + * BitmapText objects work by taking a texture file and an XML or JSON file that describes the font structure. + * + * During rendering for each letter of the text is rendered to the display, proportionally spaced out and aligned to + * match the font structure. + * + * BitmapText objects are less flexible than Text objects, in that they have less features such as shadows, fills and the ability + * to use Web Fonts, however you trade this flexibility for rendering speed. You can also create visually compelling BitmapTexts by + * processing the font texture in an image editor, applying fills and any other effects required. + * + * To create multi-line text insert \r, \n or \r\n escape codes into the text string. + * + * To create a BitmapText data files you need a 3rd party app such as: + * + * BMFont (Windows, free): http://www.angelcode.com/products/bmfont/ + * Glyph Designer (OS X, commercial): http://www.71squared.com/en/glyphdesigner + * Littera (Web-based, free): http://kvazars.com/littera/ + * + * For most use cases it is recommended to use XML. If you wish to use JSON, the formatting should be equal to the result of + * converting a valid XML file through the popular X2JS library. An online tool for conversion can be found here: http://codebeautify.org/xmltojson + * + * Note: This method will only be available if the Bitmap Text Game Object has been built into Phaser. + * @param x The x position of the Game Object. + * @param y The y position of the Game Object. + * @param font The key of the font to use from the BitmapFont cache. + * @param text The string, or array of strings, to be set as the content of this Bitmap Text. + * @param size The font size to set. + * @param align The alignment of the text in a multi-line BitmapText object. Default 0. + */ + bitmapText(x: number, y: number, font: string, text?: string | string[], size?: number, align?: number): Phaser.GameObjects.BitmapText; + + /** + * Creates a new Blitter Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Blitter Game Object has been built into Phaser. + * @param x The x position of the Game Object. + * @param y The y position of the Game Object. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame The default Frame children of the Blitter will use. + */ + blitter(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.Blitter; + + /** + * Creates a new Container Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Container Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param children An optional array of Game Objects to add to this Container. + */ + container(x?: number, y?: number, children?: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[]): Phaser.GameObjects.Container; + + /** + * DOM Element Game Objects are a way to control and manipulate HTML Elements over the top of your game. + * + * In order for DOM Elements to display you have to enable them by adding the following to your game + * configuration object: + * + * ```javascript + * dom { + * createContainer: true + * } + * ``` + * + * When this is added, Phaser will automatically create a DOM Container div that is positioned over the top + * of the game canvas. This div is sized to match the canvas, and if the canvas size changes, as a result of + * settings within the Scale Manager, the dom container is resized accordingly. + * + * You can create a DOM Element by either passing in DOMStrings, or by passing in a reference to an existing + * Element that you wish to be placed under the control of Phaser. For example: + * + * ```javascript + * this.add.dom(x, y, 'div', 'background-color: lime; width: 220px; height: 100px; font: 48px Arial', 'Phaser'); + * ``` + * + * The above code will insert a div element into the DOM Container at the given x/y coordinate. The DOMString in + * the 4th argument sets the initial CSS style of the div and the final argument is the inner text. In this case, + * it will create a lime colored div that is 220px by 100px in size with the text Phaser in it, in an Arial font. + * + * You should nearly always, without exception, use explicitly sized HTML Elements, in order to fully control + * alignment and positioning of the elements next to regular game content. + * + * Rather than specify the CSS and HTML directly you can use the `load.html` File Loader to load it into the + * cache and then use the `createFromCache` method instead. You can also use `createFromHTML` and various other + * methods available in this class to help construct your elements. + * + * Once the element has been created you can then control it like you would any other Game Object. You can set its + * position, scale, rotation, alpha and other properties. It will move as the main Scene Camera moves and be clipped + * at the edge of the canvas. It's important to remember some limitations of DOM Elements: The obvious one is that + * they appear above or below your game canvas. You cannot blend them into the display list, meaning you cannot have + * a DOM Element, then a Sprite, then another DOM Element behind it. + * + * They also cannot be enabled for input. To do that, you have to use the `addListener` method to add native event + * listeners directly. The final limitation is to do with cameras. The DOM Container is sized to match the game canvas + * entirely and clipped accordingly. DOM Elements respect camera scrolling and scrollFactor settings, but if you + * change the size of the camera so it no longer matches the size of the canvas, they won't be clipped accordingly. + * + * Also, all DOM Elements are inserted into the same DOM Container, regardless of which Scene they are created in. + * + * DOM Elements are a powerful way to align native HTML with your Phaser Game Objects. For example, you can insert + * a login form for a multiplayer game directly into your title screen. Or a text input box for a highscore table. + * Or a banner ad from a 3rd party service. Or perhaps you'd like to use them for high resolution text display and + * UI. The choice is up to you, just remember that you're dealing with standard HTML and CSS floating over the top + * of your game, and should treat it accordingly. + * + * Note: This method will only be available if the DOM Element Game Object has been built into Phaser. + * @param x The horizontal position of this DOM Element in the world. + * @param y The vertical position of this DOM Element in the world. + * @param element An existing DOM element, or a string. If a string starting with a # it will do a `getElementById` look-up on the string (minus the hash). Without a hash, it represents the type of element to create, i.e. 'div'. + * @param style If a string, will be set directly as the elements `style` property value. If a plain object, will be iterated and the values transferred. In both cases the values replacing whatever CSS styles may have been previously set. + * @param innerText If given, will be set directly as the elements `innerText` property value, replacing whatever was there before. + */ + dom(x: number, y: number, element?: HTMLElement | string, style?: string | any, innerText?: string): Phaser.GameObjects.DOMElement; + + /** + * Creates a new Extern Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Extern Game Object has been built into Phaser. + */ + extern(): Phaser.GameObjects.Extern; + + /** + * The Scene to which this Game Object Factory belongs. + */ + protected scene: Phaser.Scene; + + /** + * A reference to the Scene.Systems. + */ + protected systems: Phaser.Scenes.Systems; + + /** + * A reference to the Scene Event Emitter. + */ + protected events: Phaser.Events.EventEmitter; + + /** + * A reference to the Scene Display List. + */ + protected displayList: Phaser.GameObjects.DisplayList; + + /** + * A reference to the Scene Update List. + */ + protected updateList: Phaser.GameObjects.UpdateList; + + /** + * Adds an existing Game Object to this Scene. + * + * If the Game Object renders, it will be added to the Display List. + * If it has a `preUpdate` method, it will be added to the Update List. + * @param child The child to be added to this Scene. + */ + existing(child: G): G; + + /** + * Static method called directly by the Game Object factory functions. + * With this method you can register a custom GameObject factory in the GameObjectFactory, + * providing a name (`factoryType`) and the constructor (`factoryFunction`) in order + * to be called when you call to Phaser.Scene.add[ factoryType ] method. + * @param factoryType The key of the factory that you will use to call to Phaser.Scene.add[ factoryType ] method. + * @param factoryFunction The constructor function to be called when you invoke to the Phaser.Scene.add method. + */ + static register(factoryType: string, factoryFunction: Function): void; + + /** + * Static method called directly by the Game Object factory functions. + * With this method you can remove a custom GameObject factory registered in the GameObjectFactory, + * providing a its `factoryType`. + * @param factoryType The key of the factory that you want to remove from the GameObjectFactory. + */ + static remove(factoryType: string): void; + + /** + * Creates a new Graphics Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Graphics Game Object has been built into Phaser. + * @param config The Graphics configuration. + */ + graphics(config?: Phaser.Types.GameObjects.Graphics.Options): Phaser.GameObjects.Graphics; + + /** + * Creates a new Group Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Group Game Object has been built into Phaser. + * @param children Game Objects to add to this Group; or the `config` argument. + * @param config A Group Configuration object. + */ + group(children?: Phaser.GameObjects.GameObject[] | Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupConfig[] | Phaser.Types.GameObjects.Group.GroupCreateConfig, config?: Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig): Phaser.GameObjects.Group; + + /** + * Creates a new Image Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Image Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + image(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.Image; + + /** + * Creates a new Layer Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Layer Game Object has been built into Phaser. + * @param children An optional array of Game Objects to add to this Layer. + */ + layer(children?: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[]): Phaser.GameObjects.Layer; + + /** + * Creates a new Mesh Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Mesh Game Object and WebGL support have been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param vertices The vertices array. Either `xy` pairs, or `xyz` if the `containsZ` parameter is `true`. + * @param uvs The UVs pairs array. + * @param indicies Optional vertex indicies array. If you don't have one, pass `null` or an empty array. + * @param containsZ Does the vertices data include a `z` component? Default false. + * @param normals Optional vertex normals array. If you don't have one, pass `null` or an empty array. + * @param colors An array of colors, one per vertex, or a single color value applied to all vertices. Default 0xffffff. + * @param alphas An array of alpha values, one per vertex, or a single alpha value applied to all vertices. Default 1. + */ + mesh(x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number, vertices?: number[], uvs?: number[], indicies?: number[], containsZ?: boolean, normals?: number[], colors?: number | number[], alphas?: number | number[]): Phaser.GameObjects.Mesh; + + /** + * A Nine Slice Game Object allows you to display a texture-based object that + * can be stretched both horizontally and vertically, but that retains + * fixed-sized corners. The dimensions of the corners are set via the + * parameters to this class. + * + * This is extremely useful for UI and button like elements, where you need + * them to expand to accommodate the content without distorting the texture. + * + * The texture you provide for this Game Object should be based on the + * following layout structure: + * + * ``` + * A B + * +---+----------------------+---+ + * C | 1 | 2 | 3 | + * +---+----------------------+---+ + * | | | | + * | 4 | 5 | 6 | + * | | | | + * +---+----------------------+---+ + * D | 7 | 8 | 9 | + * +---+----------------------+---+ + * ``` + * + * When changing this objects width and / or height: + * + * areas 1, 3, 7 and 9 (the corners) will remain unscaled + * areas 2 and 8 will be stretched horizontally only + * areas 4 and 6 will be stretched vertically only + * area 5 will be stretched both horizontally and vertically + * + * You can also create a 3 slice Game Object: + * + * This works in a similar way, except you can only stretch it horizontally. + * Therefore, it requires less configuration: + * + * ``` + * A B + * +---+----------------------+---+ + * | | | | + * C | 1 | 2 | 3 | + * | | | | + * +---+----------------------+---+ + * ``` + * + * When changing this objects width (you cannot change its height) + * + * areas 1 and 3 will remain unscaled + * area 2 will be stretched horizontally + * + * The above configuration concept is adapted from the Pixi NineSlicePlane. + * + * To specify a 3 slice object instead of a 9 slice you should only + * provide the `leftWidth` and `rightWidth` parameters. To create a 9 slice + * you must supply all parameters. + * + * The _minimum_ width this Game Object can be is the total of + * `leftWidth` + `rightWidth`. The _minimum_ height this Game Object + * can be is the total of `topHeight` + `bottomHeight`. + * If you need to display this object at a smaller size, you can scale it. + * + * In terms of performance, using a 3 slice Game Object is the equivalent of + * having 3 Sprites in a row. Using a 9 slice Game Object is the equivalent + * of having 9 Sprites in a row. The vertices of this object are all batched + * together and can co-exist with other Sprites and graphics on the display + * list, without incurring any additional overhead. + * + * As of Phaser 3.60 this Game Object is WebGL only. + * @param x The horizontal position of the center of this Game Object in the world. + * @param y The vertical position of the center of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param width The width of the Nine Slice Game Object. You can adjust the width post-creation. Default 256. + * @param height The height of the Nine Slice Game Object. If this is a 3 slice object the height will be fixed to the height of the texture and cannot be changed. Default 256. + * @param leftWidth The size of the left vertical column (A). Default 10. + * @param rightWidth The size of the right vertical column (B). Default 10. + * @param topHeight The size of the top horiztonal row (C). Set to zero or undefined to create a 3 slice object. Default 0. + * @param bottomHeight The size of the bottom horiztonal row (D). Set to zero or undefined to create a 3 slice object. Default 0. + */ + nineslice(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, width?: number, height?: number, leftWidth?: number, rightWidth?: number, topHeight?: number, bottomHeight?: number): Phaser.GameObjects.NineSlice; + + /** + * Creates a new Particle Emitter Game Object and adds it to the Scene. + * + * If you wish to configure the Emitter after creating it, use the `ParticleEmitter.setConfig` method. + * + * Prior to Phaser v3.60 this function would create a `ParticleEmitterManager`. These were removed + * in v3.60 and replaced with creating a `ParticleEmitter` instance directly. Please see the + * updated function parameters and class documentation for more details. + * + * Note: This method will only be available if the Particles Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param config Configuration settings for the Particle Emitter. + */ + particles(x?: number, y?: number, texture?: string | Phaser.Textures.Texture, config?: Phaser.Types.GameObjects.Particles.ParticleEmitterConfig): Phaser.GameObjects.Particles.ParticleEmitter; + + /** + * Creates a new PathFollower Game Object and adds it to the Scene. + * + * Note: This method will only be available if the PathFollower Game Object has been built into Phaser. + * @param path The Path this PathFollower is connected to. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + follower(path: Phaser.Curves.Path, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.PathFollower; + + /** + * Creates a new Plane Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Plane Game Object has been built into Phaser. + * @param x The horizontal position of this Plane in the world. + * @param y The vertical position of this Plane in the world. + * @param texture The key, or instance of the Texture this Plane will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Plane is rendering with. + * @param width The width of this Plane, in cells, not pixels. Default 8. + * @param height The height of this Plane, in cells, not pixels. Default 8. + * @param tile Is the texture tiled? I.e. repeated across each cell. Default false. + */ + plane(x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number, width?: number, height?: number, tile?: boolean): Phaser.GameObjects.Plane; + + /** + * Creates a new Point Light Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Point Light Game Object has been built into Phaser. + * + * The Point Light Game Object provides a way to add a point light effect into your game, + * without the expensive shader processing requirements of the traditional Light Game Object. + * + * The difference is that the Point Light renders using a custom shader, designed to give the + * impression of a point light source, of variable radius, intensity and color, in your game. + * However, unlike the Light Game Object, it does not impact any other Game Objects, or use their + * normal maps for calcuations. This makes them extremely fast to render compared to Lights + * and perfect for special effects, such as flickering torches or muzzle flashes. + * + * For maximum performance you should batch Point Light Game Objects together. This means + * ensuring they follow each other consecutively on the display list. Ideally, use a Layer + * Game Object and then add just Point Lights to it, so that it can batch together the rendering + * of the lights. You don't _have_ to do this, and if you've only a handful of Point Lights in + * your game then it's perfectly safe to mix them into the dislay list as normal. However, if + * you're using a large number of them, please consider how they are mixed into the display list. + * + * The renderer will automatically cull Point Lights. Those with a radius that does not intersect + * with the Camera will be skipped in the rendering list. This happens automatically and the + * culled state is refreshed every frame, for every camera. + * + * The origin of a Point Light is always 0.5 and it cannot be changed. + * + * Point Lights are a WebGL only feature and do not have a Canvas counterpart. + * @param x The horizontal position of this Point Light in the world. + * @param y The vertical position of this Point Light in the world. + * @param color The color of the Point Light, given as a hex value. Default 0xffffff. + * @param radius The radius of the Point Light. Default 128. + * @param intensity The intensity, or color blend, of the Point Light. Default 1. + * @param attenuation The attenuation of the Point Light. This is the reduction of light from the center point. Default 0.1. + */ + pointlight(x: number, y: number, color?: number, radius?: number, intensity?: number, attenuation?: number): Phaser.GameObjects.PointLight; + + /** + * Creates a new Render Texture Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Render Texture Game Object has been built into Phaser. + * + * A Render Texture is a combination of Dynamic Texture and an Image Game Object, that uses the + * Dynamic Texture to display itself with. + * + * A Dynamic Texture is a special texture that allows you to draw textures, frames and most kind of + * Game Objects directly to it. + * + * You can take many complex objects and draw them to this one texture, which can then be used as the + * base texture for other Game Objects, such as Sprites. Should you then update this texture, all + * Game Objects using it will instantly be updated as well, reflecting the changes immediately. + * + * It's a powerful way to generate dynamic textures at run-time that are WebGL friendly and don't invoke + * expensive GPU uploads on each change. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param width The width of the Render Texture. Default 32. + * @param height The height of the Render Texture. Default 32. + */ + renderTexture(x: number, y: number, width?: number, height?: number): Phaser.GameObjects.RenderTexture; + + /** + * Creates a new Rope Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Rope Game Object and WebGL support have been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param points An array containing the vertices data for this Rope. If none is provided a simple quad is created. See `setPoints` to set this post-creation. + * @param horizontal Should the vertices of this Rope be aligned horizontally (`true`), or vertically (`false`)? Default true. + * @param colors An optional array containing the color data for this Rope. You should provide one color value per pair of vertices. + * @param alphas An optional array containing the alpha data for this Rope. You should provide one alpha value per pair of vertices. + */ + rope(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, points?: Phaser.Types.Math.Vector2Like[], horizontal?: boolean, colors?: number[], alphas?: number[]): Phaser.GameObjects.Rope; + + /** + * Creates a new Shader Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Shader Game Object and WebGL support have been built into Phaser. + * @param key The key of the shader to use from the shader cache, or a BaseShader instance. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the Game Object. Default 128. + * @param height The height of the Game Object. Default 128. + * @param textures Optional array of texture keys to bind to the iChannel0...3 uniforms. The textures must already exist in the Texture Manager. + * @param textureData Optional additional texture data. + */ + shader(key: string | Phaser.Display.BaseShader, x?: number, y?: number, width?: number, height?: number, textures?: string[], textureData?: object): Phaser.GameObjects.Shader; + + /** + * Creates a new Arc Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Arc Game Object has been built into Phaser. + * + * The Arc Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * When it renders it displays an arc shape. You can control the start and end angles of the arc, + * as well as if the angles are winding clockwise or anti-clockwise. With the default settings + * it renders as a complete circle. By changing the angles you can create other arc shapes, + * such as half-circles. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param radius The radius of the arc. Default 128. + * @param startAngle The start angle of the arc, in degrees. Default 0. + * @param endAngle The end angle of the arc, in degrees. Default 360. + * @param anticlockwise The winding order of the start and end angles. Default false. + * @param fillColor The color the arc will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the arc will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + arc(x?: number, y?: number, radius?: number, startAngle?: number, endAngle?: number, anticlockwise?: boolean, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Arc; + + /** + * Creates a new Circle Shape Game Object and adds it to the Scene. + * + * A Circle is an Arc with no defined start and end angle, making it render as a complete circle. + * + * Note: This method will only be available if the Arc Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param radius The radius of the circle. Default 128. + * @param fillColor The color the circle will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the circle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + circle(x?: number, y?: number, radius?: number, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Arc; + + /** + * Creates a new Curve Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Curve Game Object has been built into Phaser. + * + * The Curve Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * To render a Curve Shape you must first create a `Phaser.Curves.Curve` object, then pass it to + * the Curve Shape in the constructor. + * + * The Curve shape also has a `smoothness` property and corresponding `setSmoothness` method. + * This allows you to control how smooth the shape renders in WebGL, by controlling the number of iterations + * that take place during construction. Increase and decrease the default value for smoother, or more + * jagged, shapes. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param curve The Curve object to use to create the Shape. + * @param fillColor The color the curve will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the curve will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + curve(x?: number, y?: number, curve?: Phaser.Curves.Curve, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Curve; + + /** + * Creates a new Ellipse Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Ellipse Game Object has been built into Phaser. + * + * The Ellipse Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * When it renders it displays an ellipse shape. You can control the width and height of the ellipse. + * If the width and height match it will render as a circle. If the width is less than the height, + * it will look more like an egg shape. + * + * The Ellipse shape also has a `smoothness` property and corresponding `setSmoothness` method. + * This allows you to control how smooth the shape renders in WebGL, by controlling the number of iterations + * that take place during construction. Increase and decrease the default value for smoother, or more + * jagged, shapes. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the ellipse. An ellipse with equal width and height renders as a circle. Default 128. + * @param height The height of the ellipse. An ellipse with equal width and height renders as a circle. Default 128. + * @param fillColor The color the ellipse will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the ellipse will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + ellipse(x?: number, y?: number, width?: number, height?: number, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Ellipse; + + /** + * Creates a new Grid Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Grid Game Object has been built into Phaser. + * + * The Grid Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only fill colors and cannot be stroked. + * + * A Grid Shape allows you to display a grid in your game, where you can control the size of the + * grid as well as the width and height of the grid cells. You can set a fill color for each grid + * cell as well as an alternate fill color. When the alternate fill color is set then the grid + * cells will alternate the fill colors as they render, creating a chess-board effect. You can + * also optionally have an outline fill color. If set, this draws lines between the grid cells + * in the given color. If you specify an outline color with an alpha of zero, then it will draw + * the cells spaced out, but without the lines between them. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the grid. Default 128. + * @param height The height of the grid. Default 128. + * @param cellWidth The width of one cell in the grid. Default 32. + * @param cellHeight The height of one cell in the grid. Default 32. + * @param fillColor The color the grid cells will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + * @param outlineFillColor The color of the lines between the grid cells. + * @param outlineFillAlpha The alpha of the lines between the grid cells. + */ + grid(x?: number, y?: number, width?: number, height?: number, cellWidth?: number, cellHeight?: number, fillColor?: number, fillAlpha?: number, outlineFillColor?: number, outlineFillAlpha?: number): Phaser.GameObjects.Grid; + + /** + * Creates a new IsoBox Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the IsoBox Game Object has been built into Phaser. + * + * The IsoBox Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only fill colors and cannot be stroked. + * + * An IsoBox is an 'isometric' rectangle. Each face of it has a different fill color. You can set + * the color of the top, left and right faces of the rectangle respectively. You can also choose + * which of the faces are rendered via the `showTop`, `showLeft` and `showRight` properties. + * + * You cannot view an IsoBox from under-neath, however you can change the 'angle' by setting + * the `projection` property. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param size The width of the iso box in pixels. The left and right faces will be exactly half this value. Default 48. + * @param height The height of the iso box. The left and right faces will be this tall. The overall height of the isobox will be this value plus half the `size` value. Default 32. + * @param fillTop The fill color of the top face of the iso box. Default 0xeeeeee. + * @param fillLeft The fill color of the left face of the iso box. Default 0x999999. + * @param fillRight The fill color of the right face of the iso box. Default 0xcccccc. + */ + isobox(x?: number, y?: number, size?: number, height?: number, fillTop?: number, fillLeft?: number, fillRight?: number): Phaser.GameObjects.IsoBox; + + /** + * Creates a new IsoTriangle Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the IsoTriangle Game Object has been built into Phaser. + * + * The IsoTriangle Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only fill colors and cannot be stroked. + * + * An IsoTriangle is an 'isometric' triangle. Think of it like a pyramid. Each face has a different + * fill color. You can set the color of the top, left and right faces of the triangle respectively + * You can also choose which of the faces are rendered via the `showTop`, `showLeft` and `showRight` properties. + * + * You cannot view an IsoTriangle from under-neath, however you can change the 'angle' by setting + * the `projection` property. The `reversed` property controls if the IsoTriangle is rendered upside + * down or not. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param size The width of the iso triangle in pixels. The left and right faces will be exactly half this value. Default 48. + * @param height The height of the iso triangle. The left and right faces will be this tall. The overall height of the iso triangle will be this value plus half the `size` value. Default 32. + * @param reversed Is the iso triangle upside down? Default false. + * @param fillTop The fill color of the top face of the iso triangle. Default 0xeeeeee. + * @param fillLeft The fill color of the left face of the iso triangle. Default 0x999999. + * @param fillRight The fill color of the right face of the iso triangle. Default 0xcccccc. + */ + isotriangle(x?: number, y?: number, size?: number, height?: number, reversed?: boolean, fillTop?: number, fillLeft?: number, fillRight?: number): Phaser.GameObjects.IsoTriangle; + + /** + * Creates a new Line Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Line Game Object has been built into Phaser. + * + * The Line Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only stroke colors and cannot be filled. + * + * A Line Shape allows you to draw a line between two points in your game. You can control the + * stroke color and thickness of the line. In WebGL only you can also specify a different + * thickness for the start and end of the line, allowing you to render lines that taper-off. + * + * If you need to draw multiple lines in a sequence you may wish to use the Polygon Shape instead. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param x1 The horizontal position of the start of the line. Default 0. + * @param y1 The vertical position of the start of the line. Default 0. + * @param x2 The horizontal position of the end of the line. Default 128. + * @param y2 The vertical position of the end of the line. Default 0. + * @param strokeColor The color the line will be drawn in, i.e. 0xff0000 for red. + * @param strokeAlpha The alpha the line will be drawn in. You can also set the alpha of the overall Shape using its `alpha` property. + */ + line(x?: number, y?: number, x1?: number, y1?: number, x2?: number, y2?: number, strokeColor?: number, strokeAlpha?: number): Phaser.GameObjects.Line; + + /** + * Creates a new Polygon Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Polygon Game Object has been built into Phaser. + * + * The Polygon Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * The Polygon Shape is created by providing a list of points, which are then used to create an + * internal Polygon geometry object. The points can be set from a variety of formats: + * + * - An array of Point or Vector2 objects: `[new Phaser.Math.Vector2(x1, y1), ...]` + * - An array of objects with public x/y properties: `[obj1, obj2, ...]` + * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]` + * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]` + * + * By default the `x` and `y` coordinates of this Shape refer to the center of it. However, depending + * on the coordinates of the points provided, the final shape may be rendered offset from its origin. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param points The points that make up the polygon. + * @param fillColor The color the polygon will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the polygon will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + polygon(x?: number, y?: number, points?: any, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Polygon; + + /** + * Creates a new Rectangle Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Rectangle Game Object has been built into Phaser. + * + * The Rectangle Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * You can change the size of the rectangle by changing the `width` and `height` properties. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the rectangle. Default 128. + * @param height The height of the rectangle. Default 128. + * @param fillColor The color the rectangle will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the rectangle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + rectangle(x?: number, y?: number, width?: number, height?: number, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Rectangle; + + /** + * Creates a new Star Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Star Game Object has been built into Phaser. + * + * The Star Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * As the name implies, the Star shape will display a star in your game. You can control several + * aspects of it including the number of points that constitute the star. The default is 5. If + * you change it to 4 it will render as a diamond. If you increase them, you'll get a more spiky + * star shape. + * + * You can also control the inner and outer radius, which is how 'long' each point of the star is. + * Modify these values to create more interesting shapes. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param points The number of points on the star. Default 5. + * @param innerRadius The inner radius of the star. Default 32. + * @param outerRadius The outer radius of the star. Default 64. + * @param fillColor The color the star will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the star will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + star(x?: number, y?: number, points?: number, innerRadius?: number, outerRadius?: number, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Star; + + /** + * Creates a new Triangle Shape Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Triangle Game Object has been built into Phaser. + * + * The Triangle Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * The Triangle consists of 3 lines, joining up to form a triangular shape. You can control the + * position of each point of these lines. The triangle is always closed and cannot have an open + * face. If you require that, consider using a Polygon instead. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param x1 The horizontal position of the first point in the triangle. Default 0. + * @param y1 The vertical position of the first point in the triangle. Default 128. + * @param x2 The horizontal position of the second point in the triangle. Default 64. + * @param y2 The vertical position of the second point in the triangle. Default 0. + * @param x3 The horizontal position of the third point in the triangle. Default 128. + * @param y3 The vertical position of the third point in the triangle. Default 128. + * @param fillColor The color the triangle will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the triangle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + triangle(x?: number, y?: number, x1?: number, y1?: number, x2?: number, y2?: number, x3?: number, y3?: number, fillColor?: number, fillAlpha?: number): Phaser.GameObjects.Triangle; + + /** + * Creates a new Sprite Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Sprite Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + sprite(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.Sprite; + + /** + * Creates a new Text Game Object and adds it to the Scene. + * + * A Text Game Object. + * + * Text objects work by creating their own internal hidden Canvas and then renders text to it using + * the standard Canvas `fillText` API. It then creates a texture from this canvas which is rendered + * to your game during the render pass. + * + * Because it uses the Canvas API you can take advantage of all the features this offers, such as + * applying gradient fills to the text, or strokes, shadows and more. You can also use custom fonts + * loaded externally, such as Google or TypeKit Web fonts. + * + * You can only display fonts that are currently loaded and available to the browser: therefore fonts must + * be pre-loaded. Phaser does not do this for you, so you will require the use of a 3rd party font loader, + * or have the fonts ready available in the CSS on the page in which your Phaser game resides. + * + * See {@link http://www.jordanm.co.uk/tinytype this compatibility table} for the available default fonts + * across mobile browsers. + * + * A note on performance: Every time the contents of a Text object changes, i.e. changing the text being + * displayed, or the style of the text, it needs to remake the Text canvas, and if on WebGL, re-upload the + * new texture to the GPU. This can be an expensive operation if used often, or with large quantities of + * Text objects in your game. If you run into performance issues you would be better off using Bitmap Text + * instead, as it benefits from batching and avoids expensive Canvas API calls. + * + * Note: This method will only be available if the Text Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param text The text this Text object will display. + * @param style The Text style configuration object. + */ + text(x: number, y: number, text: string | string[], style?: Phaser.Types.GameObjects.Text.TextStyle): Phaser.GameObjects.Text; + + /** + * Creates a new TileSprite Game Object and adds it to the Scene. + * + * Note: This method will only be available if the TileSprite Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param width The width of the Game Object. If zero it will use the size of the texture frame. + * @param height The height of the Game Object. If zero it will use the size of the texture frame. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. Cannot be a DynamicTexture. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + tileSprite(x: number, y: number, width: number, height: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.GameObjects.TileSprite; + + /** + * Creates a new Video Game Object and adds it to the Scene. + * + * This Game Object is capable of handling playback of a video file, video stream or media stream. + * + * You can optionally 'preload' the video into the Phaser Video Cache: + * + * ```javascript + * preload () { + * this.load.video('ripley', 'assets/aliens.mp4'); + * } + * + * create () { + * this.add.video(400, 300, 'ripley'); + * } + * ``` + * + * You don't have to 'preload' the video. You can also play it directly from a URL: + * + * ```javascript + * create () { + * this.add.video(400, 300).loadURL('assets/aliens.mp4'); + * } + * ``` + * + * To all intents and purposes, a video is a standard Game Object, just like a Sprite. And as such, you can do + * all the usual things to it, such as scaling, rotating, cropping, tinting, making interactive, giving a + * physics body, etc. + * + * Transparent videos are also possible via the WebM file format. Providing the video file has was encoded with + * an alpha channel, and providing the browser supports WebM playback (not all of them do), then it will render + * in-game with full transparency. + * + * ### Autoplaying Videos + * + * Videos can only autoplay if the browser has been unlocked with an interaction, or satisfies the MEI settings. + * The policies that control autoplaying are vast and vary between browser. You can, and should, read more about + * it here: https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide + * + * If your video doesn't contain any audio, then set the `noAudio` parameter to `true` when the video is _loaded_, + * and it will often allow the video to play immediately: + * + * ```javascript + * preload () { + * this.load.video('pixar', 'nemo.mp4', true); + * } + * ``` + * + * The 3rd parameter in the load call tells Phaser that the video doesn't contain any audio tracks. Video without + * audio can autoplay without requiring a user interaction. Video with audio cannot do this unless it satisfies + * the browsers MEI settings. See the MDN Autoplay Guide for further details. + * + * Or: + * + * ```javascript + * create () { + * this.add.video(400, 300).loadURL('assets/aliens.mp4', true); + * } + * ``` + * + * You can set the `noAudio` parameter to `true` even if the video does contain audio. It will still allow the video + * to play immediately, but the audio will not start. + * + * Note that due to a bug in IE11 you cannot play a video texture to a Sprite in WebGL. For IE11 force Canvas mode. + * + * More details about video playback and the supported media formats can be found on MDN: + * + * https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement + * https://developer.mozilla.org/en-US/docs/Web/Media/Formats + * + * Note: This method will only be available if the Video Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param key Optional key of the Video this Game Object will play, as stored in the Video Cache. + */ + video(x: number, y: number, key?: string): Phaser.GameObjects.Video; + + /** + * Creates a new Zone Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Zone Game Object has been built into Phaser. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param width The width of the Game Object. + * @param height The height of the Game Object. + */ + zone(x: number, y: number, width: number, height: number): Phaser.GameObjects.Zone; + + /** + * Creates a Tilemap from the given key or data, or creates a blank Tilemap if no key/data provided. + * When loading from CSV or a 2D array, you should specify the tileWidth & tileHeight. When parsing + * from a map from Tiled, the tileWidth, tileHeight, width & height will be pulled from the map + * data. For an empty map, you should specify tileWidth, tileHeight, width & height. + * @param key The key in the Phaser cache that corresponds to the loaded tilemap data. + * @param tileWidth The width of a tile in pixels. Pass in `null` to leave as the + * default. Default 32. + * @param tileHeight The height of a tile in pixels. Pass in `null` to leave as the + * default. Default 32. + * @param width The width of the map in tiles. Pass in `null` to leave as the + * default. Default 10. + * @param height The height of the map in tiles. Pass in `null` to leave as the + * default. Default 10. + * @param data Instead of loading from the cache, you can also load directly from + * a 2D array of tile indexes. Pass in `null` for no data. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the + * map data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. Default false. + */ + tilemap(key?: string, tileWidth?: number, tileHeight?: number, width?: number, height?: number, data?: number[][], insertNull?: boolean): Phaser.Tilemaps.Tilemap; + + /** + * A Timeline is a way to schedule events to happen at specific times in the future. + * + * You can think of it as an event sequencer for your game, allowing you to schedule the + * running of callbacks, events and other actions at specific times in the future. + * + * A Timeline is a Scene level system, meaning you can have as many Timelines as you like, each + * belonging to a different Scene. You can also have multiple Timelines running at the same time. + * + * If the Scene is paused, the Timeline will also pause. If the Scene is destroyed, the Timeline + * will be automatically destroyed. However, you can control the Timeline directly, pausing, + * resuming and stopping it at any time. + * + * Create an instance of a Timeline via the Game Object Factory: + * + * ```js + * const timeline = this.add.timeline(); + * ``` + * + * The Timeline always starts paused. You must call `play` on it to start it running. + * + * You can also pass in a configuration object on creation, or an array of them: + * + * ```js + * const timeline = this.add.timeline({ + * at: 1000, + * run: () => { + * this.add.sprite(400, 300, 'logo'); + * } + * }); + * + * timeline.play(); + * ``` + * + * In this example we sequence a few different events: + * + * ```js + * const timeline = this.add.timeline([ + * { + * at: 1000, + * run: () => { this.logo = this.add.sprite(400, 300, 'logo'); }, + * sound: 'TitleMusic' + * }, + * { + * at: 2500, + * tween: { + * targets: this.logo, + * y: 600, + * yoyo: true + * }, + * sound: 'Explode' + * }, + * { + * at: 8000, + * event: 'HURRY_PLAYER', + * target: this.background, + * set: { + * tint: 0xff0000 + * } + * } + * ]); + * + * timeline.play(); + * ``` + * + * The Timeline can also be looped with the repeat method: + * ```js + * timeline.repeat().play(); + * ``` + * + * There are lots of options available to you via the configuration object. See the + * {@link Phaser.Types.Time.TimelineEventConfig} typedef for more details. + * @param config The configuration object for this Timeline Event, or an array of them. + */ + timeline(config: Phaser.Types.Time.TimelineEventConfig | Phaser.Types.Time.TimelineEventConfig[]): Phaser.Time.Timeline; + + /** + * Creates a new Tween object. + * + * Note: This method will only be available if Tweens have been built into Phaser. + * @param config A Tween Configuration object, or a Tween or TweenChain instance. + */ + tween(config: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenChainBuilderConfig | Phaser.Tweens.Tween | Phaser.Tweens.TweenChain): Phaser.Tweens.Tween; + + /** + * Creates a new TweenChain object and adds it to the Tween Manager. + * + * Note: This method will only be available if Tweens have been built into Phaser. + * @param config The TweenChain configuration. + */ + tweenchain(config: Phaser.Types.Tweens.TweenBuilderConfig | object): Phaser.Tweens.TweenChain; + + } + + /** + * Calculates the Transform Matrix of the given Game Object and Camera, factoring in + * the parent matrix if provided. + * + * Note that the object this results contains _references_ to the Transform Matrices, + * not new instances of them. Therefore, you should use their values immediately, or + * copy them to your own matrix, as they will be replaced as soon as another Game + * Object is rendered. + * @param src The Game Object to calculate the transform matrix for. + * @param camera The camera being used to render the Game Object. + * @param parentMatrix The transform matrix of the parent container, if any. + */ + function GetCalcMatrix(src: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.Types.GameObjects.GetCalcMatrixResults; + + /** + * A Graphics object is a way to draw primitive shapes to your game. Primitives include forms of geometry, such as + * Rectangles, Circles, and Polygons. They also include lines, arcs and curves. When you initially create a Graphics + * object it will be empty. + * + * To draw to it you must first specify a line style or fill style (or both), draw shapes using paths, and finally + * fill or stroke them. For example: + * + * ```javascript + * graphics.lineStyle(5, 0xFF00FF, 1.0); + * graphics.beginPath(); + * graphics.moveTo(100, 100); + * graphics.lineTo(200, 200); + * graphics.closePath(); + * graphics.strokePath(); + * ``` + * + * There are also many helpful methods that draw and fill/stroke common shapes for you. + * + * ```javascript + * graphics.lineStyle(5, 0xFF00FF, 1.0); + * graphics.fillStyle(0xFFFFFF, 1.0); + * graphics.fillRect(50, 50, 400, 200); + * graphics.strokeRect(50, 50, 400, 200); + * ``` + * + * When a Graphics object is rendered it will render differently based on if the game is running under Canvas or WebGL. + * Under Canvas it will use the HTML Canvas context drawing operations to draw the path. + * Under WebGL the graphics data is decomposed into polygons. Both of these are expensive processes, especially with + * complex shapes. + * + * If your Graphics object doesn't change much (or at all) once you've drawn your shape to it, then you will help + * performance by calling {@link Phaser.GameObjects.Graphics#generateTexture}. This will 'bake' the Graphics object into + * a Texture, and return it. You can then use this Texture for Sprites or other display objects. If your Graphics object + * updates frequently then you should avoid doing this, as it will constantly generate new textures, which will consume + * memory. + * + * As you can tell, Graphics objects are a bit of a trade-off. While they are extremely useful, you need to be careful + * in their complexity and quantity of them in your game. + */ + class Graphics extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible, Phaser.GameObjects.Components.ScrollFactor { + /** + * + * @param scene The Scene to which this Graphics object belongs. + * @param options Options that set the position and default style of this Graphics object. + */ + constructor(scene: Phaser.Scene, options?: Phaser.Types.GameObjects.Graphics.Options); + + /** + * The horizontal display origin of the Graphics. + */ + displayOriginX: number; + + /** + * The vertical display origin of the Graphics. + */ + displayOriginY: number; + + /** + * The array of commands used to render the Graphics. + */ + commandBuffer: any[]; + + /** + * The default fill color for shapes rendered by this Graphics object. + * Set this value with `setDefaultStyles()`. + */ + readonly defaultFillColor: number; + + /** + * The default fill alpha for shapes rendered by this Graphics object. + * Set this value with `setDefaultStyles()`. + */ + readonly defaultFillAlpha: number; + + /** + * The default stroke width for shapes rendered by this Graphics object. + * Set this value with `setDefaultStyles()`. + */ + readonly defaultStrokeWidth: number; + + /** + * The default stroke color for shapes rendered by this Graphics object. + * Set this value with `setDefaultStyles()`. + */ + readonly defaultStrokeColor: number; + + /** + * The default stroke alpha for shapes rendered by this Graphics object. + * Set this value with `setDefaultStyles()`. + */ + readonly defaultStrokeAlpha: number; + + /** + * Set the default style settings for this Graphics object. + * @param options The styles to set as defaults. + */ + setDefaultStyles(options: Phaser.Types.GameObjects.Graphics.Styles): this; + + /** + * Set the current line style. Used for all 'stroke' related functions. + * @param lineWidth The stroke width. + * @param color The stroke color. + * @param alpha The stroke alpha. Default 1. + */ + lineStyle(lineWidth: number, color: number, alpha?: number): this; + + /** + * Set the current fill style. Used for all 'fill' related functions. + * @param color The fill color. + * @param alpha The fill alpha. Default 1. + */ + fillStyle(color: number, alpha?: number): this; + + /** + * Sets a gradient fill style. This is a WebGL only feature. + * + * The gradient color values represent the 4 corners of an untransformed rectangle. + * The gradient is used to color all filled shapes and paths drawn after calling this method. + * If you wish to turn a gradient off, call `fillStyle` and provide a new single fill color. + * + * When filling a triangle only the first 3 color values provided are used for the 3 points of a triangle. + * + * This feature is best used only on rectangles and triangles. All other shapes will give strange results. + * + * Note that for objects such as arcs or ellipses, or anything which is made out of triangles, each triangle used + * will be filled with a gradient on its own. There is no ability to gradient fill a shape or path as a single + * entity at this time. + * @param topLeft The top left fill color. + * @param topRight The top right fill color. + * @param bottomLeft The bottom left fill color. + * @param bottomRight The bottom right fill color. Not used when filling triangles. + * @param alphaTopLeft The top left alpha value. If you give only this value, it's used for all corners. Default 1. + * @param alphaTopRight The top right alpha value. Default 1. + * @param alphaBottomLeft The bottom left alpha value. Default 1. + * @param alphaBottomRight The bottom right alpha value. Default 1. + */ + fillGradientStyle(topLeft: number, topRight: number, bottomLeft: number, bottomRight: number, alphaTopLeft?: number, alphaTopRight?: number, alphaBottomLeft?: number, alphaBottomRight?: number): this; + + /** + * Sets a gradient line style. This is a WebGL only feature. + * + * The gradient color values represent the 4 corners of an untransformed rectangle. + * The gradient is used to color all stroked shapes and paths drawn after calling this method. + * If you wish to turn a gradient off, call `lineStyle` and provide a new single line color. + * + * This feature is best used only on single lines. All other shapes will give strange results. + * + * Note that for objects such as arcs or ellipses, or anything which is made out of triangles, each triangle used + * will be filled with a gradient on its own. There is no ability to gradient stroke a shape or path as a single + * entity at this time. + * @param lineWidth The stroke width. + * @param topLeft The tint being applied to the top-left of the Game Object. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + * @param alpha The fill alpha. Default 1. + */ + lineGradientStyle(lineWidth: number, topLeft: number, topRight: number, bottomLeft: number, bottomRight: number, alpha?: number): this; + + /** + * Start a new shape path. + */ + beginPath(): this; + + /** + * Close the current path. + */ + closePath(): this; + + /** + * Fill the current path. + */ + fillPath(): this; + + /** + * Fill the current path. + * + * This is an alias for `Graphics.fillPath` and does the same thing. + * It was added to match the CanvasRenderingContext 2D API. + */ + fill(): this; + + /** + * Stroke the current path. + */ + strokePath(): this; + + /** + * Stroke the current path. + * + * This is an alias for `Graphics.strokePath` and does the same thing. + * It was added to match the CanvasRenderingContext 2D API. + */ + stroke(): this; + + /** + * Fill the given circle. + * @param circle The circle to fill. + */ + fillCircleShape(circle: Phaser.Geom.Circle): this; + + /** + * Stroke the given circle. + * @param circle The circle to stroke. + */ + strokeCircleShape(circle: Phaser.Geom.Circle): this; + + /** + * Fill a circle with the given position and radius. + * @param x The x coordinate of the center of the circle. + * @param y The y coordinate of the center of the circle. + * @param radius The radius of the circle. + */ + fillCircle(x: number, y: number, radius: number): this; + + /** + * Stroke a circle with the given position and radius. + * @param x The x coordinate of the center of the circle. + * @param y The y coordinate of the center of the circle. + * @param radius The radius of the circle. + */ + strokeCircle(x: number, y: number, radius: number): this; + + /** + * Fill the given rectangle. + * @param rect The rectangle to fill. + */ + fillRectShape(rect: Phaser.Geom.Rectangle): this; + + /** + * Stroke the given rectangle. + * @param rect The rectangle to stroke. + */ + strokeRectShape(rect: Phaser.Geom.Rectangle): this; + + /** + * Fill a rectangle with the given position and size. + * @param x The x coordinate of the top-left of the rectangle. + * @param y The y coordinate of the top-left of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + */ + fillRect(x: number, y: number, width: number, height: number): this; + + /** + * Stroke a rectangle with the given position and size. + * @param x The x coordinate of the top-left of the rectangle. + * @param y The y coordinate of the top-left of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + */ + strokeRect(x: number, y: number, width: number, height: number): this; + + /** + * Fill a rounded rectangle with the given position, size and radius. + * @param x The x coordinate of the top-left of the rectangle. + * @param y The y coordinate of the top-left of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + * @param radius The corner radius; It can also be an object to specify different radius for corners. Default 20. + */ + fillRoundedRect(x: number, y: number, width: number, height: number, radius?: Phaser.Types.GameObjects.Graphics.RoundedRectRadius | number): this; + + /** + * Stroke a rounded rectangle with the given position, size and radius. + * @param x The x coordinate of the top-left of the rectangle. + * @param y The y coordinate of the top-left of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + * @param radius The corner radius; It can also be an object to specify different radii for corners. Default 20. + */ + strokeRoundedRect(x: number, y: number, width: number, height: number, radius?: Phaser.Types.GameObjects.Graphics.RoundedRectRadius | number): this; + + /** + * Fill the given point. + * + * Draws a square at the given position, 1 pixel in size by default. + * @param point The point to fill. + * @param size The size of the square to draw. Default 1. + */ + fillPointShape(point: Phaser.Geom.Point | Phaser.Math.Vector2 | object, size?: number): this; + + /** + * Fill a point at the given position. + * + * Draws a square at the given position, 1 pixel in size by default. + * @param x The x coordinate of the point. + * @param y The y coordinate of the point. + * @param size The size of the square to draw. Default 1. + */ + fillPoint(x: number, y: number, size?: number): this; + + /** + * Fill the given triangle. + * @param triangle The triangle to fill. + */ + fillTriangleShape(triangle: Phaser.Geom.Triangle): this; + + /** + * Stroke the given triangle. + * @param triangle The triangle to stroke. + */ + strokeTriangleShape(triangle: Phaser.Geom.Triangle): this; + + /** + * Fill a triangle with the given points. + * @param x0 The x coordinate of the first point. + * @param y0 The y coordinate of the first point. + * @param x1 The x coordinate of the second point. + * @param y1 The y coordinate of the second point. + * @param x2 The x coordinate of the third point. + * @param y2 The y coordinate of the third point. + */ + fillTriangle(x0: number, y0: number, x1: number, y1: number, x2: number, y2: number): this; + + /** + * Stroke a triangle with the given points. + * @param x0 The x coordinate of the first point. + * @param y0 The y coordinate of the first point. + * @param x1 The x coordinate of the second point. + * @param y1 The y coordinate of the second point. + * @param x2 The x coordinate of the third point. + * @param y2 The y coordinate of the third point. + */ + strokeTriangle(x0: number, y0: number, x1: number, y1: number, x2: number, y2: number): this; + + /** + * Draw the given line. + * @param line The line to stroke. + */ + strokeLineShape(line: Phaser.Geom.Line): this; + + /** + * Draw a line between the given points. + * @param x1 The x coordinate of the start point of the line. + * @param y1 The y coordinate of the start point of the line. + * @param x2 The x coordinate of the end point of the line. + * @param y2 The y coordinate of the end point of the line. + */ + lineBetween(x1: number, y1: number, x2: number, y2: number): this; + + /** + * Draw a line from the current drawing position to the given position. + * + * Moves the current drawing position to the given position. + * @param x The x coordinate to draw the line to. + * @param y The y coordinate to draw the line to. + */ + lineTo(x: number, y: number): this; + + /** + * Move the current drawing position to the given position. + * @param x The x coordinate to move to. + * @param y The y coordinate to move to. + */ + moveTo(x: number, y: number): this; + + /** + * Stroke the shape represented by the given array of points. + * + * Pass `closeShape` to automatically close the shape by joining the last to the first point. + * + * Pass `closePath` to automatically close the path before it is stroked. + * @param points The points to stroke. + * @param closeShape When `true`, the shape is closed by joining the last point to the first point. Default false. + * @param closePath When `true`, the path is closed before being stroked. Default false. + * @param endIndex The index of `points` to stop drawing at. Defaults to `points.length`. + */ + strokePoints(points: any[] | Phaser.Geom.Point[], closeShape?: boolean, closePath?: boolean, endIndex?: number): this; + + /** + * Fill the shape represented by the given array of points. + * + * Pass `closeShape` to automatically close the shape by joining the last to the first point. + * + * Pass `closePath` to automatically close the path before it is filled. + * @param points The points to fill. + * @param closeShape When `true`, the shape is closed by joining the last point to the first point. Default false. + * @param closePath When `true`, the path is closed before being stroked. Default false. + * @param endIndex The index of `points` to stop at. Defaults to `points.length`. + */ + fillPoints(points: any[] | Phaser.Geom.Point[], closeShape?: boolean, closePath?: boolean, endIndex?: number): this; + + /** + * Stroke the given ellipse. + * @param ellipse The ellipse to stroke. + * @param smoothness The number of points to draw the ellipse with. Default 32. + */ + strokeEllipseShape(ellipse: Phaser.Geom.Ellipse, smoothness?: number): this; + + /** + * Stroke an ellipse with the given position and size. + * @param x The x coordinate of the center of the ellipse. + * @param y The y coordinate of the center of the ellipse. + * @param width The width of the ellipse. + * @param height The height of the ellipse. + * @param smoothness The number of points to draw the ellipse with. Default 32. + */ + strokeEllipse(x: number, y: number, width: number, height: number, smoothness?: number): this; + + /** + * Fill the given ellipse. + * @param ellipse The ellipse to fill. + * @param smoothness The number of points to draw the ellipse with. Default 32. + */ + fillEllipseShape(ellipse: Phaser.Geom.Ellipse, smoothness?: number): this; + + /** + * Fill an ellipse with the given position and size. + * @param x The x coordinate of the center of the ellipse. + * @param y The y coordinate of the center of the ellipse. + * @param width The width of the ellipse. + * @param height The height of the ellipse. + * @param smoothness The number of points to draw the ellipse with. Default 32. + */ + fillEllipse(x: number, y: number, width: number, height: number, smoothness?: number): this; + + /** + * Draw an arc. + * + * This method can be used to create circles, or parts of circles. + * + * Make sure you call `beginPath` before starting the arc unless you wish for the arc to automatically + * close when filled or stroked. + * + * Use the optional `overshoot` argument increase the number of iterations that take place when + * the arc is rendered in WebGL. This is useful if you're drawing an arc with an especially thick line, + * as it will allow the arc to fully join-up. Try small values at first, i.e. 0.01. + * + * Call {@link Phaser.GameObjects.Graphics#fillPath} or {@link Phaser.GameObjects.Graphics#strokePath} after calling + * this method to draw the arc. + * @param x The x coordinate of the center of the circle. + * @param y The y coordinate of the center of the circle. + * @param radius The radius of the circle. + * @param startAngle The starting angle, in radians. + * @param endAngle The ending angle, in radians. + * @param anticlockwise Whether the drawing should be anticlockwise or clockwise. Default false. + * @param overshoot This value allows you to increase the segment iterations in WebGL rendering. Useful if the arc has a thick stroke and needs to overshoot to join-up cleanly. Use small numbers such as 0.01 to start with and increase as needed. Default 0. + */ + arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean, overshoot?: number): this; + + /** + * Creates a pie-chart slice shape centered at `x`, `y` with the given radius. + * You must define the start and end angle of the slice. + * + * Setting the `anticlockwise` argument to `true` creates a shape similar to Pacman. + * Setting it to `false` creates a shape like a slice of pie. + * + * This method will begin a new path and close the path at the end of it. + * To display the actual slice you need to call either `strokePath` or `fillPath` after it. + * @param x The horizontal center of the slice. + * @param y The vertical center of the slice. + * @param radius The radius of the slice. + * @param startAngle The start angle of the slice, given in radians. + * @param endAngle The end angle of the slice, given in radians. + * @param anticlockwise Whether the drawing should be anticlockwise or clockwise. Default false. + * @param overshoot This value allows you to overshoot the endAngle by this amount. Useful if the arc has a thick stroke and needs to overshoot to join-up cleanly. Default 0. + */ + slice(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean, overshoot?: number): this; + + /** + * Saves the state of the Graphics by pushing the current state onto a stack. + * + * The most recently saved state can then be restored with {@link Phaser.GameObjects.Graphics#restore}. + */ + save(): this; + + /** + * Restores the most recently saved state of the Graphics by popping from the state stack. + * + * Use {@link Phaser.GameObjects.Graphics#save} to save the current state, and call this afterwards to restore that state. + * + * If there is no saved state, this command does nothing. + */ + restore(): this; + + /** + * Inserts a translation command into this Graphics objects command buffer. + * + * All objects drawn _after_ calling this method will be translated + * by the given amount. + * + * This does not change the position of the Graphics object itself, + * only of the objects drawn by it after calling this method. + * @param x The horizontal translation to apply. + * @param y The vertical translation to apply. + */ + translateCanvas(x: number, y: number): this; + + /** + * Inserts a scale command into this Graphics objects command buffer. + * + * All objects drawn _after_ calling this method will be scaled + * by the given amount. + * + * This does not change the scale of the Graphics object itself, + * only of the objects drawn by it after calling this method. + * @param x The horizontal scale to apply. + * @param y The vertical scale to apply. + */ + scaleCanvas(x: number, y: number): this; + + /** + * Inserts a rotation command into this Graphics objects command buffer. + * + * All objects drawn _after_ calling this method will be rotated + * by the given amount. + * + * This does not change the rotation of the Graphics object itself, + * only of the objects drawn by it after calling this method. + * @param radians The rotation angle, in radians. + */ + rotateCanvas(radians: number): this; + + /** + * Clear the command buffer and reset the fill style and line style to their defaults. + */ + clear(): this; + + /** + * Generate a texture from this Graphics object. + * + * If `key` is a string it'll generate a new texture using it and add it into the + * Texture Manager (assuming no key conflict happens). + * + * If `key` is a Canvas it will draw the texture to that canvas context. Note that it will NOT + * automatically upload it to the GPU in WebGL mode. + * + * Please understand that the texture is created via the Canvas API of the browser, therefore some + * Graphics features, such as `fillGradientStyle`, will not appear on the resulting texture, + * as they're unsupported by the Canvas API. + * @param key The key to store the texture with in the Texture Manager, or a Canvas to draw to. + * @param width The width of the graphics to generate. + * @param height The height of the graphics to generate. + */ + generateTexture(key: string | HTMLCanvasElement, width?: number, height?: number): this; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * A Camera used specifically by the Graphics system for rendering to textures. + */ + static TargetCamera: Phaser.Cameras.Scene2D.Camera; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + } + + /** + * A Group is a way for you to create, manipulate, or recycle similar Game Objects. + * + * Group membership is non-exclusive. A Game Object can belong to several groups, one group, or none. + * + * Groups themselves aren't displayable, and can't be positioned, rotated, scaled, or hidden. + */ + class Group extends Phaser.Events.EventEmitter { + /** + * + * @param scene The scene this group belongs to. + * @param children Game Objects to add to this group; or the `config` argument. + * @param config Settings for this group. If `key` is set, Phaser.GameObjects.Group#createMultiple is also called with these settings. + */ + constructor(scene: Phaser.Scene, children?: Phaser.GameObjects.GameObject[] | Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig, config?: Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig); + + /** + * This scene this group belongs to. + */ + scene: Phaser.Scene; + + /** + * Members of this group. + */ + children: Phaser.Structs.Set; + + /** + * A flag identifying this object as a group. + */ + isParent: boolean; + + /** + * A textual representation of this Game Object. + * Used internally by Phaser but is available for your own custom classes to populate. + */ + type: string; + + /** + * The class to create new group members from. + */ + classType: Function; + + /** + * The name of this group. + * Empty by default and never populated by Phaser, this is left for developers to use. + */ + name: string; + + /** + * Whether this group runs its {@link Phaser.GameObjects.Group#preUpdate} method (which may update any members). + */ + active: boolean; + + /** + * The maximum size of this group, if used as a pool. -1 is no limit. + */ + maxSize: number; + + /** + * A default texture key to use when creating new group members. + * + * This is used in {@link Phaser.GameObjects.Group#create} + * but not in {@link Phaser.GameObjects.Group#createMultiple}. + */ + defaultKey: string; + + /** + * A default texture frame to use when creating new group members. + */ + defaultFrame: string | number; + + /** + * Whether to call the update method of any members. + */ + runChildUpdate: boolean; + + /** + * A function to be called when adding or creating group members. + */ + createCallback: Phaser.Types.GameObjects.Group.GroupCallback | null; + + /** + * A function to be called when removing group members. + */ + removeCallback: Phaser.Types.GameObjects.Group.GroupCallback | null; + + /** + * A function to be called when creating several group members at once. + */ + createMultipleCallback: Phaser.Types.GameObjects.Group.GroupMultipleCreateCallback | null; + + /** + * Creates a new Game Object and adds it to this group, unless the group {@link Phaser.GameObjects.Group#isFull is full}. + * + * Calls {@link Phaser.GameObjects.Group#createCallback}. + * @param x The horizontal position of the new Game Object in the world. Default 0. + * @param y The vertical position of the new Game Object in the world. Default 0. + * @param key The texture key of the new Game Object. Default defaultKey. + * @param frame The texture frame of the new Game Object. Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of the new Game Object. Default true. + * @param active The {@link Phaser.GameObjects.GameObject#active} state of the new Game Object. Default true. + */ + create(x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean, active?: boolean): any; + + /** + * Creates several Game Objects and adds them to this group. + * + * If the group becomes {@link Phaser.GameObjects.Group#isFull}, no further Game Objects are created. + * + * Calls {@link Phaser.GameObjects.Group#createMultipleCallback} and {@link Phaser.GameObjects.Group#createCallback}. + * @param config Creation settings. This can be a single configuration object or an array of such objects, which will be applied in turn. + */ + createMultiple(config: Phaser.Types.GameObjects.Group.GroupCreateConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig[]): any[]; + + /** + * A helper for {@link Phaser.GameObjects.Group#createMultiple}. + * @param options Creation settings. + */ + createFromConfig(options: Phaser.Types.GameObjects.Group.GroupCreateConfig): any[]; + + /** + * Updates any group members, if {@link Phaser.GameObjects.Group#runChildUpdate} is enabled. + * @param time The current timestamp. + * @param delta The delta time elapsed since the last frame. + */ + preUpdate(time: number, delta: number): void; + + /** + * Adds a Game Object to this group. + * + * Calls {@link Phaser.GameObjects.Group#createCallback}. + * @param child The Game Object to add. + * @param addToScene Also add the Game Object to the scene. Default false. + */ + add(child: Phaser.GameObjects.GameObject, addToScene?: boolean): this; + + /** + * Adds several Game Objects to this group. + * + * Calls {@link Phaser.GameObjects.Group#createCallback}. + * @param children The Game Objects to add. + * @param addToScene Also add the Game Objects to the scene. Default false. + */ + addMultiple(children: Phaser.GameObjects.GameObject[], addToScene?: boolean): this; + + /** + * Removes a member of this Group and optionally removes it from the Scene and / or destroys it. + * + * Calls {@link Phaser.GameObjects.Group#removeCallback}. + * @param child The Game Object to remove. + * @param removeFromScene Optionally remove the Group member from the Scene it belongs to. Default false. + * @param destroyChild Optionally call destroy on the removed Group member. Default false. + */ + remove(child: Phaser.GameObjects.GameObject, removeFromScene?: boolean, destroyChild?: boolean): this; + + /** + * Removes all members of this Group and optionally removes them from the Scene and / or destroys them. + * + * Does not call {@link Phaser.GameObjects.Group#removeCallback}. + * @param removeFromScene Optionally remove each Group member from the Scene. Default false. + * @param destroyChild Optionally call destroy on the removed Group members. Default false. + */ + clear(removeFromScene?: boolean, destroyChild?: boolean): this; + + /** + * Tests if a Game Object is a member of this group. + * @param child A Game Object. + */ + contains(child: Phaser.GameObjects.GameObject): boolean; + + /** + * All members of the group. + */ + getChildren(): Phaser.GameObjects.GameObject[]; + + /** + * The number of members of the group. + */ + getLength(): number; + + /** + * Returns all children in this Group that match the given criteria based on the `property` and `value` arguments. + * + * For example: `getMatching('visible', true)` would return only children that have their `visible` property set. + * + * Optionally, you can specify a start and end index. For example if the Group has 100 elements, + * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only + * the first 50. + * @param property The property to test on each array element. + * @param value The value to test the property against. Must pass a strict (`===`) comparison check. + * @param startIndex An optional start index to search from. + * @param endIndex An optional end index to search to. + */ + getMatching(property?: string, value?: any, startIndex?: number, endIndex?: number): any[]; + + /** + * Scans the Group, from top to bottom, for the first member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument, + * assigns `x` and `y`, and returns the member. + * + * If no matching member is found and `createIfNull` is true and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param state The {@link Phaser.GameObjects.GameObject#active} value to match. Default false. + * @param createIfNull Create a new Game Object if no matching members are found, using the following arguments. Default false. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + getFirst(state?: boolean, createIfNull?: boolean, x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any | null; + + /** + * Scans the Group, from top to bottom, for the nth member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument, + * assigns `x` and `y`, and returns the member. + * + * If no matching member is found and `createIfNull` is true and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param nth The nth matching Group member to search for. + * @param state The {@link Phaser.GameObjects.GameObject#active} value to match. Default false. + * @param createIfNull Create a new Game Object if no matching members are found, using the following arguments. Default false. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + getFirstNth(nth: number, state?: boolean, createIfNull?: boolean, x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any | null; + + /** + * Scans the Group for the last member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument, + * assigns `x` and `y`, and returns the member. + * + * If no matching member is found and `createIfNull` is true and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param state The {@link Phaser.GameObjects.GameObject#active} value to match. Default false. + * @param createIfNull Create a new Game Object if no matching members are found, using the following arguments. Default false. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + getLast(state?: boolean, createIfNull?: boolean, x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any | null; + + /** + * Scans the Group for the last nth member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument, + * assigns `x` and `y`, and returns the member. + * + * If no matching member is found and `createIfNull` is true and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param nth The nth matching Group member to search for. + * @param state The {@link Phaser.GameObjects.GameObject#active} value to match. Default false. + * @param createIfNull Create a new Game Object if no matching members are found, using the following arguments. Default false. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + getLastNth(nth: number, state?: boolean, createIfNull?: boolean, x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any | null; + + /** + * Scans the group for the first member that has an {@link Phaser.GameObjects.GameObject#active} state set to `false`, + * assigns `x` and `y`, and returns the member. + * + * If no inactive member is found and the group isn't full then it will create a new Game Object using `x`, `y`, `key`, `frame`, and `visible`. + * The new Game Object will have its active state set to `true`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + get(x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any | null; + + /** + * Scans the group for the first member that has an {@link Phaser.GameObjects.GameObject#active} state set to `true`, + * assigns `x` and `y`, and returns the member. + * + * If no active member is found and `createIfNull` is `true` and the group isn't full then it will create a new one using `x`, `y`, `key`, `frame`, and `visible`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param createIfNull Create a new Game Object if no matching members are found, using the following arguments. Default false. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + getFirstAlive(createIfNull?: boolean, x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any; + + /** + * Scans the group for the first member that has an {@link Phaser.GameObjects.GameObject#active} state set to `false`, + * assigns `x` and `y`, and returns the member. + * + * If no inactive member is found and `createIfNull` is `true` and the group isn't full then it will create a new one using `x`, `y`, `key`, `frame`, and `visible`. + * The new Game Object will have an active state set to `true`. + * Unless a new member is created, `key`, `frame`, and `visible` are ignored. + * @param createIfNull Create a new Game Object if no matching members are found, using the following arguments. Default false. + * @param x The horizontal position of the Game Object in the world. + * @param y The vertical position of the Game Object in the world. + * @param key The texture key assigned to a new Game Object (if one is created). Default defaultKey. + * @param frame A texture frame assigned to a new Game Object (if one is created). Default defaultFrame. + * @param visible The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created). Default true. + */ + getFirstDead(createIfNull?: boolean, x?: number, y?: number, key?: string, frame?: string | number, visible?: boolean): any; + + /** + * {@link Phaser.GameObjects.Components.Animation#play Plays} an animation for all members of this group. + * @param key The string-based key of the animation to play. + * @param startFrame Optionally start the animation playing from this frame index. Default 0. + */ + playAnimation(key: string, startFrame?: string): this; + + /** + * Whether this group's size at its {@link Phaser.GameObjects.Group#maxSize maximum}. + */ + isFull(): boolean; + + /** + * Counts the number of active (or inactive) group members. + * @param value Count active (true) or inactive (false) group members. Default true. + */ + countActive(value?: boolean): number; + + /** + * Counts the number of in-use (active) group members. + */ + getTotalUsed(): number; + + /** + * The difference of {@link Phaser.GameObjects.Group#maxSize} and the number of active group members. + * + * This represents the number of group members that could be created or reactivated before reaching the size limit. + */ + getTotalFree(): number; + + /** + * Sets the `active` property of this Group. + * When active, this Group runs its `preUpdate` method. + * @param value True if this Group should be set as active, false if not. + */ + setActive(value: boolean): this; + + /** + * Sets the `name` property of this Group. + * The `name` property is not populated by Phaser and is presented for your own use. + * @param value The name to be given to this Group. + */ + setName(value: string): this; + + /** + * Sets the property as defined in `key` of each group member to the given value. + * @param key The property to be updated. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + propertyValueSet(key: string, value: number, step?: number, index?: number, direction?: number): this; + + /** + * Adds the given value to the property as defined in `key` of each group member. + * @param key The property to be updated. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + propertyValueInc(key: string, value: number, step?: number, index?: number, direction?: number): this; + + /** + * Sets the x of each group member. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + setX(value: number, step?: number): this; + + /** + * Sets the y of each group member. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + setY(value: number, step?: number): this; + + /** + * Sets the x, y of each group member. + * @param x The amount to set the `x` property to. + * @param y The amount to set the `y` property to. If `undefined` or `null` it uses the `x` value. Default x. + * @param stepX This is added to the `x` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `y` amount, multiplied by the iteration counter. Default 0. + */ + setXY(x: number, y?: number, stepX?: number, stepY?: number): this; + + /** + * Adds the given value to the x of each group member. + * @param value The amount to be added to the `x` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + incX(value: number, step?: number): this; + + /** + * Adds the given value to the y of each group member. + * @param value The amount to be added to the `y` property. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + incY(value: number, step?: number): this; + + /** + * Adds the given value to the x, y of each group member. + * @param x The amount to be added to the `x` property. + * @param y The amount to be added to the `y` property. If `undefined` or `null` it uses the `x` value. Default x. + * @param stepX This is added to the `x` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `y` amount, multiplied by the iteration counter. Default 0. + */ + incXY(x: number, y?: number, stepX?: number, stepY?: number): this; + + /** + * Iterate through the group members changing the position of each element to be that of the element that came before + * it in the array (or after it if direction = 1) + * + * The first group member position is set to x/y. + * @param x The x coordinate to place the first item in the array at. + * @param y The y coordinate to place the first item in the array at. + * @param direction The iteration direction. 0 = first to last and 1 = last to first. Default 0. + */ + shiftPosition(x: number, y: number, direction?: number): this; + + /** + * Sets the angle of each group member. + * @param value The amount to set the angle to, in degrees. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + angle(value: number, step?: number): this; + + /** + * Sets the rotation of each group member. + * @param value The amount to set the rotation to, in radians. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + rotate(value: number, step?: number): this; + + /** + * Rotates each group member around the given point by the given angle. + * @param point Any object with public `x` and `y` properties. + * @param angle The angle to rotate by, in radians. + */ + rotateAround(point: Phaser.Types.Math.Vector2Like, angle: number): this; + + /** + * Rotates each group member around the given point by the given angle and distance. + * @param point Any object with public `x` and `y` properties. + * @param angle The angle to rotate by, in radians. + * @param distance The distance from the point of rotation in pixels. + */ + rotateAroundDistance(point: Phaser.Types.Math.Vector2Like, angle: number, distance: number): this; + + /** + * Sets the alpha of each group member. + * @param value The amount to set the alpha to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + setAlpha(value: number, step?: number): this; + + /** + * Sets the tint of each group member. + * @param topLeft The tint being applied to top-left corner of item. If other parameters are given no value, this tint will be applied to whole item. + * @param topRight The tint to be applied to top-right corner of item. + * @param bottomLeft The tint to be applied to the bottom-left corner of item. + * @param bottomRight The tint to be applied to the bottom-right corner of item. + */ + setTint(topLeft: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets the originX, originY of each group member. + * @param originX The amount to set the `originX` property to. + * @param originY The amount to set the `originY` property to. If `undefined` or `null` it uses the `originX` value. + * @param stepX This is added to the `originX` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `originY` amount, multiplied by the iteration counter. Default 0. + */ + setOrigin(originX: number, originY?: number, stepX?: number, stepY?: number): this; + + /** + * Sets the scaleX of each group member. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + scaleX(value: number, step?: number): this; + + /** + * Sets the scaleY of each group member. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + scaleY(value: number, step?: number): this; + + /** + * Sets the scaleX, scaleY of each group member. + * @param scaleX The amount to be added to the `scaleX` property. + * @param scaleY The amount to be added to the `scaleY` property. If `undefined` or `null` it uses the `scaleX` value. + * @param stepX This is added to the `scaleX` amount, multiplied by the iteration counter. Default 0. + * @param stepY This is added to the `scaleY` amount, multiplied by the iteration counter. Default 0. + */ + scaleXY(scaleX: number, scaleY?: number, stepX?: number, stepY?: number): this; + + /** + * Sets the depth of each group member. + * @param value The amount to set the property to. + * @param step This is added to the `value` amount, multiplied by the iteration counter. Default 0. + */ + setDepth(value: number, step?: number): this; + + /** + * Sets the blendMode of each group member. + * @param value The amount to set the property to. + */ + setBlendMode(value: number): this; + + /** + * Passes all group members to the Input Manager to enable them for input with identical areas and callbacks. + * @param hitArea Either an input configuration object, or a geometric shape that defines the hit area for the Game Object. If not specified a Rectangle will be used. + * @param hitAreaCallback A callback to be invoked when the Game Object is interacted with. If you provide a shape you must also provide a callback. + */ + setHitArea(hitArea: any, hitAreaCallback: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Shuffles the group members in place. + */ + shuffle(): this; + + /** + * Deactivates a member of this group. + * @param gameObject A member of this group. + */ + kill(gameObject: Phaser.GameObjects.GameObject): void; + + /** + * Deactivates and hides a member of this group. + * @param gameObject A member of this group. + */ + killAndHide(gameObject: Phaser.GameObjects.GameObject): void; + + /** + * Sets the visible of each group member. + * @param value The value to set the property to. + * @param index An optional offset to start searching from within the items array. Default 0. + * @param direction The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning. Default 1. + */ + setVisible(value: boolean, index?: number, direction?: number): this; + + /** + * Toggles (flips) the visible state of each member of this group. + */ + toggleVisible(): this; + + /** + * Empties this Group of all children and removes it from the Scene. + * + * Does not call {@link Phaser.GameObjects.Group#removeCallback}. + * + * Children of this Group will _not_ be removed from the Scene by calling this method + * unless you specify the `removeFromScene` parameter. + * + * Children of this Group will also _not_ be destroyed by calling this method + * unless you specify the `destroyChildren` parameter. + * @param destroyChildren Also {@link Phaser.GameObjects.GameObject#destroy} each Group member. Default false. + * @param removeFromScene Optionally remove each Group member from the Scene. Default false. + */ + destroy(destroyChildren?: boolean, removeFromScene?: boolean): void; + + } + + /** + * An Image Game Object. + * + * An Image is a light-weight Game Object useful for the display of static images in your game, + * such as logos, backgrounds, scenery or other non-animated elements. Images can have input + * events and physics bodies, or be tweened, tinted or scrolled. The main difference between an + * Image and a Sprite is that you cannot animate an Image as they do not have the Animation component. + */ + class Image extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.TextureCrop, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number); + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Layer Game Object. + * + * A Layer is a special type of Game Object that acts as a Display List. You can add any type of Game Object + * to a Layer, just as you would to a Scene. Layers can be used to visually group together 'layers' of Game + * Objects: + * + * ```javascript + * const spaceman = this.add.sprite(150, 300, 'spaceman'); + * const bunny = this.add.sprite(400, 300, 'bunny'); + * const elephant = this.add.sprite(650, 300, 'elephant'); + * + * const layer = this.add.layer(); + * + * layer.add([ spaceman, bunny, elephant ]); + * ``` + * + * The 3 sprites in the example above will now be managed by the Layer they were added to. Therefore, + * if you then set `layer.setVisible(false)` they would all vanish from the display. + * + * You can also control the depth of the Game Objects within the Layer. For example, calling the + * `setDepth` method of a child of a Layer will allow you to adjust the depth of that child _within the + * Layer itself_, rather than the whole Scene. The Layer, too, can have its depth set as well. + * + * The Layer class also offers many different methods for manipulating the list, such as the + * methods `moveUp`, `moveDown`, `sendToBack`, `bringToTop` and so on. These allow you to change the + * display list position of the Layers children, causing it to adjust the order in which they are + * rendered. Using `setDepth` on a child allows you to override this. + * + * Layers can have Post FX Pipelines set, which allows you to easily enable a post pipeline across + * a whole range of children, which, depending on the effect, can often be far more efficient that doing so + * on a per-child basis. + * + * Layers have no position or size within the Scene. This means you cannot enable a Layer for + * physics or input, or change the position, rotation or scale of a Layer. They also have no scroll + * factor, texture, tint, origin, crop or bounds. + * + * If you need those kind of features then you should use a Container instead. Containers can be added + * to Layers, but Layers cannot be added to Containers. + * + * However, you can set the Alpha, Blend Mode, Depth, Mask and Visible state of a Layer. These settings + * will impact all children being rendered by the Layer. + */ + class Layer extends Phaser.Structs.List implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param children An optional array of Game Objects to add to this Layer. + */ + constructor(scene: Phaser.Scene, children?: Phaser.GameObjects.GameObject[]); + + /** + * A reference to the Scene to which this Game Object belongs. + * + * Game Objects can only belong to one Scene. + * + * You should consider this property as being read-only. You cannot move a + * Game Object to another Scene by simply changing it. + */ + scene: Phaser.Scene; + + /** + * Holds a reference to the Display List that contains this Game Object. + * + * This is set automatically when this Game Object is added to a Scene or Layer. + * + * You should treat this property as being read-only. + */ + displayList: Phaser.GameObjects.DisplayList | Phaser.GameObjects.Layer; + + /** + * A textual representation of this Game Object, i.e. `sprite`. + * Used internally by Phaser but is available for your own custom classes to populate. + */ + type: string; + + /** + * The current state of this Game Object. + * + * Phaser itself will never modify this value, although plugins may do so. + * + * Use this property to track the state of a Game Object during its lifetime. For example, it could change from + * a state of 'moving', to 'attacking', to 'dead'. The state value should be an integer (ideally mapped to a constant + * in your game code), or a string. These are recommended to keep it light and simple, with fast comparisons. + * If you need to store complex data about your Game Object, look at using the Data Component instead. + */ + state: number | string; + + /** + * A Layer cannot be placed inside a Container. + * + * This property is kept purely so a Layer has the same + * shape as a Game Object. + */ + parentContainer: Phaser.GameObjects.Container; + + /** + * The name of this Game Object. + * Empty by default and never populated by Phaser, this is left for developers to use. + */ + name: string; + + /** + * The active state of this Game Object. + * A Game Object with an active state of `true` is processed by the Scenes UpdateList, if added to it. + * An active object is one which is having its logic and internal systems updated. + */ + active: boolean; + + /** + * The Tab Index of the Game Object. + * Reserved for future use by plugins and the Input Manager. + */ + tabIndex: number; + + /** + * A Data Manager. + * It allows you to store, query and get key/value paired information specific to this Game Object. + * `null` by default. Automatically created if you use `getData` or `setData` or `setDataEnabled`. + */ + data: Phaser.Data.DataManager; + + /** + * The flags that are compared against `RENDER_MASK` to determine if this Game Object will render or not. + * The bits are 0001 | 0010 | 0100 | 1000 set by the components Visible, Alpha, Transform and Texture respectively. + * If those components are not used by your custom class then you can use this bitmask as you wish. + */ + renderFlags: number; + + /** + * A bitmask that controls if this Game Object is drawn by a Camera or not. + * Not usually set directly, instead call `Camera.ignore`, however you can + * set this property directly using the Camera.id property: + */ + cameraFilter: number; + + /** + * This property is kept purely so a Layer has the same + * shape as a Game Object. You cannot input enable a Layer. + */ + input: Phaser.Types.Input.InteractiveObject | null; + + /** + * This property is kept purely so a Layer has the same + * shape as a Game Object. You cannot give a Layer a physics body. + */ + body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody | MatterJS.BodyType | null; + + /** + * This Game Object will ignore all calls made to its destroy method if this flag is set to `true`. + * This includes calls that may come from a Group, Container or the Scene itself. + * While it allows you to persist a Game Object across Scenes, please understand you are entirely + * responsible for managing references to and from this Game Object. + */ + ignoreDestroy: boolean; + + /** + * A reference to the Scene Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * A reference to the Scene Event Emitter. + */ + events: Phaser.Events.EventEmitter; + + /** + * The flag the determines whether Game Objects should be sorted when `depthSort()` is called. + */ + sortChildrenFlag: boolean; + + /** + * Sets the `active` property of this Game Object and returns this Game Object for further chaining. + * A Game Object with its `active` property set to `true` will be updated by the Scenes UpdateList. + * @param value True if this Game Object should be set as active, false if not. + */ + setActive(value: boolean): this; + + /** + * Sets the `name` property of this Game Object and returns this Game Object for further chaining. + * The `name` property is not populated by Phaser and is presented for your own use. + * @param value The name to be given to this Game Object. + */ + setName(value: string): this; + + /** + * Sets the current state of this Game Object. + * + * Phaser itself will never modify the State of a Game Object, although plugins may do so. + * + * For example, a Game Object could change from a state of 'moving', to 'attacking', to 'dead'. + * The state value should typically be an integer (ideally mapped to a constant + * in your game code), but could also be a string. It is recommended to keep it light and simple. + * If you need to store complex data about your Game Object, look at using the Data Component instead. + * @param value The state of the Game Object. + */ + setState(value: number | string): this; + + /** + * Adds a Data Manager component to this Game Object. + */ + setDataEnabled(): this; + + /** + * Allows you to store a key value pair within this Game Objects Data Manager. + * + * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled + * before setting the value. + * + * If the key doesn't already exist in the Data Manager then it is created. + * + * ```javascript + * sprite.setData('name', 'Red Gem Stone'); + * ``` + * + * You can also pass in an object of key value pairs as the first argument: + * + * ```javascript + * sprite.setData({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 }); + * ``` + * + * To get a value back again you can call `getData`: + * + * ```javascript + * sprite.getData('gold'); + * ``` + * + * Or you can access the value directly via the `values` property, where it works like any other variable: + * + * ```javascript + * sprite.data.values.gold += 50; + * ``` + * + * When the value is first set, a `setdata` event is emitted from this Game Object. + * + * If the key already exists, a `changedata` event is emitted instead, along an event named after the key. + * For example, if you updated an existing key called `PlayerLives` then it would emit the event `changedata-PlayerLives`. + * These events will be emitted regardless if you use this method to set the value, or the direct `values` setter. + * + * Please note that the data keys are case-sensitive and must be valid JavaScript Object property strings. + * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager. + * @param key The key to set the value for. Or an object of key value pairs. If an object the `data` argument is ignored. + * @param data The value to set for the given key. If an object is provided as the key this argument is ignored. + */ + setData(key: string | object, data?: any): this; + + /** + * Increase a value for the given key within this Game Objects Data Manager. If the key doesn't already exist in the Data Manager then it is increased from 0. + * + * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled + * before setting the value. + * + * If the key doesn't already exist in the Data Manager then it is created. + * + * When the value is first set, a `setdata` event is emitted from this Game Object. + * @param key The key to increase the value for. + * @param data The value to increase for the given key. + */ + incData(key: string | object, data?: any): this; + + /** + * Toggle a boolean value for the given key within this Game Objects Data Manager. If the key doesn't already exist in the Data Manager then it is toggled from false. + * + * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled + * before setting the value. + * + * If the key doesn't already exist in the Data Manager then it is created. + * + * When the value is first set, a `setdata` event is emitted from this Game Object. + * @param key The key to toggle the value for. + */ + toggleData(key: string | object): this; + + /** + * Retrieves the value for the given key in this Game Objects Data Manager, or undefined if it doesn't exist. + * + * You can also access values via the `values` object. For example, if you had a key called `gold` you can do either: + * + * ```javascript + * sprite.getData('gold'); + * ``` + * + * Or access the value directly: + * + * ```javascript + * sprite.data.values.gold; + * ``` + * + * You can also pass in an array of keys, in which case an array of values will be returned: + * + * ```javascript + * sprite.getData([ 'gold', 'armor', 'health' ]); + * ``` + * + * This approach is useful for destructuring arrays in ES6. + * @param key The key of the value to retrieve, or an array of keys. + */ + getData(key: string | string[]): any; + + /** + * A Layer cannot be enabled for input. + * + * This method does nothing and is kept to ensure + * the Layer has the same shape as a Game Object. + */ + setInteractive(): this; + + /** + * A Layer cannot be enabled for input. + * + * This method does nothing and is kept to ensure + * the Layer has the same shape as a Game Object. + */ + disableInteractive(): this; + + /** + * A Layer cannot be enabled for input. + * + * This method does nothing and is kept to ensure + * the Layer has the same shape as a Game Object. + */ + removeInteractive(): this; + + /** + * This callback is invoked when this Game Object is added to a Scene. + * + * Can be overriden by custom Game Objects, but be aware of some Game Objects that + * will use this, such as Sprites, to add themselves into the Update List. + * + * You can also listen for the `ADDED_TO_SCENE` event from this Game Object. + */ + addedToScene(): void; + + /** + * This callback is invoked when this Game Object is removed from a Scene. + * + * Can be overriden by custom Game Objects, but be aware of some Game Objects that + * will use this, such as Sprites, to removed themselves from the Update List. + * + * You can also listen for the `REMOVED_FROM_SCENE` event from this Game Object. + */ + removedFromScene(): void; + + /** + * To be overridden by custom GameObjects. Allows base objects to be used in a Pool. + * @param args args + */ + update(...args: any[]): void; + + /** + * Returns a JSON representation of the Game Object. + */ + toJSON(): Phaser.Types.GameObjects.JSONGameObject; + + /** + * Compares the renderMask with the renderFlags to see if this Game Object will render or not. + * Also checks the Game Object against the given Cameras exclusion list. + * @param camera The Camera to check against this Game Object. + */ + willRender(camera: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Returns an array containing the display list index of either this Game Object, or if it has one, + * its parent Container. It then iterates up through all of the parent containers until it hits the + * root of the display list (which is index 0 in the returned array). + * + * Used internally by the InputPlugin but also useful if you wish to find out the display depth of + * this Game Object and all of its ancestors. + */ + getIndexList(): number[]; + + /** + * Force a sort of the display list on the next call to depthSort. + */ + queueDepthSort(): void; + + /** + * Immediately sorts the display list if the flag is set. + */ + depthSort(): void; + + /** + * Compare the depth of two Game Objects. + * @param childA The first Game Object. + * @param childB The second Game Object. + */ + sortByDepth(childA: Phaser.GameObjects.GameObject, childB: Phaser.GameObjects.GameObject): number; + + /** + * Returns an array which contains all Game Objects within this Layer. + * + * This is a reference to the main list array, not a copy of it, so be careful not to modify it. + */ + getChildren(): Phaser.GameObjects.GameObject[]; + + /** + * Adds this Layer to the given Display List. + * + * If no Display List is specified, it will default to the Display List owned by the Scene to which + * this Layer belongs. + * + * A Layer can only exist on one Display List at any given time, but may move freely between them. + * + * If this Layer is already on another Display List when this method is called, it will first + * be removed from it, before being added to the new list. + * + * You can query which list it is on by looking at the `Phaser.GameObjects.Layer#displayList` property. + * + * If a Layer isn't on any display list, it will not be rendered. If you just wish to temporarily + * disable it from rendering, consider using the `setVisible` method, instead. + * @param displayList The Display List to add to. Defaults to the Scene Display List. + */ + addToDisplayList(displayList?: Phaser.GameObjects.DisplayList | Phaser.GameObjects.Layer): this; + + /** + * Removes this Layer from the Display List it is currently on. + * + * A Layer can only exist on one Display List at any given time, but may move freely removed + * and added back at a later stage. + * + * You can query which list it is on by looking at the `Phaser.GameObjects.GameObject#displayList` property. + * + * If a Layer isn't on any Display List, it will not be rendered. If you just wish to temporarily + * disable it from rendering, consider using the `setVisible` method, instead. + */ + removeFromDisplayList(): this; + + /** + * Destroys this Layer removing it from the Display List and Update List and + * severing all ties to parent resources. + * + * Also destroys all children of this Layer. If you do not wish for the + * children to be destroyed, you should move them from this Layer first. + * + * Use this to remove this Layer from your game if you don't ever plan to use it again. + * As long as no reference to it exists within your own code it should become free for + * garbage collection by the browser. + * + * If you just want to temporarily disable an object then look at using the + * Game Object Pool instead of destroying it, as destroyed objects cannot be resurrected. + * @param fromScene `True` if this Game Object is being destroyed by the Scene, `false` if not. Default false. + */ + destroy(fromScene?: boolean): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A 2D Light. + * + * These are created by the {@link Phaser.GameObjects.LightsManager}, available from within a scene via `this.lights`. + * + * Any Game Objects using the Light2D pipeline will then be affected by these Lights as long as they have a normal map. + * + * They can also simply be used to represent a point light for your own purposes. + * + * Lights cannot be added to Containers. They are designed to exist in the root of a Scene. + */ + class Light extends Phaser.Geom.Circle implements Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Visible { + /** + * + * @param x The horizontal position of the light. + * @param y The vertical position of the light. + * @param radius The radius of the light. + * @param r The red color of the light. A value between 0 and 1. + * @param g The green color of the light. A value between 0 and 1. + * @param b The blue color of the light. A value between 0 and 1. + * @param intensity The intensity of the light. + */ + constructor(x: number, y: number, radius: number, r: number, g: number, b: number, intensity: number); + + /** + * The color of the light. + */ + color: Phaser.Display.RGB; + + /** + * The intensity of the light. + */ + intensity: number; + + /** + * The flags that are compared against `RENDER_MASK` to determine if this Game Object will render or not. + * The bits are 0001 | 0010 | 0100 | 1000 set by the components Visible, Alpha, Transform and Texture respectively. + * If those components are not used by your custom class then you can use this bitmask as you wish. + */ + renderFlags: number; + + /** + * A bitmask that controls if this Game Object is drawn by a Camera or not. + * Not usually set directly, instead call `Camera.ignore`, however you can + * set this property directly using the Camera.id property: + */ + cameraFilter: number; + + /** + * The width of this Light Game Object. This is the same as `Light.diameter`. + */ + displayWidth: number; + + /** + * The height of this Light Game Object. This is the same as `Light.diameter`. + */ + displayHeight: number; + + /** + * The width of this Light Game Object. This is the same as `Light.diameter`. + */ + width: number; + + /** + * The height of this Light Game Object. This is the same as `Light.diameter`. + */ + height: number; + + /** + * Compares the renderMask with the renderFlags to see if this Game Object will render or not. + * Also checks the Game Object against the given Cameras exclusion list. + * @param camera The Camera to check against this Game Object. + */ + willRender(camera: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Set the color of the light from a single integer RGB value. + * @param rgb The integer RGB color of the light. + */ + setColor(rgb: number): this; + + /** + * Set the intensity of the light. + * @param intensity The intensity of the light. + */ + setIntensity(intensity: number): this; + + /** + * Set the radius of the light. + * @param radius The radius of the light. + */ + setRadius(radius: number): this; + + /** + * The bitmask that `GameObject.renderFlags` is compared against to determine if the Game Object will render or not. + */ + static readonly RENDER_MASK: number; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * Manages Lights for a Scene. + * + * Affects the rendering of Game Objects using the `Light2D` pipeline. + */ + class LightsManager { + /** + * The Lights in the Scene. + */ + lights: Phaser.GameObjects.Light[]; + + /** + * The ambient color. + */ + ambientColor: Phaser.Display.RGB; + + /** + * Whether the Lights Manager is enabled. + */ + active: boolean; + + /** + * The maximum number of lights that a single Camera and the lights shader can process. + * Change this via the `maxLights` property in your game config, as it cannot be changed at runtime. + */ + readonly maxLights: number; + + /** + * The number of lights that the LightPipeline processed in the _previous_ frame. + */ + readonly visibleLights: number; + + /** + * Creates a new Point Light Game Object and adds it to the Scene. + * + * Note: This method will only be available if the Point Light Game Object has been built into Phaser. + * + * The Point Light Game Object provides a way to add a point light effect into your game, + * without the expensive shader processing requirements of the traditional Light Game Object. + * + * The difference is that the Point Light renders using a custom shader, designed to give the + * impression of a point light source, of variable radius, intensity and color, in your game. + * However, unlike the Light Game Object, it does not impact any other Game Objects, or use their + * normal maps for calcuations. This makes them extremely fast to render compared to Lights + * and perfect for special effects, such as flickering torches or muzzle flashes. + * + * For maximum performance you should batch Point Light Game Objects together. This means + * ensuring they follow each other consecutively on the display list. Ideally, use a Layer + * Game Object and then add just Point Lights to it, so that it can batch together the rendering + * of the lights. You don't _have_ to do this, and if you've only a handful of Point Lights in + * your game then it's perfectly safe to mix them into the dislay list as normal. However, if + * you're using a large number of them, please consider how they are mixed into the display list. + * + * The renderer will automatically cull Point Lights. Those with a radius that does not intersect + * with the Camera will be skipped in the rendering list. This happens automatically and the + * culled state is refreshed every frame, for every camera. + * + * The origin of a Point Light is always 0.5 and it cannot be changed. + * + * Point Lights are a WebGL only feature and do not have a Canvas counterpart. + * @param x The horizontal position of this Point Light in the world. + * @param y The vertical position of this Point Light in the world. + * @param color The color of the Point Light, given as a hex value. Default 0xffffff. + * @param radius The radius of the Point Light. Default 128. + * @param intensity The intensity, or color blend, of the Point Light. Default 1. + * @param attenuation The attenuation of the Point Light. This is the reduction of light from the center point. Default 0.1. + */ + addPointLight(x: number, y: number, color?: number, radius?: number, intensity?: number, attenuation?: number): Phaser.GameObjects.PointLight; + + /** + * Enable the Lights Manager. + */ + enable(): this; + + /** + * Disable the Lights Manager. + */ + disable(): this; + + /** + * Get all lights that can be seen by the given Camera. + * + * It will automatically cull lights that are outside the world view of the Camera. + * + * If more lights are returned than supported by the pipeline, the lights are then culled + * based on the distance from the center of the camera. Only those closest are rendered. + * @param camera The Camera to cull Lights for. + */ + getLights(camera: Phaser.Cameras.Scene2D.Camera): Phaser.GameObjects.Light[]; + + /** + * Set the ambient light color. + * @param rgb The integer RGB color of the ambient light. + */ + setAmbientColor(rgb: number): this; + + /** + * Returns the maximum number of Lights allowed to appear at once. + */ + getMaxVisibleLights(): number; + + /** + * Get the number of Lights managed by this Lights Manager. + */ + getLightCount(): number; + + /** + * Add a Light. + * @param x The horizontal position of the Light. Default 0. + * @param y The vertical position of the Light. Default 0. + * @param radius The radius of the Light. Default 128. + * @param rgb The integer RGB color of the light. Default 0xffffff. + * @param intensity The intensity of the Light. Default 1. + */ + addLight(x?: number, y?: number, radius?: number, rgb?: number, intensity?: number): Phaser.GameObjects.Light; + + /** + * Remove a Light. + * @param light The Light to remove. + */ + removeLight(light: Phaser.GameObjects.Light): this; + + /** + * Shut down the Lights Manager. + * + * Recycles all active Lights into the Light pool, resets ambient light color and clears the lists of Lights and + * culled Lights. + */ + shutdown(): void; + + /** + * Destroy the Lights Manager. + * + * Cleans up all references by calling {@link Phaser.GameObjects.LightsManager#shutdown}. + */ + destroy(): void; + + } + + /** + * A Scene plugin that provides a {@link Phaser.GameObjects.LightsManager} for the Light2D pipeline. + * + * Available from within a Scene via `this.lights`. + * + * Add Lights using the {@link Phaser.GameObjects.LightsManager#addLight} method: + * + * ```javascript + * // Enable the Lights Manager because it is disabled by default + * this.lights.enable(); + * + * // Create a Light at [400, 300] with a radius of 200 + * this.lights.addLight(400, 300, 200); + * ``` + * + * For Game Objects to be affected by the Lights when rendered, you will need to set them to use the `Light2D` pipeline like so: + * + * ```javascript + * sprite.setPipeline('Light2D'); + * ``` + * + * Note that you cannot use this pipeline on Graphics Game Objects or Shape Game Objects. + */ + class LightsPlugin extends Phaser.GameObjects.LightsManager { + /** + * + * @param scene The Scene that this Lights Plugin belongs to. + */ + constructor(scene: Phaser.Scene); + + /** + * A reference to the Scene that this Lights Plugin belongs to. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene's systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * Boot the Lights Plugin. + */ + boot(): void; + + /** + * Destroy the Lights Plugin. + * + * Cleans up all references. + */ + destroy(): void; + + } + + /** + * A Mesh Game Object. + * + * The Mesh Game Object allows you to render a group of textured vertices and manipulate + * the view of those vertices, such as rotation, translation or scaling. + * + * Support for generating mesh data from grids, model data or Wavefront OBJ Files is included. + * + * Although you can use this to render 3D objects, its primary use is for displaying more complex + * Sprites, or Sprites where you need fine-grained control over the vertex positions in order to + * achieve special effects in your games. Note that rendering still takes place using Phaser's + * orthographic camera (after being transformed via `projectionMesh`, see `setPerspective`, + * `setOrtho`, and `panZ` methods). As a result, all depth and face tests are done in an eventually + * orthographic space. + * + * The rendering process will iterate through the faces of this Mesh and render out each face + * that is considered as being in view of the camera. No depth buffer is used, and because of this, + * you should be careful not to use model data with too many vertices, or overlapping geometry, + * or you'll probably encounter z-depth fighting. The Mesh was designed to allow for more advanced + * 2D layouts, rather than displaying 3D objects, even though it can do this to a degree. + * + * In short, if you want to remake Crysis, use a 3D engine, not a Mesh. However, if you want + * to easily add some small fun 3D elements into your game, or create some special effects involving + * vertex warping, this is the right object for you. Mesh data becomes part of the WebGL batch, + * just like standard Sprites, so doesn't introduce any additional shader overhead. Because + * the Mesh just generates vertices into the WebGL batch, like any other Sprite, you can use all of + * the common Game Object components on a Mesh too, such as a custom pipeline, mask, blend mode + * or texture. + * + * Note that the Mesh object is WebGL only and does not have a Canvas counterpart. + * + * The Mesh origin is always 0.5 x 0.5 and cannot be changed. + */ + class Mesh extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param vertices The vertices array. Either `xy` pairs, or `xyz` if the `containsZ` parameter is `true` (but see note). + * @param uvs The UVs pairs array. + * @param indicies Optional vertex indicies array. If you don't have one, pass `null` or an empty array. + * @param containsZ Does the vertices data include a `z` component? Note: If not, it will be assumed `z=0`, see method `panZ` or `setOrtho`. Default false. + * @param normals Optional vertex normals array. If you don't have one, pass `null` or an empty array. + * @param colors An array of colors, one per vertex, or a single color value applied to all vertices. Default 0xffffff. + * @param alphas An array of alpha values, one per vertex, or a single alpha value applied to all vertices. Default 1. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number, vertices?: number[], uvs?: number[], indicies?: number[], containsZ?: boolean, normals?: number[], colors?: number | number[], alphas?: number | number[]); + + /** + * An array containing the Face instances belonging to this Mesh. + * + * A Face consists of 3 Vertex objects. + * + * This array is populated during calls such as `addVertices` or `addOBJ`. + */ + faces: Phaser.Geom.Mesh.Face[]; + + /** + * An array containing Vertex instances. One instance per vertex in this Mesh. + * + * This array is populated during calls such as `addVertex` or `addOBJ`. + */ + vertices: Phaser.Geom.Mesh.Vertex[]; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertex colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * You can optionally choose to render the vertices of this Mesh to a Graphics instance. + * + * Achieve this by setting the `debugCallback` and the `debugGraphic` properties. + * + * You can do this in a single call via the `Mesh.setDebug` method, which will use the + * built-in debug function. You can also set it to your own callback. The callback + * will be invoked _once per render_ and sent the following parameters: + * + * `debugCallback(src, meshLength, verts)` + * + * `src` is the Mesh instance being debugged. + * `meshLength` is the number of mesh vertices in total. + * `verts` is an array of the translated vertex coordinates. + * + * To disable rendering, set this property back to `null`. + * + * Please note that high vertex count Meshes will struggle to debug properly. + */ + debugCallback: Function; + + /** + * The Graphics instance that the debug vertices will be drawn to, if `setDebug` has + * been called. + */ + debugGraphic: Phaser.GameObjects.Graphics; + + /** + * When rendering, skip any Face that isn't counter clockwise? + * + * Enable this to hide backward-facing Faces during rendering. + * + * Disable it to render all Faces. + */ + hideCCW: boolean; + + /** + * A Vector3 containing the 3D position of the vertices in this Mesh. + * + * Modifying the components of this property will allow you to reposition where + * the vertices are rendered within the Mesh. This happens in the `preUpdate` phase, + * where each vertex is transformed using the view and projection matrices. + * + * Changing this property will impact all vertices being rendered by this Mesh. + * + * You can also adjust the 'view' by using the `pan` methods. + */ + modelPosition: Phaser.Math.Vector3; + + /** + * A Vector3 containing the 3D scale of the vertices in this Mesh. + * + * Modifying the components of this property will allow you to scale + * the vertices within the Mesh. This happens in the `preUpdate` phase, + * where each vertex is transformed using the view and projection matrices. + * + * Changing this property will impact all vertices being rendered by this Mesh. + */ + modelScale: Phaser.Math.Vector3; + + /** + * A Vector3 containing the 3D rotation of the vertices in this Mesh. + * + * The values should be given in radians, i.e. to rotate the vertices by 90 + * degrees you can use `modelRotation.x = Phaser.Math.DegToRad(90)`. + * + * Modifying the components of this property will allow you to rotate + * the vertices within the Mesh. This happens in the `preUpdate` phase, + * where each vertex is transformed using the view and projection matrices. + * + * Changing this property will impact all vertices being rendered by this Mesh. + */ + modelRotation: Phaser.Math.Vector3; + + /** + * The transformation matrix for this Mesh. + */ + transformMatrix: Phaser.Math.Matrix4; + + /** + * The view position for this Mesh. + * + * Use the methods`panX`, `panY` and `panZ` to adjust the view. + */ + viewPosition: Phaser.Math.Vector3; + + /** + * The view matrix for this Mesh. + */ + viewMatrix: Phaser.Math.Matrix4; + + /** + * The projection matrix for this Mesh. + * + * Update it with the `setPerspective` or `setOrtho` methods. + */ + projectionMatrix: Phaser.Math.Matrix4; + + /** + * How many faces were rendered by this Mesh Game Object in the last + * draw? This is reset in the `preUpdate` method and then incremented + * each time a face is drawn. Note that in multi-camera Scenes this + * value may exceed that found in `Mesh.getFaceCount` due to + * cameras drawing the same faces more than once. + */ + readonly totalRendered: number; + + /** + * By default, the Mesh will check to see if its model or view transform has + * changed each frame and only recalculate the vertex positions if they have. + * + * This avoids lots of additional math in the `preUpdate` step when not required. + * + * However, if you are performing per-Face or per-Vertex manipulation on this Mesh, + * such as tweening a Face, or moving it without moving the rest of the Mesh, + * then you may need to disable the dirty cache in order for the Mesh to re-render + * correctly. You can toggle this property to do that. Please note that leaving + * this set to `true` will cause the Mesh to recalculate the position of every single + * vertex in it, every single frame. So only really do this if you know you + * need it. + */ + ignoreDirtyCache: boolean; + + /** + * The Camera fov (field of view) in degrees. + * + * This is set automatically as part of the `Mesh.setPerspective` call, but exposed + * here for additional math. + * + * Do not modify this property directly, doing so will not change the fov. For that, + * call the respective Mesh methods. + */ + readonly fov: number; + + /** + * Translates the view position of this Mesh on the x axis by the given amount. + * @param v The amount to pan by. + */ + panX(v: number): void; + + /** + * Translates the view position of this Mesh on the y axis by the given amount. + * @param v The amount to pan by. + */ + panY(v: number): void; + + /** + * Translates the view position of this Mesh on the z axis by the given amount. + * + * As the default `panZ` value is 0, vertices with `z=0` (the default) need special + * care or else they will not display as they are "behind" the camera. + * + * Consider using `mesh.panZ(mesh.height / (2 * Math.tan(Math.PI / 16)))`, + * which will interpret vertex geometry 1:1 with pixel geometry (or see `setOrtho`). + * @param v The amount to pan by. + */ + panZ(v: number): void; + + /** + * Builds a new perspective projection matrix from the given values. + * + * These are also the initial projection matrix and parameters for `Mesh` (see `Mesh.panZ` for more discussion). + * + * See also `setOrtho`. + * @param width The width of the projection matrix. Typically the same as the Mesh and/or Renderer. + * @param height The height of the projection matrix. Typically the same as the Mesh and/or Renderer. + * @param fov The field of view, in degrees. Default 45. + * @param near The near value of the view. Default 0.01. + * @param far The far value of the view. Default 1000. + */ + setPerspective(width: number, height: number, fov?: number, near?: number, far?: number): void; + + /** + * Builds a new orthographic projection matrix from the given values. + * + * If using this mode you will often need to set `Mesh.hideCCW` to `false` as well. + * + * By default, calling this method with no parameters will set the scaleX value to + * match the renderer's aspect ratio. If you would like to render vertex positions 1:1 + * to pixel positions, consider calling as `mesh.setOrtho(mesh.width, mesh.height)`. + * + * See also `setPerspective`. + * @param scaleX The default horizontal scale in relation to the Mesh / Renderer dimensions. Default 1. + * @param scaleY The default vertical scale in relation to the Mesh / Renderer dimensions. Default 1. + * @param near The near value of the view. Default -1000. + * @param far The far value of the view. Default 1000. + */ + setOrtho(scaleX?: number, scaleY?: number, near?: number, far?: number): void; + + /** + * Iterates and destroys all current Faces in this Mesh, then resets the + * `faces` and `vertices` arrays. + */ + clear(): this; + + /** + * This method will add the data from a triangulated Wavefront OBJ model file to this Mesh. + * + * The data should have been loaded via the OBJFile: + * + * ```javascript + * this.load.obj(key, url); + * ``` + * + * Then use the same `key` as the first parameter to this method. + * + * Multiple Mesh Game Objects can use the same model data without impacting on each other. + * + * Make sure your 3D package has triangulated the model data prior to exporting it. + * + * You can add multiple models to a single Mesh, although they will act as one when + * moved or rotated. You can scale the model data, should it be too small, or too large, to see. + * You can also offset the vertices of the model via the `x`, `y` and `z` parameters. + * @param key The key of the model data in the OBJ Cache to add to this Mesh. + * @param scale An amount to scale the model data by. Use this if the model has exported too small, or large, to see. Default 1. + * @param x Translate the model x position by this amount. Default 0. + * @param y Translate the model y position by this amount. Default 0. + * @param z Translate the model z position by this amount. Default 0. + * @param rotateX Rotate the model on the x axis by this amount, in radians. Default 0. + * @param rotateY Rotate the model on the y axis by this amount, in radians. Default 0. + * @param rotateZ Rotate the model on the z axis by this amount, in radians. Default 0. + * @param zIsUp Is the z axis up (true), or is y axis up (false)? Default true. + */ + addVerticesFromObj(key: string, scale?: number, x?: number, y?: number, z?: number, rotateX?: number, rotateY?: number, rotateZ?: number, zIsUp?: boolean): this; + + /** + * Compare the depth of two Faces. + * @param faceA The first Face. + * @param faceB The second Face. + */ + sortByDepth(faceA: Phaser.Geom.Mesh.Face, faceB: Phaser.Geom.Mesh.Face): number; + + /** + * Runs a depth sort across all Faces in this Mesh, comparing their averaged depth. + * + * This is called automatically if you use any of the `rotate` methods, but you can + * also invoke it to sort the Faces should you manually position them. + */ + depthSort(): this; + + /** + * Adds a new Vertex into the vertices array of this Mesh. + * + * Just adding a vertex isn't enough to render it. You need to also + * make it part of a Face, with 3 Vertex instances per Face. + * @param x The x position of the vertex. + * @param y The y position of the vertex. + * @param z The z position of the vertex. + * @param u The UV u coordinate of the vertex. + * @param v The UV v coordinate of the vertex. + * @param color The color value of the vertex. Default 0xffffff. + * @param alpha The alpha value of the vertex. Default 1. + */ + addVertex(x: number, y: number, z: number, u: number, v: number, color?: number, alpha?: number): this; + + /** + * Adds a new Face into the faces array of this Mesh. + * + * A Face consists of references to 3 Vertex instances, which must be provided. + * @param vertex1 The first vertex of the Face. + * @param vertex2 The second vertex of the Face. + * @param vertex3 The third vertex of the Face. + */ + addFace(vertex1: Phaser.Geom.Mesh.Vertex, vertex2: Phaser.Geom.Mesh.Vertex, vertex3: Phaser.Geom.Mesh.Vertex): this; + + /** + * Adds new vertices to this Mesh by parsing the given data. + * + * This method will take vertex data in one of two formats, based on the `containsZ` parameter. + * + * If your vertex data are `x`, `y` pairs, then `containsZ` should be `false` (this is the default, and will result in `z=0` for each vertex). + * + * If your vertex data is groups of `x`, `y` and `z` values, then the `containsZ` parameter must be true. + * + * The `uvs` parameter is a numeric array consisting of `u` and `v` pairs. + * + * The `normals` parameter is a numeric array consisting of `x`, `y` vertex normal values and, if `containsZ` is true, `z` values as well. + * + * The `indicies` parameter is an optional array that, if given, is an indexed list of vertices to be added. + * + * The `colors` parameter is an optional array, or single value, that if given sets the color of each vertex created. + * + * The `alphas` parameter is an optional array, or single value, that if given sets the alpha of each vertex created. + * + * When providing indexed data it is assumed that _all_ of the arrays are indexed, not just the vertices. + * + * The following example will create a 256 x 256 sized quad using an index array: + * + * ```javascript + * let mesh = new Mesh(this); // Assuming `this` is a scene! + * const vertices = [ + * -128, 128, + * 128, 128, + * -128, -128, + * 128, -128 + * ]; + * + * const uvs = [ + * 0, 1, + * 1, 1, + * 0, 0, + * 1, 0 + * ]; + * + * const indices = [ 0, 2, 1, 2, 3, 1 ]; + * + * mesh.addVertices(vertices, uvs, indicies); + * // Note: Otherwise the added points will be "behind" the camera! This value will project vertex `x` & `y` values 1:1 to pixel values. + * mesh.hideCCW = false; + * mesh.setOrtho(mesh.width, mesh.height); + * ``` + * + * If the data is not indexed, it's assumed that the arrays all contain sequential data. + * @param vertices The vertices array. Either `xy` pairs, or `xyz` if the `containsZ` parameter is `true`. + * @param uvs The UVs pairs array. + * @param indicies Optional vertex indicies array. If you don't have one, pass `null` or an empty array. + * @param containsZ Does the vertices data include a `z` component? If not, it will be assumed `z=0`, see methods `panZ` or `setOrtho`. Default false. + * @param normals Optional vertex normals array. If you don't have one, pass `null` or an empty array. + * @param colors An array of colors, one per vertex, or a single color value applied to all vertices. Default 0xffffff. + * @param alphas An array of alpha values, one per vertex, or a single alpha value applied to all vertices. Default 1. + */ + addVertices(vertices: number[], uvs: number[], indicies?: number[], containsZ?: boolean, normals?: number[], colors?: number | number[], alphas?: number | number[]): this; + + /** + * Returns the total number of Faces in this Mesh Game Object. + */ + getFaceCount(): number; + + /** + * Returns the total number of Vertices in this Mesh Game Object. + */ + getVertexCount(): number; + + /** + * Returns the Face at the given index in this Mesh Game Object. + * @param index The index of the Face to get. + */ + getFace(index: number): Phaser.Geom.Mesh.Face; + + /** + * Tests to see if _any_ face in this Mesh intersects with the given coordinates. + * + * The given position is translated through the matrix of this Mesh and the given Camera, + * before being compared against the vertices. + * @param x The x position to check against. + * @param y The y position to check against. + * @param camera The camera to pass the coordinates through. If not give, the default Scene Camera is used. + */ + hasFaceAt(x: number, y: number, camera?: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Return an array of Face objects from this Mesh that intersect with the given coordinates. + * + * The given position is translated through the matrix of this Mesh and the given Camera, + * before being compared against the vertices. + * + * If more than one Face intersects, they will all be returned in the array, but the array will + * be depth sorted first, so the first element will always be that closest to the camera. + * @param x The x position to check against. + * @param y The y position to check against. + * @param camera The camera to pass the coordinates through. If not give, the default Scene Camera is used. + */ + getFaceAt(x: number, y: number, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Geom.Mesh.Face[]; + + /** + * This method enables rendering of the Mesh vertices to the given Graphics instance. + * + * If you enable this feature, you **must** call `Graphics.clear()` in your Scene `update`, + * otherwise the Graphics instance you provide to debug will fill-up with draw calls, + * eventually crashing the browser. This is not done automatically to allow you to debug + * draw multiple Mesh objects to a single Graphics instance. + * + * The Mesh class has a built-in debug rendering callback `Mesh.renderDebug`, however + * you can also provide your own callback to be used instead. Do this by setting the `callback` parameter. + * + * The callback is invoked _once per render_ and sent the following parameters: + * + * `callback(src, faces)` + * + * `src` is the Mesh instance being debugged. + * `faces` is an array of the Faces that were rendered. + * + * You can get the final drawn vertex position from a Face object like this: + * + * ```javascript + * let face = faces[i]; + * + * let x0 = face.vertex1.tx; + * let y0 = face.vertex1.ty; + * let x1 = face.vertex2.tx; + * let y1 = face.vertex2.ty; + * let x2 = face.vertex3.tx; + * let y2 = face.vertex3.ty; + * + * graphic.strokeTriangle(x0, y0, x1, y1, x2, y2); + * ``` + * + * If using your own callback you do not have to provide a Graphics instance to this method. + * + * To disable debug rendering, to either your own callback or the built-in one, call this method + * with no arguments. + * @param graphic The Graphic instance to render to if using the built-in callback. + * @param callback The callback to invoke during debug render. Leave as undefined to use the built-in callback. + */ + setDebug(graphic?: Phaser.GameObjects.Graphics, callback?: Function): this; + + /** + * Checks if the transformation data in this mesh is dirty. + * + * This is used internally by the `preUpdate` step to determine if the vertices should + * be recalculated or not. + */ + isDirty(): boolean; + + /** + * The Mesh update loop. The following takes place in this method: + * + * First, the `totalRendered` and `totalFrame` properties are set. + * + * If the view matrix of this Mesh isn't dirty, and the model position, rotate or scale properties are + * all clean, then the method returns at this point. + * + * Otherwise, if the viewPosition is dirty (i.e. from calling a method like `panZ`), then it will + * refresh the viewMatrix. + * + * After this, a new transformMatrix is built and it then iterates through all Faces in this + * Mesh, calling `transformCoordinatesLocal` on all of them. Internally, this updates every + * vertex, calculating its new transformed position, based on the new transform matrix. + * + * Finally, the faces are depth sorted. + * @param time The current timestamp. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected preUpdate(time: number, delta: number): void; + + /** + * The built-in Mesh debug rendering method. + * + * See `Mesh.setDebug` for more details. + * @param src The Mesh object being rendered. + * @param faces An array of Faces. + */ + renderDebug(src: Phaser.GameObjects.Mesh, faces: Phaser.Geom.Mesh.Face[]): void; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff on all vertices, + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Pass this Mesh Game Object to the Input Manager to enable it for Input. + * + * Unlike other Game Objects, the Mesh Game Object uses its own special hit area callback, which you cannot override. + * @param config An input configuration object but it will ignore hitArea, hitAreaCallback and pixelPerfect with associated alphaTolerance properties. + */ + setInteractive(config?: Phaser.Types.Input.InputConfiguration): this; + + /** + * Sets an additive tint on all vertices of this Mesh Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. + * + * To remove a tint call `clearTint`. + * @param tint The tint being applied to all vertices of this Mesh Game Object. Default 0xffffff. + */ + setTint(tint?: number): this; + + /** + * Scrolls the UV texture coordinates of all faces in this Mesh by + * adding the given x/y amounts to them. + * + * If you only wish to scroll one coordinate, pass a value of zero + * to the other. + * + * Use small values for scrolling. UVs are set from the range 0 + * to 1, so you should increment (or decrement) them by suitably + * small values, such as 0.01. + * + * Due to a limitation in WebGL1 you can only UV scroll textures + * that are a power-of-two in size. Scrolling NPOT textures will + * work but will result in clamping the pixels to the edges. + * + * Note that if this Mesh is using a _frame_ from a texture atlas + * then you will be unable to UV scroll its texture. + * @param x The amount to horizontally shift the UV coordinates by. + * @param y The amount to vertically shift the UV coordinates by. + */ + uvScroll(x: number, y: number): this; + + /** + * Scales the UV texture coordinates of all faces in this Mesh by + * the exact given amounts. + * + * If you only wish to scale one coordinate, pass a value of one + * to the other. + * + * Due to a limitation in WebGL1 you can only UV scale textures + * that are a power-of-two in size. Scaling NPOT textures will + * work but will result in clamping the pixels to the edges if + * you scale beyond a value of 1. Scaling below 1 will work + * regardless of texture size. + * + * Note that if this Mesh is using a _frame_ from a texture atlas + * then you will be unable to UV scale its texture. + * @param x The amount to horizontally scale the UV coordinates by. + * @param y The amount to vertically scale the UV coordinates by. + */ + uvScale(x: number, y: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * This property is a setter-only. + */ + tint(): number; + + /** + * The x rotation of the Model in 3D space, as specified in degrees. + * + * If you need the value in radians use the `modelRotation.x` property directly. + */ + rotateX(): number; + + /** + * The y rotation of the Model in 3D space, as specified in degrees. + * + * If you need the value in radians use the `modelRotation.y` property directly. + */ + rotateY(): number; + + /** + * The z rotation of the Model in 3D space, as specified in degrees. + * + * If you need the value in radians use the `modelRotation.z` property directly. + */ + rotateZ(): number; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Nine Slice Game Object allows you to display a texture-based object that + * can be stretched both horizontally and vertically, but that retains + * fixed-sized corners. The dimensions of the corners are set via the + * parameters to this class. + * + * This is extremely useful for UI and button like elements, where you need + * them to expand to accommodate the content without distorting the texture. + * + * The texture you provide for this Game Object should be based on the + * following layout structure: + * + * ``` + * A B + * +---+----------------------+---+ + * C | 1 | 2 | 3 | + * +---+----------------------+---+ + * | | | | + * | 4 | 5 | 6 | + * | | | | + * +---+----------------------+---+ + * D | 7 | 8 | 9 | + * +---+----------------------+---+ + * ``` + * + * When changing this objects width and / or height: + * + * areas 1, 3, 7 and 9 (the corners) will remain unscaled + * areas 2 and 8 will be stretched horizontally only + * areas 4 and 6 will be stretched vertically only + * area 5 will be stretched both horizontally and vertically + * + * You can also create a 3 slice Game Object: + * + * This works in a similar way, except you can only stretch it horizontally. + * Therefore, it requires less configuration: + * + * ``` + * A B + * +---+----------------------+---+ + * | | | | + * C | 1 | 2 | 3 | + * | | | | + * +---+----------------------+---+ + * ``` + * + * When changing this objects width (you cannot change its height) + * + * areas 1 and 3 will remain unscaled + * area 2 will be stretched horizontally + * + * The above configuration concept is adapted from the Pixi NineSlicePlane. + * + * To specify a 3 slice object instead of a 9 slice you should only + * provide the `leftWidth` and `rightWidth` parameters. To create a 9 slice + * you must supply all parameters. + * + * The _minimum_ width this Game Object can be is the total of + * `leftWidth` + `rightWidth`. The _minimum_ height this Game Object + * can be is the total of `topHeight` + `bottomHeight`. + * If you need to display this object at a smaller size, you can scale it. + * + * In terms of performance, using a 3 slice Game Object is the equivalent of + * having 3 Sprites in a row. Using a 9 slice Game Object is the equivalent + * of having 9 Sprites in a row. The vertices of this object are all batched + * together and can co-exist with other Sprites and graphics on the display + * list, without incurring any additional overhead. + * + * As of Phaser 3.60 this Game Object is WebGL only. + * + * As of Phaser 3.70 this Game Object can now populate its values automatically + * if they have been set within Texture Packer 7.1.0 or above and exported with + * the atlas json. If this is the case, you can just call this method without + * specifying anything more than the texture key and frame and it will pull the + * area data from the atlas. + */ + class NineSlice extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of the center of this Game Object in the world. + * @param y The vertical position of the center of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param width The width of the Nine Slice Game Object. You can adjust the width post-creation. Default 256. + * @param height The height of the Nine Slice Game Object. If this is a 3 slice object the height will be fixed to the height of the texture and cannot be changed. Default 256. + * @param leftWidth The size of the left vertical column (A). Default 10. + * @param rightWidth The size of the right vertical column (B). Default 10. + * @param topHeight The size of the top horizontal row (C). Set to zero or undefined to create a 3 slice object. Default 0. + * @param bottomHeight The size of the bottom horizontal row (D). Set to zero or undefined to create a 3 slice object. Default 0. + */ + constructor(scene: Phaser.Scene, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, width?: number, height?: number, leftWidth?: number, rightWidth?: number, topHeight?: number, bottomHeight?: number); + + /** + * An array of Vertex objects that correspond to the quads that make-up + * this Nine Slice Game Object. They are stored in the following order: + * + * Top Left - Indexes 0 - 5 + * Top Center - Indexes 6 - 11 + * Top Right - Indexes 12 - 17 + * Center Left - Indexes 18 - 23 + * Center - Indexes 24 - 29 + * Center Right - Indexes 30 - 35 + * Bottom Left - Indexes 36 - 41 + * Bottom Center - Indexes 42 - 47 + * Bottom Right - Indexes 48 - 53 + * + * Each quad is represented by 6 Vertex instances. + * + * This array will contain 18 elements for a 3 slice object + * and 54 for a nine slice object. + * + * You should never modify this array once it has been populated. + */ + vertices: Phaser.Geom.Mesh.Vertex[]; + + /** + * The size of the left vertical bar (A). + */ + readonly leftWidth: number; + + /** + * The size of the right vertical bar (B). + */ + readonly rightWidth: number; + + /** + * The size of the top horizontal bar (C). + * + * If this is a 3 slice object this property will be set to the + * height of the texture being used. + */ + readonly topHeight: number; + + /** + * The size of the bottom horizontal bar (D). + * + * If this is a 3 slice object this property will be set to zero. + */ + readonly bottomHeight: number; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tint: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * This property is `true` if this Nine Slice Game Object was configured + * with just `leftWidth` and `rightWidth` values, making it a 3-slice + * instead of a 9-slice object. + */ + is3Slice: boolean; + + /** + * Resets the width, height and slices for this NineSlice Game Object. + * + * This allows you to modify the texture being used by this object and then reset the slice configuration, + * to avoid having to destroy this Game Object in order to use it for a different game element. + * + * Please note that you cannot change a 9-slice to a 3-slice or vice versa. + * @param width The width of the Nine Slice Game Object. You can adjust the width post-creation. Default 256. + * @param height The height of the Nine Slice Game Object. If this is a 3 slice object the height will be fixed to the height of the texture and cannot be changed. Default 256. + * @param leftWidth The size of the left vertical column (A). Default 10. + * @param rightWidth The size of the right vertical column (B). Default 10. + * @param topHeight The size of the top horizontal row (C). Set to zero or undefined to create a 3 slice object. Default 0. + * @param bottomHeight The size of the bottom horizontal row (D). Set to zero or undefined to create a 3 slice object. Default 0. + * @param skipScale9 If this Nine Slice was created from Texture Packer scale9 atlas data, set this property to use the given column sizes instead of those specified in the JSON. Default false. + */ + setSlices(width?: number, height?: number, leftWidth?: number, rightWidth?: number, topHeight?: number, bottomHeight?: number, skipScale9?: boolean): this; + + /** + * Updates all of the vertice UV coordinates. This is called automatically + * when the NineSlice Game Object is created, or if the texture frame changes. + * + * Unlike with the `updateVertice` method, you do not need to call this + * method if the Nine Slice changes size. Only if it changes texture frame. + */ + updateUVs(): void; + + /** + * Recalculates all of the vertices in this Nine Slice Game Object + * based on the `leftWidth`, `rightWidth`, `topHeight` and `bottomHeight` + * properties, combined with the Game Object size. + * + * This method is called automatically when this object is created + * or if it's origin is changed. + * + * You should not typically need to call this method directly, but it + * is left public should you find a need to modify one of those properties + * after creation. + */ + updateVertices(): void; + + /** + * Internally updates the position coordinates across all vertices of the + * given quad offset. + * + * You should not typically need to call this method directly, but it + * is left public should an extended class require it. + * @param offset The offset in the vertices array of the quad to update. + * @param x1 The top-left quad coordinate. + * @param y1 The top-left quad coordinate. + * @param x2 The bottom-right quad coordinate. + * @param y2 The bottom-right quad coordinate. + */ + updateQuad(offset: number, x1: number, y1: number, x2: number, y2: number): void; + + /** + * Internally updates the UV coordinates across all vertices of the + * given quad offset, based on the frame size. + * + * You should not typically need to call this method directly, but it + * is left public should an extended class require it. + * @param offset The offset in the vertices array of the quad to update. + * @param u1 The top-left UV coordinate. + * @param v1 The top-left UV coordinate. + * @param u2 The bottom-right UV coordinate. + * @param v2 The bottom-right UV coordinate. + */ + updateQuadUVs(offset: number, u1: number, v1: number, u2: number, v2: number): void; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property. + * + * To remove a tint call `clearTint`, or call this method with no parameters. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param color The tint being applied to the entire Game Object. Default 0xffffff. + */ + setTint(color?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. The whole Game Object will be rendered in the given color. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property. + * + * To remove a tint call `clearTint`, or call this method with no parameters. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param color The tint being applied to the entire Game Object. Default 0xffffff. + */ + setTintFill(color?: number): this; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the tint property is set to a value other than 0xffffff. + * This indicates that a Game Object is tinted. + */ + readonly isTinted: boolean; + + /** + * The displayed width of this Game Object. + * + * Setting this value will adjust the way in which this Nine Slice + * object scales horizontally, if configured to do so. + * + * The _minimum_ width this Game Object can be is the total of + * `leftWidth` + `rightWidth`. If you need to display this object + * at a smaller size, you can also scale it. + */ + width: number; + + /** + * The displayed height of this Game Object. + * + * Setting this value will adjust the way in which this Nine Slice + * object scales vertically, if configured to do so. + * + * The _minimum_ height this Game Object can be is the total of + * `topHeight` + `bottomHeight`. If you need to display this object + * at a smaller size, you can also scale it. + * + * If this is a 3-slice object, you can only stretch it horizontally + * and changing the height will be ignored. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object. + * + * For a Nine Slice Game Object this means it will be stretched (or shrunk) horizontally + * and vertically depending on the dimensions given to this method, in accordance with + * how it has been configured for the various corner sizes. + * + * If this is a 3-slice object, you can only stretch it horizontally + * and changing the height will be ignored. + * + * If you have enabled this Game Object for input, changing the size will also change the + * size of the hit area. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + */ + originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + */ + originY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * This method is included but does nothing for the Nine Slice Game Object, + * because the size of the object isn't based on the texture frame. + * + * You should not call this method. + */ + setSizeToFrame(): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + namespace Particles { + /** + * This class is responsible for taking control over the color property + * in the Particle class and managing its emission and updating functions. + * + * See the `ParticleEmitter` class for more details on emitter op configuration. + */ + class EmitterColorOp extends Phaser.GameObjects.Particles.EmitterOp { + /** + * + * @param key The name of the property. + */ + constructor(key: string); + + /** + * An array containing the red color values. + * + * Populated during the `setMethods` method. + */ + r: number[]; + + /** + * An array containing the green color values. + * + * Populated during the `setMethods` method. + */ + g: number[]; + + /** + * An array containing the blue color values. + * + * Populated during the `setMethods` method. + */ + b: number[]; + + /** + * Checks the type of `EmitterOp.propertyValue` to determine which + * method is required in order to return values from this op function. + */ + getMethod(): number; + + /** + * Sets the EmitterColorOp method values, if in use. + */ + setMethods(): this; + + /** + * Sets the Ease function to use for Color interpolation. + * @param ease The string-based name of the Ease function to use. + */ + setEase(ease: string): void; + + /** + * An `onEmit` callback for an eased property. + * + * It prepares the particle for easing by {@link Phaser.GameObjects.Particles.EmitterColorOp#easeValueUpdate}. + * @param particle The particle. + * @param key The name of the property. + */ + easedValueEmit(particle: Phaser.GameObjects.Particles.Particle, key: string): number; + + /** + * An `onUpdate` callback that returns an eased value between the + * {@link Phaser.GameObjects.Particles.EmitterColorOp#start} and {@link Phaser.GameObjects.Particles.EmitterColorOp#end} + * range. + * @param particle The particle. + * @param key The name of the property. + * @param t The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + */ + easeValueUpdate(particle: Phaser.GameObjects.Particles.Particle, key: string, t: number): number; + + } + + /** + * This class is responsible for taking control over a single property + * in the Particle class and managing its emission and updating functions. + * + * Particles properties such as `x`, `y`, `scaleX`, `lifespan` and others all use + * EmitterOp instances to manage them, as they can be given in a variety of + * formats: from simple values, to functions, to dynamic callbacks. + * + * See the `ParticleEmitter` class for more details on emitter op configuration. + */ + class EmitterOp { + /** + * + * @param key The name of the property. + * @param defaultValue The default value of the property. + * @param emitOnly Whether the property can only be modified when a Particle is emitted. Default false. + */ + constructor(key: string, defaultValue: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType, emitOnly?: boolean); + + /** + * The name of this property. + */ + propertyKey: string; + + /** + * The current value of this property. + * + * This can be a simple value, an array, a function or an onEmit + * configuration object. + */ + propertyValue: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + + /** + * The default value of this property. + * + * This can be a simple value, an array, a function or an onEmit + * configuration object. + */ + defaultValue: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + + /** + * The number of steps for stepped easing between {@link Phaser.GameObjects.Particles.EmitterOp#start} and + * {@link Phaser.GameObjects.Particles.EmitterOp#end} values, per emit. + */ + steps: number; + + /** + * The step counter for stepped easing, per emit. + */ + counter: number; + + /** + * When the step counter reaches it's maximum, should it then + * yoyo back to the start again, or flip over to it? + */ + yoyo: boolean; + + /** + * The counter direction. 0 for up and 1 for down. + */ + direction: number; + + /** + * The start value for this property to ease between. + * + * If an interpolation this holds a reference to the number data array. + */ + start: number | number[]; + + /** + * The most recently calculated value. Updated every time an + * emission or update method is called. Treat as read-only. + */ + current: number; + + /** + * The end value for this property to ease between. + */ + end: number; + + /** + * The easing function to use for updating this property, if any. + */ + ease: Function | null; + + /** + * The interpolation function to use for updating this property, if any. + */ + interpolation: Function | null; + + /** + * Whether this property can only be modified when a Particle is emitted. + * + * Set to `true` to allow only {@link Phaser.GameObjects.Particles.EmitterOp#onEmit} callbacks to be set and + * affect this property. + * + * Set to `false` to allow both {@link Phaser.GameObjects.Particles.EmitterOp#onEmit} and + * {@link Phaser.GameObjects.Particles.EmitterOp#onUpdate} callbacks to be set and affect this property. + */ + emitOnly: boolean; + + /** + * The callback to run for Particles when they are emitted from the Particle Emitter. + */ + onEmit: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitCallback; + + /** + * The callback to run for Particles when they are updated. + */ + onUpdate: Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateCallback; + + /** + * Set to `false` to disable this EmitterOp. + */ + active: boolean; + + /** + * The onEmit method type of this EmitterOp. + * + * Set as part of `setMethod` and cached here to avoid + * re-setting when only the value changes. + */ + method: number; + + /** + * Load the property from a Particle Emitter configuration object. + * + * Optionally accepts a new property key to use, replacing the current one. + * @param config Settings for the Particle Emitter that owns this property. + * @param newKey The new key to use for this property, if any. + */ + loadConfig(config?: Phaser.Types.GameObjects.Particles.ParticleEmitterConfig, newKey?: string): void; + + /** + * Build a JSON representation of this Particle Emitter property. + */ + toJSON(): object; + + /** + * Change the current value of the property and update its callback methods. + * @param value The new numeric value of this property. + */ + onChange(value: number): this; + + /** + * Checks the type of `EmitterOp.propertyValue` to determine which + * method is required in order to return values from this op function. + */ + getMethod(): number; + + /** + * Update the {@link Phaser.GameObjects.Particles.EmitterOp#onEmit} and + * {@link Phaser.GameObjects.Particles.EmitterOp#onUpdate} callbacks based on the method returned + * from `getMethod`. The method is stored in the `EmitterOp.method` property + * and is a number between 0 and 9 inclusively. + */ + setMethods(): this; + + /** + * Check whether an object has the given property. + * @param object The object to check. + * @param key The key of the property to look for in the object. + */ + has(object: object, key: string): boolean; + + /** + * Check whether an object has both of the given properties. + * @param object The object to check. + * @param key1 The key of the first property to check the object for. + * @param key2 The key of the second property to check the object for. + */ + hasBoth(object: object, key1: string, key2: string): boolean; + + /** + * Check whether an object has at least one of the given properties. + * @param object The object to check. + * @param key1 The key of the first property to check the object for. + * @param key2 The key of the second property to check the object for. + */ + hasEither(object: object, key1: string, key2: string): boolean; + + /** + * The returned value sets what the property will be at the START of the particles life, on emit. + * @param particle The particle. + * @param key The name of the property. + * @param value The current value of the property. + */ + defaultEmit(particle: Phaser.GameObjects.Particles.Particle, key: string, value?: number): number; + + /** + * The returned value updates the property for the duration of the particles life. + * @param particle The particle. + * @param key The name of the property. + * @param t The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + * @param value The current value of the property. + */ + defaultUpdate(particle: Phaser.GameObjects.Particles.Particle, key: string, t: number, value: number): number; + + /** + * The returned value sets what the property will be at the START of the particles life, on emit. + * + * This method is only used when you have provided a custom emit callback. + * @param particle The particle. + * @param key The name of the property. + * @param value The current value of the property. + */ + proxyEmit(particle: Phaser.GameObjects.Particles.Particle, key: string, value?: number): number; + + /** + * The returned value updates the property for the duration of the particles life. + * + * This method is only used when you have provided a custom update callback. + * @param particle The particle. + * @param key The name of the property. + * @param t The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + * @param value The current value of the property. + */ + proxyUpdate(particle: Phaser.GameObjects.Particles.Particle, key: string, t: number, value: number): number; + + /** + * An `onEmit` callback that returns the current value of the property. + */ + staticValueEmit(): number; + + /** + * An `onUpdate` callback that returns the current value of the property. + */ + staticValueUpdate(): number; + + /** + * An `onEmit` callback that returns a random value from the current value array. + */ + randomStaticValueEmit(): number; + + /** + * An `onEmit` callback that returns a value between the {@link Phaser.GameObjects.Particles.EmitterOp#start} and + * {@link Phaser.GameObjects.Particles.EmitterOp#end} range. + * @param particle The particle. + * @param key The key of the property. + */ + randomRangedValueEmit(particle: Phaser.GameObjects.Particles.Particle, key: string): number; + + /** + * An `onEmit` callback that returns a value between the {@link Phaser.GameObjects.Particles.EmitterOp#start} and + * {@link Phaser.GameObjects.Particles.EmitterOp#end} range. + * @param particle The particle. + * @param key The key of the property. + */ + randomRangedIntEmit(particle: Phaser.GameObjects.Particles.Particle, key: string): number; + + /** + * An `onEmit` callback that returns a stepped value between the + * {@link Phaser.GameObjects.Particles.EmitterOp#start} and {@link Phaser.GameObjects.Particles.EmitterOp#end} + * range. + */ + steppedEmit(): number; + + /** + * An `onEmit` callback for an eased property. + * + * It prepares the particle for easing by {@link Phaser.GameObjects.Particles.EmitterOp#easeValueUpdate}. + * @param particle The particle. + * @param key The name of the property. + */ + easedValueEmit(particle: Phaser.GameObjects.Particles.Particle, key: string): number; + + /** + * An `onUpdate` callback that returns an eased value between the + * {@link Phaser.GameObjects.Particles.EmitterOp#start} and {@link Phaser.GameObjects.Particles.EmitterOp#end} + * range. + * @param particle The particle. + * @param key The name of the property. + * @param t The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + */ + easeValueUpdate(particle: Phaser.GameObjects.Particles.Particle, key: string, t: number): number; + + /** + * Destroys this EmitterOp instance and all of its references. + * + * Called automatically when the ParticleEmitter that owns this + * EmitterOp is destroyed. + */ + destroy(): void; + + } + + namespace Events { + /** + * The Particle Emitter Complete Event. + * + * This event is dispatched when the final particle, emitted from a Particle Emitter that + * has been stopped, dies. Upon receipt of this event you know that no particles are + * still rendering at this point in time. + * + * Listen for it on a Particle Emitter instance using `ParticleEmitter.on('complete', listener)`. + */ + const COMPLETE: string; + + /** + * The Particle Emitter Death Zone Event. + * + * This event is dispatched when a Death Zone kills a Particle instance. + * + * Listen for it on a Particle Emitter instance using `ParticleEmitter.on('deathzone', listener)`. + * + * If you wish to know when the final particle is killed, see the `COMPLETE` event. + */ + const DEATH_ZONE: string; + + /** + * The Particle Emitter Explode Event. + * + * This event is dispatched when a Particle Emitter explodes a set of particles. + * + * Listen for it on a Particle Emitter instance using `ParticleEmitter.on('explode', listener)`. + */ + const EXPLODE: string; + + /** + * The Particle Emitter Start Event. + * + * This event is dispatched when a Particle Emitter starts emission of particles. + * + * Listen for it on a Particle Emitter instance using `ParticleEmitter.on('start', listener)`. + */ + const START: string; + + /** + * The Particle Emitter Stop Event. + * + * This event is dispatched when a Particle Emitter is stopped. This can happen either + * when you directly call the `ParticleEmitter.stop` method, or if the emitter has + * been configured to stop after a set time via the `duration` property, or after a + * set number of particles via the `stopAfter` property. + * + * Listen for it on a Particle Emitter instance using `ParticleEmitter.on('stop', listener)`. + * + * Note that just because the emitter has stopped, that doesn't mean there aren't still + * particles alive and rendering. It just means the emitter has stopped emitting particles. + * + * If you wish to know when the final particle is killed, see the `COMPLETE` event. + */ + const STOP: string; + + } + + /** + * The Gravity Well Particle Processor applies a force on the particles to draw + * them towards, or repel them from, a single point. + * + * The force applied is inversely proportional to the square of the distance + * from the particle to the point, in accordance with Newton's law of gravity. + * + * This simulates the effect of gravity over large distances (as between planets, for example). + */ + class GravityWell extends Phaser.GameObjects.Particles.ParticleProcessor { + /** + * + * @param x The x coordinate of the Gravity Well, in world space. Default 0. + * @param y The y coordinate of the Gravity Well, in world space. Default 0. + * @param power The strength of the gravity force - larger numbers produce a stronger force. Default 0. + * @param epsilon The minimum distance for which the gravity force is calculated. Default 100. + * @param gravity The gravitational force of this Gravity Well. Default 50. + */ + constructor(x?: number | Phaser.Types.GameObjects.Particles.GravityWellConfig, y?: number, power?: number, epsilon?: number, gravity?: number); + + /** + * Takes a Particle and updates it based on the properties of this Gravity Well. + * @param particle The Particle to update. + * @param delta The delta time in ms. + * @param step The delta value divided by 1000. + */ + update(particle: Phaser.GameObjects.Particles.Particle, delta: number, step: number): void; + + /** + * The minimum distance for which the gravity force is calculated. + * + * Defaults to 100. + */ + epsilon: number; + + /** + * The strength of the gravity force - larger numbers produce a stronger force. + * + * Defaults to 0. + */ + power: number; + + /** + * The gravitational force of this Gravity Well. + * + * Defaults to 50. + */ + gravity: number; + + } + + /** + * A Particle is a simple object owned and controlled by a Particle Emitter. + * + * It encapsulates all of the properties required to move and update according + * to the Emitters operations. + */ + class Particle { + /** + * + * @param emitter The Emitter to which this Particle belongs. + */ + constructor(emitter: Phaser.GameObjects.Particles.ParticleEmitter); + + /** + * The Emitter to which this Particle belongs. + * + * A Particle can only belong to a single Emitter and is created, updated and destroyed by it. + */ + emitter: Phaser.GameObjects.Particles.ParticleEmitter; + + /** + * The texture used by this Particle when it renders. + */ + texture: Phaser.Textures.Texture; + + /** + * The texture frame used by this Particle when it renders. + */ + frame: Phaser.Textures.Frame; + + /** + * The x coordinate of this Particle. + */ + x: number; + + /** + * The y coordinate of this Particle. + */ + y: number; + + /** + * The coordinates of this Particle in world space. + * + * Updated as part of `computeVelocity`. + */ + worldPosition: Phaser.Math.Vector2; + + /** + * The x velocity of this Particle. + */ + velocityX: number; + + /** + * The y velocity of this Particle. + */ + velocityY: number; + + /** + * The x acceleration of this Particle. + */ + accelerationX: number; + + /** + * The y acceleration of this Particle. + */ + accelerationY: number; + + /** + * The maximum horizontal velocity this Particle can travel at. + */ + maxVelocityX: number; + + /** + * The maximum vertical velocity this Particle can travel at. + */ + maxVelocityY: number; + + /** + * The bounciness, or restitution, of this Particle. + */ + bounce: number; + + /** + * The horizontal scale of this Particle. + */ + scaleX: number; + + /** + * The vertical scale of this Particle. + */ + scaleY: number; + + /** + * The alpha value of this Particle. + */ + alpha: number; + + /** + * The angle of this Particle in degrees. + */ + angle: number; + + /** + * The angle of this Particle in radians. + */ + rotation: number; + + /** + * The tint applied to this Particle. + */ + tint: number; + + /** + * The lifespan of this Particle in ms. + */ + life: number; + + /** + * The current life of this Particle in ms. + */ + lifeCurrent: number; + + /** + * The delay applied to this Particle upon emission, in ms. + */ + delayCurrent: number; + + /** + * The hold applied to this Particle before it expires, in ms. + */ + holdCurrent: number; + + /** + * The normalized lifespan T value, where 0 is the start and 1 is the end. + */ + lifeT: number; + + /** + * The data used by the ease equation. + */ + data: Phaser.Types.GameObjects.Particles.ParticleData; + + /** + * A reference to the Scene to which this Game Object belongs. + * + * Game Objects can only belong to one Scene. + * + * You should consider this property as being read-only. You cannot move a + * Game Object to another Scene by simply changing it. + */ + scene: Phaser.Scene; + + /** + * The Animation State component of this Particle. + * + * This component provides features to apply animations to this Particle. + * It is responsible for playing, loading, queuing animations for later playback, + * mixing between animations and setting the current animation frame to this Particle. + */ + anims: Phaser.Animations.AnimationState; + + /** + * A rectangle that holds the bounds of this Particle after a call to + * the `Particle.getBounds` method has been made. + */ + bounds: Phaser.Geom.Rectangle; + + /** + * The Event Emitter proxy. + * + * Passes on all parameters to the `ParticleEmitter` to emit directly. + * @param event The event name. + * @param a1 Optional argument 1. + * @param a2 Optional argument 2. + * @param a3 Optional argument 3. + * @param a4 Optional argument 4. + * @param a5 Optional argument 5. + */ + emit(event: string | Symbol, a1?: any, a2?: any, a3?: any, a4?: any, a5?: any): boolean; + + /** + * Checks to see if this Particle is alive and updating. + */ + isAlive(): boolean; + + /** + * Kills this particle. This sets the `lifeCurrent` value to 0, which forces + * the Particle to be removed the next time its parent Emitter runs an update. + */ + kill(): void; + + /** + * Sets the position of this particle to the given x/y coordinates. + * + * If the parameters are left undefined, it resets the particle back to 0x0. + * @param x The x coordinate to set this Particle to. Default 0. + * @param y The y coordinate to set this Particle to. Default 0. + */ + setPosition(x?: number, y?: number): void; + + /** + * Starts this Particle from the given coordinates. + * @param x The x coordinate to launch this Particle from. + * @param y The y coordinate to launch this Particle from. + */ + fire(x?: number, y?: number): boolean; + + /** + * The main update method for this Particle. + * + * Updates its life values, computes the velocity and repositions the Particle. + * @param delta The delta time in ms. + * @param step The delta value divided by 1000. + * @param processors An array of all active Particle Processors. + */ + update(delta: number, step: number, processors: Phaser.GameObjects.Particles.ParticleProcessor[]): boolean; + + /** + * An internal method that calculates the velocity of the Particle and + * its world position. It also runs it against any active Processors + * that are set on the Emitter. + * @param emitter The Emitter that is updating this Particle. + * @param delta The delta time in ms. + * @param step The delta value divided by 1000. + * @param processors An array of all active Particle Processors. + * @param t The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + */ + computeVelocity(emitter: Phaser.GameObjects.Particles.ParticleEmitter, delta: number, step: number, processors: Phaser.GameObjects.Particles.ParticleProcessor[], t: number): void; + + /** + * This is a NOOP method and does nothing when called. + */ + setSizeToFrame(): void; + + /** + * Gets the bounds of this particle as a Geometry Rectangle, factoring in any + * transforms of the parent emitter and anything else above it in the display list. + * + * Once calculated the bounds can be accessed via the `Particle.bounds` property. + * @param matrix Optional transform matrix to apply to this particle. + */ + getBounds(matrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.Geom.Rectangle; + + /** + * Destroys this Particle. + */ + destroy(): void; + + } + + /** + * The Particle Bounds Processor. + * + * Defines a rectangular region, in world space, within which particle movement + * is restrained. + * + * Use the properties `collideLeft`, `collideRight`, `collideTop` and + * `collideBottom` to control if a particle will rebound off the sides + * of this boundary, or not. + * + * This happens when the particles worldPosition x/y coordinate hits the boundary. + * + * The strength of the rebound is determined by the `Particle.bounce` property. + */ + class ParticleBounds extends Phaser.GameObjects.Particles.ParticleProcessor { + /** + * + * @param x The x position (top-left) of the bounds, in world space. + * @param y The y position (top-left) of the bounds, in world space. + * @param width The width of the bounds. + * @param height The height of the bounds. + * @param collideLeft Whether particles interact with the left edge of the bounds. Default true. + * @param collideRight Whether particles interact with the right edge of the bounds. Default true. + * @param collideTop Whether particles interact with the top edge of the bounds. Default true. + * @param collideBottom Whether particles interact with the bottom edge of the bounds. Default true. + */ + constructor(x: number, y: number, width: number, height: number, collideLeft?: boolean, collideRight?: boolean, collideTop?: boolean, collideBottom?: boolean); + + /** + * A rectangular boundary constraining particle movement. Use the Emitter properties `collideLeft`, + * `collideRight`, `collideTop` and `collideBottom` to control if a particle will rebound off + * the sides of this boundary, or not. This happens when the particles x/y coordinate hits + * the boundary. + */ + bounds: Phaser.Geom.Rectangle; + + /** + * Whether particles interact with the left edge of the emitter {@link Phaser.GameObjects.Particles.ParticleEmitter#bounds}. + */ + collideLeft: boolean; + + /** + * Whether particles interact with the right edge of the emitter {@link Phaser.GameObjects.Particles.ParticleBounds#bounds}. + */ + collideRight: boolean; + + /** + * Whether particles interact with the top edge of the emitter {@link Phaser.GameObjects.Particles.ParticleBounds#bounds}. + */ + collideTop: boolean; + + /** + * Whether particles interact with the bottom edge of the emitter {@link Phaser.GameObjects.Particles.ParticleBounds#bounds}. + */ + collideBottom: boolean; + + /** + * Takes a Particle and updates it against the bounds. + * @param particle The Particle to update. + */ + update(particle: Phaser.GameObjects.Particles.Particle): void; + + } + + /** + * A Particle Emitter is a special kind of Game Object that controls a pool of {@link Phaser.GameObjects.Particles.Particle Particles}. + * + * Particle Emitters are created via a configuration object. The properties of this object + * can be specified in a variety of formats, given you plenty of scope over the values they + * return, leading to complex visual effects. Here are the different forms of configuration + * value you can give: + * + * ## An explicit static value: + * + * ```js + * x: 400 + * ``` + * + * The x value will always be 400 when the particle is spawned. + * + * ## A random value: + * + * ```js + * x: [ 100, 200, 300, 400 ] + * ``` + * + * The x value will be one of the 4 elements in the given array, picked at random on emission. + * + * ## A custom callback: + * + * ```js + * x: (particle, key, t, value) => { + * return value + 50; + * } + * ``` + * + * The x value is the result of calling this function. This is only used when the + * particle is emitted, so it provides it's initial starting value. It is not used + * when the particle is updated (see the onUpdate callback for that) + * + * ## A start / end object: + * + * This allows you to control the change in value between the given start and + * end parameters over the course of the particles lifetime: + * + * ```js + * scale: { start: 0, end: 1 } + * ``` + * + * The particle scale will start at 0 when emitted and ease to a scale of 1 + * over the course of its lifetime. You can also specify the ease function + * used for this change (the default is Linear): + * + * ```js + * scale: { start: 0, end: 1, ease: 'bounce.out' } + * ``` + * + * ## A start / end random object: + * + * The start and end object can have an optional `random` parameter. + * This forces it to pick a random value between the two values and use + * this as the starting value, then easing to the 'end' parameter over + * its lifetime. + * + * ```js + * scale: { start: 4, end: 0.5, random: true } + * ``` + * + * The particle will start with a random scale between 0.5 and 4 and then + * scale to the end value over its lifetime. You can combine the above + * with the `ease` parameter as well to control the value easing. + * + * ## An interpolation object: + * + * You can provide an array of values which will be used for interpolation + * during the particles lifetime. You can also define the interpolation + * function to be used. There are three provided: `linear` (the default), + * `bezier` and `catmull`, or you can provide your own function. + * + * ```js + * x: { values: [ 50, 500, 200, 800 ], interpolation: 'catmull' } + * ``` + * + * The particle scale will interpolate from 50 when emitted to 800 via the other + * points over the course of its lifetime. You can also specify an ease function + * used to control the rate of change through the values (the default is Linear): + * + * ```js + * x: { values: [ 50, 500, 200, 800 ], interpolation: 'catmull', ease: 'bounce.out } + * ``` + * + * ## A stepped emitter object: + * + * The `steps` parameter allows you to control the placement of sequential + * particles across the start-end range: + * + * ```js + * x: { steps: 32, start: 0, end: 576 } + * ``` + * + * Here we have a range of 576 (start to end). This is divided into 32 steps. + * + * The first particle will emit at the x position of 0. The next will emit + * at the next 'step' along, which would be 18. The following particle will emit + * at the next step, which is 36, and so on. Because the range of 576 has been + * divided by 32, creating 18 pixels steps. When a particle reaches the 'end' + * value the next one will start from the beginning again. + * + * ## A stepped emitter object with yoyo: + * + * You can add the optional `yoyo` property to a stepped object: + * + * ```js + * x: { steps: 32, start: 0, end: 576, yoyo: true } + * ``` + * + * As with the stepped emitter, particles are emitted in sequence, from 'start' + * to 'end' in step sized jumps. Normally, when a stepped emitter reaches the + * end it snaps around to the start value again. However, if you provide the 'yoyo' + * parameter then when it reaches the end it will reverse direction and start + * emitting back down to 'start' again. Depending on the effect you require this + * can often look better. + * + * ## A min / max object: + * + * This allows you to pick a random float value between the min and max properties: + * + * ```js + * x: { min: 100, max: 700 } + * ``` + * + * The x value will be a random float between min and max. + * + * You can force it select an integer by setting the 'int' flag: + * + * ```js + * x: { min: 100, max: 700, int: true } + * ``` + * + * Or, you could use the 'random' array approach (see below) + * + * ## A random object: + * + * This allows you to pick a random integer value between the first and second array elements: + * + * ```js + * x: { random: [ 100, 700 ] } + * ``` + * + * The x value will be a random integer between 100 and 700 as it takes the first + * element in the 'random' array as the 'min' value and the 2nd element as the 'max' value. + * + * ## Custom onEmit and onUpdate callbacks: + * + * If the above won't give you the effect you're after, you can provide your own + * callbacks that will be used when the particle is both emitted and updated: + * + * ```js + * x: { + * onEmit: (particle, key, t, value) => { + * return value; + * }, + * onUpdate: (particle, key, t, value) => { + * return value; + * } + * } + * ``` + * + * You can provide either one or both functions. The `onEmit` is called at the + * start of the particles life and defines the value of the property on birth. + * + * The `onUpdate` function is called every time the Particle Emitter updates + * until the particle dies. Both must return a value. + * + * The properties are: + * + * particle - A reference to the Particle instance. + * key - The string based key of the property, i.e. 'x' or 'lifespan'. + * t - The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + * value - The current property value. At a minimum you should return this. + * + * By using the above configuration options you have an unlimited about of + * control over how your particles behave. + * + * ## v3.55 Differences + * + * Prior to v3.60 Phaser used a `ParticleEmitterManager`. This was removed in v3.60 + * and now calling `this.add.particles` returns a `ParticleEmitter` instance instead. + * + * In order to streamline memory and the display list we have removed the + * `ParticleEmitterManager` entirely. When you call `this.add.particles` you're now + * creating a `ParticleEmitter` instance, which is being added directly to the + * display list and can be manipulated just like any other Game Object, i.e. + * scaled, rotated, positioned, added to a Container, etc. It now extends the + * `GameObject` base class, meaning it's also an event emitter, which allowed us + * to create some handy new events for particles. + * + * So, to create an emitter, you now give it an xy coordinate, a texture and an + * emitter configuration object (you can also set this later, but most commonly + * you'd do it on creation). I.e.: + * + * ```js + * const emitter = this.add.particles(100, 300, 'flares', { + * frame: 'red', + * angle: { min: -30, max: 30 }, + * speed: 150 + * }); + * ``` + * + * This will create a 'red flare' emitter at 100 x 300. + * + * Please update your code to ensure it adheres to the new function signatures. + */ + class ParticleEmitter extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param config Settings for this emitter. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, config?: Phaser.Types.GameObjects.Particles.ParticleEmitterConfig); + + /** + * The Particle Class which will be emitted by this Emitter. + */ + particleClass: Function; + + /** + * An internal object holding all of the EmitterOp instances. + * + * These are populated as part of the Emitter configuration parsing. + * + * You typically do not access them directly, but instead use the + * provided getters and setters on this class, such as `ParticleEmitter.speedX` etc. + */ + ops: Phaser.Types.GameObjects.Particles.ParticleEmitterOps; + + /** + * A radial emitter will emit particles in all directions between angle min and max, + * using {@link Phaser.GameObjects.Particles.ParticleEmitter#speed} as the value. If set to false then this acts as a point Emitter. + * A point emitter will emit particles only in the direction derived from the speedX and speedY values. + */ + radial: boolean; + + /** + * Horizontal acceleration applied to emitted particles, in pixels per second squared. + */ + gravityX: number; + + /** + * Vertical acceleration applied to emitted particles, in pixels per second squared. + */ + gravityY: number; + + /** + * Whether accelerationX and accelerationY are non-zero. Set automatically during configuration. + */ + acceleration: boolean; + + /** + * Whether moveToX and moveToY are set. Set automatically during configuration. + * + * When true the particles move toward the moveToX and moveToY coordinates and arrive at the end of their life. + * Emitter angle, speedX, and speedY are ignored. + */ + moveTo: boolean; + + /** + * A function to call when a particle is emitted. + */ + emitCallback: Phaser.Types.GameObjects.Particles.ParticleEmitterCallback | null; + + /** + * The calling context for {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallback}. + */ + emitCallbackScope: any | null; + + /** + * A function to call when a particle dies. + */ + deathCallback: Phaser.Types.GameObjects.Particles.ParticleDeathCallback | null; + + /** + * The calling context for {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallback}. + */ + deathCallbackScope: any | null; + + /** + * Set to hard limit the amount of particle objects this emitter is allowed to create + * in total. This is the number of `Particle` instances it can create, not the number + * of 'alive' particles. + * + * 0 means unlimited. + */ + maxParticles: number; + + /** + * The maximum number of alive and rendering particles this emitter will update. + * When this limit is reached, a particle needs to die before another can be emitted. + * + * 0 means no limits. + */ + maxAliveParticles: number; + + /** + * If set, either via the Emitter config, or by directly setting this property, + * the Particle Emitter will stop emitting particles once this total has been + * reached. It will then enter a 'stopped' state, firing the `STOP` + * event. Note that entering a stopped state doesn't mean all the particles + * have finished, just that it's not emitting any further ones. + * + * To know when the final particle expires, listen for the COMPLETE event. + * + * Use this if you wish to launch an exact number of particles and then stop + * your emitter afterwards. + * + * The counter is reset each time the `ParticleEmitter.start` method is called. + * + * 0 means the emitter will not stop based on total emitted particles. + */ + stopAfter: number; + + /** + * The number of milliseconds this emitter will emit particles for when in flow mode, + * before it stops emission. A value of 0 (the default) means there is no duration. + * + * When the duration expires the `STOP` event is emitted. Note that entering a + * stopped state doesn't mean all the particles have finished, just that it's + * not emitting any further ones. + * + * To know when the final particle expires, listen for the COMPLETE event. + * + * The counter is reset each time the `ParticleEmitter.start` method is called. + * + * 0 means the emitter will not stop based on duration. + */ + duration: number; + + /** + * For a flow emitter, the time interval (>= 0) between particle flow cycles in ms. + * A value of 0 means there is one particle flow cycle for each logic update (the maximum flow frequency). This is the default setting. + * For an exploding emitter, this value will be -1. + * Calling {@link Phaser.GameObjects.Particles.ParticleEmitter#flow} also puts the emitter in flow mode (frequency >= 0). + * Calling {@link Phaser.GameObjects.Particles.ParticleEmitter#explode} also puts the emitter in explode mode (frequency = -1). + */ + frequency: number; + + /** + * Controls if the emitter is currently emitting a particle flow (when frequency >= 0). + * + * Already alive particles will continue to update until they expire. + * + * Controlled by {@link Phaser.GameObjects.Particles.ParticleEmitter#start} and {@link Phaser.GameObjects.Particles.ParticleEmitter#stop}. + */ + emitting: boolean; + + /** + * Newly emitted particles are added to the top of the particle list, i.e. rendered above those already alive. + * + * Set to false to send them to the back. + * + * Also see the `sortOrder` property for more complex particle sorting. + */ + particleBringToTop: boolean; + + /** + * The time rate applied to active particles, affecting lifespan, movement, and tweens. Values larger than 1 are faster than normal. + */ + timeScale: number; + + /** + * An array containing Particle Emission Zones. These can be either EdgeZones or RandomZones. + * + * Particles are emitted from a randomly selected zone from this array. + * + * Prior to Phaser v3.60 an Emitter could only have one single Emission Zone. + * In 3.60 they can now have an array of Emission Zones. + */ + emitZones: Phaser.Types.GameObjects.Particles.EmitZoneObject[]; + + /** + * An array containing Particle Death Zone objects. A particle is immediately killed as soon as its x/y coordinates + * intersect with any of the configured Death Zones. + * + * Prior to Phaser v3.60 an Emitter could only have one single Death Zone. + * In 3.60 they can now have an array of Death Zones. + */ + deathZones: Phaser.GameObjects.Particles.Zones.DeathZone[]; + + /** + * An optional Rectangle object that is used during rendering to cull Particles from + * display. For example, if your particles are limited to only move within a 300x300 + * sized area from their origin, then you can set this Rectangle to those dimensions. + * + * The renderer will check to see if the `viewBounds` Rectangle intersects with the + * Camera bounds during the render step and if not it will skip rendering the Emitter + * entirely. + * + * This allows you to create many emitters in a Scene without the cost of + * rendering if the contents aren't visible. + * + * Note that the Emitter will not perform any checks to see if the Particles themselves + * are outside of these bounds, or not. It will simply check the bounds against the + * camera. Use the `getBounds` method with the `advance` parameter to help define + * the location and placement of the view bounds. + */ + viewBounds: Phaser.Geom.Rectangle | null; + + /** + * A Game Object whose position is used as the particle origin. + */ + follow: Phaser.Types.Math.Vector2Like | null; + + /** + * The offset of the particle origin from the {@link Phaser.GameObjects.Particles.ParticleEmitter#follow} target. + */ + followOffset: Phaser.Math.Vector2; + + /** + * Whether the emitter's {@link Phaser.GameObjects.Particles.ParticleEmitter#visible} state will track + * the {@link Phaser.GameObjects.Particles.ParticleEmitter#follow} target's visibility state. + */ + trackVisible: boolean; + + /** + * The texture frames assigned to particles. + */ + frames: Phaser.Textures.Frame[]; + + /** + * Whether texture {@link Phaser.GameObjects.Particles.ParticleEmitter#frames} are selected at random. + */ + randomFrame: boolean; + + /** + * The number of consecutive particles that receive a single texture frame (per frame cycle). + */ + frameQuantity: number; + + /** + * The animations assigned to particles. + */ + anims: string[]; + + /** + * Whether animations {@link Phaser.GameObjects.Particles.ParticleEmitter#anims} are selected at random. + */ + randomAnim: boolean; + + /** + * The number of consecutive particles that receive a single animation (per frame cycle). + */ + animQuantity: number; + + /** + * An internal property used to tell when the emitter is in fast-forwarc mode. + */ + skipping: boolean; + + /** + * An internal Transform Matrix used to cache this emitters world matrix. + */ + worldMatrix: Phaser.GameObjects.Components.TransformMatrix; + + /** + * Optionally sort the particles before they render based on this + * property. The property must exist on the `Particle` class, such + * as `y`, `lifeT`, `scaleX`, etc. + * + * When set this overrides the `particleBringToTop` setting. + * + * To reset this and disable sorting, so this property to an empty string. + */ + sortProperty: string; + + /** + * When `sortProperty` is defined this controls the sorting order, + * either ascending or descending. Toggle to control the visual effect. + */ + sortOrderAsc: boolean; + + /** + * The callback used to sort the particles. Only used if `sortProperty` + * has been set. Set this via the `setSortCallback` method. + */ + sortCallback: Phaser.Types.GameObjects.Particles.ParticleSortCallback | null; + + /** + * A list of Particle Processors being managed by this Emitter. + */ + processors: Phaser.Structs.List; + + /** + * The tint fill mode used by the Particles in this Emitter. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Takes an Emitter Configuration file and resets this Emitter, using any + * properties defined in the config to then set it up again. + * @param config Settings for this emitter. + */ + setConfig(config: Phaser.Types.GameObjects.Particles.ParticleEmitterConfig): this; + + /** + * Creates a description of this emitter suitable for JSON serialization. + */ + toJSON(): Phaser.Types.GameObjects.JSONGameObject; + + /** + * Resets the internal counter trackers. + * + * You shouldn't ever need to call this directly. + * @param frequency The frequency counter. + * @param on Set the complete flag. + */ + resetCounters(frequency: number, on: boolean): void; + + /** + * Continuously moves the particle origin to follow a Game Object's position. + * @param target The Object to follow. + * @param offsetX Horizontal offset of the particle origin from the Game Object. Default 0. + * @param offsetY Vertical offset of the particle origin from the Game Object. Default 0. + * @param trackVisible Whether the emitter's visible state will track the target's visible state. Default false. + */ + startFollow(target: Phaser.Types.Math.Vector2Like, offsetX?: number, offsetY?: number, trackVisible?: boolean): this; + + /** + * Stops following a Game Object. + */ + stopFollow(): this; + + /** + * Chooses a texture frame from {@link Phaser.GameObjects.Particles.ParticleEmitter#frames}. + */ + getFrame(): Phaser.Textures.Frame; + + /** + * Sets a pattern for assigning texture frames to emitted particles. The `frames` configuration can be any of: + * + * frame: 0 + * frame: 'red' + * frame: [ 0, 1, 2, 3 ] + * frame: [ 'red', 'green', 'blue', 'pink', 'white' ] + * frame: { frames: [ 'red', 'green', 'blue', 'pink', 'white' ], [cycle: bool], [quantity: int] } + * @param frames One or more texture frames, or a configuration object. + * @param pickRandom Whether frames should be assigned at random from `frames`. Default true. + * @param quantity The number of consecutive particles that will receive each frame. Default 1. + */ + setEmitterFrame(frames: any[] | string | number | Phaser.Types.GameObjects.Particles.ParticleEmitterFrameConfig, pickRandom?: boolean, quantity?: number): this; + + /** + * Chooses an animation from {@link Phaser.GameObjects.Particles.ParticleEmitter#anims}, if populated. + */ + getAnim(): string; + + /** + * Sets a pattern for assigning animations to emitted particles. The `anims` configuration can be any of: + * + * anim: 'red' + * anim: [ 'red', 'green', 'blue', 'pink', 'white' ] + * anim: { anims: [ 'red', 'green', 'blue', 'pink', 'white' ], [cycle: bool], [quantity: int] } + * @param anims One or more animations, or a configuration object. + * @param pickRandom Whether animations should be assigned at random from `anims`. If a config object is given, this parameter is ignored. Default true. + * @param quantity The number of consecutive particles that will receive each animation. If a config object is given, this parameter is ignored. Default 1. + */ + setAnim(anims: string | string[] | Phaser.Types.GameObjects.Particles.ParticleEmitterAnimConfig, pickRandom?: boolean, quantity?: number): this; + + /** + * Turns {@link Phaser.GameObjects.Particles.ParticleEmitter#radial} particle movement on or off. + * @param value Radial mode (true) or point mode (true). Default true. + */ + setRadial(value?: boolean): this; + + /** + * Creates a Particle Bounds processor and adds it to this Emitter. + * + * This processor will check to see if any of the active Particles hit + * the defined boundary, as specified by a Rectangle shape in world-space. + * + * If so, they are 'rebounded' back again by having their velocity adjusted. + * + * The strength of the rebound is controlled by the `Particle.bounce` + * property. + * + * You should be careful to ensure that you emit particles within a bounds, + * if set, otherwise it will lead to unpredictable visual results as the + * particles are hastily repositioned. + * + * The Particle Bounds processor is returned from this method. If you wish + * to modify the area you can directly change its `bounds` property, along + * with the `collideLeft` etc values. + * + * To disable the bounds you can either set its `active` property to `false`, + * or if you no longer require it, call `ParticleEmitter.removeParticleProcessor`. + * @param x The x-coordinate of the left edge of the boundary, or an object representing a rectangle. + * @param y The y-coordinate of the top edge of the boundary. + * @param width The width of the boundary. + * @param height The height of the boundary. + * @param collideLeft Whether particles interact with the left edge of the bounds. Default true. + * @param collideRight Whether particles interact with the right edge of the bounds. Default true. + * @param collideTop Whether particles interact with the top edge of the bounds. Default true. + * @param collideBottom Whether particles interact with the bottom edge of the bounds. Default true. + */ + addParticleBounds(x: number | Phaser.Types.GameObjects.Particles.ParticleEmitterBounds | Phaser.Types.GameObjects.Particles.ParticleEmitterBoundsAlt, y?: number, width?: number, height?: number, collideLeft?: boolean, collideRight?: boolean, collideTop?: boolean, collideBottom?: boolean): Phaser.GameObjects.Particles.ParticleBounds; + + /** + * Sets the initial radial speed of emitted particles. + * + * Changes the emitter to radial mode. + * @param x The horizontal speed of the emitted Particles. + * @param y The vertical speed of emitted Particles. If not set it will use the `x` value. Default x. + */ + setParticleSpeed(x: number, y?: number): this; + + /** + * Sets the vertical and horizontal scale of the emitted particles. + * + * You can also set the scale of the entire emitter via `setScale`. + * @param x The horizontal scale of the emitted Particles. Default 1. + * @param y The vertical scale of emitted Particles. If not set it will use the `x` value. Default x. + */ + setParticleScale(x?: number, y?: number): this; + + /** + * Sets the gravity applied to emitted particles. + * @param x Horizontal acceleration due to gravity, in pixels per second squared. Set to zero for no gravity. + * @param y Vertical acceleration due to gravity, in pixels per second squared. Set to zero for no gravity. + */ + setParticleGravity(x: number, y: number): this; + + /** + * Sets the opacity (alpha) of emitted particles. + * + * You can also set the alpha of the entire emitter via `setAlpha`. + * @param value A value between 0 (transparent) and 1 (opaque). + */ + setParticleAlpha(value: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType): this; + + /** + * Sets the color tint of emitted particles. + * + * This is a WebGL only feature. + * @param value A value between 0 and 0xffffff. + */ + setParticleTint(value: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType): this; + + /** + * Sets the angle of a {@link Phaser.GameObjects.Particles.ParticleEmitter#radial} particle stream. + * + * The value is given in degrees using Phaser's right-handed coordinate system. + * @param value The angle of the initial velocity of emitted particles, in degrees. + */ + setEmitterAngle(value: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType): this; + + /** + * Sets the lifespan of newly emitted particles in milliseconds. + * @param value The lifespan of a particle, in ms. + */ + setParticleLifespan(value: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType): this; + + /** + * Sets the number of particles released at each flow cycle or explosion. + * @param quantity The number of particles to release at each flow cycle or explosion. + */ + setQuantity(quantity: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType): this; + + /** + * Sets the emitter's {@link Phaser.GameObjects.Particles.ParticleEmitter#frequency} + * and {@link Phaser.GameObjects.Particles.ParticleEmitter#quantity}. + * @param frequency The time interval (>= 0) of each flow cycle, in ms; or -1 to put the emitter in explosion mode. + * @param quantity The number of particles to release at each flow cycle or explosion. + */ + setFrequency(frequency: number, quantity?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType): this; + + /** + * Adds a new Particle Death Zone to this Emitter. + * + * A particle is immediately killed as soon as its x/y coordinates intersect + * with any of the configured Death Zones. + * + * The `source` can be a Geometry Shape, such as a Circle, Rectangle or Triangle. + * Any valid object from the `Phaser.Geometry` namespace is allowed, as long as + * it supports a `contains` function. You can set the `type` to be either `onEnter` + * or `onLeave`. + * + * A single Death Zone instance can only exist once within this Emitter, but can belong + * to multiple Emitters. + * @param config A Death Zone configuration object, a Death Zone instance, a valid Geometry object or an array of them. + */ + addDeathZone(config: Phaser.Types.GameObjects.Particles.DeathZoneObject | Phaser.Types.GameObjects.Particles.DeathZoneObject[]): Phaser.GameObjects.Particles.Zones.DeathZone[]; + + /** + * Removes the given Particle Death Zone from this Emitter. + * @param zone The Death Zone that should be removed from this Emitter. + */ + removeDeathZone(zone: Phaser.GameObjects.Particles.Zones.DeathZone): this; + + /** + * Clear all Death Zones from this Particle Emitter. + */ + clearDeathZones(): this; + + /** + * Adds a new Particle Emission Zone to this Emitter. + * + * An {@link Phaser.Types.GameObjects.Particles.ParticleEmitterEdgeZoneConfig EdgeZone} places particles on its edges. + * Its {@link Phaser.Types.GameObjects.Particles.EdgeZoneSource source} can be a Curve, Path, Circle, Ellipse, Line, Polygon, Rectangle, or Triangle; + * or any object with a suitable {@link Phaser.Types.GameObjects.Particles.EdgeZoneSourceCallback getPoints} method. + * + * A {@link Phaser.Types.GameObjects.Particles.ParticleEmitterRandomZoneConfig RandomZone} places the particles randomly within its interior. + * Its {@link RandomZoneSource source} can be a Circle, Ellipse, Line, Polygon, Rectangle, or Triangle; or any object with a suitable {@link Phaser.Types.GameObjects.Particles.RandomZoneSourceCallback getRandomPoint} method. + * + * An Emission Zone can only exist once within this Emitter. + * @param zone An Emission Zone configuration object, a RandomZone or EdgeZone instance, or an array of them. + */ + addEmitZone(zone: Phaser.Types.GameObjects.Particles.EmitZoneData | Phaser.Types.GameObjects.Particles.EmitZoneData[]): Phaser.Types.GameObjects.Particles.EmitZoneObject[]; + + /** + * Removes the given Particle Emission Zone from this Emitter. + * @param zone The Emission Zone that should be removed from this Emitter. + */ + removeEmitZone(zone: Phaser.GameObjects.Particles.Zones.EdgeZone | Phaser.GameObjects.Particles.Zones.RandomZone): this; + + /** + * Clear all Emission Zones from this Particle Emitter. + */ + clearEmitZones(): this; + + /** + * Takes the given particle and sets its x/y coordinates to match the next available + * emission zone, if any have been configured. This method is called automatically + * as part of the `Particle.fire` process. + * + * The Emit Zones are iterated in sequence. Once a zone has had a particle emitted + * from it, then the next zone is used and so on, in a loop. + * @param particle The particle to set the emission zone for. + */ + getEmitZone(particle: Phaser.GameObjects.Particles.Particle): void; + + /** + * Takes the given particle and checks to see if any of the configured Death Zones + * will kill it and returns the result. This method is called automatically as part + * of the `Particle.update` process. + * @param particle The particle to test against the Death Zones. + */ + getDeathZone(particle: Phaser.GameObjects.Particles.Particle): boolean; + + /** + * Changes the currently active Emission Zone. The zones should have already + * been added to this Emitter either via the emitter config, or the + * `addEmitZone` method. + * + * Call this method by passing either a numeric zone index value, or + * the zone instance itself. + * + * Prior to v3.60 an Emitter could only have a single Emit Zone and this + * method was how you set it. From 3.60 and up it now performs a different + * function and swaps between all available active zones. + * @param zone The Emit Zone to set as the active zone. + */ + setEmitZone(zone: number | Phaser.GameObjects.Particles.Zones.EdgeZone | Phaser.GameObjects.Particles.Zones.RandomZone): this; + + /** + * Adds a Particle Processor, such as a Gravity Well, to this Emitter. + * + * It will start processing particles from the next update as long as its `active` + * property is set. + * @param processor The Particle Processor to add to this Emitter Manager. + */ + addParticleProcessor(processor: T): T; + + /** + * Removes a Particle Processor from this Emitter. + * + * The Processor must belong to this Emitter to be removed. + * + * It is not destroyed when removed, allowing you to move it to another Emitter Manager, + * so if you no longer require it you should call its `destroy` method directly. + * @param processor The Particle Processor to remove from this Emitter Manager. + */ + removeParticleProcessor(processor: T): T | null; + + /** + * Gets all active Particle Processors. + */ + getProcessors(): Phaser.GameObjects.Particles.ParticleProcessor[]; + + /** + * Creates a new Gravity Well, adds it to this Emitter and returns a reference to it. + * @param config Configuration settings for the Gravity Well to create. + */ + createGravityWell(config: Phaser.Types.GameObjects.Particles.GravityWellConfig): Phaser.GameObjects.Particles.GravityWell; + + /** + * Creates inactive particles and adds them to this emitter's pool. + * + * If `ParticleEmitter.maxParticles` is set it will limit the + * value passed to this method to make sure it's not exceeded. + * @param count The number of particles to create. + */ + reserve(count: number): this; + + /** + * Gets the number of active (in-use) particles in this emitter. + */ + getAliveParticleCount(): number; + + /** + * Gets the number of inactive (available) particles in this emitter. + */ + getDeadParticleCount(): number; + + /** + * Gets the total number of particles in this emitter. + */ + getParticleCount(): number; + + /** + * Whether this emitter is at either its hard-cap limit (maxParticles), if set, or + * the max allowed number of 'alive' particles (maxAliveParticles). + */ + atLimit(): boolean; + + /** + * Sets a function to call for each newly emitted particle. + * @param callback The function. + * @param context The calling context. + */ + onParticleEmit(callback: Phaser.Types.GameObjects.Particles.ParticleEmitterCallback, context?: any): this; + + /** + * Sets a function to call for each particle death. + * @param callback The function. + * @param context The function's calling context. + */ + onParticleDeath(callback: Phaser.Types.GameObjects.Particles.ParticleDeathCallback, context?: any): this; + + /** + * Deactivates every particle in this emitter immediately. + * + * This particles are killed but do not emit an event or callback. + */ + killAll(): this; + + /** + * Calls a function for each active particle in this emitter. The function is + * sent two parameters: a reference to the Particle instance and to this Emitter. + * @param callback The function. + * @param context The functions calling context. + */ + forEachAlive(callback: Phaser.Types.GameObjects.Particles.ParticleEmitterCallback, context: any): this; + + /** + * Calls a function for each inactive particle in this emitter. + * @param callback The function. + * @param context The functions calling context. + */ + forEachDead(callback: Phaser.Types.GameObjects.Particles.ParticleEmitterCallback, context: any): this; + + /** + * Turns {@link Phaser.GameObjects.Particles.ParticleEmitter#on} the emitter and resets the flow counter. + * + * If this emitter is in flow mode (frequency >= 0; the default), the particle flow will start (or restart). + * + * If this emitter is in explode mode (frequency = -1), nothing will happen. + * Use {@link Phaser.GameObjects.Particles.ParticleEmitter#explode} or {@link Phaser.GameObjects.Particles.ParticleEmitter#flow} instead. + * + * Calling this method will emit the `START` event. + * @param advance Advance this number of ms in time through the emitter. Default 0. + * @param duration Limit this emitter to only emit particles for the given number of ms. Setting this parameter will override any duration already set in the Emitter configuration object. Default 0. + */ + start(advance?: number, duration?: number): this; + + /** + * Turns {@link Phaser.GameObjects.Particles.ParticleEmitter#emitting off} the emitter and + * stops it from emitting further particles. Currently alive particles will remain + * active until they naturally expire unless you set the `kill` parameter to `true`. + * + * Calling this method will emit the `STOP` event. When the final particle has + * expired the `COMPLETE` event will be emitted. + * @param kill Kill all particles immediately (true), or leave them to die after their lifespan expires? (false, the default) Default false. + */ + stop(kill?: boolean): this; + + /** + * {@link Phaser.GameObjects.Particles.ParticleEmitter#active Deactivates} the emitter. + */ + pause(): this; + + /** + * {@link Phaser.GameObjects.Particles.ParticleEmitter#active Activates} the emitter. + */ + resume(): this; + + /** + * Set the property by which active particles are sorted prior to be rendered. + * + * It allows you to control the rendering order of the particles. + * + * This can be any valid property of the `Particle` class, such as `y`, `alpha` + * or `lifeT`. + * + * The 'alive' particles array is sorted in place each game frame. Setting a + * sort property will override the `particleBringToTop` setting. + * + * If you wish to use your own sorting function, see `setSortCallback` instead. + * @param property The property on the `Particle` class to sort by. + * @param ascending Should the particles be sorted in ascending or descending order? Default true. + */ + setSortProperty(property?: string, ascending?: boolean): this; + + /** + * Sets a callback to be used to sort the particles before rendering each frame. + * + * This allows you to define your own logic and behavior in the callback. + * + * The callback will be sent two parameters: the two Particles being compared, + * and must adhere to the criteria of the `compareFn` in `Array.sort`: + * + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#description + * + * Call this method with no parameters to reset the sort callback. + * + * Setting your own callback will override both the `particleBringToTop` and + * `sortProperty` settings of this Emitter. + * @param callback The callback to invoke when the particles are sorted. Leave undefined to reset to the default. + */ + setSortCallback(callback?: Phaser.Types.GameObjects.Particles.ParticleSortCallback): this; + + /** + * Sorts active particles with {@link Phaser.GameObjects.Particles.ParticleEmitter#depthSortCallback}. + */ + depthSort(): this; + + /** + * Calculates the difference of two particles, for sorting them by depth. + * @param a The first particle. + * @param b The second particle. + */ + depthSortCallback(a: object, b: object): number; + + /** + * Puts the emitter in flow mode (frequency >= 0) and starts (or restarts) a particle flow. + * + * To resume a flow at the current frequency and quantity, use {@link Phaser.GameObjects.Particles.ParticleEmitter#start} instead. + * @param frequency The time interval (>= 0) of each flow cycle, in ms. + * @param count The number of particles to emit at each flow cycle. Default 1. + * @param stopAfter Stop this emitter from firing any more particles once this value is reached. Set to zero for unlimited. Setting this parameter will override any `stopAfter` value already set in the Emitter configuration object. + */ + flow(frequency: number, count?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType, stopAfter?: number): this; + + /** + * Puts the emitter in explode mode (frequency = -1), stopping any current particle flow, and emits several particles all at once. + * @param count The number of Particles to emit. Default this.quantity. + * @param x The x coordinate to emit the Particles from. Default this.x. + * @param y The y coordinate to emit the Particles from. Default this.x. + */ + explode(count?: number, x?: number, y?: number): Phaser.GameObjects.Particles.Particle | undefined; + + /** + * Emits particles at the given position. If no position is given, it will + * emit from this Emitters current location. + * @param x The x coordinate to emit the Particles from. Default this.x. + * @param y The y coordinate to emit the Particles from. Default this.x. + * @param count The number of Particles to emit. Default this.quantity. + */ + emitParticleAt(x?: number, y?: number, count?: number): Phaser.GameObjects.Particles.Particle | undefined; + + /** + * Emits particles at a given position (or the emitters current position). + * @param count The number of Particles to emit. Default this.quantity. + * @param x The x coordinate to emit the Particles from. Default this.x. + * @param y The y coordinate to emit the Particles from. Default this.x. + */ + emitParticle(count?: number, x?: number, y?: number): Phaser.GameObjects.Particles.Particle | undefined; + + /** + * Fast forwards this Particle Emitter and all of its particles. + * + * Works by running the Emitter `preUpdate` handler in a loop until the `time` + * has been reached at `delta` steps per loop. + * + * All callbacks and emitter related events that would normally be fired + * will still be invoked. + * + * You can make an emitter 'fast forward' via the emitter config using the + * `advance` property. Set this value to the number of ms you wish the + * emitter to be fast-forwarded by. Or, call this method post-creation. + * @param time The number of ms to advance the Particle Emitter by. + * @param delta The amount of delta to use for each step. Defaults to 1000 / 60. + */ + fastForward(time: number, delta?: number): this; + + /** + * Updates this emitter and its particles. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + preUpdate(time: number, delta: number): void; + + /** + * Takes either a Rectangle Geometry object or an Arcade Physics Body and tests + * to see if it intersects with any currently alive Particle in this Emitter. + * + * Overlapping particles are returned in an array, where you can perform further + * processing on them. If nothing overlaps then the array will be empty. + * @param target A Rectangle or Arcade Physics Body to check for intersection against all alive particles. + */ + overlap(target: Phaser.Geom.Rectangle | Phaser.Physics.Arcade.Body): Phaser.GameObjects.Particles.Particle[]; + + /** + * Returns a bounds Rectangle calculated from the bounds of all currently + * _active_ Particles in this Emitter. If this Emitter has only just been + * created and not yet rendered, then calling this method will return a Rectangle + * with a max safe integer for dimensions. Use the `advance` parameter to + * avoid this. + * + * Typically it takes a few seconds for a flow Emitter to 'warm up'. You can + * use the `advance` and `delta` parameters to force the Emitter to + * 'fast forward' in time to try and allow the bounds to be more accurate, + * as it will calculate the bounds based on the particle bounds across all + * timesteps, giving a better result. + * + * You can also use the `padding` parameter to increase the size of the + * bounds. Emitters with a lot of randomness in terms of direction or lifespan + * can often return a bounds smaller than their possible maximum. By using + * the `padding` (and `advance` if needed) you can help limit this. + * @param padding The amount of padding, in pixels, to add to the bounds Rectangle. + * @param advance The number of ms to advance the Particle Emitter by. Defaults to 0, i.e. not used. + * @param delta The amount of delta to use for each step. Defaults to 1000 / 60. + * @param output The Rectangle to store the results in. If not given a new one will be created. + */ + getBounds(padding?: number, advance?: number, delta?: number, output?: Phaser.Geom.Rectangle): Phaser.Geom.Rectangle; + + /** + * Prints a warning to the console if you mistakenly call this function + * thinking it works the same way as Phaser v3.55. + */ + createEmitter(): void; + + /** + * The x coordinate the particles are emitted from. + * + * This is relative to the Emitters x coordinate and that of any parent. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleX: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + + /** + * The y coordinate the particles are emitted from. + * + * This is relative to the Emitters x coordinate and that of any parent. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleY: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + + /** + * The horizontal acceleration applied to emitted particles, in pixels per second squared. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + accelerationX: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The vertical acceleration applied to emitted particles, in pixels per second squared. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + accelerationY: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The maximum horizontal velocity emitted particles can reach, in pixels per second squared. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + maxVelocityX: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The maximum vertical velocity emitted particles can reach, in pixels per second squared. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + maxVelocityY: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The initial speed of emitted particles, in pixels per second. + * + * If using this as a getter it will return the `speedX` value. + * + * If using it as a setter it will update both `speedX` and `speedY` to the + * given value. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + speed: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The initial horizontal speed of emitted particles, in pixels per second. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + speedX: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The initial vertical speed of emitted particles, in pixels per second. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + speedY: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The x coordinate emitted particles move toward, when {@link Phaser.GameObjects.Particles.ParticleEmitter#moveTo} is true. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + moveToX: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The y coordinate emitted particles move toward, when {@link Phaser.GameObjects.Particles.ParticleEmitter#moveTo} is true. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + moveToY: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The amount of velocity particles will use when rebounding off the + * emitter bounds, if set. A value of 0 means no bounce. A value of 1 + * means a full rebound. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + bounce: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The horizontal scale of emitted particles. + * + * This is relative to the Emitters scale and that of any parent. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleScaleX: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The vertical scale of emitted particles. + * + * This is relative to the Emitters scale and that of any parent. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleScaleY: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * A color tint value that is applied to the texture of the emitted + * particle. The value should be given in hex format, i.e. 0xff0000 + * for a red tint, and should not include the alpha channel. + * + * Tints are additive, meaning a tint value of white (0xffffff) will + * effectively reset the tint to nothing. + * + * Modify the `ParticleEmitter.tintFill` property to change between + * an additive and replacement tint mode. + * + * When you define the color via the Emitter config you should give + * it as an array of color values. The Particle will then interpolate + * through these colors over the course of its lifespan. Setting this + * will override any `tint` value that may also be given. + * + * This is a WebGL only feature. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleColor: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * Controls the easing function used when you have created an + * Emitter that uses the `color` property to interpolate the + * tint of Particles over their lifetime. + * + * Setting this has no effect if you haven't also applied a + * `particleColor` to this Emitter. + */ + colorEase: string; + + /** + * A color tint value that is applied to the texture of the emitted + * particle. The value should be given in hex format, i.e. 0xff0000 + * for a red tint, and should not include the alpha channel. + * + * Tints are additive, meaning a tint value of white (0xffffff) will + * effectively reset the tint to nothing. + * + * Modify the `ParticleEmitter.tintFill` property to change between + * an additive and replacement tint mode. + * + * The `tint` value will be overriden if a `color` array is provided. + * + * This is a WebGL only feature. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleTint: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The alpha value of the emitted particles. This is a value + * between 0 and 1. Particles with alpha zero are invisible + * and are therefore not rendered, but are still processed + * by the Emitter. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleAlpha: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The lifespan of the emitted particles. This value is given + * in milliseconds and defaults to 1000ms (1 second). When a + * particle reaches this amount it is killed. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + lifespan: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The angle at which the particles are emitted. The values are + * given in degrees. This allows you to control the direction + * of the emitter. If you wish instead to change the rotation + * of the particles themselves, see the `particleRotate` property. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleAngle: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The rotation (or angle) of each particle when it is emitted. + * The value is given in degrees and uses a right-handed + * coordinate system, where 0 degrees points to the right, 90 degrees + * points down and -90 degrees points up. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + particleRotate: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The number of particles that are emitted each time an emission + * occurs, i.e. from one 'explosion' or each frame in a 'flow' cycle. + * + * The default is 1. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + quantity: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The number of milliseconds to wait after emission before + * the particles start updating. This allows you to emit particles + * that appear 'static' or still on-screen and then, after this value, + * begin to move. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + delay: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The number of milliseconds to wait after a particle has finished + * its life before it will be removed. This allows you to 'hold' a + * particle on the screen once it has reached its final state + * before it then vanishes. + * + * Note that all particle updates will cease, including changing + * alpha, scale, movement or animation. + * + * Accessing this property should typically return a number. + * However, it can be set to any valid EmitterOp onEmit type. + */ + hold: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + + /** + * The internal flow counter. + * + * Treat this property as read-only. + */ + flowCounter: number; + + /** + * The internal frame counter. + * + * Treat this property as read-only. + */ + frameCounter: number; + + /** + * The internal animation counter. + * + * Treat this property as read-only. + */ + animCounter: number; + + /** + * The internal elasped counter. + * + * Treat this property as read-only. + */ + elapsed: number; + + /** + * The internal stop counter. + * + * Treat this property as read-only. + */ + stopCounter: number; + + /** + * The internal complete flag. + * + * Treat this property as read-only. + */ + completeFlag: boolean; + + /** + * The internal zone index. + * + * Treat this property as read-only. + */ + zoneIndex: number; + + /** + * The internal zone total. + * + * Treat this property as read-only. + */ + zoneTotal: number; + + /** + * The current frame index. + * + * Treat this property as read-only. + */ + currentFrame: number; + + /** + * The current animation index. + * + * Treat this property as read-only. + */ + currentAnim: number; + + /** + * Destroys this Particle Emitter and all Particles it owns. + */ + preDestroy(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * This class provides the structured required for all Particle Processors. + * + * You should extend it and add the functionality required for your processor, + * including tidying up any resources this may create in the `destroy` method. + * + * See the GravityWell for an example of a processor. + */ + class ParticleProcessor { + /** + * + * @param x The x coordinate of the Particle Processor, in world space. Default 0. + * @param y The y coordinate of the Particle Processor, in world space. Default 0. + * @param active The active state of this Particle Processor. Default true. + */ + constructor(x?: number, y?: number, active?: boolean); + + /** + * A reference to the Particle Emitter that owns this Processor. + * This is set automatically when the Processor is added to an Emitter + * and nulled when removed or destroyed. + */ + manager: Phaser.GameObjects.Particles.ParticleEmitter; + + /** + * The x coordinate of the Particle Processor, in world space. + */ + x: number; + + /** + * The y coordinate of the Particle Processor, in world space. + */ + y: number; + + /** + * The active state of the Particle Processor. + * + * An inactive Particle Processor will be skipped for processing by + * its parent Emitter. + */ + active: boolean; + + /** + * The Particle Processor update method should be overriden by your own + * method and handle the processing of the particles, typically modifying + * their velocityX/Y values based on the criteria of this processor. + * @param particle The Particle to update. + * @param delta The delta time in ms. + * @param step The delta value divided by 1000. + * @param t The current normalized lifetime of the particle, between 0 (birth) and 1 (death). + */ + update(particle: Phaser.GameObjects.Particles.Particle, delta: number, step: number, t: number): void; + + /** + * Destroys this Particle Processor by removing all external references. + * + * This is called automatically when the owning Particle Emitter is destroyed. + */ + destroy(): void; + + } + + namespace Zones { + /** + * A Death Zone. + * + * A Death Zone is a special type of zone that will kill a Particle as soon as it either enters, or leaves, the zone. + * + * The zone consists of a `source` which could be a Geometric shape, such as a Rectangle or Ellipse, or your own + * object as long as it includes a `contains` method for which the Particles can be tested against. + */ + class DeathZone { + /** + * + * @param source An object instance that has a `contains` method that returns a boolean when given `x` and `y` arguments. + * @param killOnEnter Should the Particle be killed when it enters the zone? `true` or leaves it? `false` + */ + constructor(source: Phaser.Types.GameObjects.Particles.DeathZoneSource, killOnEnter: boolean); + + /** + * An object instance that has a `contains` method that returns a boolean when given `x` and `y` arguments. + * This could be a Geometry shape, such as `Phaser.Geom.Circle`, or your own custom object. + */ + source: Phaser.Types.GameObjects.Particles.DeathZoneSource; + + /** + * Set to `true` if the Particle should be killed if it enters this zone. + * Set to `false` to kill the Particle if it leaves this zone. + */ + killOnEnter: boolean; + + /** + * Checks if the given Particle will be killed or not by this zone. + * @param particle The particle to test against this Death Zones. + */ + willKill(particle: Phaser.GameObjects.Particles.Particle): boolean; + + } + + /** + * A zone that places particles on a shape's edges. + */ + class EdgeZone { + /** + * + * @param source An object instance with a `getPoints(quantity, stepRate)` method returning an array of points. + * @param quantity The number of particles to place on the source edge. Set to 0 to use `stepRate` instead. + * @param stepRate The distance between each particle. When set, `quantity` is implied and should be set to 0. + * @param yoyo Whether particles are placed from start to end and then end to start. Default false. + * @param seamless Whether one endpoint will be removed if it's identical to the other. Default true. + * @param total The total number of particles this zone will emit before passing over to the next emission zone in the Emitter. -1 means it will never pass over and you must use `setEmitZone` to change it. Default -1. + */ + constructor(source: Phaser.Types.GameObjects.Particles.EdgeZoneSource, quantity: number, stepRate?: number, yoyo?: boolean, seamless?: boolean, total?: number); + + /** + * An object instance with a `getPoints(quantity, stepRate)` method returning an array of points. + */ + source: Phaser.Types.GameObjects.Particles.EdgeZoneSource | Phaser.Types.GameObjects.Particles.RandomZoneSource; + + /** + * The points placed on the source edge. + */ + points: Phaser.Geom.Point[]; + + /** + * The number of particles to place on the source edge. Set to 0 to use `stepRate` instead. + */ + quantity: number; + + /** + * The distance between each particle. When set, `quantity` is implied and should be set to 0. + */ + stepRate: number; + + /** + * Whether particles are placed from start to end and then end to start. + */ + yoyo: boolean; + + /** + * The counter used for iterating the EdgeZone's points. + */ + counter: number; + + /** + * Whether one endpoint will be removed if it's identical to the other. + */ + seamless: boolean; + + /** + * The total number of particles this zone will emit before the Emitter + * transfers control over to the next zone in its emission zone list. + * + * By default this is -1, meaning it will never pass over from this + * zone to another one. You can call the `ParticleEmitter.setEmitZone` + * method to change it, or set this value to something else via the + * config, or directly at runtime. + * + * A value of 1 would mean the zones rotate in order, but it can + * be set to any integer value. + */ + total: number; + + /** + * Update the {@link Phaser.GameObjects.Particles.Zones.EdgeZone#points} from the EdgeZone's + * {@link Phaser.GameObjects.Particles.Zones.EdgeZone#source}. + * + * Also updates internal properties. + */ + updateSource(): this; + + /** + * Change the source of the EdgeZone. + * @param source An object instance with a `getPoints(quantity, stepRate)` method returning an array of points. + */ + changeSource(source: Phaser.Types.GameObjects.Particles.EdgeZoneSource): this; + + /** + * Get the next point in the Zone and set its coordinates on the given Particle. + * @param particle The Particle. + */ + getPoint(particle: Phaser.GameObjects.Particles.Particle): void; + + } + + /** + * A zone that places particles randomly within a shapes area. + */ + class RandomZone { + /** + * + * @param source An object instance with a `getRandomPoint(point)` method. + */ + constructor(source: Phaser.Types.GameObjects.Particles.RandomZoneSource); + + /** + * An object instance with a `getRandomPoint(point)` method. + */ + source: Phaser.Types.GameObjects.Particles.RandomZoneSource; + + /** + * The total number of particles this zone will emit before the Emitter + * transfers control over to the next zone in its emission zone list. + * + * By default this is -1, meaning it will never pass over from this + * zone to another one. You can call the `ParticleEmitter.setEmitZone` + * method to change it, or set this value to something else via the + * config, or directly at runtime. + * + * A value of 1 would mean the zones rotate in order, but it can + * be set to any integer value. + */ + total: number; + + /** + * Get the next point in the Zone and set its coordinates on the given Particle. + * @param particle The Particle. + */ + getPoint(particle: Phaser.GameObjects.Particles.Particle): void; + + } + + } + + } + + /** + * A PathFollower Game Object. + * + * A PathFollower is a Sprite Game Object with some extra helpers to allow it to follow a Path automatically. + * + * Anything you can do with a standard Sprite can be done with this PathFollower, such as animate it, tint it, + * scale it and so on. + * + * PathFollowers are bound to a single Path at any one time and can traverse the length of the Path, from start + * to finish, forwards or backwards, or from any given point on the Path to its end. They can optionally rotate + * to face the direction of the path, be offset from the path coordinates or rotate independently of the Path. + */ + class PathFollower extends Phaser.GameObjects.Sprite implements Phaser.GameObjects.Components.PathFollower { + /** + * + * @param scene The Scene to which this PathFollower belongs. + * @param path The Path this PathFollower is following. It can only follow one Path at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, path: Phaser.Curves.Path, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number); + + /** + * If the PathFollower is rotating to match the Path (@see Phaser.GameObjects.PathFollower#rotateToPath) + * this value is added to the rotation value. This allows you to rotate objects to a path but control + * the angle of the rotation as well. + */ + pathRotationOffset: number; + + /** + * An additional vector to add to the PathFollowers position, allowing you to offset it from the + * Path coordinates. + */ + pathOffset: Phaser.Math.Vector2; + + /** + * A Vector2 that stores the current point of the path the follower is on. + */ + pathVector: Phaser.Math.Vector2; + + /** + * The distance the follower has traveled from the previous point to the current one, at the last update. + */ + pathDelta: Phaser.Math.Vector2; + + /** + * The Tween used for following the Path. + */ + pathTween: Phaser.Tweens.Tween; + + /** + * Settings for the PathFollower. + */ + pathConfig: Phaser.Types.GameObjects.PathFollower.PathConfig | null; + + /** + * Internal update handler that advances this PathFollower along the path. + * + * Called automatically by the Scene step, should not typically be called directly. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected preUpdate(time: number, delta: number): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * The Path this PathFollower is following. It can only follow one Path at a time. + */ + path: Phaser.Curves.Path; + + /** + * Should the PathFollower automatically rotate to point in the direction of the Path? + */ + rotateToPath: boolean; + + /** + * Set the Path that this PathFollower should follow. + * + * Optionally accepts {@link Phaser.Types.GameObjects.PathFollower.PathConfig} settings. + * @param path The Path this PathFollower is following. It can only follow one Path at a time. + * @param config Settings for the PathFollower. + */ + setPath(path: Phaser.Curves.Path, config?: number | Phaser.Types.GameObjects.PathFollower.PathConfig | Phaser.Types.Tweens.NumberTweenBuilderConfig): this; + + /** + * Set whether the PathFollower should automatically rotate to point in the direction of the Path. + * @param value Whether the PathFollower should automatically rotate to point in the direction of the Path. + * @param offset Rotation offset in degrees. Default 0. + */ + setRotateToPath(value: boolean, offset?: number): this; + + /** + * Is this PathFollower actively following a Path or not? + * + * To be considered as `isFollowing` it must be currently moving on a Path, and not paused. + */ + isFollowing(): boolean; + + /** + * Starts this PathFollower following its given Path. + * @param config The duration of the follow, or a PathFollower config object. Default {}. + * @param startAt Optional start position of the follow, between 0 and 1. Default 0. + */ + startFollow(config?: number | Phaser.Types.GameObjects.PathFollower.PathConfig | Phaser.Types.Tweens.NumberTweenBuilderConfig, startAt?: number): this; + + /** + * Pauses this PathFollower. It will still continue to render, but it will remain motionless at the + * point on the Path at which you paused it. + */ + pauseFollow(): this; + + /** + * Resumes a previously paused PathFollower. + * + * If the PathFollower was not paused this has no effect. + */ + resumeFollow(): this; + + /** + * Stops this PathFollower from following the path any longer. + * + * This will invoke any 'stop' conditions that may exist on the Path, or for the follower. + */ + stopFollow(): this; + + /** + * Internal update handler that advances this PathFollower along the path. + * + * Called automatically by the Scene step, should not typically be called directly. + */ + pathUpdate(): void; + + } + + /** + * A Plane Game Object. + * + * The Plane Game Object is a helper class that takes the Mesh Game Object and extends it, + * allowing for fast and easy creation of Planes. A Plane is a one-sided grid of cells, + * where you specify the number of cells in each dimension. The Plane can have a texture + * that is either repeated (tiled) across each cell, or applied to the full Plane. + * + * The Plane can then be manipulated in 3D space, with rotation across all 3 axis. + * + * This allows you to create effects not possible with regular Sprites, such as perspective + * distortion. You can also adjust the vertices on a per-vertex basis. Plane data becomes + * part of the WebGL batch, just like standard Sprites, so doesn't introduce any additional + * shader overhead. Because the Plane just generates vertices into the WebGL batch, like any + * other Sprite, you can use all of the common Game Object components on a Plane too, + * such as a custom pipeline, mask, blend mode or texture. + * + * You can use the `uvScroll` and `uvScale` methods to adjust the placement and scaling + * of the texture if this Plane is using a single texture, and not a frame from a texture + * atlas or sprite sheet. + * + * The Plane Game Object also has the Animation component, allowing you to play animations + * across the Plane just as you would with a Sprite. The animation frame size must be fixed + * as the first frame will be the size of the entire animation, for example use a `SpriteSheet`. + * + * Note that the Plane object is WebGL only and does not have a Canvas counterpart. + * + * The Plane origin is always 0.5 x 0.5 and cannot be changed. + */ + class Plane extends Phaser.GameObjects.Mesh { + /** + * + * @param scene The Scene to which this Plane belongs. A Plane can only belong to one Scene at a time. + * @param x The horizontal position of this Plane in the world. + * @param y The vertical position of this Plane in the world. + * @param texture The key, or instance of the Texture this Plane will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Plane is rendering with. + * @param width The width of this Plane, in cells, not pixels. Default 8. + * @param height The height of this Plane, in cells, not pixels. Default 8. + * @param tile Is the texture tiled? I.e. repeated across each cell. Default false. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number, width?: number, height?: number, tile?: boolean); + + /** + * The Animation State component of this Sprite. + * + * This component provides features to apply animations to this Sprite. + * It is responsible for playing, loading, queuing animations for later playback, + * mixing between animations and setting the current animation frame to this Sprite. + */ + anims: Phaser.Animations.AnimationState; + + /** + * The width of this Plane in cells, not pixels. + * + * This value is read-only. To adjust it, see the `setGridSize` method. + */ + readonly gridWidth: number; + + /** + * The height of this Plane in cells, not pixels. + * + * This value is read-only. To adjust it, see the `setGridSize` method. + */ + readonly gridHeight: number; + + /** + * Is the texture of this Plane tiled across all cells, or not? + * + * This value is read-only. To adjust it, see the `setGridSize` method. + */ + readonly isTiled: boolean; + + /** + * Do not change this value. It has no effect other than to break things. + */ + readonly originX: number; + + /** + * Do not change this value. It has no effect other than to break things. + */ + readonly originY: number; + + /** + * Modifies the layout of this Plane by adjusting the grid dimensions to the + * given width and height. The values are given in cells, not pixels. + * + * The `tile` parameter allows you to control if the texture is tiled, or + * applied across the entire Plane? A tiled texture will repeat with one + * iteration per cell. A non-tiled texture will be applied across the whole + * Plane. + * + * Note that if this Plane is using a single texture, not from a texture atlas + * or sprite sheet, then you can use the `Plane.uvScale` method to have much + * more fine-grained control over the texture tiling. + * @param width The width of this Plane, in cells, not pixels. Default 8. + * @param height The height of this Plane, in cells, not pixels. Default 8. + * @param tile Is the texture tiled? I.e. repeated across each cell. Default false. + */ + preDestroy(width?: number, height?: number, tile?: boolean): void; + + /** + * Sets the height of this Plane to match the given value, in pixels. + * + * This adjusts the `Plane.viewPosition.z` value to achieve this. + * + * If no `value` parameter is given, it will set the view height to match + * that of the current texture frame the Plane is using. + * @param value The height, in pixels, to set this Plane view height to. + */ + setViewHeight(value?: number): void; + + /** + * Creates a checkerboard style texture, based on the given colors and alpha + * values and applies it to this Plane, replacing any current texture it may + * have. + * + * The colors are used in an alternating pattern, like a chess board. + * + * Calling this method generates a brand new 16x16 pixel WebGLTexture internally + * and applies it to this Plane. While quite fast to do, you should still be + * mindful of calling this method either extensively, or in tight parts of + * your game. + * @param color1 The odd cell color, specified as a hex value. Default 0xffffff. + * @param color2 The even cell color, specified as a hex value. Default 0x0000ff. + * @param alpha1 The odd cell alpha value, specified as a number between 0 and 255. Default 255. + * @param alpha2 The even cell alpha value, specified as a number between 0 and 255. Default 255. + * @param height The view height of the Plane after creation, in pixels. Default 128. + */ + createCheckerboard(color1?: number, color2?: number, alpha1?: number, alpha2?: number, height?: number): void; + + /** + * If this Plane has a Checkerboard Texture, this method will destroy it + * and reset the internal flag for it. + */ + removeCheckerboard(): void; + + /** + * Start playing the given animation on this Plane. + * + * Animations in Phaser can either belong to the global Animation Manager, or specifically to this Plane. + * + * The benefit of a global animation is that multiple Game Objects can all play the same animation, without + * having to duplicate the data. You can just create it once and then play it on any animating Game Object. + * + * The following code shows how to create a global repeating animation. The animation will be created + * from all of the frames within the sprite sheet that was loaded with the key 'muybridge': + * + * ```javascript + * var config = { + * key: 'run', + * frames: 'muybridge', + * frameRate: 15, + * repeat: -1 + * }; + * + * // This code should be run from within a Scene: + * this.anims.create(config); + * ``` + * + * However, if you wish to create an animation that is unique to this Plane, and this Plane alone, + * you can call the `Animation.create` method instead. It accepts the exact same parameters as when + * creating a global animation, however the resulting data is kept locally in this Plane. + * + * With the animation created, either globally or locally, you can now play it on this Plane: + * + * ```javascript + * const plane = this.add.plane(...); + * plane.play('run'); + * ``` + * + * Alternatively, if you wish to run it at a different frame rate for example, you can pass a config + * object instead: + * + * ```javascript + * const plane = this.add.plane(...); + * plane.play({ key: 'run', frameRate: 24 }); + * ``` + * + * When playing an animation on a Plane it will first check to see if it can find a matching key + * locally within the Plane. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * If you need a Plane to be able to play both local and global animations, make sure they don't + * have conflicting keys. + * + * See the documentation for the `PlayAnimationConfig` config object for more details about this. + * + * Also, see the documentation in the Animation Manager for further details on creating animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If an animation is already playing then ignore this call. Default false. + */ + play(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): this; + + /** + * Start playing the given animation on this Plane, in reverse. + * + * Animations in Phaser can either belong to the global Animation Manager, or specifically to a Game Object. + * + * The benefit of a global animation is that multiple Game Objects can all play the same animation, without + * having to duplicate the data. You can just create it once and then play it on any animating Game Object. + * + * The following code shows how to create a global repeating animation. The animation will be created + * from all of the frames within the sprite sheet that was loaded with the key 'muybridge': + * + * ```javascript + * var config = { + * key: 'run', + * frames: 'muybridge', + * frameRate: 15, + * repeat: -1 + * }; + * + * // This code should be run from within a Scene: + * this.anims.create(config); + * ``` + * + * However, if you wish to create an animation that is unique to this Game Object, and this Game Object alone, + * you can call the `Animation.create` method instead. It accepts the exact same parameters as when + * creating a global animation, however the resulting data is kept locally in this Game Object. + * + * With the animation created, either globally or locally, you can now play it on this Game Object: + * + * ```javascript + * const plane = this.add.plane(...); + * plane.playReverse('run'); + * ``` + * + * Alternatively, if you wish to run it at a different frame rate, for example, you can pass a config + * object instead: + * + * ```javascript + * const plane = this.add.plane(...); + * plane.playReverse({ key: 'run', frameRate: 24 }); + * ``` + * + * When playing an animation on a Game Object it will first check to see if it can find a matching key + * locally within the Game Object. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * If you need a Game Object to be able to play both local and global animations, make sure they don't + * have conflicting keys. + * + * See the documentation for the `PlayAnimationConfig` config object for more details about this. + * + * Also, see the documentation in the Animation Manager for further details on creating animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If an animation is already playing then ignore this call. Default false. + */ + playReverse(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): this; + + /** + * Waits for the specified delay, in milliseconds, then starts playback of the given animation. + * + * If the animation _also_ has a delay value set in its config, it will be **added** to the delay given here. + * + * If an animation is already running and a new animation is given to this method, it will wait for + * the given delay before starting the new animation. + * + * If no animation is currently running, the given one begins after the delay. + * + * When playing an animation on a Game Object it will first check to see if it can find a matching key + * locally within the Game Object. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param delay The delay, in milliseconds, to wait before starting the animation playing. + */ + playAfterDelay(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, delay: number): this; + + /** + * Waits for the current animation to complete the `repeatCount` number of repeat cycles, then starts playback + * of the given animation. + * + * You can use this to ensure there are no harsh jumps between two sets of animations, i.e. going from an + * idle animation to a walking animation, by making them blend smoothly into each other. + * + * If no animation is currently running, the given one will start immediately. + * + * When playing an animation on a Game Object it will first check to see if it can find a matching key + * locally within the Game Object. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param repeatCount How many times should the animation repeat before the next one starts? Default 1. + */ + playAfterRepeat(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, repeatCount?: number): this; + + /** + * Immediately stops the current animation from playing and dispatches the `ANIMATION_STOP` events. + * + * If no animation is playing, no event will be dispatched. + * + * If there is another animation queued (via the `chain` method) then it will start playing immediately. + */ + stop(): this; + + /** + * Stops the current animation from playing after the specified time delay, given in milliseconds. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param delay The number of milliseconds to wait before stopping this animation. + */ + stopAfterDelay(delay: number): this; + + /** + * Stops the current animation from playing after the given number of repeats. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param repeatCount How many times should the animation repeat before stopping? Default 1. + */ + stopAfterRepeat(repeatCount?: number): this; + + /** + * Stops the current animation from playing when it next sets the given frame. + * If this frame doesn't exist within the animation it will not stop it from playing. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param frame The frame to check before stopping this animation. + */ + stopOnFrame(frame: Phaser.Animations.AnimationFrame): this; + + /** + * Runs the preUpdate for this Plane, which will check its Animation State, + * if one is playing, and refresh view / model matrices, if updated. + * @param time The current timestamp. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected preUpdate(time: number, delta: number): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * An internal method that resets the perspective projection for this Plane + * when it changes texture or frame, and also resets the cell UV coordinates, + * if required. + * @param resetUV Reset all of the cell UV coordinates? Default true. + */ + setSizeToFrame(resetUV?: boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Point Light Game Object provides a way to add a point light effect into your game, + * without the expensive shader processing requirements of the traditional Light Game Object. + * + * The difference is that the Point Light renders using a custom shader, designed to give the + * impression of a point light source, of variable radius, intensity and color, in your game. + * However, unlike the Light Game Object, it does not impact any other Game Objects, or use their + * normal maps for calcuations. This makes them extremely fast to render compared to Lights + * and perfect for special effects, such as flickering torches or muzzle flashes. + * + * For maximum performance you should batch Point Light Game Objects together. This means + * ensuring they follow each other consecutively on the display list. Ideally, use a Layer + * Game Object and then add just Point Lights to it, so that it can batch together the rendering + * of the lights. You don't _have_ to do this, and if you've only a handful of Point Lights in + * your game then it's perfectly safe to mix them into the dislay list as normal. However, if + * you're using a large number of them, please consider how they are mixed into the display list. + * + * The renderer will automatically cull Point Lights. Those with a radius that does not intersect + * with the Camera will be skipped in the rendering list. This happens automatically and the + * culled state is refreshed every frame, for every camera. + * + * The origin of a Point Light is always 0.5 and it cannot be changed. + * + * Point Lights are a WebGL only feature and do not have a Canvas counterpart. + */ + class PointLight extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Point Light belongs. A Point Light can only belong to one Scene at a time. + * @param x The horizontal position of this Point Light in the world. + * @param y The vertical position of this Point Light in the world. + * @param color The color of the Point Light, given as a hex value. Default 0xffffff. + * @param radius The radius of the Point Light. Default 128. + * @param intensity The intensity, or color blend, of the Point Light. Default 1. + * @param attenuation The attenuation of the Point Light. This is the reduction of light from the center point. Default 0.1. + */ + constructor(scene: Phaser.Scene, x: number, y: number, color?: number, radius?: number, intensity?: number, attenuation?: number); + + /** + * The color of this Point Light. This property is an instance of a + * Color object, so you can use the methods within it, such as `setTo(r, g, b)` + * to change the color value. + */ + color: Phaser.Display.Color; + + /** + * The intensity of the Point Light. + * + * The colors of the light are multiplied by this value during rendering. + */ + intensity: number; + + /** + * The attenuation of the Point Light. + * + * This value controls the force with which the light falls-off from the center of the light. + * + * Use small float-based values, i.e. 0.1. + */ + attenuation: number; + + /** + * The radius of the Point Light. + */ + radius: number; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Render Texture is a combination of Dynamic Texture and an Image Game Object, that uses the + * Dynamic Texture to display itself with. + * + * A Dynamic Texture is a special texture that allows you to draw textures, frames and most kind of + * Game Objects directly to it. + * + * You can take many complex objects and draw them to this one texture, which can then be used as the + * base texture for other Game Objects, such as Sprites. Should you then update this texture, all + * Game Objects using it will instantly be updated as well, reflecting the changes immediately. + * + * It's a powerful way to generate dynamic textures at run-time that are WebGL friendly and don't invoke + * expensive GPU uploads on each change. + * + * In versions of Phaser before 3.60 a Render Texture was the only way you could create a texture + * like this, that had the ability to be drawn on. But in 3.60 we split the core functions out to + * the Dynamic Texture class as it made a lot more sense for them to reside in there. As a result, + * the Render Texture is now a light-weight shim that sits on-top of an Image Game Object and offers + * proxy methods to the features available from a Dynamic Texture. + * + * **When should you use a Render Texture vs. a Dynamic Texture?** + * + * You should use a Dynamic Texture if the texture is going to be used by multiple Game Objects, + * or you want to use it across multiple Scenes, because textures are globally stored. + * + * You should use a Dynamic Texture if the texture isn't going to be displayed in-game, but is + * instead going to be used for something like a mask or shader. + * + * You should use a Render Texture if you need to display the texture in-game on a single Game Object, + * as it provides the convenience of wrapping an Image and Dynamic Texture together for you. + * + * Under WebGL1, a FrameBuffer, which is what this Dynamic Texture uses internally, cannot be anti-aliased. + * This means that when drawing objects such as Shapes or Graphics instances to this texture, they may appear + * to be drawn with no aliasing around the edges. This is a technical limitation of WebGL1. To get around it, + * create your shape as a texture in an art package, then draw that to this texture. + */ + class RenderTexture extends Phaser.GameObjects.Image { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the Render Texture. Default 32. + * @param height The height of the Render Texture. Default 32. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, width?: number, height?: number); + + /** + * An internal Camera that can be used to move around this Render Texture. + * + * Control it just like you would any Scene Camera. The difference is that it only impacts + * the placement of Game Objects that you then draw to this texture. + * + * You can scroll, zoom and rotate this Camera. + * + * This property is a reference to `RenderTexture.texture.camera`. + */ + camera: Phaser.Cameras.Scene2D.BaseCamera; + + /** + * Sets the internal size of this Render Texture, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Resizes the Render Texture to the new dimensions given. + * + * In WebGL it will destroy and then re-create the frame buffer being used by the Render Texture. + * In Canvas it will resize the underlying canvas element. + * + * Both approaches will erase everything currently drawn to the Render Texture. + * + * If the dimensions given are the same as those already being used, calling this method will do nothing. + * @param width The new width of the Render Texture. + * @param height The new height of the Render Texture. If not specified, will be set the same as the `width`. Default width. + */ + resize(width: number, height?: number): this; + + /** + * Stores a copy of this Render Texture in the Texture Manager using the given key. + * + * After doing this, any texture based Game Object, such as a Sprite, can use the contents of this + * Render Texture by using the texture key: + * + * ```javascript + * var rt = this.add.renderTexture(0, 0, 128, 128); + * + * // Draw something to the Render Texture + * + * rt.saveTexture('doodle'); + * + * this.add.image(400, 300, 'doodle'); + * ``` + * + * Updating the contents of this Render Texture will automatically update _any_ Game Object + * that is using it as a texture. Calling `saveTexture` again will not save another copy + * of the same texture, it will just rename the key of the existing copy. + * + * By default it will create a single base texture. You can add frames to the texture + * by using the `Texture.add` method. After doing this, you can then allow Game Objects + * to use a specific frame from a Render Texture. + * + * If you destroy this Render Texture, any Game Object using it via the Texture Manager will + * stop rendering. Ensure you remove the texture from the Texture Manager and any Game Objects + * using it first, before destroying this Render Texture. + * @param key The unique key to store the texture as within the global Texture Manager. + */ + saveTexture(key: string): Phaser.Textures.DynamicTexture; + + /** + * Fills this Render Texture with the given color. + * + * By default it will fill the entire texture, however you can set it to fill a specific + * rectangular area by using the x, y, width and height arguments. + * + * The color should be given in hex format, i.e. 0xff0000 for red, 0x00ff00 for green, etc. + * @param rgb The color to fill this Render Texture with, such as 0xff0000 for red. + * @param alpha The alpha value used by the fill. Default 1. + * @param x The left coordinate of the fill rectangle. Default 0. + * @param y The top coordinate of the fill rectangle. Default 0. + * @param width The width of the fill rectangle. Default this.width. + * @param height The height of the fill rectangle. Default this.height. + */ + fill(rgb: number, alpha?: number, x?: number, y?: number, width?: number, height?: number): this; + + /** + * Fully clears this Render Texture, erasing everything from it and resetting it back to + * a blank, transparent, texture. + */ + clear(): this; + + /** + * Takes the given texture key and frame and then stamps it at the given + * x and y coordinates. You can use the optional 'config' argument to provide + * lots more options about how the stamp is applied, including the alpha, + * tint, angle, scale and origin. + * + * By default, the frame will stamp on the x/y coordinates based on its center. + * + * If you wish to stamp from the top-left, set the config `originX` and + * `originY` properties both to zero. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. Set to `null` to skip this argument if not required. + * @param x The x position to draw the frame at. Default 0. + * @param y The y position to draw the frame at. Default 0. + * @param config The stamp configuration object, allowing you to set the alpha, tint, angle, scale and origin of the stamp. + */ + stamp(key: string, frame?: string | number, x?: number, y?: number, config?: Phaser.Types.Textures.StampConfig): this; + + /** + * Draws the given object, or an array of objects, to this Render Texture using a blend mode of ERASE. + * This has the effect of erasing any filled pixels present in the objects from this texture. + * + * It can accept any of the following: + * + * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite. + * * Tilemap Layers. + * * A Group. The contents of which will be iterated and drawn in turn. + * * A Container. The contents of which will be iterated fully, and drawn in turn. + * * A Scene Display List. Pass in `Scene.children` to draw the whole list. + * * Another Dynamic Texture, or a Render Texture. + * * A Texture Frame instance. + * * A string. This is used to look-up the texture from the Texture Manager. + * + * Note: You cannot erase a Render Texture from itself. + * + * If passing in a Group or Container it will only draw children that return `true` + * when their `willRender()` method is called. I.e. a Container with 10 children, + * 5 of which have `visible=false` will only draw the 5 visible ones. + * + * If passing in an array of Game Objects it will draw them all, regardless if + * they pass a `willRender` check or not. + * + * You can pass in a string in which case it will look for a texture in the Texture + * Manager matching that string, and draw the base frame. + * + * You can pass in the `x` and `y` coordinates to draw the objects at. The use of + * the coordinates differ based on what objects are being drawn. If the object is + * a Group, Container or Display List, the coordinates are _added_ to the positions + * of the children. For all other types of object, the coordinates are exact. + * + * Calling this method causes the WebGL batch to flush, so it can write the texture + * data to the framebuffer being used internally. The batch is flushed at the end, + * after the entries have been iterated. So if you've a bunch of objects to draw, + * try and pass them in an array in one single call, rather than making lots of + * separate calls. + * @param entries Any renderable Game Object, or Group, Container, Display List, Render Texture, Texture Frame, or an array of any of these. + * @param x The x position to draw the Frame at, or the offset applied to the object. Default 0. + * @param y The y position to draw the Frame at, or the offset applied to the object. Default 0. + */ + erase(entries: any, x?: number, y?: number): this; + + /** + * Draws the given object, or an array of objects, to this Render Texture. + * + * It can accept any of the following: + * + * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite. + * * Tilemap Layers. + * * A Group. The contents of which will be iterated and drawn in turn. + * * A Container. The contents of which will be iterated fully, and drawn in turn. + * * A Scene Display List. Pass in `Scene.children` to draw the whole list. + * * Another Dynamic Texture, or a Render Texture. + * * A Texture Frame instance. + * * A string. This is used to look-up the texture from the Texture Manager. + * + * Note 1: You cannot draw a Render Texture to itself. + * + * Note 2: For Game Objects that have Post FX Pipelines, the pipeline _cannot_ be + * used when drawn to this texture. + * + * If passing in a Group or Container it will only draw children that return `true` + * when their `willRender()` method is called. I.e. a Container with 10 children, + * 5 of which have `visible=false` will only draw the 5 visible ones. + * + * If passing in an array of Game Objects it will draw them all, regardless if + * they pass a `willRender` check or not. + * + * You can pass in a string in which case it will look for a texture in the Texture + * Manager matching that string, and draw the base frame. If you need to specify + * exactly which frame to draw then use the method `drawFrame` instead. + * + * You can pass in the `x` and `y` coordinates to draw the objects at. The use of + * the coordinates differ based on what objects are being drawn. If the object is + * a Group, Container or Display List, the coordinates are _added_ to the positions + * of the children. For all other types of object, the coordinates are exact. + * + * The `alpha` and `tint` values are only used by Texture Frames. + * Game Objects use their own alpha and tint values when being drawn. + * + * Calling this method causes the WebGL batch to flush, so it can write the texture + * data to the framebuffer being used internally. The batch is flushed at the end, + * after the entries have been iterated. So if you've a bunch of objects to draw, + * try and pass them in an array in one single call, rather than making lots of + * separate calls. + * @param entries Any renderable Game Object, or Group, Container, Display List, other Render Texture, Texture Frame or an array of any of these. + * @param x The x position to draw the Frame at, or the offset applied to the object. Default 0. + * @param y The y position to draw the Frame at, or the offset applied to the object. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Game Objects use their own alpha. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. Game Objects use their own tint. WebGL only. Default 0xffffff. + */ + draw(entries: any, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Draws the Texture Frame to the Render Texture at the given position. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * ```javascript + * var rt = this.add.renderTexture(0, 0, 800, 600); + * rt.drawFrame(key, frame); + * ``` + * + * You can optionally provide a position, alpha and tint value to apply to the frame + * before it is drawn. + * + * Calling this method will cause a batch flush, so if you've got a stack of things to draw + * in a tight loop, try using the `draw` method instead. + * + * If you need to draw a Sprite to this Render Texture, use the `draw` method instead. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. Set to `null` to skip this argument if not required. + * @param x The x position to draw the frame at. Default 0. + * @param y The y position to draw the frame at. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. WebGL only. Default 0xffffff. + */ + drawFrame(key: string, frame?: string | number, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Takes the given Texture Frame and draws it to this Render Texture as a fill pattern, + * i.e. in a grid-layout based on the frame dimensions. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * You can optionally provide a position, width, height, alpha and tint value to apply to + * the frames before they are drawn. The position controls the top-left where the repeating + * fill will start from. The width and height control the size of the filled area. + * + * The position can be negative if required, but the dimensions cannot. + * + * Calling this method will cause a batch flush by default. Use the `skipBatch` argument + * to disable this if this call is part of a larger batch draw. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. Set to `null` to skip this argument if not required. + * @param x The x position to start drawing the frames from (can be negative to offset). Default 0. + * @param y The y position to start drawing the frames from (can be negative to offset). Default 0. + * @param width The width of the area to repeat the frame within. Defaults to the width of this Dynamic Texture. Default this.width. + * @param height The height of the area to repeat the frame within. Defaults to the height of this Dynamic Texture. Default this.height. + * @param alpha The alpha to use. Defaults to 1, no alpha. Default 1. + * @param tint WebGL only. The tint color to use. Leave as undefined, or 0xffffff to have no tint. Default 0xffffff. + * @param skipBatch Skip beginning and ending a batch with this call. Use if this is part of a bigger batched draw. Default false. + */ + repeat(key: string, frame?: string | number, x?: number, y?: number, width?: number, height?: number, alpha?: number, tint?: number, skipBatch?: boolean): this; + + /** + * Use this method if you need to batch draw a large number of Game Objects to + * this Render Texture in a single pass, or on a frequent basis. This is especially + * useful under WebGL, however, if your game is using Canvas only, it will not make + * any speed difference in that situation. + * + * This method starts the beginning of a batched draw, unless one is already open. + * + * Batched drawing is faster than calling `draw` in loop, but you must be careful + * to manage the flow of code and remember to call `endDraw()` when you're finished. + * + * If you don't need to draw large numbers of objects it's much safer and easier + * to use the `draw` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * RenderTexture.beginDraw(); + * + * // repeat n times: + * RenderTexture.batchDraw(); + * // or + * RenderTexture.batchDrawFrame(); + * + * // Call once: + * RenderTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Render Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `RenderTexture.texture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + */ + beginDraw(): this; + + /** + * Use this method if you have already called `beginDraw` and need to batch + * draw a large number of objects to this Render Texture. + * + * This method batches the drawing of the given objects to this texture, + * without causing a WebGL bind or batch flush for each one. + * + * It is faster than calling `draw`, but you must be careful to manage the + * flow of code and remember to call `endDraw()`. If you don't need to draw large + * numbers of objects it's much safer and easier to use the `draw` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * RenderTexture.beginDraw(); + * + * // repeat n times: + * RenderTexture.batchDraw(); + * // or + * RenderTexture.batchDrawFrame(); + * + * // Call once: + * RenderTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Render Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `RenderTexture.texture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + * + * This method can accept any of the following: + * + * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite. + * * Tilemap Layers. + * * A Group. The contents of which will be iterated and drawn in turn. + * * A Container. The contents of which will be iterated fully, and drawn in turn. + * * A Scene's Display List. Pass in `Scene.children` to draw the whole list. + * * Another Dynamic Texture or Render Texture. + * * A Texture Frame instance. + * * A string. This is used to look-up a texture from the Texture Manager. + * + * Note: You cannot draw a Render Texture to itself. + * + * If passing in a Group or Container it will only draw children that return `true` + * when their `willRender()` method is called. I.e. a Container with 10 children, + * 5 of which have `visible=false` will only draw the 5 visible ones. + * + * If passing in an array of Game Objects it will draw them all, regardless if + * they pass a `willRender` check or not. + * + * You can pass in a string in which case it will look for a texture in the Texture + * Manager matching that string, and draw the base frame. If you need to specify + * exactly which frame to draw then use the method `drawFrame` instead. + * + * You can pass in the `x` and `y` coordinates to draw the objects at. The use of + * the coordinates differ based on what objects are being drawn. If the object is + * a Group, Container or Display List, the coordinates are _added_ to the positions + * of the children. For all other types of object, the coordinates are exact. + * + * The `alpha` and `tint` values are only used by Texture Frames. + * Game Objects use their own alpha and tint values when being drawn. + * @param entries Any renderable Game Object, or Group, Container, Display List, other Dynamic or Texture, Texture Frame or an array of any of these. + * @param x The x position to draw the Frame at, or the offset applied to the object. Default 0. + * @param y The y position to draw the Frame at, or the offset applied to the object. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Game Objects use their own alpha. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. Game Objects use their own tint. WebGL only. Default 0xffffff. + */ + batchDraw(entries: any, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Use this method if you have already called `beginDraw` and need to batch + * draw a large number of texture frames to this Render Texture. + * + * This method batches the drawing of the given frames to this Render Texture, + * without causing a WebGL bind or batch flush for each one. + * + * It is faster than calling `drawFrame`, but you must be careful to manage the + * flow of code and remember to call `endDraw()`. If you don't need to draw large + * numbers of frames it's much safer and easier to use the `drawFrame` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * RenderTexture.beginDraw(); + * + * // repeat n times: + * RenderTexture.batchDraw(); + * // or + * RenderTexture.batchDrawFrame(); + * + * // Call once: + * RenderTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Render Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `RenderTexture.texture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * You can optionally provide a position, alpha and tint value to apply to the frame + * before it is drawn. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + * @param x The x position to draw the frame at. Default 0. + * @param y The y position to draw the frame at. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Game Objects use their own alpha. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. Game Objects use their own tint. WebGL only. Default 0xffffff. + */ + batchDrawFrame(key: string, frame?: string | number, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Use this method to finish batch drawing to this Render Texture. + * + * Doing so will stop the WebGL Renderer from capturing draws and then blit the + * framebuffer to the Render Target owned by this texture. + * + * Calling this method without first calling `beginDraw` will have no effect. + * + * Batch drawing is faster than calling `draw`, but you must be careful to manage the + * flow of code and remember to call `endDraw()` when you're finished. + * + * If you don't need to draw large numbers of objects it's much safer and easier + * to use the `draw` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * RenderTexture.beginDraw(); + * + * // repeat n times: + * RenderTexture.batchDraw(); + * // or + * RenderTexture.batchDrawFrame(); + * + * // Call once: + * RenderTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Render Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `RenderTexture.texture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + * @param erase Draws all objects in this batch using a blend mode of ERASE. This has the effect of erasing any filled pixels in the objects being drawn. Default false. + */ + endDraw(erase?: boolean): this; + + /** + * Takes a snapshot of the given area of this Render Texture. + * + * The snapshot is taken immediately, but the results are returned via the given callback. + * + * To capture the whole Render Texture see the `snapshot` method. + * To capture just a specific pixel, see the `snapshotPixel` method. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer + * into an ArrayBufferView. It then parses this, copying the contents to a temporary Canvas and finally + * creating an Image object from it, which is the image returned to the callback provided. + * + * All in all, this is a computationally expensive and blocking process, which gets more expensive + * the larger the resolution this Render Texture has, so please be careful how you employ this in your game. + * @param x The x coordinate to grab from. + * @param y The y coordinate to grab from. + * @param width The width of the area to grab. + * @param height The height of the area to grab. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshotArea(x: number, y: number, width: number, height: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Takes a snapshot of the whole of this Render Texture. + * + * The snapshot is taken immediately, but the results are returned via the given callback. + * + * To capture a portion of this Render Texture see the `snapshotArea` method. + * To capture just a specific pixel, see the `snapshotPixel` method. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer + * into an ArrayBufferView. It then parses this, copying the contents to a temporary Canvas and finally + * creating an Image object from it, which is the image returned to the callback provided. + * + * All in all, this is a computationally expensive and blocking process, which gets more expensive + * the larger the resolution this Render Texture has, so please be careful how you employ this in your game. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshot(callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Takes a snapshot of the given pixel from this Render Texture. + * + * The snapshot is taken immediately, but the results are returned via the given callback. + * + * To capture the whole Render Texture see the `snapshot` method. + * To capture a portion of this Render Texture see the `snapshotArea` method. + * + * Unlike the two other snapshot methods, this one will send your callback a `Color` object + * containing the color data for the requested pixel. It doesn't need to create an internal + * Canvas or Image object, so is a lot faster to execute, using less memory than the other snapshot methods. + * @param x The x coordinate of the pixel to get. + * @param y The y coordinate of the pixel to get. + * @param callback The Function to invoke after the snapshot pixel data is extracted. + */ + snapshotPixel(x: number, y: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback): this; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Rope Game Object. + * + * The Rope object is WebGL only and does not have a Canvas counterpart. + * + * A Rope is a special kind of Game Object that has a texture is stretched along its entire length. + * + * Unlike a Sprite, it isn't restricted to using just a quad and can have as many vertices as you define + * when creating it. The vertices can be arranged in a horizontal or vertical strip and have their own + * color and alpha values as well. + * + * A Ropes origin is always 0.5 x 0.5 and cannot be changed. + */ + class Rope extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible, Phaser.GameObjects.Components.ScrollFactor { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param texture The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. If not given, `__DEFAULT` is used. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param points An array containing the vertices data for this Rope, or a number that indicates how many segments to split the texture frame into. If none is provided a simple quad is created. See `setPoints` to set this post-creation. Default 2. + * @param horizontal Should the vertices of this Rope be aligned horizontally (`true`), or vertically (`false`)? Default true. + * @param colors An optional array containing the color data for this Rope. You should provide one color value per pair of vertices. + * @param alphas An optional array containing the alpha data for this Rope. You should provide one alpha value per pair of vertices. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, texture?: string, frame?: string | number | null, points?: number | Phaser.Types.Math.Vector2Like[], horizontal?: boolean, colors?: number[], alphas?: number[]); + + /** + * The Animation State of this Rope. + */ + anims: Phaser.Animations.AnimationState; + + /** + * An array containing the points data for this Rope. + * + * Each point should be given as a Vector2Like object (i.e. a Vector2, Geom.Point or object with public x/y properties). + * + * The point coordinates are given in local space, where 0 x 0 is the start of the Rope strip. + * + * You can modify the contents of this array directly in real-time to create interesting effects. + * If you do so, be sure to call `setDirty` _after_ modifying this array, so that the vertices data is + * updated before the next render. Alternatively, you can use the `setPoints` method instead. + * + * Should you need to change the _size_ of this array, then you should always use the `setPoints` method. + */ + points: Phaser.Types.Math.Vector2Like[]; + + /** + * An array containing the vertices data for this Rope. + * + * This data is calculated automatically in the `updateVertices` method, based on the points provided. + */ + vertices: Float32Array; + + /** + * An array containing the uv data for this Rope. + * + * This data is calculated automatically in the `setPoints` method, based on the points provided. + */ + uv: Float32Array; + + /** + * An array containing the color data for this Rope. + * + * Colors should be given as numeric RGB values, such as 0xff0000. + * You should provide _two_ color values for every point in the Rope, one for the top and one for the bottom of each quad. + * + * You can modify the contents of this array directly in real-time, however, should you need to change the _size_ + * of the array, then you should use the `setColors` method instead. + */ + colors: Uint32Array; + + /** + * An array containing the alpha data for this Rope. + * + * Alphas should be given as float values, such as 0.5. + * You should provide _two_ alpha values for every point in the Rope, one for the top and one for the bottom of each quad. + * + * You can modify the contents of this array directly in real-time, however, should you need to change the _size_ + * of the array, then you should use the `setAlphas` method instead. + */ + alphas: Float32Array; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * If the Rope is marked as `dirty` it will automatically recalculate its vertices + * the next time it renders. You can also force this by calling `updateVertices`. + */ + dirty: boolean; + + /** + * Are the Rope vertices aligned horizontally, in a strip, or vertically, in a column? + * + * This property is set during instantiation and cannot be changed directly. + * See the `setVertical` and `setHorizontal` methods. + */ + readonly horizontal: boolean; + + /** + * You can optionally choose to render the vertices of this Rope to a Graphics instance. + * + * Achieve this by setting the `debugCallback` and the `debugGraphic` properties. + * + * You can do this in a single call via the `Rope.setDebug` method, which will use the + * built-in debug function. You can also set it to your own callback. The callback + * will be invoked _once per render_ and sent the following parameters: + * + * `debugCallback(src, meshLength, verts)` + * + * `src` is the Rope instance being debugged. + * `meshLength` is the number of mesh vertices in total. + * `verts` is an array of the translated vertex coordinates. + * + * To disable rendering, set this property back to `null`. + */ + debugCallback: Function; + + /** + * The Graphics instance that the debug vertices will be drawn to, if `setDebug` has + * been called. + */ + debugGraphic: Phaser.GameObjects.Graphics; + + /** + * The Rope update loop. + * @param time The current timestamp. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected preUpdate(time: number, delta: number): void; + + /** + * Start playing the given animation. + * @param key The string-based key of the animation to play. + * @param ignoreIfPlaying If an animation is already playing then ignore this call. Default false. + * @param startFrame Optionally start the animation playing from this frame index. Default 0. + */ + play(key: string, ignoreIfPlaying?: boolean, startFrame?: number): this; + + /** + * Flags this Rope as being dirty. A dirty rope will recalculate all of its vertices data + * the _next_ time it renders. You should set this rope as dirty if you update the points + * array directly. + */ + setDirty(): this; + + /** + * Sets the alignment of the points in this Rope to be horizontal, in a strip format. + * + * Calling this method will reset this Rope. The current points, vertices, colors and alpha + * values will be reset to thoes values given as parameters. + * @param points An array containing the vertices data for this Rope, or a number that indicates how many segments to split the texture frame into. If none is provided the current points length is used. + * @param colors Either a single color value, or an array of values. + * @param alphas Either a single alpha value, or an array of values. + */ + setHorizontal(points?: number | Phaser.Types.Math.Vector2Like[], colors?: number | number[], alphas?: number | number[]): this; + + /** + * Sets the alignment of the points in this Rope to be vertical, in a column format. + * + * Calling this method will reset this Rope. The current points, vertices, colors and alpha + * values will be reset to thoes values given as parameters. + * @param points An array containing the vertices data for this Rope, or a number that indicates how many segments to split the texture frame into. If none is provided the current points length is used. + * @param colors Either a single color value, or an array of values. + * @param alphas Either a single alpha value, or an array of values. + */ + setVertical(points?: number | Phaser.Types.Math.Vector2Like[], colors?: number | number[], alphas?: number | number[]): this; + + /** + * Sets the tint fill mode. + * + * Mode 0 (`false`) is an additive tint, the default, which blends the vertices colors with the texture. + * This mode respects the texture alpha. + * + * Mode 1 (`true`) is a fill tint. Unlike an additive tint, a fill-tint literally replaces the pixel colors + * from the texture with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. This mode respects the texture alpha. + * + * See the `setColors` method for details of how to color each of the vertices. + * @param value Set to `false` for an Additive tint or `true` fill tint with alpha. Default false. + */ + setTintFill(value?: boolean): this; + + /** + * Set the alpha values used by the Rope during rendering. + * + * You can provide the values in a number of ways: + * + * 1) One single numeric value: `setAlphas(0.5)` - This will set a single alpha for the whole Rope. + * 2) Two numeric value: `setAlphas(1, 0.5)` - This will set a 'top' and 'bottom' alpha value across the whole Rope. + * 3) An array of values: `setAlphas([ 1, 0.5, 0.2 ])` + * + * If you provide an array of values and the array has exactly the same number of values as `points` in the Rope, it + * will use each alpha value per rope segment. + * + * If the provided array has a different number of values than `points` then it will use the values in order, from + * the first Rope segment and on, until it runs out of values. This allows you to control the alpha values at all + * vertices in the Rope. + * + * Note this method is called `setAlphas` (plural) and not `setAlpha`. + * @param alphas Either a single alpha value, or an array of values. If nothing is provided alpha is reset to 1. + * @param bottomAlpha An optional bottom alpha value. See the method description for details. + */ + setAlphas(alphas?: number | number[], bottomAlpha?: number): this; + + /** + * Set the color values used by the Rope during rendering. + * + * Colors are used to control the level of tint applied across the Rope texture. + * + * You can provide the values in a number of ways: + * + * * One single numeric value: `setColors(0xff0000)` - This will set a single color tint for the whole Rope. + * * An array of values: `setColors([ 0xff0000, 0x00ff00, 0x0000ff ])` + * + * If you provide an array of values and the array has exactly the same number of values as `points` in the Rope, it + * will use each color per rope segment. + * + * If the provided array has a different number of values than `points` then it will use the values in order, from + * the first Rope segment and on, until it runs out of values. This allows you to control the color values at all + * vertices in the Rope. + * @param colors Either a single color value, or an array of values. If nothing is provided color is reset to 0xffffff. + */ + setColors(colors?: number | number[]): this; + + /** + * Sets the points used by this Rope. + * + * The points should be provided as an array of Vector2, or vector2-like objects (i.e. those with public x/y properties). + * + * Each point corresponds to one segment of the Rope. The more points in the array, the more segments the rope has. + * + * Point coordinates are given in local-space, not world-space, and are directly related to the size of the texture + * this Rope object is using. + * + * For example, a Rope using a 512 px wide texture, split into 4 segments (128px each) would use the following points: + * + * ```javascript + * rope.setPoints([ + * { x: 0, y: 0 }, + * { x: 128, y: 0 }, + * { x: 256, y: 0 }, + * { x: 384, y: 0 } + * ]); + * ``` + * + * Or, you can provide an integer to do the same thing: + * + * ```javascript + * rope.setPoints(4); + * ``` + * + * Which will divide the Rope into 4 equally sized segments based on the frame width. + * + * Note that calling this method with a different number of points than the Rope has currently will + * _reset_ the color and alpha values, unless you provide them as arguments to this method. + * @param points An array containing the vertices data for this Rope, or a number that indicates how many segments to split the texture frame into. If none is provided a simple quad is created. Default 2. + * @param colors Either a single color value, or an array of values. + * @param alphas Either a single alpha value, or an array of values. + */ + setPoints(points?: number | Phaser.Types.Math.Vector2Like[], colors?: number | number[], alphas?: number | number[]): this; + + /** + * Updates all of the UVs based on the Rope.points and `flipX` and `flipY` settings. + */ + updateUVs(): this; + + /** + * Resizes all of the internal arrays: `vertices`, `uv`, `colors` and `alphas` to the new + * given Rope segment total. + * @param newSize The amount of segments to split the Rope in to. + */ + resizeArrays(newSize: number): this; + + /** + * Updates the vertices based on the Rope points. + * + * This method is called automatically during rendering if `Rope.dirty` is `true`, which is set + * by the `setPoints` and `setDirty` methods. You should flag the Rope as being dirty if you modify + * the Rope points directly. + */ + updateVertices(): this; + + /** + * This method enables rendering of the Rope vertices to the given Graphics instance. + * + * If you enable this feature, you **must** call `Graphics.clear()` in your Scene `update`, + * otherwise the Graphics instance you provide to debug will fill-up with draw calls, + * eventually crashing the browser. This is not done automatically to allow you to debug + * draw multiple Rope objects to a single Graphics instance. + * + * The Rope class has a built-in debug rendering callback `Rope.renderDebugVerts`, however + * you can also provide your own callback to be used instead. Do this by setting the `callback` parameter. + * + * The callback is invoked _once per render_ and sent the following parameters: + * + * `callback(src, meshLength, verts)` + * + * `src` is the Rope instance being debugged. + * `meshLength` is the number of mesh vertices in total. + * `verts` is an array of the translated vertex coordinates. + * + * If using your own callback you do not have to provide a Graphics instance to this method. + * + * To disable debug rendering, to either your own callback or the built-in one, call this method + * with no arguments. + * @param graphic The Graphic instance to render to if using the built-in callback. + * @param callback The callback to invoke during debug render. Leave as undefined to use the built-in callback. + */ + setDebug(graphic?: Phaser.GameObjects.Graphics, callback?: Function): this; + + /** + * The built-in Rope vertices debug rendering method. + * + * See `Rope.setDebug` for more details. + * @param src The Rope object being rendered. + * @param meshLength The number of vertices in the mesh. + * @param verts An array of translated vertex coordinates. + */ + renderDebugVerts(src: Phaser.GameObjects.Rope, meshLength: number, verts: number[]): void; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * Calling this method will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param key The key of the texture to be used, as stored in the Texture Manager, or a Texture instance. + * @param frame The name or index of the frame within the Texture. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call change the origin of the Game Object? Default true. + */ + setTexture(key: string | Phaser.Textures.Texture, frame?: string | number, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + } + + /** + * A Shader Game Object. + * + * This Game Object allows you to easily add a quad with its own shader into the display list, and manipulate it + * as you would any other Game Object, including scaling, rotating, positioning and adding to Containers. Shaders + * can be masked with either Bitmap or Geometry masks and can also be used as a Bitmap Mask for a Camera or other + * Game Object. They can also be made interactive and used for input events. + * + * It works by taking a reference to a `Phaser.Display.BaseShader` instance, as found in the Shader Cache. These can + * be created dynamically at runtime, or loaded in via the GLSL File Loader: + * + * ```javascript + * function preload () + * { + * this.load.glsl('fire', 'shaders/fire.glsl.js'); + * } + * + * function create () + * { + * this.add.shader('fire', 400, 300, 512, 512); + * } + * ``` + * + * Please see the Phaser 3 Examples GitHub repo for examples of loading and creating shaders dynamically. + * + * Due to the way in which they work, you cannot directly change the alpha or blend mode of a Shader. This should + * be handled via exposed uniforms in the shader code itself. + * + * By default a Shader will be created with a standard set of uniforms. These were added to match those + * found on sites such as ShaderToy or GLSLSandbox, and provide common functionality a shader may need, + * such as the timestamp, resolution or pointer position. You can replace them by specifying your own uniforms + * in the Base Shader. + * + * These Shaders work by halting the current pipeline during rendering, creating a viewport matched to the + * size of this Game Object and then renders a quad using the bound shader. At the end, the pipeline is restored. + * + * Because it blocks the pipeline it means it will interrupt any batching that is currently going on, so you should + * use these Game Objects sparingly. If you need to have a fully batched custom shader, then please look at using + * a custom pipeline instead. However, for background or special masking effects, they are extremely effective. + */ + class Shader extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.ComputedSize, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param key The key of the shader to use from the shader cache, or a BaseShader instance. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the Game Object. Default 128. + * @param height The height of the Game Object. Default 128. + * @param textures Optional array of texture keys to bind to the iChannel0...3 uniforms. The textures must already exist in the Texture Manager. + * @param textureData Additional texture data if you want to create shader with none NPOT textures. + */ + constructor(scene: Phaser.Scene, key: string | Phaser.Display.BaseShader, x?: number, y?: number, width?: number, height?: number, textures?: string[], textureData?: any); + + /** + * The underlying shader object being used. + * Empty by default and set during a call to the `setShader` method. + */ + shader: Phaser.Display.BaseShader; + + /** + * A reference to the current renderer. + * Shaders only work with the WebGL Renderer. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The WebGL context belonging to the renderer. + */ + gl: WebGLRenderingContext; + + /** + * Raw byte buffer of vertices this Shader uses. + */ + vertexData: ArrayBuffer; + + /** + * The WebGL vertex buffer object this shader uses. + */ + vertexBuffer: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper; + + /** + * The WebGL shader program this shader uses. + */ + program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper; + + /** + * Uint8 view to the vertex raw buffer. Used for uploading vertex buffer resources to the GPU. + */ + bytes: Uint8Array; + + /** + * Float32 view of the array buffer containing the shaders vertices. + */ + vertexViewF32: Float32Array; + + /** + * The view matrix the shader uses during rendering. + */ + readonly viewMatrix: Float32Array; + + /** + * The projection matrix the shader uses during rendering. + */ + readonly projectionMatrix: Float32Array; + + /** + * The default uniform mappings. These can be added to (or replaced) by specifying your own uniforms when + * creating this shader game object. The uniforms are updated automatically during the render step. + * + * The defaults are: + * + * `resolution` (2f) - Set to the size of this shader. + * `time` (1f) - The elapsed game time, in seconds. + * `mouse` (2f) - If a pointer has been bound (with `setPointer`), this uniform contains its position each frame. + * `date` (4fv) - A vec4 containing the year, month, day and time in seconds. + * `sampleRate` (1f) - Sound sample rate. 44100 by default. + * `iChannel0...3` (sampler2D) - Input channels 0 to 3. `null` by default. + */ + uniforms: any; + + /** + * The pointer bound to this shader, if any. + * Set via the chainable `setPointer` method, or by modifying this property directly. + */ + pointer: Phaser.Input.Pointer; + + /** + * A reference to the GL Frame Buffer this Shader is drawing to. + * This property is only set if you have called `Shader.setRenderToTexture`. + */ + framebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper | null; + + /** + * A reference to the WebGLTextureWrapper this Shader is rendering to. + * This property is only set if you have called `Shader.setRenderToTexture`. + */ + glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * A flag that indicates if this Shader has been set to render to a texture instead of the display list. + * + * This property is `true` if you have called `Shader.setRenderToTexture`, otherwise it's `false`. + * + * A Shader that is rendering to a texture _does not_ appear on the display list. + */ + readonly renderToTexture: boolean; + + /** + * A reference to the Phaser.Textures.Texture that has been stored in the Texture Manager for this Shader. + * + * This property is only set if you have called `Shader.setRenderToTexture` with a key, otherwise it is `null`. + */ + texture: Phaser.Textures.Texture; + + /** + * Compares the renderMask with the renderFlags to see if this Game Object will render or not. + * Also checks the Game Object against the given Cameras exclusion list. + * @param camera The Camera to check against this Game Object. + */ + willRender(camera: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Changes this Shader so instead of rendering to the display list it renders to a + * WebGL Framebuffer and WebGL Texture instead. This allows you to use the output + * of this shader as an input for another shader, by mapping a sampler2D uniform + * to it. + * + * After calling this method the `Shader.framebuffer` and `Shader.glTexture` properties + * are populated. + * + * Additionally, you can provide a key to this method. Doing so will create a Phaser Texture + * from this Shader and save it into the Texture Manager, allowing you to then use it for + * any texture-based Game Object, such as a Sprite or Image: + * + * ```javascript + * var shader = this.add.shader('myShader', x, y, width, height); + * + * shader.setRenderToTexture('doodle'); + * + * this.add.image(400, 300, 'doodle'); + * ``` + * + * Note that it stores an active reference to this Shader. That means as this shader updates, + * so does the texture and any object using it to render with. Also, if you destroy this + * shader, be sure to clear any objects that may have been using it as a texture too. + * + * You can access the Phaser Texture that is created via the `Shader.texture` property. + * + * By default it will create a single base texture. You can add frames to the texture + * by using the `Texture.add` method. After doing this, you can then allow Game Objects + * to use a specific frame from a Render Texture. + * @param key The unique key to store the texture as within the global Texture Manager. + * @param flipY Does this texture need vertically flipping before rendering? This should usually be set to `true` if being fed from a buffer. Default false. + */ + setRenderToTexture(key?: string, flipY?: boolean): this; + + /** + * Sets the fragment and, optionally, the vertex shader source code that this Shader will use. + * This will immediately delete the active shader program, if set, and then create a new one + * with the given source. Finally, the shader uniforms are initialized. + * @param key The key of the shader to use from the shader cache, or a BaseShader instance. + * @param textures Optional array of texture keys to bind to the iChannel0...3 uniforms. The textures must already exist in the Texture Manager. + * @param textureData Additional texture data. + */ + setShader(key: string | Phaser.Display.BaseShader, textures?: string[], textureData?: any): this; + + /** + * Binds a Phaser Pointer object to this Shader. + * + * The screen position of the pointer will be set in to the shaders `mouse` uniform + * automatically every frame. Call this method with no arguments to unbind the pointer. + * @param pointer The Pointer to bind to this shader. + */ + setPointer(pointer?: Phaser.Input.Pointer): this; + + /** + * Sets this shader to use an orthographic projection matrix. + * This matrix is stored locally in the `projectionMatrix` property, + * as well as being bound to the `uProjectionMatrix` uniform. + * @param left The left value. + * @param right The right value. + * @param bottom The bottom value. + * @param top The top value. + */ + projOrtho(left: number, right: number, bottom: number, top: number): void; + + /** + * Sets a sampler2D uniform on this shader where the source texture is a WebGLTextureBuffer. + * + * This allows you to feed the output from one Shader into another: + * + * ```javascript + * let shader1 = this.add.shader(baseShader1, 0, 0, 512, 512).setRenderToTexture(); + * let shader2 = this.add.shader(baseShader2, 0, 0, 512, 512).setRenderToTexture('output'); + * + * shader1.setSampler2DBuffer('iChannel0', shader2.glTexture, 512, 512); + * shader2.setSampler2DBuffer('iChannel0', shader1.glTexture, 512, 512); + * ``` + * + * In the above code, the result of baseShader1 is fed into Shader2 as the `iChannel0` sampler2D uniform. + * The result of baseShader2 is then fed back into shader1 again, creating a feedback loop. + * + * If you wish to use an image from the Texture Manager as a sampler2D input for this shader, + * see the `Shader.setSampler2D` method. + * @param uniformKey The key of the sampler2D uniform to be updated, i.e. `iChannel0`. + * @param texture A texture reference. + * @param width The width of the texture. + * @param height The height of the texture. + * @param textureIndex The texture index. Default 0. + * @param textureData Additional texture data. + */ + setSampler2DBuffer(uniformKey: string, texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, width: number, height: number, textureIndex?: number, textureData?: any): this; + + /** + * Sets a sampler2D uniform on this shader. + * + * The textureKey given is the key from the Texture Manager cache. You cannot use a single frame + * from a texture, only the full image. Also, lots of shaders expect textures to be power-of-two sized. + * + * If you wish to use another Shader as a sampler2D input for this shader, see the `Shader.setSampler2DBuffer` method. + * @param uniformKey The key of the sampler2D uniform to be updated, i.e. `iChannel0`. + * @param textureKey The key of the texture, as stored in the Texture Manager. Must already be loaded. + * @param textureIndex The texture index. Default 0. + * @param textureData Additional texture data. + */ + setSampler2D(uniformKey: string, textureKey: string, textureIndex?: number, textureData?: any): this; + + /** + * Sets a property of a uniform already present on this shader. + * + * To modify the value of a uniform such as a 1f or 1i use the `value` property directly: + * + * ```javascript + * shader.setUniform('size.value', 16); + * ``` + * + * You can use dot notation to access deeper values, for example: + * + * ```javascript + * shader.setUniform('resolution.value.x', 512); + * ``` + * + * The change to the uniform will take effect the next time the shader is rendered. + * @param key The key of the uniform to modify. Use dots for deep properties, i.e. `resolution.value.x`. + * @param value The value to set into the uniform. + */ + setUniform(key: string, value: any): this; + + /** + * Returns the uniform object for the given key, or `null` if the uniform couldn't be found. + * @param key The key of the uniform to return the value for. + */ + getUniform(key: string): any; + + /** + * A short-cut method that will directly set the texture being used by the `iChannel0` sampler2D uniform. + * + * The textureKey given is the key from the Texture Manager cache. You cannot use a single frame + * from a texture, only the full image. Also, lots of shaders expect textures to be power-of-two sized. + * @param textureKey The key of the texture, as stored in the Texture Manager. Must already be loaded. + * @param textureData Additional texture data. + */ + setChannel0(textureKey: string, textureData?: any): this; + + /** + * A short-cut method that will directly set the texture being used by the `iChannel1` sampler2D uniform. + * + * The textureKey given is the key from the Texture Manager cache. You cannot use a single frame + * from a texture, only the full image. Also, lots of shaders expect textures to be power-of-two sized. + * @param textureKey The key of the texture, as stored in the Texture Manager. Must already be loaded. + * @param textureData Additional texture data. + */ + setChannel1(textureKey: string, textureData?: any): this; + + /** + * A short-cut method that will directly set the texture being used by the `iChannel2` sampler2D uniform. + * + * The textureKey given is the key from the Texture Manager cache. You cannot use a single frame + * from a texture, only the full image. Also, lots of shaders expect textures to be power-of-two sized. + * @param textureKey The key of the texture, as stored in the Texture Manager. Must already be loaded. + * @param textureData Additional texture data. + */ + setChannel2(textureKey: string, textureData?: any): this; + + /** + * A short-cut method that will directly set the texture being used by the `iChannel3` sampler2D uniform. + * + * The textureKey given is the key from the Texture Manager cache. You cannot use a single frame + * from a texture, only the full image. Also, lots of shaders expect textures to be power-of-two sized. + * @param textureKey The key of the texture, as stored in the Texture Manager. Must already be loaded. + * @param textureData Additional texture data. + */ + setChannel3(textureKey: string, textureData?: any): this; + + /** + * Called automatically during render. + * + * This method performs matrix ITRS and then stores the resulting value in the `uViewMatrix` uniform. + * It then sets up the vertex buffer and shader, updates and syncs the uniforms ready + * for flush to be called. + * @param matrix2D The transform matrix to use during rendering. + */ + load(matrix2D?: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Called automatically during render. + * + * Sets the active shader, loads the vertex buffer and then draws. + */ + flush(): void; + + /** + * Run any logic that was deferred during context loss. + */ + onContextRestored(): void; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Arc Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * When it renders it displays an arc shape. You can control the start and end angles of the arc, + * as well as if the angles are winding clockwise or anti-clockwise. With the default settings + * it renders as a complete circle. By changing the angles you can create other arc shapes, + * such as half-circles. + * + * Arcs also have an `iterations` property and corresponding `setIterations` method. This allows + * you to control how smooth the shape renders in WebGL, by controlling the number of iterations + * that take place during construction. + */ + class Arc extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param radius The radius of the arc. Default 128. + * @param startAngle The start angle of the arc, in degrees. Default 0. + * @param endAngle The end angle of the arc, in degrees. Default 360. + * @param anticlockwise The winding order of the start and end angles. Default false. + * @param fillColor The color the arc will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the arc will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, radius?: number, startAngle?: number, endAngle?: number, anticlockwise?: boolean, fillColor?: number, fillAlpha?: number); + + /** + * The number of iterations used when drawing the arc. + * Increase this value for smoother arcs, at the cost of more polygons being rendered. + * Modify this value by small amounts, such as 0.01. + */ + iterations: number; + + /** + * The radius of the arc. + */ + radius: number; + + /** + * The start angle of the arc, in degrees. + */ + startAngle: number; + + /** + * The end angle of the arc, in degrees. + */ + endAngle: number; + + /** + * The winding order of the start and end angles. + */ + anticlockwise: boolean; + + /** + * Sets the radius of the arc. + * This call can be chained. + * @param value The value to set the radius to. + */ + setRadius(value: number): this; + + /** + * Sets the number of iterations used when drawing the arc. + * Increase this value for smoother arcs, at the cost of more polygons being rendered. + * Modify this value by small amounts, such as 0.01. + * This call can be chained. + * @param value The value to set the iterations to. + */ + setIterations(value: number): this; + + /** + * Sets the starting angle of the arc, in degrees. + * This call can be chained. + * @param value The value to set the starting angle to. + */ + setStartAngle(value: number): this; + + /** + * Sets the ending angle of the arc, in degrees. + * This call can be chained. + * @param value The value to set the ending angle to. + */ + setEndAngle(value: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Curve Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * To render a Curve Shape you must first create a `Phaser.Curves.Curve` object, then pass it to + * the Curve Shape in the constructor. + * + * The Curve shape also has a `smoothness` property and corresponding `setSmoothness` method. + * This allows you to control how smooth the shape renders in WebGL, by controlling the number of iterations + * that take place during construction. Increase and decrease the default value for smoother, or more + * jagged, shapes. + */ + class Curve extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param curve The Curve object to use to create the Shape. + * @param fillColor The color the curve will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the curve will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, curve?: Phaser.Curves.Curve, fillColor?: number, fillAlpha?: number); + + /** + * The smoothness of the curve. The number of points used when rendering it. + * Increase this value for smoother curves, at the cost of more polygons being rendered. + */ + smoothness: number; + + /** + * Sets the smoothness of the curve. The number of points used when rendering it. + * Increase this value for smoother curves, at the cost of more polygons being rendered. + * This call can be chained. + * @param value The value to set the smoothness to. + */ + setSmoothness(value: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Ellipse Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * When it renders it displays an ellipse shape. You can control the width and height of the ellipse. + * If the width and height match it will render as a circle. If the width is less than the height, + * it will look more like an egg shape. + * + * The Ellipse shape also has a `smoothness` property and corresponding `setSmoothness` method. + * This allows you to control how smooth the shape renders in WebGL, by controlling the number of iterations + * that take place during construction. Increase and decrease the default value for smoother, or more + * jagged, shapes. + */ + class Ellipse extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the ellipse. An ellipse with equal width and height renders as a circle. Default 128. + * @param height The height of the ellipse. An ellipse with equal width and height renders as a circle. Default 128. + * @param fillColor The color the ellipse will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the ellipse will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, width?: number, height?: number, fillColor?: number, fillAlpha?: number); + + /** + * The smoothness of the ellipse. The number of points used when rendering it. + * Increase this value for a smoother ellipse, at the cost of more polygons being rendered. + */ + smoothness: number; + + /** + * Sets the size of the ellipse by changing the underlying geometry data, rather than scaling the object. + * This call can be chained. + * @param width The width of the ellipse. + * @param height The height of the ellipse. + */ + setSize(width: number, height: number): this; + + /** + * Sets the smoothness of the ellipse. The number of points used when rendering it. + * Increase this value for a smoother ellipse, at the cost of more polygons being rendered. + * This call can be chained. + * @param value The value to set the smoothness to. + */ + setSmoothness(value: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Grid Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only fill colors and cannot be stroked. + * + * A Grid Shape allows you to display a grid in your game, where you can control the size of the + * grid as well as the width and height of the grid cells. You can set a fill color for each grid + * cell as well as an alternate fill color. When the alternate fill color is set then the grid + * cells will alternate the fill colors as they render, creating a chess-board effect. You can + * also optionally have an outline fill color. If set, this draws lines between the grid cells + * in the given color. If you specify an outline color with an alpha of zero, then it will draw + * the cells spaced out, but without the lines between them. + */ + class Grid extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param width The width of the grid. Default 128. + * @param height The height of the grid. Default 128. + * @param cellWidth The width of one cell in the grid. Default 32. + * @param cellHeight The height of one cell in the grid. Default 32. + * @param fillColor The color the grid cells will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + * @param outlineFillColor The color of the lines between the grid cells. See the `setOutline` method. + * @param outlineFillAlpha The alpha of the lines between the grid cells. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, width?: number, height?: number, cellWidth?: number, cellHeight?: number, fillColor?: number, fillAlpha?: number, outlineFillColor?: number, outlineFillAlpha?: number); + + /** + * The width of each grid cell. + * Must be a positive value. + */ + cellWidth: number; + + /** + * The height of each grid cell. + * Must be a positive value. + */ + cellHeight: number; + + /** + * Will the grid render its cells in the `fillColor`? + */ + showCells: boolean; + + /** + * The color of the lines between each grid cell. + */ + outlineFillColor: number; + + /** + * The alpha value for the color of the lines between each grid cell. + */ + outlineFillAlpha: number; + + /** + * Will the grid display the lines between each cell when it renders? + */ + showOutline: boolean; + + /** + * Will the grid render the alternating cells in the `altFillColor`? + */ + showAltCells: boolean; + + /** + * The color the alternating grid cells will be filled with, i.e. 0xff0000 for red. + */ + altFillColor: number; + + /** + * The alpha the alternating grid cells will be filled with. + * You can also set the alpha of the overall Shape using its `alpha` property. + */ + altFillAlpha: number; + + /** + * Sets the fill color and alpha level the grid cells will use when rendering. + * + * If this method is called with no values then the grid cells will not be rendered, + * however the grid lines and alternating cells may still be. + * + * Also see the `setOutlineStyle` and `setAltFillStyle` methods. + * + * This call can be chained. + * @param fillColor The color the grid cells will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. Default 1. + */ + setFillStyle(fillColor?: number, fillAlpha?: number): this; + + /** + * Sets the fill color and alpha level that the alternating grid cells will use. + * + * If this method is called with no values then alternating grid cells will not be rendered in a different color. + * + * Also see the `setOutlineStyle` and `setFillStyle` methods. + * + * This call can be chained. + * @param fillColor The color the alternating grid cells will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the alternating grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. Default 1. + */ + setAltFillStyle(fillColor?: number, fillAlpha?: number): this; + + /** + * Sets the fill color and alpha level that the lines between each grid cell will use. + * + * If this method is called with no values then the grid lines will not be rendered at all, however + * the cells themselves may still be if they have colors set. + * + * Also see the `setFillStyle` and `setAltFillStyle` methods. + * + * This call can be chained. + * @param fillColor The color the lines between the grid cells will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the lines between the grid cells will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. Default 1. + */ + setOutlineStyle(fillColor?: number, fillAlpha?: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The IsoBox Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only fill colors and cannot be stroked. + * + * An IsoBox is an 'isometric' rectangle. Each face of it has a different fill color. You can set + * the color of the top, left and right faces of the rectangle respectively. You can also choose + * which of the faces are rendered via the `showTop`, `showLeft` and `showRight` properties. + * + * You cannot view an IsoBox from under-neath, however you can change the 'angle' by setting + * the `projection` property. + */ + class IsoBox extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param size The width of the iso box in pixels. The left and right faces will be exactly half this value. Default 48. + * @param height The height of the iso box. The left and right faces will be this tall. The overall height of the isobox will be this value plus half the `size` value. Default 32. + * @param fillTop The fill color of the top face of the iso box. Default 0xeeeeee. + * @param fillLeft The fill color of the left face of the iso box. Default 0x999999. + * @param fillRight The fill color of the right face of the iso box. Default 0xcccccc. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, size?: number, height?: number, fillTop?: number, fillLeft?: number, fillRight?: number); + + /** + * The projection level of the iso box. Change this to change the 'angle' at which you are looking at the box. + */ + projection: number; + + /** + * The color used to fill in the top of the iso box. + */ + fillTop: number; + + /** + * The color used to fill in the left-facing side of the iso box. + */ + fillLeft: number; + + /** + * The color used to fill in the right-facing side of the iso box. + */ + fillRight: number; + + /** + * Controls if the top-face of the iso box be rendered. + */ + showTop: boolean; + + /** + * Controls if the left-face of the iso box be rendered. + */ + showLeft: boolean; + + /** + * Controls if the right-face of the iso box be rendered. + */ + showRight: boolean; + + /** + * Sets the projection level of the iso box. Change this to change the 'angle' at which you are looking at the box. + * This call can be chained. + * @param value The value to set the projection to. + */ + setProjection(value: number): this; + + /** + * Sets which faces of the iso box will be rendered. + * This call can be chained. + * @param showTop Show the top-face of the iso box. Default true. + * @param showLeft Show the left-face of the iso box. Default true. + * @param showRight Show the right-face of the iso box. Default true. + */ + setFaces(showTop?: boolean, showLeft?: boolean, showRight?: boolean): this; + + /** + * Sets the fill colors for each face of the iso box. + * This call can be chained. + * @param fillTop The color used to fill the top of the iso box. + * @param fillLeft The color used to fill in the left-facing side of the iso box. + * @param fillRight The color used to fill in the right-facing side of the iso box. + */ + setFillStyle(fillTop?: number, fillLeft?: number, fillRight?: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The IsoTriangle Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only fill colors and cannot be stroked. + * + * An IsoTriangle is an 'isometric' triangle. Think of it like a pyramid. Each face has a different + * fill color. You can set the color of the top, left and right faces of the triangle respectively + * You can also choose which of the faces are rendered via the `showTop`, `showLeft` and `showRight` properties. + * + * You cannot view an IsoTriangle from under-neath, however you can change the 'angle' by setting + * the `projection` property. The `reversed` property controls if the IsoTriangle is rendered upside + * down or not. + */ + class IsoTriangle extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param size The width of the iso triangle in pixels. The left and right faces will be exactly half this value. Default 48. + * @param height The height of the iso triangle. The left and right faces will be this tall. The overall height of the iso triangle will be this value plus half the `size` value. Default 32. + * @param reversed Is the iso triangle upside down? Default false. + * @param fillTop The fill color of the top face of the iso triangle. Default 0xeeeeee. + * @param fillLeft The fill color of the left face of the iso triangle. Default 0x999999. + * @param fillRight The fill color of the right face of the iso triangle. Default 0xcccccc. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, size?: number, height?: number, reversed?: boolean, fillTop?: number, fillLeft?: number, fillRight?: number); + + /** + * The projection level of the iso box. Change this to change the 'angle' at which you are looking at the box. + */ + projection: number; + + /** + * The color used to fill in the top of the iso triangle. This is only used if the triangle is reversed. + */ + fillTop: number; + + /** + * The color used to fill in the left-facing side of the iso triangle. + */ + fillLeft: number; + + /** + * The color used to fill in the right-facing side of the iso triangle. + */ + fillRight: number; + + /** + * Controls if the top-face of the iso triangle be rendered. + */ + showTop: boolean; + + /** + * Controls if the left-face of the iso triangle be rendered. + */ + showLeft: boolean; + + /** + * Controls if the right-face of the iso triangle be rendered. + */ + showRight: boolean; + + /** + * Sets if the iso triangle will be rendered upside down or not. + */ + isReversed: boolean; + + /** + * Sets the projection level of the iso triangle. Change this to change the 'angle' at which you are looking at the pyramid. + * This call can be chained. + * @param value The value to set the projection to. + */ + setProjection(value: number): this; + + /** + * Sets if the iso triangle will be rendered upside down or not. + * This call can be chained. + * @param reversed Sets if the iso triangle will be rendered upside down or not. + */ + setReversed(reversed: boolean): this; + + /** + * Sets which faces of the iso triangle will be rendered. + * This call can be chained. + * @param showTop Show the top-face of the iso triangle (only if `reversed` is true) Default true. + * @param showLeft Show the left-face of the iso triangle. Default true. + * @param showRight Show the right-face of the iso triangle. Default true. + */ + setFaces(showTop?: boolean, showLeft?: boolean, showRight?: boolean): this; + + /** + * Sets the fill colors for each face of the iso triangle. + * This call can be chained. + * @param fillTop The color used to fill the top of the iso triangle. + * @param fillLeft The color used to fill in the left-facing side of the iso triangle. + * @param fillRight The color used to fill in the right-facing side of the iso triangle. + */ + setFillStyle(fillTop?: number, fillLeft?: number, fillRight?: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Line Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports only stroke colors and cannot be filled. + * + * A Line Shape allows you to draw a line between two points in your game. You can control the + * stroke color and thickness of the line. In WebGL only you can also specify a different + * thickness for the start and end of the line, allowing you to render lines that taper-off. + * + * If you need to draw multiple lines in a sequence you may wish to use the Polygon Shape instead. + * + * Be aware that as with all Game Objects the default origin is 0.5. If you need to draw a Line + * between two points and want the x1/y1 values to match the x/y values, then set the origin to 0. + */ + class Line extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param x1 The horizontal position of the start of the line. Default 0. + * @param y1 The vertical position of the start of the line. Default 0. + * @param x2 The horizontal position of the end of the line. Default 128. + * @param y2 The vertical position of the end of the line. Default 0. + * @param strokeColor The color the line will be drawn in, i.e. 0xff0000 for red. + * @param strokeAlpha The alpha the line will be drawn in. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, x1?: number, y1?: number, x2?: number, y2?: number, strokeColor?: number, strokeAlpha?: number); + + /** + * The width (or thickness) of the line. + * See the setLineWidth method for extra details on changing this on WebGL. + */ + lineWidth: number; + + /** + * Sets the width of the line. + * + * When using the WebGL renderer you can have different start and end widths. + * When using the Canvas renderer only the `startWidth` value is used. The `endWidth` is ignored. + * + * This call can be chained. + * @param startWidth The start width of the line. + * @param endWidth The end width of the line. Only used in WebGL. + */ + setLineWidth(startWidth: number, endWidth?: number): this; + + /** + * Sets the start and end coordinates of this Line. + * @param x1 The horizontal position of the start of the line. Default 0. + * @param y1 The vertical position of the start of the line. Default 0. + * @param x2 The horizontal position of the end of the line. Default 0. + * @param y2 The vertical position of the end of the line. Default 0. + */ + setTo(x1?: number, y1?: number, x2?: number, y2?: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Polygon Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * The Polygon Shape is created by providing a list of points, which are then used to create an + * internal Polygon geometry object. The points can be set from a variety of formats: + * + * - A string containing paired values separated by a single space: `'40 0 40 20 100 20 100 80 40 80 40 100 0 50'` + * - An array of Point or Vector2 objects: `[new Phaser.Math.Vector2(x1, y1), ...]` + * - An array of objects with public x/y properties: `[obj1, obj2, ...]` + * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]` + * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]` + * + * By default the `x` and `y` coordinates of this Shape refer to the center of it. However, depending + * on the coordinates of the points provided, the final shape may be rendered offset from its origin. + * + * Note: The method `getBounds` will return incorrect bounds if any of the points in the Polygon are negative. + * If this is the case, please use the function `Phaser.Geom.Polygon.GetAABB(polygon.geom)` instead and then + * adjust the returned Rectangle position accordingly. + */ + class Polygon extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param points The points that make up the polygon. + * @param fillColor The color the polygon will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the polygon will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, points?: any, fillColor?: number, fillAlpha?: number); + + /** + * Smooths the polygon over the number of iterations specified. + * The base polygon data will be updated and replaced with the smoothed values. + * This call can be chained. + * @param iterations The number of times to apply the polygon smoothing. Default 1. + */ + smooth(iterations?: number): this; + + /** + * Sets this Polygon to the given points. + * + * The points can be set from a variety of formats: + * + * - A string containing paired values separated by a single space: `'40 0 40 20 100 20 100 80 40 80 40 100 0 50'` + * - An array of Point objects: `[new Phaser.Point(x1, y1), ...]` + * - An array of objects with public x/y properties: `[obj1, obj2, ...]` + * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]` + * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]` + * + * Calling this method will reset the size (width, height) and display origin of this Shape. + * + * It also runs both GetAABB and EarCut on the given points, so please be careful not to do this + * at a high frequency, or with too many points. + * @param points Points defining the perimeter of this polygon. Please check function description above for the different supported formats. + */ + setTo(points?: string | number[] | Phaser.Types.Math.Vector2Like[]): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Rectangle Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * You can change the size of the rectangle by changing the `width` and `height` properties. + */ + class Rectangle extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param width The width of the rectangle. Default 128. + * @param height The height of the rectangle. Default 128. + * @param fillColor The color the rectangle will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the rectangle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x: number, y: number, width?: number, height?: number, fillColor?: number, fillAlpha?: number); + + /** + * Sets the internal size of this Rectangle, as used for frame or physics body creation. + * + * If you have assigned a custom input hit area for this Rectangle, changing the Rectangle size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Shape Game Object is a base class for the various different shapes, such as the Arc, Star or Polygon. + * You cannot add a Shape directly to your Scene, it is meant as a base for your own custom Shape classes. + */ + class Shape extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param type The internal type of the Shape. + * @param data The data of the source shape geometry, if any. + */ + constructor(scene: Phaser.Scene, type?: string, data?: any); + + /** + * The source Shape data. Typically a geometry object. + * You should not manipulate this directly. + */ + readonly geom: any; + + /** + * Holds the polygon path data for filled rendering. + */ + readonly pathData: number[]; + + /** + * Holds the earcut polygon path index data for filled rendering. + */ + readonly pathIndexes: number[]; + + /** + * The fill color used by this Shape. + */ + fillColor: number; + + /** + * The fill alpha value used by this Shape. + */ + fillAlpha: number; + + /** + * The stroke color used by this Shape. + */ + strokeColor: number; + + /** + * The stroke alpha value used by this Shape. + */ + strokeAlpha: number; + + /** + * The stroke line width used by this Shape. + */ + lineWidth: number; + + /** + * Controls if this Shape is filled or not. + * Note that some Shapes do not support being filled (such as Line shapes) + */ + isFilled: boolean; + + /** + * Controls if this Shape is stroked or not. + * Note that some Shapes do not support being stroked (such as Iso Box shapes) + */ + isStroked: boolean; + + /** + * Controls if this Shape path is closed during rendering when stroked. + * Note that some Shapes are always closed when stroked (such as Ellipse shapes) + */ + closePath: boolean; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * Sets the fill color and alpha for this Shape. + * + * If you wish for the Shape to not be filled then call this method with no arguments, or just set `isFilled` to `false`. + * + * Note that some Shapes do not support fill colors, such as the Line shape. + * + * This call can be chained. + * @param color The color used to fill this shape. If not provided the Shape will not be filled. + * @param alpha The alpha value used when filling this shape, if a fill color is given. Default 1. + */ + setFillStyle(color?: number, alpha?: number): this; + + /** + * Sets the stroke color and alpha for this Shape. + * + * If you wish for the Shape to not be stroked then call this method with no arguments, or just set `isStroked` to `false`. + * + * Note that some Shapes do not support being stroked, such as the Iso Box shape. + * + * This call can be chained. + * @param lineWidth The width of line to stroke with. If not provided or undefined the Shape will not be stroked. + * @param color The color used to stroke this shape. If not provided the Shape will not be stroked. + * @param alpha The alpha value used when stroking this shape, if a stroke color is given. Default 1. + */ + setStrokeStyle(lineWidth?: number, color?: number, alpha?: number): this; + + /** + * Sets if this Shape path is closed during rendering when stroked. + * Note that some Shapes are always closed when stroked (such as Ellipse shapes) + * + * This call can be chained. + * @param value Set to `true` if the Shape should be closed when stroked, otherwise `false`. + */ + setClosePath(value: boolean): this; + + /** + * Sets the display size of this Shape. + * + * Calling this will adjust the scale. + * @param width The display width of this Shape. + * @param height The display height of this Shape. + */ + setDisplaySize(width: number, height: number): this; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Star Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * As the name implies, the Star shape will display a star in your game. You can control several + * aspects of it including the number of points that constitute the star. The default is 5. If + * you change it to 4 it will render as a diamond. If you increase them, you'll get a more spiky + * star shape. + * + * You can also control the inner and outer radius, which is how 'long' each point of the star is. + * Modify these values to create more interesting shapes. + */ + class Star extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param points The number of points on the star. Default 5. + * @param innerRadius The inner radius of the star. Default 32. + * @param outerRadius The outer radius of the star. Default 64. + * @param fillColor The color the star will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the star will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, points?: number, innerRadius?: number, outerRadius?: number, fillColor?: number, fillAlpha?: number); + + /** + * Sets the number of points that make up the Star shape. + * This call can be chained. + * @param value The amount of points the Star will have. + */ + setPoints(value: number): this; + + /** + * Sets the inner radius of the Star shape. + * This call can be chained. + * @param value The amount to set the inner radius to. + */ + setInnerRadius(value: number): this; + + /** + * Sets the outer radius of the Star shape. + * This call can be chained. + * @param value The amount to set the outer radius to. + */ + setOuterRadius(value: number): this; + + /** + * The number of points that make up the Star shape. + */ + points: number; + + /** + * The inner radius of the Star shape. + */ + innerRadius: number; + + /** + * The outer radius of the Star shape. + */ + outerRadius: number; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Triangle Shape is a Game Object that can be added to a Scene, Group or Container. You can + * treat it like any other Game Object in your game, such as tweening it, scaling it, or enabling + * it for input or physics. It provides a quick and easy way for you to render this shape in your + * game without using a texture, while still taking advantage of being fully batched in WebGL. + * + * This shape supports both fill and stroke colors. + * + * The Triangle consists of 3 lines, joining up to form a triangular shape. You can control the + * position of each point of these lines. The triangle is always closed and cannot have an open + * face. If you require that, consider using a Polygon instead. + */ + class Triangle extends Phaser.GameObjects.Shape { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. Default 0. + * @param y The vertical position of this Game Object in the world. Default 0. + * @param x1 The horizontal position of the first point in the triangle. Default 0. + * @param y1 The vertical position of the first point in the triangle. Default 128. + * @param x2 The horizontal position of the second point in the triangle. Default 64. + * @param y2 The vertical position of the second point in the triangle. Default 0. + * @param x3 The horizontal position of the third point in the triangle. Default 128. + * @param y3 The vertical position of the third point in the triangle. Default 128. + * @param fillColor The color the triangle will be filled with, i.e. 0xff0000 for red. + * @param fillAlpha The alpha the triangle will be filled with. You can also set the alpha of the overall Shape using its `alpha` property. + */ + constructor(scene: Phaser.Scene, x?: number, y?: number, x1?: number, y1?: number, x2?: number, y2?: number, x3?: number, y3?: number, fillColor?: number, fillAlpha?: number); + + /** + * Sets the data for the lines that make up this Triangle shape. + * @param x1 The horizontal position of the first point in the triangle. Default 0. + * @param y1 The vertical position of the first point in the triangle. Default 0. + * @param x2 The horizontal position of the second point in the triangle. Default 0. + * @param y2 The vertical position of the second point in the triangle. Default 0. + * @param x3 The horizontal position of the third point in the triangle. Default 0. + * @param y3 The vertical position of the third point in the triangle. Default 0. + */ + setTo(x1?: number, y1?: number, x2?: number, y2?: number, x3?: number, y3?: number): this; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Sprite Game Object. + * + * A Sprite Game Object is used for the display of both static and animated images in your game. + * Sprites can have input events and physics bodies. They can also be tweened, tinted, scrolled + * and animated. + * + * The main difference between a Sprite and an Image Game Object is that you cannot animate Images. + * As such, Sprites take a fraction longer to process and have a larger API footprint due to the Animation + * Component. If you do not require animation then you can safely use Images to replace Sprites in all cases. + */ + class Sprite extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.TextureCrop, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number); + + /** + * The Animation State component of this Sprite. + * + * This component provides features to apply animations to this Sprite. + * It is responsible for playing, loading, queuing animations for later playback, + * mixing between animations and setting the current animation frame to this Sprite. + */ + anims: Phaser.Animations.AnimationState; + + /** + * Update this Sprite's animations. + * @param time The current timestamp. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + protected preUpdate(time: number, delta: number): void; + + /** + * Start playing the given animation on this Sprite. + * + * Animations in Phaser can either belong to the global Animation Manager, or specifically to this Sprite. + * + * The benefit of a global animation is that multiple Sprites can all play the same animation, without + * having to duplicate the data. You can just create it once and then play it on any Sprite. + * + * The following code shows how to create a global repeating animation. The animation will be created + * from all of the frames within the sprite sheet that was loaded with the key 'muybridge': + * + * ```javascript + * var config = { + * key: 'run', + * frames: 'muybridge', + * frameRate: 15, + * repeat: -1 + * }; + * + * // This code should be run from within a Scene: + * this.anims.create(config); + * ``` + * + * However, if you wish to create an animation that is unique to this Sprite, and this Sprite alone, + * you can call the `Animation.create` method instead. It accepts the exact same parameters as when + * creating a global animation, however the resulting data is kept locally in this Sprite. + * + * With the animation created, either globally or locally, you can now play it on this Sprite: + * + * ```javascript + * this.add.sprite(x, y).play('run'); + * ``` + * + * Alternatively, if you wish to run it at a different frame rate, for example, you can pass a config + * object instead: + * + * ```javascript + * this.add.sprite(x, y).play({ key: 'run', frameRate: 24 }); + * ``` + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * If you need a Sprite to be able to play both local and global animations, make sure they don't + * have conflicting keys. + * + * See the documentation for the `PlayAnimationConfig` config object for more details about this. + * + * Also, see the documentation in the Animation Manager for further details on creating animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If an animation is already playing then ignore this call. Default false. + */ + play(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): this; + + /** + * Start playing the given animation on this Sprite, in reverse. + * + * Animations in Phaser can either belong to the global Animation Manager, or specifically to this Sprite. + * + * The benefit of a global animation is that multiple Sprites can all play the same animation, without + * having to duplicate the data. You can just create it once and then play it on any Sprite. + * + * The following code shows how to create a global repeating animation. The animation will be created + * from all of the frames within the sprite sheet that was loaded with the key 'muybridge': + * + * ```javascript + * var config = { + * key: 'run', + * frames: 'muybridge', + * frameRate: 15, + * repeat: -1 + * }; + * + * // This code should be run from within a Scene: + * this.anims.create(config); + * ``` + * + * However, if you wish to create an animation that is unique to this Sprite, and this Sprite alone, + * you can call the `Animation.create` method instead. It accepts the exact same parameters as when + * creating a global animation, however the resulting data is kept locally in this Sprite. + * + * With the animation created, either globally or locally, you can now play it on this Sprite: + * + * ```javascript + * this.add.sprite(x, y).playReverse('run'); + * ``` + * + * Alternatively, if you wish to run it at a different frame rate, for example, you can pass a config + * object instead: + * + * ```javascript + * this.add.sprite(x, y).playReverse({ key: 'run', frameRate: 24 }); + * ``` + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * If you need a Sprite to be able to play both local and global animations, make sure they don't + * have conflicting keys. + * + * See the documentation for the `PlayAnimationConfig` config object for more details about this. + * + * Also, see the documentation in the Animation Manager for further details on creating animations. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param ignoreIfPlaying If an animation is already playing then ignore this call. Default false. + */ + playReverse(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, ignoreIfPlaying?: boolean): this; + + /** + * Waits for the specified delay, in milliseconds, then starts playback of the given animation. + * + * If the animation _also_ has a delay value set in its config, it will be **added** to the delay given here. + * + * If an animation is already running and a new animation is given to this method, it will wait for + * the given delay before starting the new animation. + * + * If no animation is currently running, the given one begins after the delay. + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * + * Prior to Phaser 3.50 this method was called 'delayedPlay'. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param delay The delay, in milliseconds, to wait before starting the animation playing. + */ + playAfterDelay(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, delay: number): this; + + /** + * Waits for the current animation to complete the `repeatCount` number of repeat cycles, then starts playback + * of the given animation. + * + * You can use this to ensure there are no harsh jumps between two sets of animations, i.e. going from an + * idle animation to a walking animation, by making them blend smoothly into each other. + * + * If no animation is currently running, the given one will start immediately. + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + * @param repeatCount How many times should the animation repeat before the next one starts? Default 1. + */ + playAfterRepeat(key: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig, repeatCount?: number): this; + + /** + * Sets an animation, or an array of animations, to be played immediately after the current one completes or stops. + * + * The current animation must enter a 'completed' state for this to happen, i.e. finish all of its repeats, delays, etc, + * or have the `stop` method called directly on it. + * + * An animation set to repeat forever will never enter a completed state. + * + * You can chain a new animation at any point, including before the current one starts playing, during it, + * or when it ends (via its `animationcomplete` event). + * + * Chained animations are specific to a Game Object, meaning different Game Objects can have different chained + * animations without impacting the animation they're playing. + * + * Call this method with no arguments to reset all currently chained animations. + * + * When playing an animation on a Sprite it will first check to see if it can find a matching key + * locally within the Sprite. If it can, it will play the local animation. If not, it will then + * search the global Animation Manager and look for it there. + * @param key The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object, or an array of them. + */ + chain(key?: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig | string[] | Phaser.Animations.Animation[] | Phaser.Types.Animations.PlayAnimationConfig[]): this; + + /** + * Immediately stops the current animation from playing and dispatches the `ANIMATION_STOP` events. + * + * If no animation is playing, no event will be dispatched. + * + * If there is another animation queued (via the `chain` method) then it will start playing immediately. + */ + stop(): this; + + /** + * Stops the current animation from playing after the specified time delay, given in milliseconds. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param delay The number of milliseconds to wait before stopping this animation. + */ + stopAfterDelay(delay: number): this; + + /** + * Stops the current animation from playing after the given number of repeats. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param repeatCount How many times should the animation repeat before stopping? Default 1. + */ + stopAfterRepeat(repeatCount?: number): this; + + /** + * Stops the current animation from playing when it next sets the given frame. + * If this frame doesn't exist within the animation it will not stop it from playing. + * + * It then dispatches the `ANIMATION_STOP` event. + * + * If no animation is running, no events will be dispatched. + * + * If there is another animation in the queue (set via the `chain` method) then it will start playing, + * when the current one stops. + * @param frame The frame to check before stopping this animation. + */ + stopOnFrame(frame: Phaser.Animations.AnimationFrame): this; + + /** + * Build a JSON representation of this Sprite. + */ + toJSON(): Phaser.Types.GameObjects.JSONGameObject; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * Returns an object containing dimensions of the Text object. + * @param text The Text object to calculate the size from. + * @param size The Text metrics to use when calculating the size. + * @param lines The lines of text to calculate the size from. + */ + function GetTextSize(text: Phaser.GameObjects.Text, size: Phaser.Types.GameObjects.Text.TextMetrics, lines: string[]): Phaser.Types.GameObjects.Text.GetTextSizeObject; + + /** + * Calculates the ascent, descent and fontSize of a given font style. + * @param textStyle The TextStyle object to measure. + */ + function MeasureText(textStyle: Phaser.GameObjects.TextStyle): Phaser.Types.GameObjects.Text.TextMetrics; + + /** + * A Text Game Object. + * + * Text objects work by creating their own internal hidden Canvas and then renders text to it using + * the standard Canvas `fillText` API. It then creates a texture from this canvas which is rendered + * to your game during the render pass. + * + * Because it uses the Canvas API you can take advantage of all the features this offers, such as + * applying gradient fills to the text, or strokes, shadows and more. You can also use custom fonts + * loaded externally, such as Google or TypeKit Web fonts. + * + * **Important:** The font name must be quoted if it contains certain combinations of digits or + * special characters, either when creating the Text object, or when setting the font via `setFont` + * or `setFontFamily`, e.g.: + * + * ```javascript + * this.add.text(0, 0, 'Hello World', { fontFamily: 'Georgia, "Goudy Bookletter 1911", Times, serif' }); + * ``` + * + * ```javascript + * this.add.text(0, 0, 'Hello World', { font: '"Press Start 2P"' }); + * ``` + * + * You can only display fonts that are currently loaded and available to the browser: therefore fonts must + * be pre-loaded. Phaser does not do this for you, so you will require the use of a 3rd party font loader, + * or have the fonts ready available in the CSS on the page in which your Phaser game resides. + * + * See {@link http://www.jordanm.co.uk/tinytype this compatibility table} for the available default fonts + * across mobile browsers. + * + * A note on performance: Every time the contents of a Text object changes, i.e. changing the text being + * displayed, or the style of the text, it needs to remake the Text canvas, and if on WebGL, re-upload the + * new texture to the GPU. This can be an expensive operation if used often, or with large quantities of + * Text objects in your game. If you run into performance issues you would be better off using Bitmap Text + * instead, as it benefits from batching and avoids expensive Canvas API calls. + */ + class Text extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.ComputedSize, Phaser.GameObjects.Components.Crop, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param text The text this Text object will display. + * @param style The text style configuration object. + */ + constructor(scene: Phaser.Scene, x: number, y: number, text: string | string[], style: Phaser.Types.GameObjects.Text.TextStyle); + + /** + * The renderer in use by this Text object. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The canvas element that the text is rendered to. + */ + canvas: HTMLCanvasElement; + + /** + * The context of the canvas element that the text is rendered to. + */ + context: CanvasRenderingContext2D; + + /** + * The Text Style object. + * + * Manages the style of this Text object. + */ + style: Phaser.GameObjects.TextStyle; + + /** + * Whether to automatically round line positions. + */ + autoRound: boolean; + + /** + * The Regular Expression that is used to split the text up into lines, in + * multi-line text. By default this is `/(?:\r\n|\r|\n)/`. + * You can change this RegExp to be anything else that you may need. + */ + splitRegExp: object; + + /** + * Specify a padding value which is added to the line width and height when calculating the Text size. + * Allows you to add extra spacing if the browser is unable to accurately determine the true font dimensions. + */ + padding: Phaser.Types.GameObjects.Text.TextPadding; + + /** + * The width of this Text object. + */ + width: number; + + /** + * The height of this Text object. + */ + height: number; + + /** + * The line spacing value. + * This value is added to the font height to calculate the overall line height. + * Only has an effect if this Text object contains multiple lines of text. + * + * If you update this property directly, instead of using the `setLineSpacing` method, then + * be sure to call `updateText` after, or you won't see the change reflected in the Text object. + */ + lineSpacing: number; + + /** + * Adds / Removes spacing between characters. + * Can be a negative or positive number. + * + * If you update this property directly, instead of using the `setLetterSpacing` method, then + * be sure to call `updateText` after, or you won't see the change reflected in the Text object. + */ + letterSpacing: number; + + /** + * Initialize right to left text. + */ + initRTL(): void; + + /** + * Greedy wrapping algorithm that will wrap words as the line grows longer than its horizontal + * bounds. + * @param text The text to perform word wrap detection against. + */ + runWordWrap(text: string): string; + + /** + * Advanced wrapping algorithm that will wrap words as the line grows longer than its horizontal + * bounds. Consecutive spaces will be collapsed and replaced with a single space. Lines will be + * trimmed of white space before processing. Throws an error if wordWrapWidth is less than a + * single character. + * @param text The text to perform word wrap detection against. + * @param context The Canvas Rendering Context. + * @param wordWrapWidth The word wrap width. + */ + advancedWordWrap(text: string, context: CanvasRenderingContext2D, wordWrapWidth: number): string; + + /** + * Greedy wrapping algorithm that will wrap words as the line grows longer than its horizontal + * bounds. Spaces are not collapsed and whitespace is not trimmed. + * @param text The text to perform word wrap detection against. + * @param context The Canvas Rendering Context. + * @param wordWrapWidth The word wrap width. + */ + basicWordWrap(text: string, context: CanvasRenderingContext2D, wordWrapWidth: number): string; + + /** + * Runs the given text through this Text objects word wrapping and returns the results as an + * array, where each element of the array corresponds to a wrapped line of text. + * @param text The text for which the wrapping will be calculated. If unspecified, the Text objects current text will be used. + */ + getWrappedText(text?: string): string[]; + + /** + * Set the text to display. + * + * An array of strings will be joined with `\n` line breaks. + * @param value The string, or array of strings, to be set as the content of this Text object. + */ + setText(value: string | string[]): this; + + /** + * Appends the given text to the content already being displayed by this Text object. + * + * An array of strings will be joined with `\n` line breaks. + * @param value The string, or array of strings, to be appended to the existing content of this Text object. + * @param addCR Insert a carriage-return before the string value. Default true. + */ + appendText(value: string | string[], addCR?: boolean): this; + + /** + * Set the text style. + * @param style The style settings to set. + */ + setStyle(style: object): this; + + /** + * Set the font. + * + * If a string is given, the font family is set. + * + * If an object is given, the `fontFamily`, `fontSize` and `fontStyle` + * properties of that object are set. + * + * **Important:** The font name must be quoted if it contains certain combinations of digits or + * special characters: + * + * ```javascript + * Text.setFont('"Press Start 2P"'); + * ``` + * + * Equally, if you wish to provide a list of fallback fonts, then you should ensure they are all + * quoted properly, too: + * + * ```javascript + * Text.setFont('Georgia, "Goudy Bookletter 1911", Times, serif'); + * ``` + * @param font The font family or font settings to set. + */ + setFont(font: string): this; + + /** + * Set the font family. + * + * **Important:** The font name must be quoted if it contains certain combinations of digits or + * special characters: + * + * ```javascript + * Text.setFont('"Press Start 2P"'); + * ``` + * + * Equally, if you wish to provide a list of fallback fonts, then you should ensure they are all + * quoted properly, too: + * + * ```javascript + * Text.setFont('Georgia, "Goudy Bookletter 1911", Times, serif'); + * ``` + * @param family The font family. + */ + setFontFamily(family: string): this; + + /** + * Set the font size. Can be a string with a valid CSS unit, i.e. `16px`, or a number. + * @param size The font size. + */ + setFontSize(size: string | number): this; + + /** + * Set the font style. + * @param style The font style. + */ + setFontStyle(style: string): this; + + /** + * Set a fixed width and height for the text. + * + * Pass in `0` for either of these parameters to disable fixed width or height respectively. + * @param width The fixed width to set. `0` disables fixed width. + * @param height The fixed height to set. `0` disables fixed height. + */ + setFixedSize(width: number, height: number): this; + + /** + * Set the background color. + * @param color The background color. + */ + setBackgroundColor(color: string): this; + + /** + * Set the fill style to be used by the Text object. + * + * This can be any valid CanvasRenderingContext2D fillStyle value, such as + * a color (in hex, rgb, rgba, hsl or named values), a gradient or a pattern. + * + * See the [MDN fillStyle docs](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/fillStyle) for more details. + * @param color The text fill style. Can be any valid CanvasRenderingContext `fillStyle` value. + */ + setFill(color: string | CanvasGradient | CanvasPattern): this; + + /** + * Set the text fill color. + * @param color The text fill color. + */ + setColor(color: string | CanvasGradient | CanvasPattern): this; + + /** + * Set the stroke settings. + * @param color The stroke color. + * @param thickness The stroke thickness. + */ + setStroke(color: string | CanvasGradient | CanvasPattern, thickness: number): this; + + /** + * Set the shadow settings. + * @param x The horizontal shadow offset. Default 0. + * @param y The vertical shadow offset. Default 0. + * @param color The shadow color. Default '#000'. + * @param blur The shadow blur radius. Default 0. + * @param shadowStroke Whether to stroke the shadow. Default false. + * @param shadowFill Whether to fill the shadow. Default true. + */ + setShadow(x?: number, y?: number, color?: string, blur?: number, shadowStroke?: boolean, shadowFill?: boolean): this; + + /** + * Set the shadow offset. + * @param x The horizontal shadow offset. + * @param y The vertical shadow offset. + */ + setShadowOffset(x: number, y: number): this; + + /** + * Set the shadow color. + * @param color The shadow color. + */ + setShadowColor(color: string): this; + + /** + * Set the shadow blur radius. + * @param blur The shadow blur radius. + */ + setShadowBlur(blur: number): this; + + /** + * Enable or disable shadow stroke. + * @param enabled Whether shadow stroke is enabled or not. + */ + setShadowStroke(enabled: boolean): this; + + /** + * Enable or disable shadow fill. + * @param enabled Whether shadow fill is enabled or not. + */ + setShadowFill(enabled: boolean): this; + + /** + * Set the width (in pixels) to use for wrapping lines. Pass in null to remove wrapping by width. + * @param width The maximum width of a line in pixels. Set to null to remove wrapping. + * @param useAdvancedWrap Whether or not to use the advanced wrapping + * algorithm. If true, spaces are collapsed and whitespace is trimmed from lines. If false, + * spaces and whitespace are left as is. Default false. + */ + setWordWrapWidth(width: number | undefined, useAdvancedWrap?: boolean): this; + + /** + * Set a custom callback for wrapping lines. Pass in null to remove wrapping by callback. + * @param callback A custom function that will be responsible for wrapping the + * text. It will receive two arguments: text (the string to wrap), textObject (this Text + * instance). It should return the wrapped lines either as an array of lines or as a string with + * newline characters in place to indicate where breaks should happen. + * @param scope The scope that will be applied when the callback is invoked. Default null. + */ + setWordWrapCallback(callback: TextStyleWordWrapCallback, scope?: object): this; + + /** + * Set the alignment of the text in this Text object. + * + * The argument can be one of: `left`, `right`, `center` or `justify`. + * + * Alignment only works if the Text object has more than one line of text. + * @param align The text alignment for multi-line text. Default 'left'. + */ + setAlign(align?: string): this; + + /** + * Set the resolution used by this Text object. + * + * It allows for much clearer text on High DPI devices, at the cost of memory because it uses larger + * internal Canvas textures for the Text. + * + * Therefore, please use with caution, as the more high res Text you have, the more memory it uses. + * @param value The resolution for this Text object to use. + */ + setResolution(value: number): this; + + /** + * Sets the line spacing value. + * + * This value is _added_ to the height of the font when calculating the overall line height. + * This only has an effect if this Text object consists of multiple lines of text. + * @param value The amount to add to the font height to achieve the overall line height. + */ + setLineSpacing(value: number): this; + + /** + * Sets the letter spacing value. + * + * This will add, or remove spacing between each character of this Text Game Object. The value can be + * either positive or negative. Positive values increase the space between each character, whilst negative + * values decrease it. Note that some fonts are spaced naturally closer together than others. + * + * Please understand that enabling this feature will cause Phaser to render each character in this Text object + * one by one, rather than use a draw for the whole string. This makes it extremely expensive when used with + * either long strings, or lots of strings in total. You will be better off creating bitmap font text if you + * need to display large quantities of characters with fine control over the letter spacing. + * @param value The amount to add to the letter width. Set to zero to disable. + */ + setLetterSpacing(value: number): this; + + /** + * Set the text padding. + * + * 'left' can be an object. + * + * If only 'left' and 'top' are given they are treated as 'x' and 'y'. + * @param left The left padding value, or a padding config object. + * @param top The top padding value. + * @param right The right padding value. + * @param bottom The bottom padding value. + */ + setPadding(left: number | Phaser.Types.GameObjects.Text.TextPadding, top?: number, right?: number, bottom?: number): this; + + /** + * Set the maximum number of lines to draw. + * @param max The maximum number of lines to draw. Default 0. + */ + setMaxLines(max?: number): this; + + /** + * Render text from right-to-left or left-to-right. + * @param rtl Set to `true` to render from right-to-left. Default true. + */ + setRTL(rtl?: boolean): this; + + /** + * Update the displayed text. + */ + updateText(): this; + + /** + * Get the current text metrics. + */ + getTextMetrics(): Phaser.Types.GameObjects.Text.TextMetrics; + + /** + * The text string being rendered by this Text Game Object. + */ + text: string; + + /** + * Build a JSON representation of the Text object. + */ + toJSON(): Phaser.Types.GameObjects.JSONGameObject; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A TextStyle class manages all of the style settings for a Text object. + * + * Text Game Objects create a TextStyle instance automatically, which is + * accessed via the `Text.style` property. You do not normally need to + * instantiate one yourself. + */ + class TextStyle { + /** + * + * @param text The Text object that this TextStyle is styling. + * @param style The style settings to set. + */ + constructor(text: Phaser.GameObjects.Text, style: Phaser.Types.GameObjects.Text.TextStyle); + + /** + * The Text object that this TextStyle is styling. + */ + parent: Phaser.GameObjects.Text; + + /** + * The font family. + */ + fontFamily: string; + + /** + * The font size. + */ + fontSize: string | number; + + /** + * The font style. + */ + fontStyle: string; + + /** + * The background color. + */ + backgroundColor: string; + + /** + * The text fill color. + */ + color: string | CanvasGradient | CanvasPattern; + + /** + * The text stroke color. + */ + stroke: string | CanvasGradient | CanvasPattern; + + /** + * The text stroke thickness. + */ + strokeThickness: number; + + /** + * The horizontal shadow offset. + */ + shadowOffsetX: number; + + /** + * The vertical shadow offset. + */ + shadowOffsetY: number; + + /** + * The shadow color. + */ + shadowColor: string; + + /** + * The shadow blur radius. + */ + shadowBlur: number; + + /** + * Whether shadow stroke is enabled or not. + */ + shadowStroke: boolean; + + /** + * Whether shadow fill is enabled or not. + */ + shadowFill: boolean; + + /** + * The text alignment. + */ + align: string; + + /** + * The maximum number of lines to draw. + */ + maxLines: number; + + /** + * The fixed width of the text. + * + * `0` means no fixed with. + */ + fixedWidth: number; + + /** + * The fixed height of the text. + * + * `0` means no fixed height. + */ + fixedHeight: number; + + /** + * The resolution the text is rendered to its internal canvas at. + * The default is 0, which means it will use the resolution set in the Game Config. + */ + resolution: number; + + /** + * Whether the text should render right to left. + */ + rtl: boolean; + + /** + * The test string to use when measuring the font. + */ + testString: string; + + /** + * The amount of horizontal padding added to the width of the text when calculating the font metrics. + */ + baselineX: number; + + /** + * The amount of vertical padding added to the height of the text when calculating the font metrics. + */ + baselineY: number; + + /** + * The maximum width of a line of text in pixels. Null means no line wrapping. Setting this + * property directly will not re-run the word wrapping algorithm. To change the width and + * re-wrap, use {@link Phaser.GameObjects.TextStyle#setWordWrapWidth}. + */ + wordWrapWidth: number | null; + + /** + * A custom function that will be responsible for wrapping the text. It will receive two + * arguments: text (the string to wrap), textObject (this Text instance). It should return + * the wrapped lines either as an array of lines or as a string with newline characters in + * place to indicate where breaks should happen. Setting this directly will not re-run the + * word wrapping algorithm. To change the callback and re-wrap, use + * {@link Phaser.GameObjects.TextStyle#setWordWrapCallback}. + */ + wordWrapCallback: TextStyleWordWrapCallback | null; + + /** + * The scope that will be applied when the wordWrapCallback is invoked. Setting this directly will not re-run the + * word wrapping algorithm. To change the callback and re-wrap, use + * {@link Phaser.GameObjects.TextStyle#setWordWrapCallback}. + */ + wordWrapCallbackScope: object | null; + + /** + * Whether or not to use the advanced wrapping algorithm. If true, spaces are collapsed and + * whitespace is trimmed from lines. If false, spaces and whitespace are left as is. Setting + * this property directly will not re-run the word wrapping algorithm. To change the + * advanced setting and re-wrap, use {@link Phaser.GameObjects.TextStyle#setWordWrapWidth}. + */ + wordWrapUseAdvanced: boolean; + + /** + * Set the text style. + * @param style The style settings to set. + * @param updateText Whether to update the text immediately. Default true. + * @param setDefaults Use the default values is not set, or the local values. Default false. + */ + setStyle(style: Phaser.Types.GameObjects.Text.TextStyle, updateText?: boolean, setDefaults?: boolean): Phaser.GameObjects.Text; + + /** + * Synchronize the font settings to the given Canvas Rendering Context. + * @param canvas The Canvas Element. + * @param context The Canvas Rendering Context. + */ + syncFont(canvas: HTMLCanvasElement, context: CanvasRenderingContext2D): void; + + /** + * Synchronize the text style settings to the given Canvas Rendering Context. + * @param canvas The Canvas Element. + * @param context The Canvas Rendering Context. + */ + syncStyle(canvas: HTMLCanvasElement, context: CanvasRenderingContext2D): void; + + /** + * Synchronize the shadow settings to the given Canvas Rendering Context. + * @param context The Canvas Rendering Context. + * @param enabled Whether shadows are enabled or not. + */ + syncShadow(context: CanvasRenderingContext2D, enabled: boolean): void; + + /** + * Update the style settings for the parent Text object. + * @param recalculateMetrics Whether to recalculate font and text metrics. + */ + update(recalculateMetrics: boolean): Phaser.GameObjects.Text; + + /** + * Set the font. + * + * If a string is given, the font family is set. + * + * If an object is given, the `fontFamily`, `fontSize` and `fontStyle` + * properties of that object are set. + * @param font The font family or font settings to set. + * @param updateText Whether to update the text immediately. Default true. + */ + setFont(font: string | object, updateText?: boolean): Phaser.GameObjects.Text; + + /** + * Set the font family. + * @param family The font family. + */ + setFontFamily(family: string): Phaser.GameObjects.Text; + + /** + * Set the font style. + * @param style The font style. + */ + setFontStyle(style: string): Phaser.GameObjects.Text; + + /** + * Set the font size. Can be a string with a valid CSS unit, i.e. `16px`, or a number. + * @param size The font size. + */ + setFontSize(size: number | string): Phaser.GameObjects.Text; + + /** + * Set the test string to use when measuring the font. + * @param string The test string to use when measuring the font. + */ + setTestString(string: string): Phaser.GameObjects.Text; + + /** + * Set a fixed width and height for the text. + * + * Pass in `0` for either of these parameters to disable fixed width or height respectively. + * @param width The fixed width to set. + * @param height The fixed height to set. + */ + setFixedSize(width: number, height: number): Phaser.GameObjects.Text; + + /** + * Set the background color. + * @param color The background color. + */ + setBackgroundColor(color: string): Phaser.GameObjects.Text; + + /** + * Set the text fill color. + * @param color The text fill color. + */ + setFill(color: string | CanvasGradient | CanvasPattern): Phaser.GameObjects.Text; + + /** + * Set the text fill color. + * @param color The text fill color. + */ + setColor(color: string | CanvasGradient | CanvasPattern): Phaser.GameObjects.Text; + + /** + * Set the resolution used by the Text object. + * + * It allows for much clearer text on High DPI devices, at the cost of memory because + * it uses larger internal Canvas textures for the Text. + * + * Please use with caution, as the more high res Text you have, the more memory it uses up. + * @param value The resolution for this Text object to use. + */ + setResolution(value: number): Phaser.GameObjects.Text; + + /** + * Set the stroke settings. + * @param color The stroke color. + * @param thickness The stroke thickness. + */ + setStroke(color: string | CanvasGradient | CanvasPattern, thickness: number): Phaser.GameObjects.Text; + + /** + * Set the shadow settings. + * + * Calling this method always re-measures the parent Text object, + * so only call it when you actually change the shadow settings. + * @param x The horizontal shadow offset. Default 0. + * @param y The vertical shadow offset. Default 0. + * @param color The shadow color. Default '#000'. + * @param blur The shadow blur radius. Default 0. + * @param shadowStroke Whether to stroke the shadow. Default false. + * @param shadowFill Whether to fill the shadow. Default true. + */ + setShadow(x?: number, y?: number, color?: string, blur?: number, shadowStroke?: boolean, shadowFill?: boolean): Phaser.GameObjects.Text; + + /** + * Set the shadow offset. + * @param x The horizontal shadow offset. Default 0. + * @param y The vertical shadow offset. Default 0. + */ + setShadowOffset(x?: number, y?: number): Phaser.GameObjects.Text; + + /** + * Set the shadow color. + * @param color The shadow color. Default '#000'. + */ + setShadowColor(color?: string): Phaser.GameObjects.Text; + + /** + * Set the shadow blur radius. + * @param blur The shadow blur radius. Default 0. + */ + setShadowBlur(blur?: number): Phaser.GameObjects.Text; + + /** + * Enable or disable shadow stroke. + * @param enabled Whether shadow stroke is enabled or not. + */ + setShadowStroke(enabled: boolean): Phaser.GameObjects.Text; + + /** + * Enable or disable shadow fill. + * @param enabled Whether shadow fill is enabled or not. + */ + setShadowFill(enabled: boolean): Phaser.GameObjects.Text; + + /** + * Set the width (in pixels) to use for wrapping lines. + * + * Pass in null to remove wrapping by width. + * @param width The maximum width of a line in pixels. Set to null to remove wrapping. + * @param useAdvancedWrap Whether or not to use the advanced wrapping + * algorithm. If true, spaces are collapsed and whitespace is trimmed from lines. If false, + * spaces and whitespace are left as is. Default false. + */ + setWordWrapWidth(width: number, useAdvancedWrap?: boolean): Phaser.GameObjects.Text; + + /** + * Set a custom callback for wrapping lines. + * + * Pass in null to remove wrapping by callback. + * @param callback A custom function that will be responsible for wrapping the + * text. It will receive two arguments: text (the string to wrap), textObject (this Text + * instance). It should return the wrapped lines either as an array of lines or as a string with + * newline characters in place to indicate where breaks should happen. + * @param scope The scope that will be applied when the callback is invoked. Default null. + */ + setWordWrapCallback(callback: TextStyleWordWrapCallback, scope?: object): Phaser.GameObjects.Text; + + /** + * Set the alignment of the text in this Text object. + * + * The argument can be one of: `left`, `right`, `center` or `justify`. + * + * Alignment only works if the Text object has more than one line of text. + * @param align The text alignment for multi-line text. Default 'left'. + */ + setAlign(align?: string): Phaser.GameObjects.Text; + + /** + * Set the maximum number of lines to draw. + * @param max The maximum number of lines to draw. Default 0. + */ + setMaxLines(max?: number): Phaser.GameObjects.Text; + + /** + * Get the current text metrics. + */ + getTextMetrics(): Phaser.Types.GameObjects.Text.TextMetrics; + + /** + * Build a JSON representation of this Text Style. + */ + toJSON(): object; + + /** + * Destroy this Text Style. + */ + destroy(): void; + + } + + /** + * A TileSprite is a Sprite that has a repeating texture. + * + * The texture can be scrolled and scaled independently of the TileSprite itself. Textures will automatically wrap and + * are designed so that you can create game backdrops using seamless textures as a source. + * + * You shouldn't ever create a TileSprite any larger than your actual canvas size. If you want to create a large repeating background + * that scrolls across the whole map of your game, then you create a TileSprite that fits the canvas size and then use the `tilePosition` + * property to scroll the texture as the player moves. If you create a TileSprite that is thousands of pixels in size then it will + * consume huge amounts of memory and cause performance issues. Remember: use `tilePosition` to scroll your texture and `tileScale` to + * adjust the scale of the texture - don't resize the sprite itself or make it larger than it needs. + * + * An important note about Tile Sprites and NPOT textures: Internally, TileSprite textures use GL_REPEAT to provide + * seamless repeating of the textures. This, combined with the way in which the textures are handled in WebGL, means + * they need to be POT (power-of-two) sizes in order to wrap. If you provide a NPOT (non power-of-two) texture to a + * TileSprite it will generate a POT sized canvas and draw your texture to it, scaled up to the POT size. It's then + * scaled back down again during rendering to the original dimensions. While this works, in that it allows you to use + * any size texture for a Tile Sprite, it does mean that NPOT textures are going to appear anti-aliased when rendered, + * due to the interpolation that took place when it was resized into a POT texture. This is especially visible in + * pixel art graphics. If you notice it and it becomes an issue, the only way to avoid it is to ensure that you + * provide POT textures for Tile Sprites. + */ + class TileSprite extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.ComputedSize, Phaser.GameObjects.Components.Crop, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param width The width of the Game Object. If zero it will use the size of the texture frame. + * @param height The height of the Game Object. If zero it will use the size of the texture frame. + * @param textureKey The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. Cannot be a DynamicTexture. + * @param frameKey An optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, x: number, y: number, width: number, height: number, textureKey: string, frameKey?: string | number); + + /** + * Whether the Tile Sprite has changed in some way, requiring an re-render of its tile texture. + * + * Such changes include the texture frame and scroll position of the Tile Sprite. + */ + dirty: boolean; + + /** + * The renderer in use by this Tile Sprite. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The Canvas element that the TileSprite renders its fill pattern in to. + * Only used in Canvas mode. + */ + canvas: HTMLCanvasElement | null; + + /** + * The Context of the Canvas element that the TileSprite renders its fill pattern in to. + * Only used in Canvas mode. + */ + context: CanvasRenderingContext2D; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * The next power of two value from the width of the Fill Pattern frame. + */ + potWidth: number; + + /** + * The next power of two value from the height of the Fill Pattern frame. + */ + potHeight: number; + + /** + * The Canvas that the TileSprites texture is rendered to. + * This is used to create a WebGL texture from. + */ + fillCanvas: HTMLCanvasElement; + + /** + * The Canvas Context used to render the TileSprites texture. + */ + fillContext: CanvasRenderingContext2D; + + /** + * The texture that the Tile Sprite is rendered to, which is then rendered to a Scene. + * In WebGL this is a WebGLTextureWrapper. In Canvas it's a Canvas Fill Pattern. + */ + fillPattern: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | CanvasPattern | null; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * The Frame has to belong to the current Texture being used. + * + * It can be either a string or an index. + * @param frame The name or index of the frame within the Texture. + */ + setFrame(frame: string | number): this; + + /** + * Sets {@link Phaser.GameObjects.TileSprite#tilePositionX} and {@link Phaser.GameObjects.TileSprite#tilePositionY}. + * @param x The x position of this sprite's tiling texture. + * @param y The y position of this sprite's tiling texture. + */ + setTilePosition(x?: number, y?: number): this; + + /** + * Sets {@link Phaser.GameObjects.TileSprite#tileScaleX} and {@link Phaser.GameObjects.TileSprite#tileScaleY}. + * @param x The horizontal scale of the tiling texture. If not given it will use the current `tileScaleX` value. + * @param y The vertical scale of the tiling texture. If not given it will use the `x` value. Default x. + */ + setTileScale(x?: number, y?: number): this; + + /** + * Internal destroy handler, called as part of the destroy process. + */ + protected preDestroy(): void; + + /** + * The horizontal scroll position of the Tile Sprite. + */ + tilePositionX: number; + + /** + * The vertical scroll position of the Tile Sprite. + */ + tilePositionY: number; + + /** + * The horizontal scale of the Tile Sprite texture. + */ + tileScaleX: number; + + /** + * The vertical scale of the Tile Sprite texture. + */ + tileScaleY: number; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * The Update List plugin. + * + * Update Lists belong to a Scene and maintain the list Game Objects to be updated every frame. + * + * Some or all of these Game Objects may also be part of the Scene's [Display List]{@link Phaser.GameObjects.DisplayList}, for Rendering. + */ + class UpdateList extends Phaser.Structs.ProcessQueue { + /** + * + * @param scene The Scene that the Update List belongs to. + */ + constructor(scene: Phaser.Scene); + + /** + * The Scene that the Update List belongs to. + */ + scene: Phaser.Scene; + + /** + * The Scene's Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * The update step. + * + * Pre-updates every active Game Object in the list. + * @param time The current timestamp. + * @param delta The delta time elapsed since the last frame. + */ + sceneUpdate(time: number, delta: number): void; + + /** + * The Scene that owns this plugin is shutting down. + * + * We need to kill and reset all internal properties as well as stop listening to Scene events. + */ + shutdown(): void; + + /** + * The Scene that owns this plugin is being destroyed. + * + * We need to shutdown and then kill off all external references. + */ + destroy(): void; + + } + + /** + * A Video Game Object. + * + * This Game Object is capable of handling playback of a video file, video stream or media stream. + * + * You can optionally 'preload' the video into the Phaser Video Cache: + * + * ```javascript + * preload () { + * this.load.video('ripley', 'assets/aliens.mp4'); + * } + * + * create () { + * this.add.video(400, 300, 'ripley'); + * } + * ``` + * + * You don't have to 'preload' the video. You can also play it directly from a URL: + * + * ```javascript + * create () { + * this.add.video(400, 300).loadURL('assets/aliens.mp4'); + * } + * ``` + * + * To all intents and purposes, a video is a standard Game Object, just like a Sprite. And as such, you can do + * all the usual things to it, such as scaling, rotating, cropping, tinting, making interactive, giving a + * physics body, etc. + * + * Transparent videos are also possible via the WebM file format. Providing the video file has was encoded with + * an alpha channel, and providing the browser supports WebM playback (not all of them do), then it will render + * in-game with full transparency. + * + * Playback is handled entirely via the Request Video Frame API, which is supported by most modern browsers. + * A polyfill is provided for older browsers. + * + * ### Autoplaying Videos + * + * Videos can only autoplay if the browser has been unlocked with an interaction, or satisfies the MEI settings. + * The policies that control autoplaying are vast and vary between browser. You can, and should, read more about + * it here: https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide + * + * If your video doesn't contain any audio, then set the `noAudio` parameter to `true` when the video is _loaded_, + * and it will often allow the video to play immediately: + * + * ```javascript + * preload () { + * this.load.video('pixar', 'nemo.mp4', true); + * } + * ``` + * + * The 3rd parameter in the load call tells Phaser that the video doesn't contain any audio tracks. Video without + * audio can autoplay without requiring a user interaction. Video with audio cannot do this unless it satisfies + * the browsers MEI settings. See the MDN Autoplay Guide for further details. + * + * Or: + * + * ```javascript + * create () { + * this.add.video(400, 300).loadURL('assets/aliens.mp4', true); + * } + * ``` + * + * You can set the `noAudio` parameter to `true` even if the video does contain audio. It will still allow the video + * to play immediately, but the audio will not start. + * + * Note that due to a bug in IE11 you cannot play a video texture to a Sprite in WebGL. For IE11 force Canvas mode. + * + * More details about video playback and the supported media formats can be found on MDN: + * + * https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement + * https://developer.mozilla.org/en-US/docs/Web/Media/Formats + */ + class Video extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.ComputedSize, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.TextureCrop, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param key Optional key of the Video this Game Object will play, as stored in the Video Cache. + */ + constructor(scene: Phaser.Scene, x: number, y: number, key?: string); + + /** + * A reference to the HTML Video Element this Video Game Object is playing. + * + * Will be `undefined` until a video is loaded for playback. + */ + video: HTMLVideoElement | null; + + /** + * The Phaser Texture this Game Object is using to render the video to. + * + * Will be `undefined` until a video is loaded for playback. + */ + videoTexture: Phaser.Textures.Texture | null; + + /** + * A reference to the TextureSource backing the `videoTexture` Texture object. + * + * Will be `undefined` until a video is loaded for playback. + */ + videoTextureSource: Phaser.Textures.TextureSource | null; + + /** + * A Phaser `CanvasTexture` instance that holds the most recent snapshot taken from the video. + * + * This will only be set if the `snapshot` or `snapshotArea` methods have been called. + * + * Until those methods are called, this property will be `undefined`. + */ + snapshotTexture: Phaser.Textures.CanvasTexture | null; + + /** + * If you have saved this video to a texture via the `saveTexture` method, this controls if the video + * is rendered with `flipY` in WebGL or not. You often need to set this if you wish to use the video texture + * as the input source for a shader. If you find your video is appearing upside down within a shader or + * custom pipeline, flip this property. + */ + flipY: boolean; + + /** + * An internal flag holding the current state of the video lock, should document interaction be required + * before playback can begin. + */ + readonly touchLocked: boolean; + + /** + * Should the video auto play when document interaction is required and happens? + */ + playWhenUnlocked: boolean; + + /** + * Has the video created its texture and populated it with the first frame of video? + */ + frameReady: boolean; + + /** + * This read-only property returns `true` if the video is currently stalled, i.e. it has stopped + * playing due to a lack of data, or too much data, but hasn't yet reached the end of the video. + * + * This is set if the Video DOM element emits any of the following events: + * + * `stalled` + * `suspend` + * `waiting` + * + * And is cleared if the Video DOM element emits the `playing` event, or handles + * a requestVideoFrame call. + * + * Listen for the Phaser Event `VIDEO_STALLED` to be notified and inspect the event + * to see which DOM event caused it. + * + * Note that being stalled isn't always a negative thing. A video can be stalled if it + * has downloaded enough data in to its buffer to not need to download any more until + * the current batch of frames have rendered. + */ + readonly isStalled: boolean; + + /** + * Records the number of times the video has failed to play, + * typically because the user hasn't interacted with the page yet. + */ + failedPlayAttempts: number; + + /** + * If the browser supports the Request Video Frame API then this + * property will hold the metadata that is returned from + * the callback each time it is invoked. + * + * See https://wicg.github.io/video-rvfc/#video-frame-metadata-callback + * for a complete list of all properties that will be in this object. + * Likely of most interest is the `mediaTime` property: + * + * The media presentation timestamp (PTS) in seconds of the frame presented + * (e.g. its timestamp on the video.currentTime timeline). MAY have a zero + * value for live-streams or WebRTC applications. + * + * If the browser doesn't support the API then this property will be undefined. + */ + metadata: VideoFrameCallbackMetadata; + + /** + * The current retry elapsed time. + */ + retry: number; + + /** + * If a video fails to play due to a lack of user interaction, this is the + * amount of time, in ms, that the video will wait before trying again to + * play. The default is 500ms. + */ + retryInterval: number; + + /** + * An object containing in and out markers for sequence playback. + */ + markers: any; + + /** + * The key of the current video as stored in the Video cache. + * + * If the video did not come from the cache this will be an empty string. + */ + readonly cacheKey: string; + + /** + * Is the video currently seeking? + * + * This is set to `true` when the `seeking` event is fired, + * and set to `false` when the `seeked` event is fired. + */ + readonly isSeeking: boolean; + + /** + * Loads a Video from the Video Cache, ready for playback with the `Video.play` method. + * + * If a video is already playing, this method allows you to change the source of the current video element. + * It works by first stopping the current video and then starts playback of the new source through the existing video element. + * + * The reason you may wish to do this is because videos that require interaction to unlock, remain in an unlocked + * state, even if you change the source of the video. By changing the source to a new video you avoid having to + * go through the unlock process again. + * @param key The key of the Video this Game Object will play, as stored in the Video Cache. + */ + load(key: string): this; + + /** + * This method allows you to change the source of the current video element. It works by first stopping the + * current video, if playing. Then deleting the video texture, if one has been created. Finally, it makes a + * new video texture and starts playback of the new source through the existing video element. + * + * The reason you may wish to do this is because videos that require interaction to unlock, remain in an unlocked + * state, even if you change the source of the video. By changing the source to a new video you avoid having to + * go through the unlock process again. + * @param key The key of the Video this Game Object will swap to playing, as stored in the Video Cache. + * @param autoplay Should the video start playing immediately, once the swap is complete? Default true. + * @param loop Should the video loop automatically when it reaches the end? Please note that not all browsers support _seamless_ video looping for all encoding formats. Default false. + * @param markerIn Optional in marker time, in seconds, for playback of a sequence of the video. + * @param markerOut Optional out marker time, in seconds, for playback of a sequence of the video. + */ + changeSource(key: string, autoplay?: boolean, loop?: boolean, markerIn?: number, markerOut?: number): this; + + /** + * Returns the key of the currently played video, as stored in the Video Cache. + * + * If the video did not come from the cache this will return an empty string. + */ + getVideoKey(): string; + + /** + * Loads a Video from the given URL, ready for playback with the `Video.play` method. + * + * If a video is already playing, this method allows you to change the source of the current video element. + * It works by first stopping the current video and then starts playback of the new source through the existing video element. + * + * The reason you may wish to do this is because videos that require interaction to unlock, remain in an unlocked + * state, even if you change the source of the video. By changing the source to a new video you avoid having to + * go through the unlock process again. + * @param urls The absolute or relative URL to load the video files from. + * @param noAudio Does the video have an audio track? If not you can enable auto-playing on it. Default false. + * @param crossOrigin The value to use for the `crossOrigin` property in the video load request. Either undefined, `anonymous` or `use-credentials`. If no value is given, `crossorigin` will not be set in the request. + */ + loadURL(urls?: string | string[] | Phaser.Types.Loader.FileTypes.VideoFileURLConfig | Phaser.Types.Loader.FileTypes.VideoFileURLConfig[], noAudio?: boolean, crossOrigin?: string): this; + + /** + * Loads a Video from the given MediaStream object, ready for playback with the `Video.play` method. + * @param stream The MediaStream object. + * @param noAudio Does the video have an audio track? If not you can enable auto-playing on it. Default false. + * @param crossOrigin The value to use for the `crossOrigin` property in the video load request. Either undefined, `anonymous` or `use-credentials`. If no value is given, `crossorigin` will not be set in the request. + */ + loadMediaStream(stream: string, noAudio?: boolean, crossOrigin?: string): this; + + /** + * Internal method that loads a Video from the given URL, ready for playback with the + * `Video.play` method. + * + * Normally you don't call this method directly, but instead use the `Video.loadURL` method, + * or the `Video.load` method if you have preloaded the video. + * + * Calling this method will skip checking if the browser supports the given format in + * the URL, where-as the other two methods enforce these checks. + * @param url The absolute or relative URL to load the video file from. Set to `null` if passing in a MediaStream object. + * @param noAudio Does the video have an audio track? If not you can enable auto-playing on it. + * @param crossOrigin The value to use for the `crossOrigin` property in the video load request. Either undefined, `anonymous` or `use-credentials`. If no value is given, `crossorigin` will not be set in the request. + * @param stream A MediaStream object if this is playing a stream instead of a file. + */ + loadHandler(url?: string, noAudio?: boolean, crossOrigin?: string, stream?: string): this; + + /** + * This method handles the Request Video Frame callback. + * + * It is called by the browser when a new video frame is ready to be displayed. + * + * It's also responsible for the creation of the video texture, if it doesn't + * already exist. If it does, it updates the texture as required. + * + * For more details about the Request Video Frame callback, see: + * https://web.dev/requestvideoframecallback-rvfc + * @param now The current time in milliseconds. + * @param metadata Useful metadata about the video frame that was most recently presented for composition. See https://wicg.github.io/video-rvfc/#video-frame-metadata-callback + */ + requestVideoFrame(now: DOMHighResTimeStamp, metadata: VideoFrameCallbackMetadata): void; + + /** + * Starts this video playing. + * + * If the video is already playing, or has been queued to play with `changeSource` then this method just returns. + * + * Videos can only autoplay if the browser has been unlocked. This happens if you have interacted with the browser, i.e. + * by clicking on it or pressing a key, or due to server settings. The policies that control autoplaying are vast and + * vary between browser. You can read more here: https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide + * + * If your video doesn't contain any audio, then set the `noAudio` parameter to `true` when the video is loaded, + * and it will often allow the video to play immediately: + * + * ```javascript + * preload () { + * this.load.video('pixar', 'nemo.mp4', true); + * } + * ``` + * + * The 3rd parameter in the load call tells Phaser that the video doesn't contain any audio tracks. Video without + * audio can autoplay without requiring a user interaction. Video with audio cannot do this unless it satisfies + * the browsers MEI settings. See the MDN Autoplay Guide for details. + * + * If you need audio in your videos, then you'll have to consider the fact that the video cannot start playing until the + * user has interacted with the browser, into your game flow. + * @param loop Should the video loop automatically when it reaches the end? Please note that not all browsers support _seamless_ video looping for all encoding formats. Default false. + * @param markerIn Optional in marker time, in seconds, for playback of a sequence of the video. + * @param markerOut Optional out marker time, in seconds, for playback of a sequence of the video. + */ + play(loop?: boolean, markerIn?: number, markerOut?: number): this; + + /** + * Adds the loading specific event handlers to the video element. + */ + addLoadEventHandlers(): void; + + /** + * Removes the loading specific event handlers from the video element. + */ + removeLoadEventHandlers(): void; + + /** + * Adds the playback specific event handlers to the video element. + */ + addEventHandlers(): void; + + /** + * Removes the playback specific event handlers from the video element. + */ + removeEventHandlers(): void; + + /** + * Creates the video.play promise and adds the success and error handlers to it. + * + * Not all browsers support the video.play promise, so this method will fall back to + * the old-school way of handling the video.play call. + * + * See https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play#browser_compatibility for details. + * @param catchError Should the error be caught and the video marked as failed to play? Default true. + */ + createPlayPromise(catchError?: boolean): void; + + /** + * Adds a sequence marker to this video. + * + * Markers allow you to split a video up into sequences, delineated by a start and end time, given in seconds. + * + * You can then play back specific markers via the `playMarker` method. + * + * Note that marker timing is _not_ frame-perfect. You should construct your videos in such a way that you allow for + * plenty of extra padding before and after each sequence to allow for discrepancies in browser seek and currentTime accuracy. + * + * See https://github.com/w3c/media-and-entertainment/issues/4 for more details about this issue. + * @param key A unique name to give this marker. + * @param markerIn The time, in seconds, representing the start of this marker. + * @param markerOut The time, in seconds, representing the end of this marker. + */ + addMarker(key: string, markerIn: number, markerOut: number): this; + + /** + * Plays a pre-defined sequence in this video. + * + * Markers allow you to split a video up into sequences, delineated by a start and end time, given in seconds and + * specified via the `addMarker` method. + * + * Note that marker timing is _not_ frame-perfect. You should construct your videos in such a way that you allow for + * plenty of extra padding before and after each sequence to allow for discrepancies in browser seek and currentTime accuracy. + * + * See https://github.com/w3c/media-and-entertainment/issues/4 for more details about this issue. + * @param key The name of the marker sequence to play. + * @param loop Should the video loop automatically when it reaches the end? Please note that not all browsers support _seamless_ video looping for all encoding formats. Default false. + */ + playMarker(key: string, loop?: boolean): this; + + /** + * Removes a previously set marker from this video. + * + * If the marker is currently playing it will _not_ stop playback. + * @param key The name of the marker to remove. + */ + removeMarker(key: string): this; + + /** + * Takes a snapshot of the current frame of the video and renders it to a CanvasTexture object, + * which is then returned. You can optionally resize the grab by passing a width and height. + * + * This method returns a reference to the `Video.snapshotTexture` object. Calling this method + * multiple times will overwrite the previous snapshot with the most recent one. + * @param width The width of the resulting CanvasTexture. + * @param height The height of the resulting CanvasTexture. + */ + snapshot(width?: number, height?: number): Phaser.Textures.CanvasTexture; + + /** + * Takes a snapshot of the specified area of the current frame of the video and renders it to a CanvasTexture object, + * which is then returned. You can optionally resize the grab by passing a different `destWidth` and `destHeight`. + * + * This method returns a reference to the `Video.snapshotTexture` object. Calling this method + * multiple times will overwrite the previous snapshot with the most recent one. + * @param x The horizontal location of the top-left of the area to grab from. Default 0. + * @param y The vertical location of the top-left of the area to grab from. Default 0. + * @param srcWidth The width of area to grab from the video. If not given it will grab the full video dimensions. + * @param srcHeight The height of area to grab from the video. If not given it will grab the full video dimensions. + * @param destWidth The destination width of the grab, allowing you to resize it. + * @param destHeight The destination height of the grab, allowing you to resize it. + */ + snapshotArea(x?: number, y?: number, srcWidth?: number, srcHeight?: number, destWidth?: number, destHeight?: number): Phaser.Textures.CanvasTexture; + + /** + * Stores a copy of this Videos `snapshotTexture` in the Texture Manager using the given key. + * + * This texture is created when the `snapshot` or `snapshotArea` methods are called. + * + * After doing this, any texture based Game Object, such as a Sprite, can use the contents of the + * snapshot by using the texture key: + * + * ```javascript + * var vid = this.add.video(0, 0, 'intro'); + * + * vid.snapshot(); + * + * vid.saveSnapshotTexture('doodle'); + * + * this.add.image(400, 300, 'doodle'); + * ``` + * + * Updating the contents of the `snapshotTexture`, for example by calling `snapshot` again, + * will automatically update _any_ Game Object that is using it as a texture. + * Calling `saveSnapshotTexture` again will not save another copy of the same texture, + * it will just rename the existing one. + * + * By default it will create a single base texture. You can add frames to the texture + * by using the `Texture.add` method. After doing this, you can then allow Game Objects + * to use a specific frame. + * @param key The unique key to store the texture as within the global Texture Manager. + */ + saveSnapshotTexture(key: string): Phaser.Textures.CanvasTexture; + + /** + * This internal method is called automatically if the playback Promise resolves successfully. + */ + playSuccess(): void; + + /** + * This internal method is called automatically if the playback Promise fails to resolve. + * @param error The Promise DOM Exception error. + */ + playError(error: DOMException): void; + + /** + * Called when the video emits a `playing` event. + * + * This is the legacy handler for browsers that don't support Promise based playback. + */ + legacyPlayHandler(): void; + + /** + * Called when the video emits a `playing` event. + */ + playingHandler(): void; + + /** + * This internal method is called automatically if the video fails to load. + * @param event The error Event. + */ + loadErrorHandler(event: Event): void; + + /** + * This internal method is called automatically when the video metadata is available. + * @param event The loadedmetadata Event. + */ + metadataHandler(event: Event): void; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * This internal method is called automatically if the video stalls, for whatever reason. + * @param event The error Event. + */ + stalledHandler(event: Event): void; + + /** + * Called when the video completes playback, i.e. reaches an `ended` state. + * + * This will never happen if the video is coming from a live stream, where the duration is `Infinity`. + */ + completeHandler(): void; + + /** + * Seeks to a given point in the video. The value is given as a float between 0 and 1, + * where 0 represents the start of the video and 1 represents the end. + * + * Seeking only works if the video has a duration, so will not work for live streams. + * + * When seeking begins, this video will emit a `seeking` event. When the video completes + * seeking (i.e. reaches its designated timestamp) it will emit a `seeked` event. + * + * If you wish to seek based on time instead, use the `Video.setCurrentTime` method. + * + * Unfortunately, the DOM video element does not guarantee frame-accurate seeking. + * This has been an ongoing subject of discussion: https://github.com/w3c/media-and-entertainment/issues/4 + * @param value The point in the video to seek to. A value between 0 and 1. + */ + seekTo(value: number): this; + + /** + * A double-precision floating-point value indicating the current playback time in seconds. + * + * If the media has not started to play and has not been seeked, this value is the media's initial playback time. + * + * For a more accurate value, use the `Video.metadata.mediaTime` property instead. + */ + getCurrentTime(): number; + + /** + * Seeks to a given playback time in the video. The value is given in _seconds_ or as a string. + * + * Seeking only works if the video has a duration, so will not work for live streams. + * + * When seeking begins, this video will emit a `seeking` event. When the video completes + * seeking (i.e. reaches its designated timestamp) it will emit a `seeked` event. + * + * You can provide a string prefixed with either a `+` or a `-`, such as `+2.5` or `-2.5`. + * In this case it will seek to +/- the value given, relative to the _current time_. + * + * If you wish to seek based on a duration percentage instead, use the `Video.seekTo` method. + * @param value The playback time to seek to in seconds. Can be expressed as a string, such as `+2` to seek 2 seconds ahead from the current time. + */ + setCurrentTime(value: string | number): this; + + /** + * Returns the current progress of the video as a float. + * + * Progress is defined as a value between 0 (the start) and 1 (the end). + * + * Progress can only be returned if the video has a duration. Some videos, + * such as those coming from a live stream, do not have a duration. In this + * case the method will return -1. + */ + getProgress(): number; + + /** + * A double-precision floating-point value which indicates the duration (total length) of the media in seconds, + * on the media's timeline. If no media is present on the element, or the media is not valid, the returned value is NaN. + * + * If the media has no known end (such as for live streams of unknown duration, web radio, media incoming from WebRTC, + * and so forth), this value is +Infinity. + * + * If no video has been loaded, this method will return 0. + */ + getDuration(): number; + + /** + * Sets the muted state of the currently playing video, if one is loaded. + * @param value The mute value. `true` if the video should be muted, otherwise `false`. Default true. + */ + setMute(value?: boolean): this; + + /** + * Returns a boolean indicating if this Video is currently muted. + */ + isMuted(): boolean; + + /** + * Sets the paused state of the currently loaded video. + * + * If the video is playing, calling this method with `true` will pause playback. + * If the video is paused, calling this method with `false` will resume playback. + * + * If no video is loaded, this method does nothing. + * + * If the video has not yet been played, `Video.play` will be called with no parameters. + * + * If the video has ended, this method will do nothing. + * @param value The paused value. `true` if the video should be paused, `false` to resume it. Default true. + */ + setPaused(value?: boolean): this; + + /** + * Pauses the current Video, if one is playing. + * + * If no video is loaded, this method does nothing. + * + * Call `Video.resume` to resume playback. + */ + pause(): this; + + /** + * Resumes the current Video, if one was previously playing and has been paused. + * + * If no video is loaded, this method does nothing. + * + * Call `Video.pause` to pause playback. + */ + resume(): this; + + /** + * Returns a double indicating the audio volume, from 0.0 (silent) to 1.0 (loudest). + */ + getVolume(): number; + + /** + * Sets the volume of the currently playing video. + * + * The value given is a double indicating the audio volume, from 0.0 (silent) to 1.0 (loudest). + * @param value A double indicating the audio volume, from 0.0 (silent) to 1.0 (loudest). Default 1. + */ + setVolume(value?: number): this; + + /** + * Returns a double that indicates the rate at which the media is being played back. + */ + getPlaybackRate(): number; + + /** + * Sets the playback rate of the current video. + * + * The value given is a double that indicates the rate at which the media is being played back. + * @param rate A double that indicates the rate at which the media is being played back. + */ + setPlaybackRate(rate?: number): this; + + /** + * Returns a boolean which indicates whether the media element should start over when it reaches the end. + */ + getLoop(): boolean; + + /** + * Sets the loop state of the current video. + * + * The value given is a boolean which indicates whether the media element will start over when it reaches the end. + * + * Not all videos can loop, for example live streams. + * + * Please note that not all browsers support _seamless_ video looping for all encoding formats. + * @param value A boolean which indicates whether the media element will start over when it reaches the end. Default true. + */ + setLoop(value?: boolean): this; + + /** + * Returns a boolean which indicates whether the video is currently playing. + */ + isPlaying(): boolean; + + /** + * Returns a boolean which indicates whether the video is currently paused. + */ + isPaused(): boolean; + + /** + * Stores this Video in the Texture Manager using the given key as a dynamic texture, + * which any texture-based Game Object, such as a Sprite, can use as its source: + * + * ```javascript + * const vid = this.add.video(0, 0, 'intro'); + * + * vid.play(); + * + * vid.saveTexture('doodle'); + * + * this.add.image(400, 300, 'doodle'); + * ``` + * + * If the video is not yet playing then you need to listen for the `TEXTURE_READY` event before + * you can use this texture on a Game Object: + * + * ```javascript + * const vid = this.add.video(0, 0, 'intro'); + * + * vid.play(); + * + * vid.once('textureready', (video, texture, key) => { + * + * this.add.image(400, 300, key); + * + * }); + * + * vid.saveTexture('doodle'); + * ``` + * + * The saved texture is automatically updated as the video plays. If you pause this video, + * or change its source, then the saved texture updates instantly. + * + * Calling `saveTexture` again will not save another copy of the same texture, it will just rename the existing one. + * + * By default it will create a single base texture. You can add frames to the texture + * by using the `Texture.add` method. After doing this, you can then allow Game Objects + * to use a specific frame. + * + * If you intend to save the texture so you can use it as the input for a Shader, you may need to set the + * `flipY` parameter to `true` if you find the video renders upside down in your shader. + * @param key The unique key to store the texture as within the global Texture Manager. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y` during upload? Default false. + */ + saveTexture(key: string, flipY?: boolean): boolean; + + /** + * Stops the video playing and clears all internal event listeners. + * + * If you only wish to pause playback of the video, and resume it a later time, use the `Video.pause` method instead. + * + * If the video hasn't finished downloading, calling this method will not abort the download. To do that you need to + * call `destroy` instead. + * @param emitStopEvent Should the `VIDEO_STOP` event be emitted? Default true. + */ + stop(emitStopEvent?: boolean): this; + + /** + * Removes the Video element from the DOM by calling parentNode.removeChild on itself. + * + * Also removes the autoplay and src attributes and nulls the `Video.video` reference. + * + * If you loaded an external video via `Video.loadURL` then you should call this function + * to clear up once you are done with the instance, but don't want to destroy this + * Video Game Object. + * + * This method is called automatically by `Video.destroy`. + */ + removeVideoElement(): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Zone Game Object. + * + * A Zone is a non-rendering rectangular Game Object that has a position and size. + * It has no texture and never displays, but does live on the display list and + * can be moved, scaled and rotated like any other Game Object. + * + * Its primary use is for creating Drop Zones and Input Hit Areas and it has a couple of helper methods + * specifically for this. It is also useful for object overlap checks, or as a base for your own + * non-displaying Game Objects. + * The default origin is 0.5, the center of the Zone, the same as with Game Objects. + */ + class Zone extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param width The width of the Game Object. Default 1. + * @param height The height of the Game Object. Default 1. + */ + constructor(scene: Phaser.Scene, x: number, y: number, width?: number, height?: number); + + /** + * The native (un-scaled) width of this Game Object. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + */ + height: number; + + /** + * The Blend Mode of the Game Object. + * Although a Zone never renders, it still has a blend mode to allow it to fit seamlessly into + * display lists without causing a batch flush. + */ + blendMode: number; + + /** + * The displayed width of this Game Object. + * This value takes into account the scale factor. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * This value takes into account the scale factor. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + * @param resizeInput If this Zone has a Rectangle for a hit area this argument will resize the hit area as well. Default true. + */ + setSize(width: number, height: number, resizeInput?: boolean): this; + + /** + * Sets the display size of this Game Object. + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * Sets this Zone to be a Circular Drop Zone. + * The circle is centered on this Zones `x` and `y` coordinates. + * @param radius The radius of the Circle that will form the Drop Zone. + */ + setCircleDropZone(radius: number): this; + + /** + * Sets this Zone to be a Rectangle Drop Zone. + * The rectangle is centered on this Zones `x` and `y` coordinates. + * @param width The width of the rectangle drop zone. + * @param height The height of the rectangle drop zone. + */ + setRectangleDropZone(width: number, height: number): this; + + /** + * Allows you to define your own Geometry shape to be used as a Drop Zone. + * @param hitArea A Geometry shape instance, such as Phaser.Geom.Ellipse, or your own custom shape. If not given it will try to create a Rectangle based on the size of this zone. + * @param hitAreaCallback A function that will return `true` if the given x/y coords it is sent are within the shape. If you provide a shape you must also provide a callback. + */ + setDropZone(hitArea?: object, hitAreaCallback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + } + + namespace Geom { + /** + * A Circle object. + * + * This is a geometry object, containing numerical values and related methods to inspect and modify them. + * It is not a Game Object, in that you cannot add it to the display list, and it has no texture. + * To render a Circle you should look at the capabilities of the Graphics class. + */ + class Circle { + /** + * + * @param x The x position of the center of the circle. Default 0. + * @param y The y position of the center of the circle. Default 0. + * @param radius The radius of the circle. Default 0. + */ + constructor(x?: number, y?: number, radius?: number); + + /** + * Calculates the area of the circle. + * @param circle The Circle to get the area of. + */ + static Area(circle: Phaser.Geom.Circle): number; + + /** + * The geometry constant type of this object: `GEOM_CONST.CIRCLE`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * The x position of the center of the circle. + */ + x: number; + + /** + * The y position of the center of the circle. + */ + y: number; + + /** + * Check to see if the Circle contains the given x / y coordinates. + * @param x The x coordinate to check within the circle. + * @param y The y coordinate to check within the circle. + */ + contains(x: number, y: number): boolean; + + /** + * Returns a Point object containing the coordinates of a point on the circumference of the Circle + * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point + * at 180 degrees around the circle. + * @param position A value between 0 and 1, where 0 equals 0 degrees, 0.5 equals 180 degrees and 1 equals 360 around the circle. + * @param out An object to store the return values in. If not given a Point object will be created. + */ + getPoint(position: number, out?: O): O; + + /** + * Returns an array of Point objects containing the coordinates of the points around the circumference of the Circle, + * based on the given quantity or stepRate values. + * @param quantity The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead. + * @param stepRate Sets the quantity by getting the circumference of the circle and dividing it by the stepRate. + * @param output An array to insert the points in to. If not provided a new array will be created. + */ + getPoints(quantity: number, stepRate?: number, output?: O): O; + + /** + * Returns a uniformly distributed random point from anywhere within the Circle. + * @param point A Point or point-like object to set the random `x` and `y` values in. + */ + getRandomPoint(point?: O): O; + + /** + * Sets the x, y and radius of this circle. + * @param x The x position of the center of the circle. Default 0. + * @param y The y position of the center of the circle. Default 0. + * @param radius The radius of the circle. Default 0. + */ + setTo(x?: number, y?: number, radius?: number): this; + + /** + * Sets this Circle to be empty with a radius of zero. + * Does not change its position. + */ + setEmpty(): this; + + /** + * Sets the position of this Circle. + * @param x The x position of the center of the circle. Default 0. + * @param y The y position of the center of the circle. Default 0. + */ + setPosition(x?: number, y?: number): this; + + /** + * Checks to see if the Circle is empty: has a radius of zero. + */ + isEmpty(): boolean; + + /** + * The radius of the Circle. + */ + radius: number; + + /** + * The diameter of the Circle. + */ + diameter: number; + + /** + * The left position of the Circle. + */ + left: number; + + /** + * The right position of the Circle. + */ + right: number; + + /** + * The top position of the Circle. + */ + top: number; + + /** + * The bottom position of the Circle. + */ + bottom: number; + + /** + * Returns the circumference of the given Circle. + * @param circle The Circle to get the circumference of. + */ + static Circumference(circle: Phaser.Geom.Circle): number; + + /** + * Returns a Point object containing the coordinates of a point on the circumference of the Circle based on the given angle. + * @param circle The Circle to get the circumference point on. + * @param angle The angle from the center of the Circle to the circumference to return the point from. Given in radians. + * @param out A Point, or point-like object, to store the results in. If not given a Point will be created. + */ + static CircumferencePoint(circle: Phaser.Geom.Circle, angle: number, out?: O): O; + + /** + * Creates a new Circle instance based on the values contained in the given source. + * @param source The Circle to be cloned. Can be an instance of a Circle or a circle-like object, with x, y and radius properties. + */ + static Clone(source: Phaser.Geom.Circle | object): Phaser.Geom.Circle; + + /** + * Check to see if the Circle contains the given x / y coordinates. + * @param circle The Circle to check. + * @param x The x coordinate to check within the circle. + * @param y The y coordinate to check within the circle. + */ + static Contains(circle: Phaser.Geom.Circle, x: number, y: number): boolean; + + /** + * Check to see if the Circle contains the given Point object. + * @param circle The Circle to check. + * @param point The Point object to check if it's within the Circle or not. + */ + static ContainsPoint(circle: Phaser.Geom.Circle, point: Phaser.Geom.Point | object): boolean; + + /** + * Check to see if the Circle contains all four points of the given Rectangle object. + * @param circle The Circle to check. + * @param rect The Rectangle object to check if it's within the Circle or not. + */ + static ContainsRect(circle: Phaser.Geom.Circle, rect: Phaser.Geom.Rectangle | object): boolean; + + /** + * Copies the `x`, `y` and `radius` properties from the `source` Circle + * into the given `dest` Circle, then returns the `dest` Circle. + * @param source The source Circle to copy the values from. + * @param dest The destination Circle to copy the values to. + */ + static CopyFrom(source: Phaser.Geom.Circle, dest: O): O; + + /** + * Compares the `x`, `y` and `radius` properties of the two given Circles. + * Returns `true` if they all match, otherwise returns `false`. + * @param circle The first Circle to compare. + * @param toCompare The second Circle to compare. + */ + static Equals(circle: Phaser.Geom.Circle, toCompare: Phaser.Geom.Circle): boolean; + + /** + * Returns the bounds of the Circle object. + * @param circle The Circle to get the bounds from. + * @param out A Rectangle, or rectangle-like object, to store the circle bounds in. If not given a new Rectangle will be created. + */ + static GetBounds(circle: Phaser.Geom.Circle, out?: O): O; + + /** + * Returns a Point object containing the coordinates of a point on the circumference of the Circle + * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point + * at 180 degrees around the circle. + * @param circle The Circle to get the circumference point on. + * @param position A value between 0 and 1, where 0 equals 0 degrees, 0.5 equals 180 degrees and 1 equals 360 around the circle. + * @param out An object to store the return values in. If not given a Point object will be created. + */ + static GetPoint(circle: Phaser.Geom.Circle, position: number, out?: O): O; + + /** + * Returns an array of Point objects containing the coordinates of the points around the circumference of the Circle, + * based on the given quantity or stepRate values. + * @param circle The Circle to get the points from. + * @param quantity The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead. + * @param stepRate Sets the quantity by getting the circumference of the circle and dividing it by the stepRate. + * @param output An array to insert the points in to. If not provided a new array will be created. + */ + static GetPoints(circle: Phaser.Geom.Circle, quantity: number, stepRate?: number, output?: any[]): Phaser.Geom.Point[]; + + /** + * Offsets the Circle by the values given. + * @param circle The Circle to be offset (translated.) + * @param x The amount to horizontally offset the Circle by. + * @param y The amount to vertically offset the Circle by. + */ + static Offset(circle: O, x: number, y: number): O; + + /** + * Offsets the Circle by the values given in the `x` and `y` properties of the Point object. + * @param circle The Circle to be offset (translated.) + * @param point The Point object containing the values to offset the Circle by. + */ + static OffsetPoint(circle: O, point: Phaser.Geom.Point | object): O; + + /** + * Returns a uniformly distributed random point from anywhere within the given Circle. + * @param circle The Circle to get a random point from. + * @param out A Point or point-like object to set the random `x` and `y` values in. + */ + static Random(circle: Phaser.Geom.Circle, out?: O): O; + + } + + /** + * A Circle Geometry object type. + */ + var CIRCLE: number; + + /** + * An Ellipse Geometry object type. + */ + var ELLIPSE: number; + + /** + * A Line Geometry object type. + */ + var LINE: number; + + /** + * A Point Geometry object type. + */ + var POINT: number; + + /** + * A Polygon Geometry object type. + */ + var POLYGON: number; + + /** + * A Rectangle Geometry object type. + */ + var RECTANGLE: number; + + /** + * A Triangle Geometry object type. + */ + var TRIANGLE: number; + + /** + * An Ellipse object. + * + * This is a geometry object, containing numerical values and related methods to inspect and modify them. + * It is not a Game Object, in that you cannot add it to the display list, and it has no texture. + * To render an Ellipse you should look at the capabilities of the Graphics class. + */ + class Ellipse { + /** + * + * @param x The x position of the center of the ellipse. Default 0. + * @param y The y position of the center of the ellipse. Default 0. + * @param width The width of the ellipse. Default 0. + * @param height The height of the ellipse. Default 0. + */ + constructor(x?: number, y?: number, width?: number, height?: number); + + /** + * Calculates the area of the Ellipse. + * @param ellipse The Ellipse to get the area of. + */ + static Area(ellipse: Phaser.Geom.Ellipse): number; + + /** + * Returns the circumference of the given Ellipse. + * @param ellipse The Ellipse to get the circumference of. + */ + static Circumference(ellipse: Phaser.Geom.Ellipse): number; + + /** + * Returns a Point object containing the coordinates of a point on the circumference of the Ellipse based on the given angle. + * @param ellipse The Ellipse to get the circumference point on. + * @param angle The angle from the center of the Ellipse to the circumference to return the point from. Given in radians. + * @param out A Point, or point-like object, to store the results in. If not given a Point will be created. + */ + static CircumferencePoint(ellipse: Phaser.Geom.Ellipse, angle: number, out?: O): O; + + /** + * Creates a new Ellipse instance based on the values contained in the given source. + * @param source The Ellipse to be cloned. Can be an instance of an Ellipse or a ellipse-like object, with x, y, width and height properties. + */ + static Clone(source: Phaser.Geom.Ellipse): Phaser.Geom.Ellipse; + + /** + * Check to see if the Ellipse contains the given x / y coordinates. + * @param ellipse The Ellipse to check. + * @param x The x coordinate to check within the ellipse. + * @param y The y coordinate to check within the ellipse. + */ + static Contains(ellipse: Phaser.Geom.Ellipse, x: number, y: number): boolean; + + /** + * Check to see if the Ellipse contains the given Point object. + * @param ellipse The Ellipse to check. + * @param point The Point object to check if it's within the Circle or not. + */ + static ContainsPoint(ellipse: Phaser.Geom.Ellipse, point: Phaser.Geom.Point | object): boolean; + + /** + * Check to see if the Ellipse contains all four points of the given Rectangle object. + * @param ellipse The Ellipse to check. + * @param rect The Rectangle object to check if it's within the Ellipse or not. + */ + static ContainsRect(ellipse: Phaser.Geom.Ellipse, rect: Phaser.Geom.Rectangle | object): boolean; + + /** + * Copies the `x`, `y`, `width` and `height` properties from the `source` Ellipse + * into the given `dest` Ellipse, then returns the `dest` Ellipse. + * @param source The source Ellipse to copy the values from. + * @param dest The destination Ellipse to copy the values to. + */ + static CopyFrom(source: Phaser.Geom.Ellipse, dest: O): O; + + /** + * The geometry constant type of this object: `GEOM_CONST.ELLIPSE`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * The x position of the center of the ellipse. + */ + x: number; + + /** + * The y position of the center of the ellipse. + */ + y: number; + + /** + * The width of the ellipse. + */ + width: number; + + /** + * The height of the ellipse. + */ + height: number; + + /** + * Check to see if the Ellipse contains the given x / y coordinates. + * @param x The x coordinate to check within the ellipse. + * @param y The y coordinate to check within the ellipse. + */ + contains(x: number, y: number): boolean; + + /** + * Returns a Point object containing the coordinates of a point on the circumference of the Ellipse + * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point + * at 180 degrees around the circle. + * @param position A value between 0 and 1, where 0 equals 0 degrees, 0.5 equals 180 degrees and 1 equals 360 around the ellipse. + * @param out An object to store the return values in. If not given a Point object will be created. + */ + getPoint(position: number, out?: O): O; + + /** + * Returns an array of Point objects containing the coordinates of the points around the circumference of the Ellipse, + * based on the given quantity or stepRate values. + * @param quantity The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead. + * @param stepRate Sets the quantity by getting the circumference of the ellipse and dividing it by the stepRate. + * @param output An array to insert the points in to. If not provided a new array will be created. + */ + getPoints(quantity: number, stepRate?: number, output?: O): O; + + /** + * Returns a uniformly distributed random point from anywhere within the given Ellipse. + * @param point A Point or point-like object to set the random `x` and `y` values in. + */ + getRandomPoint(point?: O): O; + + /** + * Sets the x, y, width and height of this ellipse. + * @param x The x position of the center of the ellipse. + * @param y The y position of the center of the ellipse. + * @param width The width of the ellipse. + * @param height The height of the ellipse. + */ + setTo(x: number, y: number, width: number, height: number): this; + + /** + * Sets this Ellipse to be empty with a width and height of zero. + * Does not change its position. + */ + setEmpty(): this; + + /** + * Sets the position of this Ellipse. + * @param x The x position of the center of the ellipse. + * @param y The y position of the center of the ellipse. + */ + setPosition(x: number, y: number): this; + + /** + * Sets the size of this Ellipse. + * Does not change its position. + * @param width The width of the ellipse. + * @param height The height of the ellipse. Default width. + */ + setSize(width: number, height?: number): this; + + /** + * Checks to see if the Ellipse is empty: has a width or height equal to zero. + */ + isEmpty(): boolean; + + /** + * Returns the minor radius of the ellipse. Also known as the Semi Minor Axis. + */ + getMinorRadius(): number; + + /** + * Returns the major radius of the ellipse. Also known as the Semi Major Axis. + */ + getMajorRadius(): number; + + /** + * The left position of the Ellipse. + */ + left: number; + + /** + * The right position of the Ellipse. + */ + right: number; + + /** + * The top position of the Ellipse. + */ + top: number; + + /** + * The bottom position of the Ellipse. + */ + bottom: number; + + /** + * Compares the `x`, `y`, `width` and `height` properties of the two given Ellipses. + * Returns `true` if they all match, otherwise returns `false`. + * @param ellipse The first Ellipse to compare. + * @param toCompare The second Ellipse to compare. + */ + static Equals(ellipse: Phaser.Geom.Ellipse, toCompare: Phaser.Geom.Ellipse): boolean; + + /** + * Returns the bounds of the Ellipse object. + * @param ellipse The Ellipse to get the bounds from. + * @param out A Rectangle, or rectangle-like object, to store the ellipse bounds in. If not given a new Rectangle will be created. + */ + static GetBounds(ellipse: Phaser.Geom.Ellipse, out?: O): O; + + /** + * Returns a Point object containing the coordinates of a point on the circumference of the Ellipse + * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point + * at 180 degrees around the circle. + * @param ellipse The Ellipse to get the circumference point on. + * @param position A value between 0 and 1, where 0 equals 0 degrees, 0.5 equals 180 degrees and 1 equals 360 around the ellipse. + * @param out An object to store the return values in. If not given a Point object will be created. + */ + static GetPoint(ellipse: Phaser.Geom.Ellipse, position: number, out?: O): O; + + /** + * Returns an array of Point objects containing the coordinates of the points around the circumference of the Ellipse, + * based on the given quantity or stepRate values. + * @param ellipse The Ellipse to get the points from. + * @param quantity The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead. + * @param stepRate Sets the quantity by getting the circumference of the ellipse and dividing it by the stepRate. + * @param out An array to insert the points in to. If not provided a new array will be created. + */ + static GetPoints(ellipse: Phaser.Geom.Ellipse, quantity: number, stepRate?: number, out?: O): O; + + /** + * Offsets the Ellipse by the values given. + * @param ellipse The Ellipse to be offset (translated.) + * @param x The amount to horizontally offset the Ellipse by. + * @param y The amount to vertically offset the Ellipse by. + */ + static Offset(ellipse: O, x: number, y: number): O; + + /** + * Offsets the Ellipse by the values given in the `x` and `y` properties of the Point object. + * @param ellipse The Ellipse to be offset (translated.) + * @param point The Point object containing the values to offset the Ellipse by. + */ + static OffsetPoint(ellipse: O, point: Phaser.Geom.Point | object): O; + + /** + * Returns a uniformly distributed random point from anywhere within the given Ellipse. + * @param ellipse The Ellipse to get a random point from. + * @param out A Point or point-like object to set the random `x` and `y` values in. + */ + static Random(ellipse: Phaser.Geom.Ellipse, out?: O): O; + + } + + namespace Intersects { + /** + * Checks if two Circles intersect. + * @param circleA The first Circle to check for intersection. + * @param circleB The second Circle to check for intersection. + */ + function CircleToCircle(circleA: Phaser.Geom.Circle, circleB: Phaser.Geom.Circle): boolean; + + /** + * Checks for intersection between a circle and a rectangle. + * @param circle The circle to be checked. + * @param rect The rectangle to be checked. + */ + function CircleToRectangle(circle: Phaser.Geom.Circle, rect: Phaser.Geom.Rectangle): boolean; + + /** + * Checks if two Circles intersect and returns the intersection points as a Point object array. + * @param circleA The first Circle to check for intersection. + * @param circleB The second Circle to check for intersection. + * @param out An optional array in which to store the points of intersection. + */ + function GetCircleToCircle(circleA: Phaser.Geom.Circle, circleB: Phaser.Geom.Circle, out?: any[]): any[]; + + /** + * Checks for intersection between a circle and a rectangle, + * and returns the intersection points as a Point object array. + * @param circle The circle to be checked. + * @param rect The rectangle to be checked. + * @param out An optional array in which to store the points of intersection. + */ + function GetCircleToRectangle(circle: Phaser.Geom.Circle, rect: Phaser.Geom.Rectangle, out?: any[]): any[]; + + /** + * Checks for intersection between the line segment and circle, + * and returns the intersection points as a Point object array. + * @param line The line segment to check. + * @param circle The circle to check against the line. + * @param out An optional array in which to store the points of intersection. + */ + function GetLineToCircle(line: Phaser.Geom.Line, circle: Phaser.Geom.Circle, out?: any[]): any[]; + + /** + * Checks for intersection between the two line segments, or a ray and a line segment, + * and returns the intersection point as a Vector3, or `null` if the lines are parallel, or do not intersect. + * + * The `z` property of the Vector3 contains the intersection distance, which can be used to find + * the closest intersecting point from a group of line segments. + * @param line1 The first line segment, or a ray, to check. + * @param line2 The second line segment to check. + * @param isRay Is `line1` a ray or a line segment? Default false. + * @param out A Vector3 to store the intersection results in. + */ + function GetLineToLine(line1: Phaser.Geom.Line, line2: Phaser.Geom.Line, isRay?: boolean, out?: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Checks for the closest point of intersection between a line segment and an array of points, where each pair + * of points are converted to line segments for the intersection tests. + * + * If no intersection is found, this function returns `null`. + * + * If intersection was found, a Vector3 is returned with the following properties: + * + * The `x` and `y` components contain the point of the intersection. + * The `z` component contains the closest distance. + * @param line The line segment, or ray, to check. If a ray, set the `isRay` parameter to `true`. + * @param points An array of points to check. + * @param isRay Is `line` a ray or a line segment? Default false. + * @param out A Vector3 to store the intersection results in. + */ + function GetLineToPoints(line: Phaser.Geom.Line, points: Phaser.Math.Vector2[] | Phaser.Geom.Point[], isRay?: boolean, out?: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Checks for the closest point of intersection between a line segment and an array of polygons. + * + * If no intersection is found, this function returns `null`. + * + * If intersection was found, a Vector4 is returned with the following properties: + * + * The `x` and `y` components contain the point of the intersection. + * The `z` component contains the closest distance. + * The `w` component contains the index of the polygon, in the given array, that triggered the intersection. + * @param line The line segment, or ray, to check. If a ray, set the `isRay` parameter to `true`. + * @param polygons A single polygon, or array of polygons, to check. + * @param isRay Is `line` a ray or a line segment? Default false. + * @param out A Vector4 to store the intersection results in. + */ + function GetLineToPolygon(line: Phaser.Geom.Line, polygons: Phaser.Geom.Polygon | Phaser.Geom.Polygon[], isRay?: boolean, out?: Phaser.Math.Vector4): Phaser.Math.Vector4; + + /** + * Checks for intersection between the Line and a Rectangle shape, + * and returns the intersection points as a Point object array. + * @param line The Line to check for intersection. + * @param rect The Rectangle to check for intersection. + * @param out An optional array in which to store the points of intersection. + */ + function GetLineToRectangle(line: Phaser.Geom.Line, rect: Phaser.Geom.Rectangle | object, out?: any[]): any[]; + + /** + * Projects rays out from the given point to each line segment of the polygons. + * + * If the rays intersect with the polygons, the points of intersection are returned in an array. + * + * If no intersections are found, the returned array will be empty. + * + * Each Vector4 intersection result has the following properties: + * + * The `x` and `y` components contain the point of the intersection. + * The `z` component contains the angle of intersection. + * The `w` component contains the index of the polygon, in the given array, that triggered the intersection. + * @param x The x coordinate to project the rays from. + * @param y The y coordinate to project the rays from. + * @param polygons A single polygon, or array of polygons, to check against the rays. + */ + function GetRaysFromPointToPolygon(x: number, y: number, polygons: Phaser.Geom.Polygon | Phaser.Geom.Polygon[]): Phaser.Math.Vector4[]; + + /** + * Checks if two Rectangle shapes intersect and returns the area of this intersection as Rectangle object. + * + * If optional `output` parameter is omitted, new Rectangle object is created and returned. If there is intersection, it will contain intersection area. If there is no intersection, it wil be empty Rectangle (all values set to zero). + * + * If Rectangle object is passed as `output` and there is intersection, then intersection area data will be loaded into it and it will be returned. If there is no intersection, it will be returned without any change. + * @param rectA The first Rectangle object. + * @param rectB The second Rectangle object. + * @param output Optional Rectangle object. If given, the intersection data will be loaded into it (in case of no intersection, it will be left unchanged). Otherwise, new Rectangle object will be created and returned with either intersection data or empty (all values set to zero), if there is no intersection. + */ + function GetRectangleIntersection(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle, output?: O): O; + + /** + * Checks if two Rectangles intersect and returns the intersection points as a Point object array. + * + * A Rectangle intersects another Rectangle if any part of its bounds is within the other Rectangle's bounds. As such, the two Rectangles are considered "solid". A Rectangle with no width or no height will never intersect another Rectangle. + * @param rectA The first Rectangle to check for intersection. + * @param rectB The second Rectangle to check for intersection. + * @param out An optional array in which to store the points of intersection. + */ + function GetRectangleToRectangle(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle, out?: any[]): any[]; + + /** + * Checks for intersection between Rectangle shape and Triangle shape, + * and returns the intersection points as a Point object array. + * @param rect Rectangle object to test. + * @param triangle Triangle object to test. + * @param out An optional array in which to store the points of intersection. + */ + function GetRectangleToTriangle(rect: Phaser.Geom.Rectangle, triangle: Phaser.Geom.Triangle, out?: any[]): any[]; + + /** + * Checks if a Triangle and a Circle intersect, and returns the intersection points as a Point object array. + * + * A Circle intersects a Triangle if its center is located within it or if any of the Triangle's sides intersect the Circle. As such, the Triangle and the Circle are considered "solid" for the intersection. + * @param triangle The Triangle to check for intersection. + * @param circle The Circle to check for intersection. + * @param out An optional array in which to store the points of intersection. + */ + function GetTriangleToCircle(triangle: Phaser.Geom.Triangle, circle: Phaser.Geom.Circle, out?: any[]): any[]; + + /** + * Checks if a Triangle and a Line intersect, and returns the intersection points as a Point object array. + * + * The Line intersects the Triangle if it starts inside of it, ends inside of it, or crosses any of the Triangle's sides. Thus, the Triangle is considered "solid". + * @param triangle The Triangle to check with. + * @param line The Line to check with. + * @param out An optional array in which to store the points of intersection. + */ + function GetTriangleToLine(triangle: Phaser.Geom.Triangle, line: Phaser.Geom.Line, out?: any[]): any[]; + + /** + * Checks if two Triangles intersect, and returns the intersection points as a Point object array. + * + * A Triangle intersects another Triangle if any pair of their lines intersects or if any point of one Triangle is within the other Triangle. Thus, the Triangles are considered "solid". + * @param triangleA The first Triangle to check for intersection. + * @param triangleB The second Triangle to check for intersection. + * @param out An optional array in which to store the points of intersection. + */ + function GetTriangleToTriangle(triangleA: Phaser.Geom.Triangle, triangleB: Phaser.Geom.Triangle, out?: any[]): any[]; + + /** + * Checks for intersection between the line segment and circle. + * + * Based on code by [Matt DesLauriers](https://github.com/mattdesl/line-circle-collision/blob/master/LICENSE.md). + * @param line The line segment to check. + * @param circle The circle to check against the line. + * @param nearest An optional Point-like object. If given the closest point on the Line where the circle intersects will be stored in this object. + */ + function LineToCircle(line: Phaser.Geom.Line, circle: Phaser.Geom.Circle, nearest?: Phaser.Geom.Point | any): boolean; + + /** + * Checks if two Lines intersect. If the Lines are identical, they will be treated as parallel and thus non-intersecting. + * @param line1 The first Line to check. + * @param line2 The second Line to check. + * @param out An optional point-like object in which to store the coordinates of intersection, if needed. + */ + function LineToLine(line1: Phaser.Geom.Line, line2: Phaser.Geom.Line, out?: Phaser.Types.Math.Vector2Like): boolean; + + /** + * Checks for intersection between the Line and a Rectangle shape, or a rectangle-like + * object, with public `x`, `y`, `right` and `bottom` properties, such as a Sprite or Body. + * + * An intersection is considered valid if: + * + * The line starts within, or ends within, the Rectangle. + * The line segment intersects one of the 4 rectangle edges. + * + * The for the purposes of this function rectangles are considered 'solid'. + * @param line The Line to check for intersection. + * @param rect The Rectangle to check for intersection. + */ + function LineToRectangle(line: Phaser.Geom.Line, rect: Phaser.Geom.Rectangle | object): boolean; + + /** + * Checks if the a Point falls between the two end-points of a Line, based on the given line thickness. + * + * Assumes that the line end points are circular, not square. + * @param point The point, or point-like object to check. + * @param line The line segment to test for intersection on. + * @param lineThickness The line thickness. Assumes that the line end points are circular. Default 1. + */ + function PointToLine(point: Phaser.Geom.Point | any, line: Phaser.Geom.Line, lineThickness?: number): boolean; + + /** + * Checks if a Point is located on the given line segment. + * @param point The Point to check for intersection. + * @param line The line segment to check for intersection. + */ + function PointToLineSegment(point: Phaser.Geom.Point, line: Phaser.Geom.Line): boolean; + + /** + * Checks if two Rectangles intersect. + * + * A Rectangle intersects another Rectangle if any part of its bounds is within the other Rectangle's bounds. + * As such, the two Rectangles are considered "solid". + * A Rectangle with no width or no height will never intersect another Rectangle. + * @param rectA The first Rectangle to check for intersection. + * @param rectB The second Rectangle to check for intersection. + */ + function RectangleToRectangle(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle): boolean; + + /** + * Checks for intersection between Rectangle shape and Triangle shape. + * @param rect Rectangle object to test. + * @param triangle Triangle object to test. + */ + function RectangleToTriangle(rect: Phaser.Geom.Rectangle, triangle: Phaser.Geom.Triangle): boolean; + + /** + * Check if rectangle intersects with values. + * @param rect The rectangle object + * @param left The x coordinate of the left of the Rectangle. + * @param right The x coordinate of the right of the Rectangle. + * @param top The y coordinate of the top of the Rectangle. + * @param bottom The y coordinate of the bottom of the Rectangle. + * @param tolerance Tolerance allowed in the calculation, expressed in pixels. Default 0. + */ + function RectangleToValues(rect: Phaser.Geom.Rectangle, left: number, right: number, top: number, bottom: number, tolerance?: number): boolean; + + /** + * Checks if a Triangle and a Circle intersect. + * + * A Circle intersects a Triangle if its center is located within it or if any of the Triangle's sides intersect the Circle. As such, the Triangle and the Circle are considered "solid" for the intersection. + * @param triangle The Triangle to check for intersection. + * @param circle The Circle to check for intersection. + */ + function TriangleToCircle(triangle: Phaser.Geom.Triangle, circle: Phaser.Geom.Circle): boolean; + + /** + * Checks if a Triangle and a Line intersect. + * + * The Line intersects the Triangle if it starts inside of it, ends inside of it, or crosses any of the Triangle's sides. Thus, the Triangle is considered "solid". + * @param triangle The Triangle to check with. + * @param line The Line to check with. + */ + function TriangleToLine(triangle: Phaser.Geom.Triangle, line: Phaser.Geom.Line): boolean; + + /** + * Checks if two Triangles intersect. + * + * A Triangle intersects another Triangle if any pair of their lines intersects or if any point of one Triangle is within the other Triangle. Thus, the Triangles are considered "solid". + * @param triangleA The first Triangle to check for intersection. + * @param triangleB The second Triangle to check for intersection. + */ + function TriangleToTriangle(triangleA: Phaser.Geom.Triangle, triangleB: Phaser.Geom.Triangle): boolean; + + } + + /** + * Defines a Line segment, a part of a line between two endpoints. + */ + class Line { + /** + * + * @param x1 The x coordinate of the lines starting point. Default 0. + * @param y1 The y coordinate of the lines starting point. Default 0. + * @param x2 The x coordinate of the lines ending point. Default 0. + * @param y2 The y coordinate of the lines ending point. Default 0. + */ + constructor(x1?: number, y1?: number, x2?: number, y2?: number); + + /** + * Calculate the angle of the line in radians. + * @param line The line to calculate the angle of. + */ + static Angle(line: Phaser.Geom.Line): number; + + /** + * Using Bresenham's line algorithm this will return an array of all coordinates on this line. + * + * The `start` and `end` points are rounded before this runs as the algorithm works on integers. + * @param line The line. + * @param stepRate The optional step rate for the points on the line. Default 1. + * @param results An optional array to push the resulting coordinates into. + */ + static BresenhamPoints(line: Phaser.Geom.Line, stepRate?: number, results?: Phaser.Types.Math.Vector2Like[]): Phaser.Types.Math.Vector2Like[]; + + /** + * Center a line on the given coordinates. + * @param line The line to center. + * @param x The horizontal coordinate to center the line on. + * @param y The vertical coordinate to center the line on. + */ + static CenterOn(line: Phaser.Geom.Line, x: number, y: number): Phaser.Geom.Line; + + /** + * Clone the given line. + * @param source The source line to clone. + */ + static Clone(source: Phaser.Geom.Line): Phaser.Geom.Line; + + /** + * Copy the values of one line to a destination line. + * @param source The source line to copy the values from. + * @param dest The destination line to copy the values to. + */ + static CopyFrom(source: Phaser.Geom.Line, dest: O): O; + + /** + * Compare two lines for strict equality. + * @param line The first line to compare. + * @param toCompare The second line to compare. + */ + static Equals(line: Phaser.Geom.Line, toCompare: Phaser.Geom.Line): boolean; + + /** + * Extends the start and end points of a Line by the given amounts. + * + * The amounts can be positive or negative. Positive points will increase the length of the line, + * while negative ones will decrease it. + * + * If no `right` value is provided it will extend the length of the line equally in both directions. + * + * Pass a value of zero to leave the start or end point unchanged. + * @param line The line instance to extend. + * @param left The amount to extend the start of the line by. + * @param right The amount to extend the end of the line by. If not given it will be set to the `left` value. + */ + static Extend(line: Phaser.Geom.Line, left: number, right?: number): Phaser.Geom.Line; + + /** + * Returns an array of `quantity` Points where each point is taken from the given Line, + * spaced out according to the ease function specified. + * + * ```javascript + * const line = new Phaser.Geom.Line(100, 300, 700, 300); + * const points = Phaser.Geom.Line.GetEasedPoints(line, 'sine.out', 32) + * ``` + * + * In the above example, the `points` array will contain 32 points spread-out across + * the length of `line`, where the position of each point is determined by the `Sine.out` + * ease function. + * + * You can optionally provide a collinear threshold. In this case, the resulting points + * are checked against each other, and if they are `< collinearThreshold` distance apart, + * they are dropped from the results. This can help avoid lots of clustered points at + * far ends of the line with tightly-packed eases such as Quartic. Leave the value set + * to zero to skip this check. + * + * Note that if you provide a collinear threshold, the resulting array may not always + * contain `quantity` points. + * @param line The Line object. + * @param ease The ease to use. This can be either a string from the EaseMap, or a custom function. + * @param quantity The number of points to return. Note that if you provide a `collinearThreshold`, the resulting array may not always contain this number of points. + * @param collinearThreshold An optional threshold. The final array is reduced so that each point is spaced out at least this distance apart. This helps reduce clustering in noisey eases. Default 0. + * @param easeParams An optional array of ease parameters to go with the ease. + */ + static GetEasedPoints(line: Phaser.Geom.Line, ease: string | Function, quantity: number, collinearThreshold?: number, easeParams?: number[]): O; + + /** + * Get the midpoint of the given line. + * @param line The line to get the midpoint of. + * @param out An optional point object to store the midpoint in. + */ + static GetMidPoint(line: Phaser.Geom.Line, out?: O): O; + + /** + * Get the nearest point on a line perpendicular to the given point. + * @param line The line to get the nearest point on. + * @param point The point to get the nearest point to. + * @param out An optional point, or point-like object, to store the coordinates of the nearest point on the line. + */ + static GetNearestPoint(line: Phaser.Geom.Line, point: Phaser.Geom.Point | object, out?: O): O; + + /** + * Calculate the normal of the given line. + * + * The normal of a line is a vector that points perpendicular from it. + * @param line The line to calculate the normal of. + * @param out An optional point object to store the normal in. + */ + static GetNormal(line: Phaser.Geom.Line, out?: O): O; + + /** + * Get a point on a line that's a given percentage along its length. + * @param line The line. + * @param position A value between 0 and 1, where 0 is the start, 0.5 is the middle and 1 is the end of the line. + * @param out An optional point, or point-like object, to store the coordinates of the point on the line. + */ + static GetPoint(line: Phaser.Geom.Line, position: number, out?: O): O; + + /** + * Get a number of points along a line's length. + * + * Provide a `quantity` to get an exact number of points along the line. + * + * Provide a `stepRate` to ensure a specific distance between each point on the line. Set `quantity` to `0` when + * providing a `stepRate`. + * + * See also `GetEasedPoints` for a way to distribute the points across the line according to an ease type or input function. + * @param line The line. + * @param quantity The number of points to place on the line. Set to `0` to use `stepRate` instead. + * @param stepRate The distance between each point on the line. When set, `quantity` is implied and should be set to `0`. + * @param out An optional array of Points, or point-like objects, to store the coordinates of the points on the line. + */ + static GetPoints(line: Phaser.Geom.Line, quantity: number, stepRate?: number, out?: O): O; + + /** + * Get the shortest distance from a Line to the given Point. + * @param line The line to get the distance from. + * @param point The point to get the shortest distance to. + */ + static GetShortestDistance(line: Phaser.Geom.Line, point: Phaser.Types.Math.Vector2Like): boolean | number; + + /** + * Calculate the height of the given line. + * @param line The line to calculate the height of. + */ + static Height(line: Phaser.Geom.Line): number; + + /** + * Calculate the length of the given line. + * @param line The line to calculate the length of. + */ + static Length(line: Phaser.Geom.Line): number; + + /** + * The geometry constant type of this object: `GEOM_CONST.LINE`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * The x coordinate of the lines starting point. + */ + x1: number; + + /** + * The y coordinate of the lines starting point. + */ + y1: number; + + /** + * The x coordinate of the lines ending point. + */ + x2: number; + + /** + * The y coordinate of the lines ending point. + */ + y2: number; + + /** + * Get a point on a line that's a given percentage along its length. + * @param position A value between 0 and 1, where 0 is the start, 0.5 is the middle and 1 is the end of the line. + * @param output An optional point, or point-like object, to store the coordinates of the point on the line. + */ + getPoint(position: number, output?: O): O; + + /** + * Get a number of points along a line's length. + * + * Provide a `quantity` to get an exact number of points along the line. + * + * Provide a `stepRate` to ensure a specific distance between each point on the line. Set `quantity` to `0` when + * providing a `stepRate`. + * @param quantity The number of points to place on the line. Set to `0` to use `stepRate` instead. + * @param stepRate The distance between each point on the line. When set, `quantity` is implied and should be set to `0`. + * @param output An optional array of Points, or point-like objects, to store the coordinates of the points on the line. + */ + getPoints(quantity: number, stepRate?: number, output?: O): O; + + /** + * Get a random Point on the Line. + * @param point An instance of a Point to be modified. + */ + getRandomPoint(point?: O): O; + + /** + * Set new coordinates for the line endpoints. + * @param x1 The x coordinate of the lines starting point. Default 0. + * @param y1 The y coordinate of the lines starting point. Default 0. + * @param x2 The x coordinate of the lines ending point. Default 0. + * @param y2 The y coordinate of the lines ending point. Default 0. + */ + setTo(x1?: number, y1?: number, x2?: number, y2?: number): this; + + /** + * Sets this Line to match the x/y coordinates of the two given Vector2Like objects. + * @param start Any object with public `x` and `y` properties, whose values will be assigned to the x1/y1 components of this Line. + * @param end Any object with public `x` and `y` properties, whose values will be assigned to the x2/y2 components of this Line. + */ + setFromObjects(start: Phaser.Types.Math.Vector2Like, end: Phaser.Types.Math.Vector2Like): this; + + /** + * Returns a Vector2 object that corresponds to the start of this Line. + * @param vec2 A Vector2 object to set the results in. If `undefined` a new Vector2 will be created. + */ + getPointA(vec2?: O): O; + + /** + * Returns a Vector2 object that corresponds to the end of this Line. + * @param vec2 A Vector2 object to set the results in. If `undefined` a new Vector2 will be created. + */ + getPointB(vec2?: O): O; + + /** + * The left position of the Line. + */ + left: number; + + /** + * The right position of the Line. + */ + right: number; + + /** + * The top position of the Line. + */ + top: number; + + /** + * The bottom position of the Line. + */ + bottom: number; + + /** + * Get the angle of the normal of the given line in radians. + * @param line The line to calculate the angle of the normal of. + */ + static NormalAngle(line: Phaser.Geom.Line): number; + + /** + * Returns the x component of the normal vector of the given line. + * @param line The Line object to get the normal value from. + */ + static NormalX(line: Phaser.Geom.Line): number; + + /** + * The Y value of the normal of the given line. + * The normal of a line is a vector that points perpendicular from it. + * @param line The line to calculate the normal of. + */ + static NormalY(line: Phaser.Geom.Line): number; + + /** + * Offset a line by the given amount. + * @param line The line to offset. + * @param x The horizontal offset to add to the line. + * @param y The vertical offset to add to the line. + */ + static Offset(line: O, x: number, y: number): O; + + /** + * Calculate the perpendicular slope of the given line. + * @param line The line to calculate the perpendicular slope of. + */ + static PerpSlope(line: Phaser.Geom.Line): number; + + /** + * Returns a random point on a given Line. + * @param line The Line to calculate the random Point on. + * @param out An instance of a Point to be modified. + */ + static Random(line: Phaser.Geom.Line, out?: O): O; + + /** + * Calculate the reflected angle between two lines. + * + * This is the outgoing angle based on the angle of Line 1 and the normalAngle of Line 2. + * @param lineA The first line. + * @param lineB The second line. + */ + static ReflectAngle(lineA: Phaser.Geom.Line, lineB: Phaser.Geom.Line): number; + + /** + * Rotate a line around its midpoint by the given angle in radians. + * @param line The line to rotate. + * @param angle The angle of rotation in radians. + */ + static Rotate(line: O, angle: number): O; + + /** + * Rotate a line around a point by the given angle in radians. + * @param line The line to rotate. + * @param point The point to rotate the line around. + * @param angle The angle of rotation in radians. + */ + static RotateAroundPoint(line: O, point: Phaser.Geom.Point | object, angle: number): O; + + /** + * Rotate a line around the given coordinates by the given angle in radians. + * @param line The line to rotate. + * @param x The horizontal coordinate to rotate the line around. + * @param y The vertical coordinate to rotate the line around. + * @param angle The angle of rotation in radians. + */ + static RotateAroundXY(line: O, x: number, y: number, angle: number): O; + + /** + * Set a line to a given position, angle and length. + * @param line The line to set. + * @param x The horizontal start position of the line. + * @param y The vertical start position of the line. + * @param angle The angle of the line in radians. + * @param length The length of the line. + */ + static SetToAngle(line: O, x: number, y: number, angle: number, length: number): O; + + /** + * Calculate the slope of the given line. + * @param line The line to calculate the slope of. + */ + static Slope(line: Phaser.Geom.Line): number; + + /** + * Calculate the width of the given line. + * @param line The line to calculate the width of. + */ + static Width(line: Phaser.Geom.Line): number; + + } + + namespace Mesh { + /** + * A Face Geometry Object. + * + * A Face is used by the Mesh Game Object. A Mesh consists of one, or more, faces that are + * used to render the Mesh Game Objects in WebGL. + * + * A Face consists of 3 Vertex instances, for the 3 corners of the face and methods to help + * you modify and test them. + */ + class Face { + /** + * + * @param vertex1 The first vertex of the Face. + * @param vertex2 The second vertex of the Face. + * @param vertex3 The third vertex of the Face. + */ + constructor(vertex1: Phaser.Geom.Mesh.Vertex, vertex2: Phaser.Geom.Mesh.Vertex, vertex3: Phaser.Geom.Mesh.Vertex); + + /** + * The first vertex in this Face. + */ + vertex1: Phaser.Geom.Mesh.Vertex; + + /** + * The second vertex in this Face. + */ + vertex2: Phaser.Geom.Mesh.Vertex; + + /** + * The third vertex in this Face. + */ + vertex3: Phaser.Geom.Mesh.Vertex; + + /** + * The bounds of this Face. + * + * Be sure to call the `Face.updateBounds` method _before_ using this property. + */ + bounds: Phaser.Geom.Rectangle; + + /** + * Calculates and returns the in-center position of this Face. + * @param local Return the in center from the un-transformed vertex positions (`true`), or transformed? (`false`) Default true. + */ + getInCenter(local?: boolean): Phaser.Math.Vector2; + + /** + * Checks if the given coordinates are within this Face. + * + * You can optionally provide a transform matrix. If given, the Face vertices + * will be transformed first, before being checked against the coordinates. + * @param x The horizontal position to check. + * @param y The vertical position to check. + * @param calcMatrix Optional transform matrix to apply to the vertices before comparison. + */ + contains(x: number, y: number, calcMatrix?: Phaser.GameObjects.Components.TransformMatrix): boolean; + + /** + * Checks if the vertices in this Face are orientated counter-clockwise, or not. + * + * It checks the transformed position of the vertices, not the local one. + * @param z The z-axis value to test against. Typically the `Mesh.modelPosition.z`. + */ + isCounterClockwise(z: number): boolean; + + /** + * Loads the data from this Vertex into the given Typed Arrays. + * @param F32 A Float32 Array to insert the position, UV and unit data in to. + * @param U32 A Uint32 Array to insert the color and alpha data in to. + * @param offset The index of the array to insert this Vertex to. + * @param textureUnit The texture unit currently in use. + * @param tintEffect The tint effect to use. + */ + load(F32: Float32Array, U32: Uint32Array, offset: number, textureUnit: number, tintEffect: number): number; + + /** + * Transforms all Face vertices by the given matrix, storing the results in their `vx`, `vy` and `vz` properties. + * @param transformMatrix The transform matrix to apply to this vertex. + * @param width The width of the parent Mesh. + * @param height The height of the parent Mesh. + * @param cameraZ The z position of the MeshCamera. + */ + transformCoordinatesLocal(transformMatrix: Phaser.Math.Matrix4, width: number, height: number, cameraZ: number): this; + + /** + * Updates the bounds of this Face, based on the translated values of the vertices. + * + * Call this method prior to accessing the `Face.bounds` property. + */ + updateBounds(): this; + + /** + * Checks if this Face is within the view of the given Camera. + * + * This method is called in the `MeshWebGLRenderer` function. It performs the following tasks: + * + * First, the `Vertex.update` method is called on each of the vertices. This populates them + * with the new translated values, updating their `tx`, `ty` and `ta` properties. + * + * Then it tests to see if this face is visible due to the alpha values, if not, it returns. + * + * After this, if `hideCCW` is set, it calls `isCounterClockwise` and returns if not. + * + * Finally, it will update the `Face.bounds` based on the newly translated vertex values + * and return the results of an intersection test between the bounds and the camera world view + * rectangle. + * @param camera The Camera to check against. + * @param hideCCW Test the counter-clockwise orientation of the verts? + * @param z The Cameras z position, used in the CCW test. + * @param alpha The alpha of the parent object. + * @param a The parent transform matrix data a component. + * @param b The parent transform matrix data b component. + * @param c The parent transform matrix data c component. + * @param d The parent transform matrix data d component. + * @param e The parent transform matrix data e component. + * @param f The parent transform matrix data f component. + * @param roundPixels Round the vertex position or not? + */ + isInView(camera: Phaser.Cameras.Scene2D.Camera, hideCCW: boolean, z: number, alpha: number, a: number, b: number, c: number, d: number, e: number, f: number, roundPixels: boolean): boolean; + + /** + * Translates the original UV positions of each vertex by the given amounts. + * + * The original properties `Vertex.u` and `Vertex.v` + * remain unchanged, only the translated properties + * `Vertex.tu` and `Vertex.tv`, as used in rendering, + * are updated. + * @param x The amount to scroll the UV u coordinate by. + * @param y The amount to scroll the UV v coordinate by. + */ + scrollUV(x: number, y: number): this; + + /** + * Scales the original UV values of each vertex by the given amounts. + * + * The original properties `Vertex.u` and `Vertex.v` + * remain unchanged, only the translated properties + * `Vertex.tu` and `Vertex.tv`, as used in rendering, + * are updated. + * @param x The amount to scale the UV u coordinate by. + * @param y The amount to scale the UV v coordinate by. + */ + scaleUV(x: number, y: number): this; + + /** + * Sets the color value for each Vertex in this Face. + * @param color The color value for each vertex. + */ + setColor(color: number): this; + + /** + * Calls the `Vertex.update` method on each of the vertices. This populates them + * with the new translated values, updating their `tx`, `ty` and `ta` properties. + * @param alpha The alpha of the parent object. + * @param a The parent transform matrix data a component. + * @param b The parent transform matrix data b component. + * @param c The parent transform matrix data c component. + * @param d The parent transform matrix data d component. + * @param e The parent transform matrix data e component. + * @param f The parent transform matrix data f component. + * @param roundPixels Round the vertex position or not? + */ + update(alpha: number, a: number, b: number, c: number, d: number, e: number, f: number, roundPixels: boolean): this; + + /** + * Translates the vertices of this Face by the given amounts. + * + * The actual vertex positions are adjusted, not their transformed position. + * + * Therefore, this updates the vertex data directly. + * @param x The amount to horizontally translate by. + * @param y The amount to vertically translate by. Default 0. + */ + translate(x: number, y?: number): this; + + /** + * The x coordinate of this Face, based on the in center position of the Face. + */ + x: number; + + /** + * The y coordinate of this Face, based on the in center position of the Face. + */ + y: number; + + /** + * Set the alpha value of this Face. + * + * Each vertex is given the same value. If you need to adjust the alpha on a per-vertex basis + * then use the `Vertex.alpha` property instead. + * + * When getting the alpha of this Face, it will return an average of the alpha + * component of all three vertices. + */ + alpha: number; + + /** + * The depth of this Face, which is an average of the z component of all three vertices. + * + * The depth is calculated based on the transformed z value, not the local one. + */ + readonly depth: number; + + /** + * Destroys this Face and nulls the references to the vertices. + */ + destroy(): void; + + } + + /** + * Creates a grid of vertices based on the given configuration object and optionally adds it to a Mesh. + * + * The size of the grid is given in pixels. An example configuration may be: + * + * `{ width: 256, height: 256, widthSegments: 2, heightSegments: 2, tile: true }` + * + * This will create a grid 256 x 256 pixels in size, split into 2 x 2 segments, with + * the texture tiling across the cells. + * + * You can split the grid into segments both vertically and horizontally. This will + * generate two faces per grid segment as a result. + * + * The `tile` parameter allows you to control if the tile will repeat across the grid + * segments, or be displayed in full. + * + * If adding this grid to a Mesh you can offset the grid via the `x` and `y` properties. + * + * UV coordinates are generated based on the given texture and frame in the config. For + * example, no frame is given, the UVs will be in the range 0 to 1. If a frame is given, + * such as from a texture atlas, the UVs will be generated within the range of that frame. + * @param config A Grid configuration object. + */ + function GenerateGridVerts(config: Phaser.Types.Geom.Mesh.GenerateGridConfig): Phaser.Types.Geom.Mesh.GenerateGridVertsResult; + + /** + * This method will return an object containing Face and Vertex instances, generated + * from the parsed triangulated OBJ Model data given to this function. + * + * The obj data should have been parsed in advance via the ParseObj function: + * + * ```javascript + * var data = Phaser.Geom.Mesh.ParseObj(rawData, flipUV); + * + * var results = GenerateObjVerts(data); + * ``` + * + * Alternatively, you can parse obj files loaded via the OBJFile loader: + * + * ```javascript + * preload () + * { + * this.load.obj('alien', 'assets/3d/alien.obj); + * } + * + * var results = GenerateObjVerts(this.cache.obj.get('alien)); + * ``` + * + * Make sure your 3D package has triangulated the model data prior to exporting it. + * + * You can use the data returned by this function to populate the vertices of a Mesh Game Object. + * + * You may add multiple models to a single Mesh, although they will act as one when + * moved or rotated. You can scale the model data, should it be too small (or large) to visualize. + * You can also offset the model via the `x`, `y` and `z` parameters. + * @param data The parsed OBJ model data. + * @param mesh An optional Mesh Game Object. If given, the generated Faces will be automatically added to this Mesh. Set to `null` to skip. + * @param scale An amount to scale the model data by. Use this if the model has exported too small, or large, to see. Default 1. + * @param x Translate the model x position by this amount. Default 0. + * @param y Translate the model y position by this amount. Default 0. + * @param z Translate the model z position by this amount. Default 0. + * @param rotateX Rotate the model on the x axis by this amount, in radians. Default 0. + * @param rotateY Rotate the model on the y axis by this amount, in radians. Default 0. + * @param rotateZ Rotate the model on the z axis by this amount, in radians. Default 0. + * @param zIsUp Is the z axis up (true), or is y axis up (false)? Default true. + */ + function GenerateObjVerts(data: Phaser.Types.Geom.Mesh.OBJData, mesh?: Phaser.GameObjects.Mesh, scale?: number, x?: number, y?: number, z?: number, rotateX?: number, rotateY?: number, rotateZ?: number, zIsUp?: boolean): Phaser.Types.Geom.Mesh.GenerateVertsResult; + + /** + * Generates a set of Face and Vertex objects by parsing the given data. + * + * This method will take vertex data in one of two formats, based on the `containsZ` parameter. + * + * If your vertex data are `x`, `y` pairs, then `containsZ` should be `false` (this is the default) + * + * If your vertex data is groups of `x`, `y` and `z` values, then the `containsZ` parameter must be true. + * + * The `uvs` parameter is a numeric array consisting of `u` and `v` pairs. + * + * The `normals` parameter is a numeric array consisting of `x`, `y` vertex normal values and, if `containsZ` is true, `z` values as well. + * + * The `indicies` parameter is an optional array that, if given, is an indexed list of vertices to be added. + * + * The `colors` parameter is an optional array, or single value, that if given sets the color of each vertex created. + * + * The `alphas` parameter is an optional array, or single value, that if given sets the alpha of each vertex created. + * + * When providing indexed data it is assumed that _all_ of the arrays are indexed, not just the vertices. + * + * The following example will create a 256 x 256 sized quad using an index array: + * + * ```javascript + * const vertices = [ + * -128, 128, + * 128, 128, + * -128, -128, + * 128, -128 + * ]; + * + * const uvs = [ + * 0, 1, + * 1, 1, + * 0, 0, + * 1, 0 + * ]; + * + * const indices = [ 0, 2, 1, 2, 3, 1 ]; + * + * GenerateVerts(vertices, uvs, indicies); + * ``` + * + * If the data is not indexed, it's assumed that the arrays all contain sequential data. + * @param vertices The vertices array. Either `xy` pairs, or `xyz` if the `containsZ` parameter is `true`. + * @param uvs The UVs pairs array. + * @param indicies Optional vertex indicies array. If you don't have one, pass `null` or an empty array. + * @param containsZ Does the vertices data include a `z` component? Default false. + * @param normals Optional vertex normals array. If you don't have one, pass `null` or an empty array. + * @param colors An array of colors, one per vertex, or a single color value applied to all vertices. Default 0xffffff. + * @param alphas An array of alpha values, one per vertex, or a single alpha value applied to all vertices. Default 1. + * @param flipUV Flip the UV coordinates? Default false. + */ + function GenerateVerts(vertices: number[], uvs: number[], indicies?: number[], containsZ?: boolean, normals?: number[], colors?: number | number[], alphas?: number | number[], flipUV?: boolean): Phaser.Types.Geom.Mesh.GenerateVertsResult; + + /** + * Parses a Wavefront OBJ File, extracting the models from it and returning them in an array. + * + * The model data *must* be triangulated for a Mesh Game Object to be able to render it. + * @param data The OBJ File data as a raw string. + * @param flipUV Flip the UV coordinates? Default true. + */ + function ParseObj(data: string, flipUV?: boolean): Phaser.Types.Geom.Mesh.OBJData; + + /** + * Takes a Wavefront Material file and extracts the diffuse reflectivity of the named + * materials, converts them to integer color values and returns them. + * + * This is used internally by the `addOBJ` and `addModel` methods, but is exposed for + * public consumption as well. + * + * Note this only works with diffuse values, specified in the `Kd r g b` format, where + * `g` and `b` are optional, but `r` is required. It does not support spectral rfl files, + * or any other material statement (such as `Ka` or `Ks`) + * @param mtl The OBJ MTL file as a raw string, i.e. loaded via `this.load.text`. + */ + function ParseObjMaterial(mtl: string): object; + + /** + * Rotates the vertices of a Face to the given angle. + * + * The actual vertex positions are adjusted, not their transformed positions. + * + * Therefore, this updates the vertex data directly. + * @param face The Face to rotate. + * @param angle The angle to rotate to, in radians. + * @param cx An optional center of rotation. If not given, the Face in-center is used. + * @param cy An optional center of rotation. If not given, the Face in-center is used. + */ + function RotateFace(face: Phaser.Geom.Mesh.Face, angle: number, cx?: number, cy?: number): void; + + /** + * A Vertex Geometry Object. + * + * This class consists of all the information required for a single vertex within a Face Geometry Object. + * + * Faces, and thus Vertex objects, are used by the Mesh Game Object in order to render objects in WebGL. + */ + class Vertex extends Phaser.Math.Vector3 { + /** + * + * @param x The x position of the vertex. + * @param y The y position of the vertex. + * @param z The z position of the vertex. + * @param u The UV u coordinate of the vertex. + * @param v The UV v coordinate of the vertex. + * @param color The color value of the vertex. Default 0xffffff. + * @param alpha The alpha value of the vertex. Default 1. + * @param nx The x normal value of the vertex. Default 0. + * @param ny The y normal value of the vertex. Default 0. + * @param nz The z normal value of the vertex. Default 0. + */ + constructor(x: number, y: number, z: number, u: number, v: number, color?: number, alpha?: number, nx?: number, ny?: number, nz?: number); + + /** + * The projected x coordinate of this vertex. + */ + vx: number; + + /** + * The projected y coordinate of this vertex. + */ + vy: number; + + /** + * The projected z coordinate of this vertex. + */ + vz: number; + + /** + * The normalized projected x coordinate of this vertex. + */ + nx: number; + + /** + * The normalized projected y coordinate of this vertex. + */ + ny: number; + + /** + * The normalized projected z coordinate of this vertex. + */ + nz: number; + + /** + * UV u coordinate of this vertex. + */ + u: number; + + /** + * UV v coordinate of this vertex. + */ + v: number; + + /** + * The color value of this vertex. + */ + color: number; + + /** + * The alpha value of this vertex. + */ + alpha: number; + + /** + * The translated x coordinate of this vertex. + */ + tx: number; + + /** + * The translated y coordinate of this vertex. + */ + ty: number; + + /** + * The translated alpha value of this vertex. + */ + ta: number; + + /** + * The translated uv u coordinate of this vertex. + */ + tu: number; + + /** + * The translated uv v coordinate of this vertex. + */ + tv: number; + + /** + * Sets the U and V properties. + * + * Also resets the translated uv properties, undoing any scale + * or shift they may have had. + * @param u The UV u coordinate of the vertex. + * @param v The UV v coordinate of the vertex. + */ + setUVs(u: number, v: number): this; + + /** + * Translates the original UV positions by the given amounts. + * + * The original properties `Vertex.u` and `Vertex.v` + * remain unchanged, only the translated properties + * `Vertex.tu` and `Vertex.tv`, as used in rendering, + * are updated. + * @param x The amount to scroll the UV u coordinate by. + * @param y The amount to scroll the UV v coordinate by. + */ + scrollUV(x: number, y: number): this; + + /** + * Scales the original UV values by the given amounts. + * + * The original properties `Vertex.u` and `Vertex.v` + * remain unchanged, only the translated properties + * `Vertex.tu` and `Vertex.tv`, as used in rendering, + * are updated. + * @param x The amount to scale the UV u coordinate by. + * @param y The amount to scale the UV v coordinate by. + */ + scaleUV(x: number, y: number): this; + + /** + * Transforms this vertex by the given matrix, storing the results in `vx`, `vy` and `vz`. + * @param transformMatrix The transform matrix to apply to this vertex. + * @param width The width of the parent Mesh. + * @param height The height of the parent Mesh. + * @param cameraZ The z position of the MeshCamera. + */ + transformCoordinatesLocal(transformMatrix: Phaser.Math.Matrix4, width: number, height: number, cameraZ: number): void; + + /** + * Resizes this Vertex by setting the x and y coordinates, then transforms this vertex + * by an identity matrix and dimensions, storing the results in `vx`, `vy` and `vz`. + * @param x The x position of the vertex. + * @param y The y position of the vertex. + * @param width The width of the parent Mesh. + * @param height The height of the parent Mesh. + * @param originX The originX of the parent Mesh. + * @param originY The originY of the parent Mesh. + */ + resize(x: number, y: number, width: number, height: number, originX: number, originY: number): this; + + /** + * Updates this Vertex based on the given transform. + * @param a The parent transform matrix data a component. + * @param b The parent transform matrix data b component. + * @param c The parent transform matrix data c component. + * @param d The parent transform matrix data d component. + * @param e The parent transform matrix data e component. + * @param f The parent transform matrix data f component. + * @param roundPixels Round the vertex position or not? + * @param alpha The alpha of the parent object. + */ + update(a: number, b: number, c: number, d: number, e: number, f: number, roundPixels: boolean, alpha: number): this; + + /** + * Loads the data from this Vertex into the given Typed Arrays. + * @param F32 A Float32 Array to insert the position, UV and unit data in to. + * @param U32 A Uint32 Array to insert the color and alpha data in to. + * @param offset The index of the array to insert this Vertex to. + * @param textureUnit The texture unit currently in use. + * @param tintEffect The tint effect to use. + */ + load(F32: Float32Array, U32: Uint32Array, offset: number, textureUnit: number, tintEffect: number): number; + + } + + } + + /** + * Defines a Point in 2D space, with an x and y component. + */ + class Point { + /** + * + * @param x The x coordinate of this Point. Default 0. + * @param y The y coordinate of this Point. Default x. + */ + constructor(x?: number, y?: number); + + /** + * Apply `Math.ceil()` to each coordinate of the given Point. + * @param point The Point to ceil. + */ + static Ceil(point: O): O; + + /** + * Clone the given Point. + * @param source The source Point to clone. + */ + static Clone(source: Phaser.Geom.Point): Phaser.Geom.Point; + + /** + * Copy the values of one Point to a destination Point. + * @param source The source Point to copy the values from. + * @param dest The destination Point to copy the values to. + */ + static CopyFrom(source: Phaser.Geom.Point, dest: O): O; + + /** + * A comparison of two `Point` objects to see if they are equal. + * @param point The original `Point` to compare against. + * @param toCompare The second `Point` to compare. + */ + static Equals(point: Phaser.Geom.Point, toCompare: Phaser.Geom.Point): boolean; + + /** + * Apply `Math.ceil()` to each coordinate of the given Point. + * @param point The Point to floor. + */ + static Floor(point: O): O; + + /** + * Get the centroid or geometric center of a plane figure (the arithmetic mean position of all the points in the figure). + * Informally, it is the point at which a cutout of the shape could be perfectly balanced on the tip of a pin. + * @param points An array of Vector2Like objects to get the geometric center of. + * @param out A Point object to store the output coordinates in. If not given, a new Point instance is created. + */ + static GetCentroid(points: Phaser.Types.Math.Vector2Like[], out?: O): O; + + /** + * Calculate the magnitude of the point, which equivalent to the length of the line from the origin to this point. + * @param point The point to calculate the magnitude for + */ + static GetMagnitude(point: Phaser.Geom.Point): number; + + /** + * Calculates the square of magnitude of given point.(Can be used for fast magnitude calculation of point) + * @param point Returns square of the magnitude/length of given point. + */ + static GetMagnitudeSq(point: Phaser.Geom.Point): number; + + /** + * Calculates the Axis Aligned Bounding Box (or aabb) from an array of points. + * @param points An array of Vector2Like objects to get the AABB from. + * @param out A Rectangle object to store the results in. If not given, a new Rectangle instance is created. + */ + static GetRectangleFromPoints(points: Phaser.Types.Math.Vector2Like[], out?: O): O; + + /** + * Returns the linear interpolation point between the two given points, based on `t`. + * @param pointA The starting `Point` for the interpolation. + * @param pointB The target `Point` for the interpolation. + * @param t The amount to interpolate between the two points. Generally, a value between 0 (returns the starting `Point`) and 1 (returns the target `Point`). If omitted, 0 is used. Default 0. + * @param out An optional `Point` object whose `x` and `y` values will be set to the result of the interpolation (can also be any object with `x` and `y` properties). If omitted, a new `Point` created and returned. + */ + static Interpolate(pointA: Phaser.Geom.Point, pointB: Phaser.Geom.Point, t?: number, out?: O): O; + + /** + * Swaps the X and the Y coordinate of a point. + * @param point The Point to modify. + */ + static Invert(point: O): O; + + /** + * Inverts a Point's coordinates. + * @param point The Point to invert. + * @param out The Point to return the inverted coordinates in. + */ + static Negative(point: Phaser.Geom.Point, out?: O): O; + + /** + * The geometry constant type of this object: `GEOM_CONST.POINT`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * The x coordinate of this Point. + */ + x: number; + + /** + * The y coordinate of this Point. + */ + y: number; + + /** + * Set the x and y coordinates of the point to the given values. + * @param x The x coordinate of this Point. Default 0. + * @param y The y coordinate of this Point. Default x. + */ + setTo(x?: number, y?: number): this; + + /** + * Calculates the vector projection of `pointA` onto the nonzero `pointB`. This is the + * orthogonal projection of `pointA` onto a straight line parallel to `pointB`. + * @param pointA Point A, to be projected onto Point B. + * @param pointB Point B, to have Point A projected upon it. + * @param out The Point object to store the position in. If not given, a new Point instance is created. + */ + static Project(pointA: Phaser.Geom.Point, pointB: Phaser.Geom.Point, out?: O): O; + + /** + * Calculates the vector projection of `pointA` onto the nonzero `pointB`. This is the + * orthogonal projection of `pointA` onto a straight line paralle to `pointB`. + * @param pointA Point A, to be projected onto Point B. Must be a normalized point with a magnitude of 1. + * @param pointB Point B, to have Point A projected upon it. + * @param out The Point object to store the position in. If not given, a new Point instance is created. + */ + static ProjectUnit(pointA: Phaser.Geom.Point, pointB: Phaser.Geom.Point, out?: O): O; + + /** + * Changes the magnitude (length) of a two-dimensional vector without changing its direction. + * @param point The Point to treat as the end point of the vector. + * @param magnitude The new magnitude of the vector. + */ + static SetMagnitude(point: O, magnitude: number): O; + + } + + /** + * A Polygon object + * + * The polygon is a closed shape consists of a series of connected straight lines defined by list of ordered points. + * Several formats are supported to define the list of points, check the setTo method for details. + * This is a geometry object allowing you to define and inspect the shape. + * It is not a Game Object, in that you cannot add it to the display list, and it has no texture. + * To render a Polygon you should look at the capabilities of the Graphics class. + */ + class Polygon { + /** + * + * @param points List of points defining the perimeter of this Polygon. Several formats are supported: + * - A string containing paired x y values separated by a single space: `'40 0 40 20 100 20 100 80 40 80 40 100 0 50'` + * - An array of Point objects: `[new Phaser.Point(x1, y1), ...]` + * - An array of objects with public x y properties: `[obj1, obj2, ...]` + * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]` + * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]` + */ + constructor(points?: string | number[] | Phaser.Types.Math.Vector2Like[]); + + /** + * Create a new polygon which is a copy of the specified polygon + * @param polygon The polygon to create a clone of + */ + static Clone(polygon: Phaser.Geom.Polygon): Phaser.Geom.Polygon; + + /** + * Checks if a point is within the bounds of a Polygon. + * @param polygon The Polygon to check against. + * @param x The X coordinate of the point to check. + * @param y The Y coordinate of the point to check. + */ + static Contains(polygon: Phaser.Geom.Polygon, x: number, y: number): boolean; + + /** + * Checks the given Point again the Polygon to see if the Point lays within its vertices. + * @param polygon The Polygon to check. + * @param point The Point to check if it's within the Polygon. + */ + static ContainsPoint(polygon: Phaser.Geom.Polygon, point: Phaser.Geom.Point): boolean; + + /** + * This module implements a modified ear slicing algorithm, optimized by z-order curve hashing and extended to + * handle holes, twisted polygons, degeneracies and self-intersections in a way that doesn't guarantee correctness + * of triangulation, but attempts to always produce acceptable results for practical data. + * + * Example: + * + * ```javascript + * const triangles = Phaser.Geom.Polygon.Earcut([10,0, 0,50, 60,60, 70,10]); // returns [1,0,3, 3,2,1] + * ``` + * + * Each group of three vertex indices in the resulting array forms a triangle. + * + * ```javascript + * // triangulating a polygon with a hole + * earcut([0,0, 100,0, 100,100, 0,100, 20,20, 80,20, 80,80, 20,80], [4]); + * // [3,0,4, 5,4,0, 3,4,7, 5,0,1, 2,3,7, 6,5,1, 2,7,6, 6,1,2] + * + * // triangulating a polygon with 3d coords + * earcut([10,0,1, 0,50,2, 60,60,3, 70,10,4], null, 3); + * // [1,0,3, 3,2,1] + * ``` + * + * If you pass a single vertex as a hole, Earcut treats it as a Steiner point. + * + * If your input is a multi-dimensional array (e.g. GeoJSON Polygon), you can convert it to the format + * expected by Earcut with `Phaser.Geom.Polygon.Earcut.flatten`: + * + * ```javascript + * var data = earcut.flatten(geojson.geometry.coordinates); + * var triangles = earcut(data.vertices, data.holes, data.dimensions); + * ``` + * + * After getting a triangulation, you can verify its correctness with `Phaser.Geom.Polygon.Earcut.deviation`: + * + * ```javascript + * var deviation = earcut.deviation(vertices, holes, dimensions, triangles); + * ``` + * Returns the relative difference between the total area of triangles and the area of the input polygon. + * 0 means the triangulation is fully correct. + * + * For more information see https://github.com/mapbox/earcut + * @param data A flat array of vertex coordinate, like [x0,y0, x1,y1, x2,y2, ...] + * @param holeIndices An array of hole indices if any (e.g. [5, 8] for a 12-vertex input would mean one hole with vertices 5–7 and another with 8–11). + * @param dimensions The number of coordinates per vertex in the input array (2 by default). Default 2. + */ + static Earcut(data: number[], holeIndices?: number[], dimensions?: number): number[]; + + /** + * Calculates the bounding AABB rectangle of a polygon. + * @param polygon The polygon that should be calculated. + * @param out The rectangle or object that has x, y, width, and height properties to store the result. Optional. + */ + static GetAABB(polygon: Phaser.Geom.Polygon, out?: O): O; + + /** + * Stores all of the points of a Polygon into a flat array of numbers following the sequence [ x,y, x,y, x,y ], + * i.e. each point of the Polygon, in the order it's defined, corresponds to two elements of the resultant + * array for the point's X and Y coordinate. + * @param polygon The Polygon whose points to export. + * @param output An array to which the points' coordinates should be appended. + */ + static GetNumberArray(polygon: Phaser.Geom.Polygon, output?: O): O; + + /** + * Returns an array of Point objects containing the coordinates of the points around the perimeter of the Polygon, + * based on the given quantity or stepRate values. + * @param polygon The Polygon to get the points from. + * @param quantity The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead. + * @param stepRate Sets the quantity by getting the perimeter of the Polygon and dividing it by the stepRate. + * @param output An array to insert the points in to. If not provided a new array will be created. + */ + static GetPoints(polygon: Phaser.Geom.Polygon, quantity: number, stepRate?: number, output?: any[]): Phaser.Geom.Point[]; + + /** + * Returns the perimeter of the given Polygon. + * @param polygon The Polygon to get the perimeter of. + */ + static Perimeter(polygon: Phaser.Geom.Polygon): number; + + /** + * The geometry constant type of this object: `GEOM_CONST.POLYGON`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * The area of this Polygon. + */ + area: number; + + /** + * An array of number pair objects that make up this polygon. I.e. [ {x,y}, {x,y}, {x,y} ] + */ + points: Phaser.Geom.Point[]; + + /** + * Check to see if the Polygon contains the given x / y coordinates. + * @param x The x coordinate to check within the polygon. + * @param y The y coordinate to check within the polygon. + */ + contains(x: number, y: number): boolean; + + /** + * Sets this Polygon to the given points. + * + * The points can be set from a variety of formats: + * + * - A string containing paired values separated by a single space: `'40 0 40 20 100 20 100 80 40 80 40 100 0 50'` + * - An array of Point objects: `[new Phaser.Point(x1, y1), ...]` + * - An array of objects with public x/y properties: `[obj1, obj2, ...]` + * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]` + * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]` + * + * `setTo` may also be called without any arguments to remove all points. + * @param points Points defining the perimeter of this polygon. Please check function description above for the different supported formats. + */ + setTo(points?: string | number[] | Phaser.Types.Math.Vector2Like[]): this; + + /** + * Calculates the area of the Polygon. This is available in the property Polygon.area + */ + calculateArea(): number; + + /** + * Returns an array of Point objects containing the coordinates of the points around the perimeter of the Polygon, + * based on the given quantity or stepRate values. + * @param quantity The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead. + * @param stepRate Sets the quantity by getting the perimeter of the Polygon and dividing it by the stepRate. + * @param output An array to insert the points in to. If not provided a new array will be created. + */ + getPoints(quantity: number, stepRate?: number, output?: O): O; + + /** + * Reverses the order of the points of a Polygon. + * @param polygon The Polygon to modify. + */ + static Reverse(polygon: O): O; + + /** + * Takes a Polygon object and simplifies the points by running them through a combination of + * Douglas-Peucker and Radial Distance algorithms. Simplification dramatically reduces the number of + * points in a polygon while retaining its shape, giving a huge performance boost when processing + * it and also reducing visual noise. + * @param polygon The polygon to be simplified. The polygon will be modified in-place and returned. + * @param tolerance Affects the amount of simplification (in the same metric as the point coordinates). Default 1. + * @param highestQuality Excludes distance-based preprocessing step which leads to highest quality simplification but runs ~10-20 times slower. Default false. + */ + static Simplify(polygon: O, tolerance?: number, highestQuality?: boolean): O; + + /** + * Takes a Polygon object and applies Chaikin's smoothing algorithm on its points. + * @param polygon The polygon to be smoothed. The polygon will be modified in-place and returned. + */ + static Smooth(polygon: O): O; + + /** + * Tranlates the points of the given Polygon. + * @param polygon The Polygon to modify. + * @param x The amount to horizontally translate the points by. + * @param y The amount to vertically translate the points by. + */ + static Translate(polygon: O, x: number, y: number): O; + + } + + /** + * Encapsulates a 2D rectangle defined by its corner point in the top-left and its extends in x (width) and y (height) + */ + class Rectangle { + /** + * + * @param x The X coordinate of the top left corner of the Rectangle. Default 0. + * @param y The Y coordinate of the top left corner of the Rectangle. Default 0. + * @param width The width of the Rectangle. Default 0. + * @param height The height of the Rectangle. Default 0. + */ + constructor(x?: number, y?: number, width?: number, height?: number); + + /** + * Calculates the area of the given Rectangle object. + * @param rect The rectangle to calculate the area of. + */ + static Area(rect: Phaser.Geom.Rectangle): number; + + /** + * Rounds a Rectangle's position up to the smallest integer greater than or equal to each current coordinate. + * @param rect The Rectangle to adjust. + */ + static Ceil(rect: O): O; + + /** + * Rounds a Rectangle's position and size up to the smallest integer greater than or equal to each respective value. + * @param rect The Rectangle to modify. + */ + static CeilAll(rect: O): O; + + /** + * Moves the top-left corner of a Rectangle so that its center is at the given coordinates. + * @param rect The Rectangle to be centered. + * @param x The X coordinate of the Rectangle's center. + * @param y The Y coordinate of the Rectangle's center. + */ + static CenterOn(rect: O, x: number, y: number): O; + + /** + * Creates a new Rectangle which is identical to the given one. + * @param source The Rectangle to clone. + */ + static Clone(source: Phaser.Geom.Rectangle): Phaser.Geom.Rectangle; + + /** + * Checks if a given point is inside a Rectangle's bounds. + * @param rect The Rectangle to check. + * @param x The X coordinate of the point to check. + * @param y The Y coordinate of the point to check. + */ + static Contains(rect: Phaser.Geom.Rectangle, x: number, y: number): boolean; + + /** + * Determines whether the specified point is contained within the rectangular region defined by this Rectangle object. + * @param rect The Rectangle object. + * @param point The point object to be checked. Can be a Phaser Point object or any object with x and y values. + */ + static ContainsPoint(rect: Phaser.Geom.Rectangle, point: Phaser.Geom.Point): boolean; + + /** + * Tests if one rectangle fully contains another. + * @param rectA The first rectangle. + * @param rectB The second rectangle. + */ + static ContainsRect(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle): boolean; + + /** + * Copy the values of one Rectangle to a destination Rectangle. + * @param source The source Rectangle to copy the values from. + * @param dest The destination Rectangle to copy the values to. + */ + static CopyFrom(source: Phaser.Geom.Rectangle, dest: O): O; + + /** + * Create an array of points for each corner of a Rectangle + * If an array is specified, each point object will be added to the end of the array, otherwise a new array will be created. + * @param rect The Rectangle object to be decomposed. + * @param out If provided, each point will be added to this array. + */ + static Decompose(rect: Phaser.Geom.Rectangle, out?: any[]): any[]; + + /** + * Compares the `x`, `y`, `width` and `height` properties of two rectangles. + * @param rect Rectangle A + * @param toCompare Rectangle B + */ + static Equals(rect: Phaser.Geom.Rectangle, toCompare: Phaser.Geom.Rectangle): boolean; + + /** + * Adjusts the target rectangle, changing its width, height and position, + * so that it fits inside the area of the source rectangle, while maintaining its original + * aspect ratio. + * + * Unlike the `FitOutside` function, there may be some space inside the source area not covered. + * @param target The target rectangle to adjust. + * @param source The source rectangle to envelop the target in. + */ + static FitInside(target: O, source: Phaser.Geom.Rectangle): O; + + /** + * Adjusts the target rectangle, changing its width, height and position, + * so that it fully covers the area of the source rectangle, while maintaining its original + * aspect ratio. + * + * Unlike the `FitInside` function, the target rectangle may extend further out than the source. + * @param target The target rectangle to adjust. + * @param source The source rectangle to envelope the target in. + */ + static FitOutside(target: O, source: Phaser.Geom.Rectangle): O; + + /** + * Rounds down (floors) the top left X and Y coordinates of the given Rectangle to the largest integer less than or equal to them + * @param rect The rectangle to floor the top left X and Y coordinates of + */ + static Floor(rect: O): O; + + /** + * Rounds a Rectangle's position and size down to the largest integer less than or equal to each current coordinate or dimension. + * @param rect The Rectangle to adjust. + */ + static FloorAll(rect: O): O; + + /** + * Constructs new Rectangle or repositions and resizes an existing Rectangle so that all of the given points are on or within its bounds. + * + * The `points` parameter is an array of Point-like objects: + * + * ```js + * const points = [ + * [100, 200], + * [200, 400], + * { x: 30, y: 60 } + * ] + * ``` + * @param points An array of points (either arrays with two elements corresponding to the X and Y coordinate or an object with public `x` and `y` properties) which should be surrounded by the Rectangle. + * @param out Optional Rectangle to adjust. + */ + static FromPoints(points: any[], out?: O): O; + + /** + * Create the smallest Rectangle containing two coordinate pairs. + * @param x1 The X coordinate of the first point. + * @param y1 The Y coordinate of the first point. + * @param x2 The X coordinate of the second point. + * @param y2 The Y coordinate of the second point. + * @param out Optional Rectangle to adjust. + */ + static FromXY(x1: number, y1: number, x2: number, y2: number, out?: O): O; + + /** + * Calculates the width/height ratio of a rectangle. + * @param rect The rectangle. + */ + static GetAspectRatio(rect: Phaser.Geom.Rectangle): number; + + /** + * Returns the center of a Rectangle as a Point. + * @param rect The Rectangle to get the center of. + * @param out Optional point-like object to update with the center coordinates. + */ + static GetCenter(rect: Phaser.Geom.Rectangle, out?: O): O; + + /** + * Calculates the coordinates of a point at a certain `position` on the Rectangle's perimeter. + * + * The `position` is a fraction between 0 and 1 which defines how far into the perimeter the point is. + * + * A value of 0 or 1 returns the point at the top left corner of the rectangle, while a value of 0.5 returns the point at the bottom right corner of the rectangle. Values between 0 and 0.5 are on the top or the right side and values between 0.5 and 1 are on the bottom or the left side. + * @param rectangle The Rectangle to get the perimeter point from. + * @param position The normalized distance into the Rectangle's perimeter to return. + * @param out An object to update with the `x` and `y` coordinates of the point. + */ + static GetPoint(rectangle: Phaser.Geom.Rectangle, position: number, out?: O): O; + + /** + * Return an array of points from the perimeter of the rectangle, each spaced out based on the quantity or step required. + * @param rectangle The Rectangle object to get the points from. + * @param step Step between points. Used to calculate the number of points to return when quantity is falsey. Ignored if quantity is positive. + * @param quantity The number of evenly spaced points from the rectangles perimeter to return. If falsey, step param will be used to calculate the number of points. + * @param out An optional array to store the points in. + */ + static GetPoints(rectangle: Phaser.Geom.Rectangle, step: number, quantity: number, out?: O): O; + + /** + * Returns the size of the Rectangle, expressed as a Point object. + * With the value of the `width` as the `x` property and the `height` as the `y` property. + * @param rect The Rectangle to get the size from. + * @param out The Point object to store the size in. If not given, a new Point instance is created. + */ + static GetSize(rect: Phaser.Geom.Rectangle, out?: O): O; + + /** + * Increases the size of a Rectangle by a specified amount. + * + * The center of the Rectangle stays the same. The amounts are added to each side, so the actual increase in width or height is two times bigger than the respective argument. + * @param rect The Rectangle to inflate. + * @param x How many pixels the left and the right side should be moved by horizontally. + * @param y How many pixels the top and the bottom side should be moved by vertically. + */ + static Inflate(rect: O, x: number, y: number): O; + + /** + * Takes two Rectangles and first checks to see if they intersect. + * If they intersect it will return the area of intersection in the `out` Rectangle. + * If they do not intersect, the `out` Rectangle will have a width and height of zero. + * @param rectA The first Rectangle to get the intersection from. + * @param rectB The second Rectangle to get the intersection from. + * @param out A Rectangle to store the intersection results in. + */ + static Intersection(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle, out?: Phaser.Geom.Rectangle): O; + + /** + * Returns an array of points from the perimeter of the Rectangle, where each point is spaced out based + * on either the `step` value, or the `quantity`. + * @param rect The Rectangle to get the perimeter points from. + * @param step The distance between each point of the perimeter. Set to `null` if you wish to use the `quantity` parameter instead. + * @param quantity The total number of points to return. The step is then calculated based on the length of the Rectangle, divided by this value. + * @param out An array in which the perimeter points will be stored. If not given, a new array instance is created. + */ + static MarchingAnts(rect: Phaser.Geom.Rectangle, step?: number, quantity?: number, out?: O): O; + + /** + * Merges a Rectangle with a list of points by repositioning and/or resizing it such that all points are located on or within its bounds. + * @param target The Rectangle which should be merged. + * @param points An array of Points (or any object with public `x` and `y` properties) which should be merged with the Rectangle. + */ + static MergePoints(target: O, points: Phaser.Geom.Point[]): O; + + /** + * Merges the source rectangle into the target rectangle and returns the target. + * Neither rectangle should have a negative width or height. + * @param target Target rectangle. Will be modified to include source rectangle. + * @param source Rectangle that will be merged into target rectangle. + */ + static MergeRect(target: O, source: Phaser.Geom.Rectangle): O; + + /** + * Merges a Rectangle with a point by repositioning and/or resizing it so that the point is on or within its bounds. + * @param target The Rectangle which should be merged and modified. + * @param x The X coordinate of the point which should be merged. + * @param y The Y coordinate of the point which should be merged. + */ + static MergeXY(target: O, x: number, y: number): O; + + /** + * Nudges (translates) the top left corner of a Rectangle by a given offset. + * @param rect The Rectangle to adjust. + * @param x The distance to move the Rectangle horizontally. + * @param y The distance to move the Rectangle vertically. + */ + static Offset(rect: O, x: number, y: number): O; + + /** + * Nudges (translates) the top-left corner of a Rectangle by the coordinates of a point (translation vector). + * @param rect The Rectangle to adjust. + * @param point The point whose coordinates should be used as an offset. + */ + static OffsetPoint(rect: O, point: Phaser.Geom.Point | Phaser.Math.Vector2): O; + + /** + * Checks if two Rectangles overlap. If a Rectangle is within another Rectangle, the two will be considered overlapping. Thus, the Rectangles are treated as "solid". + * @param rectA The first Rectangle to check. + * @param rectB The second Rectangle to check. + */ + static Overlaps(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle): boolean; + + /** + * Calculates the perimeter of a Rectangle. + * @param rect The Rectangle to use. + */ + static Perimeter(rect: Phaser.Geom.Rectangle): number; + + /** + * Returns a Point from the perimeter of a Rectangle based on the given angle. + * @param rectangle The Rectangle to get the perimeter point from. + * @param angle The angle of the point, in degrees. + * @param out The Point object to store the position in. If not given, a new Point instance is created. + */ + static PerimeterPoint(rectangle: Phaser.Geom.Rectangle, angle: number, out?: O): O; + + /** + * Returns a random point within a Rectangle. + * @param rect The Rectangle to return a point from. + * @param out The object to update with the point's coordinates. + */ + static Random(rect: Phaser.Geom.Rectangle, out: O): O; + + /** + * Calculates a random point that lies within the `outer` Rectangle, but outside of the `inner` Rectangle. + * The inner Rectangle must be fully contained within the outer rectangle. + * @param outer The outer Rectangle to get the random point within. + * @param inner The inner Rectangle to exclude from the returned point. + * @param out A Point, or Point-like object to store the result in. If not specified, a new Point will be created. + */ + static RandomOutside(outer: Phaser.Geom.Rectangle, inner: Phaser.Geom.Rectangle, out?: O): O; + + /** + * The geometry constant type of this object: `GEOM_CONST.RECTANGLE`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * The X coordinate of the top left corner of the Rectangle. + */ + x: number; + + /** + * The Y coordinate of the top left corner of the Rectangle. + */ + y: number; + + /** + * The width of the Rectangle, i.e. the distance between its left side (defined by `x`) and its right side. + */ + width: number; + + /** + * The height of the Rectangle, i.e. the distance between its top side (defined by `y`) and its bottom side. + */ + height: number; + + /** + * Checks if the given point is inside the Rectangle's bounds. + * @param x The X coordinate of the point to check. + * @param y The Y coordinate of the point to check. + */ + contains(x: number, y: number): boolean; + + /** + * Calculates the coordinates of a point at a certain `position` on the Rectangle's perimeter. + * + * The `position` is a fraction between 0 and 1 which defines how far into the perimeter the point is. + * + * A value of 0 or 1 returns the point at the top left corner of the rectangle, while a value of 0.5 returns the point at the bottom right corner of the rectangle. Values between 0 and 0.5 are on the top or the right side and values between 0.5 and 1 are on the bottom or the left side. + * @param position The normalized distance into the Rectangle's perimeter to return. + * @param output An object to update with the `x` and `y` coordinates of the point. + */ + getPoint(position: number, output?: O): O; + + /** + * Returns an array of points from the perimeter of the Rectangle, each spaced out based on the quantity or step required. + * @param quantity The number of points to return. Set to `false` or 0 to return an arbitrary number of points (`perimeter / stepRate`) evenly spaced around the Rectangle based on the `stepRate`. + * @param stepRate If `quantity` is 0, determines the normalized distance between each returned point. + * @param output An array to which to append the points. + */ + getPoints(quantity: number, stepRate?: number, output?: O): O; + + /** + * Returns a random point within the Rectangle's bounds. + * @param point The object in which to store the `x` and `y` coordinates of the point. + */ + getRandomPoint(point?: O): O; + + /** + * Sets the position, width, and height of the Rectangle. + * @param x The X coordinate of the top left corner of the Rectangle. + * @param y The Y coordinate of the top left corner of the Rectangle. + * @param width The width of the Rectangle. + * @param height The height of the Rectangle. + */ + setTo(x: number, y: number, width: number, height: number): this; + + /** + * Resets the position, width, and height of the Rectangle to 0. + */ + setEmpty(): this; + + /** + * Sets the position of the Rectangle. + * @param x The X coordinate of the top left corner of the Rectangle. + * @param y The Y coordinate of the top left corner of the Rectangle. Default x. + */ + setPosition(x: number, y?: number): this; + + /** + * Sets the width and height of the Rectangle. + * @param width The width to set the Rectangle to. + * @param height The height to set the Rectangle to. Default width. + */ + setSize(width: number, height?: number): this; + + /** + * Determines if the Rectangle is empty. A Rectangle is empty if its width or height is less than or equal to 0. + */ + isEmpty(): boolean; + + /** + * Returns a Line object that corresponds to the top of this Rectangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineA(line?: O): O; + + /** + * Returns a Line object that corresponds to the right of this Rectangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineB(line?: O): O; + + /** + * Returns a Line object that corresponds to the bottom of this Rectangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineC(line?: O): O; + + /** + * Returns a Line object that corresponds to the left of this Rectangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineD(line?: O): O; + + /** + * The x coordinate of the left of the Rectangle. + * Changing the left property of a Rectangle object has no effect on the y and height properties. However it does affect the width property, whereas changing the x value does not affect the width property. + */ + left: number; + + /** + * The sum of the x and width properties. + * Changing the right property of a Rectangle object has no effect on the x, y and height properties, however it does affect the width property. + */ + right: number; + + /** + * The y coordinate of the top of the Rectangle. Changing the top property of a Rectangle object has no effect on the x and width properties. + * However it does affect the height property, whereas changing the y value does not affect the height property. + */ + top: number; + + /** + * The sum of the y and height properties. + * Changing the bottom property of a Rectangle object has no effect on the x, y and width properties, but does change the height property. + */ + bottom: number; + + /** + * The x coordinate of the center of the Rectangle. + */ + centerX: number; + + /** + * The y coordinate of the center of the Rectangle. + */ + centerY: number; + + /** + * Determines if the two objects (either Rectangles or Rectangle-like) have the same width and height values under strict equality. + * @param rect The first Rectangle object. + * @param toCompare The second Rectangle object. + */ + static SameDimensions(rect: Phaser.Geom.Rectangle, toCompare: Phaser.Geom.Rectangle): boolean; + + /** + * Scales the width and height of this Rectangle by the given amounts. + * @param rect The `Rectangle` object that will be scaled by the specified amount(s). + * @param x The factor by which to scale the rectangle horizontally. + * @param y The amount by which to scale the rectangle vertically. If this is not specified, the rectangle will be scaled by the factor `x` in both directions. + */ + static Scale(rect: O, x: number, y: number): O; + + /** + * Creates a new Rectangle or repositions and/or resizes an existing Rectangle so that it encompasses the two given Rectangles, i.e. calculates their union. + * @param rectA The first Rectangle to use. + * @param rectB The second Rectangle to use. + * @param out The Rectangle to store the union in. + */ + static Union(rectA: Phaser.Geom.Rectangle, rectB: Phaser.Geom.Rectangle, out?: O): O; + + } + + /** + * A triangle is a plane created by connecting three points. + * The first two arguments specify the first point, the middle two arguments + * specify the second point, and the last two arguments specify the third point. + */ + class Triangle { + /** + * + * @param x1 `x` coordinate of the first point. Default 0. + * @param y1 `y` coordinate of the first point. Default 0. + * @param x2 `x` coordinate of the second point. Default 0. + * @param y2 `y` coordinate of the second point. Default 0. + * @param x3 `x` coordinate of the third point. Default 0. + * @param y3 `y` coordinate of the third point. Default 0. + */ + constructor(x1?: number, y1?: number, x2?: number, y2?: number, x3?: number, y3?: number); + + /** + * Returns the area of a Triangle. + * @param triangle The Triangle to use. + */ + static Area(triangle: Phaser.Geom.Triangle): number; + + /** + * Builds an equilateral triangle. In the equilateral triangle, all the sides are the same length (congruent) and all the angles are the same size (congruent). + * The x/y specifies the top-middle of the triangle (x1/y1) and length is the length of each side. + * @param x x coordinate of the top point of the triangle. + * @param y y coordinate of the top point of the triangle. + * @param length Length of each side of the triangle. + */ + static BuildEquilateral(x: number, y: number, length: number): Phaser.Geom.Triangle; + + /** + * Takes an array of vertex coordinates, and optionally an array of hole indices, then returns an array + * of Triangle instances, where the given vertices have been decomposed into a series of triangles. + * @param data A flat array of vertex coordinates like [x0,y0, x1,y1, x2,y2, ...] + * @param holes An array of hole indices if any (e.g. [5, 8] for a 12-vertex input would mean one hole with vertices 5–7 and another with 8–11). Default null. + * @param scaleX Horizontal scale factor to multiply the resulting points by. Default 1. + * @param scaleY Vertical scale factor to multiply the resulting points by. Default 1. + * @param out An array to store the resulting Triangle instances in. If not provided, a new array is created. + */ + static BuildFromPolygon(data: any[], holes?: any[], scaleX?: number, scaleY?: number, out?: O): O; + + /** + * Builds a right triangle, i.e. one which has a 90-degree angle and two acute angles. + * @param x The X coordinate of the right angle, which will also be the first X coordinate of the constructed Triangle. + * @param y The Y coordinate of the right angle, which will also be the first Y coordinate of the constructed Triangle. + * @param width The length of the side which is to the left or to the right of the right angle. + * @param height The length of the side which is above or below the right angle. + */ + static BuildRight(x: number, y: number, width: number, height: number): Phaser.Geom.Triangle; + + /** + * Positions the Triangle so that it is centered on the given coordinates. + * @param triangle The triangle to be positioned. + * @param x The horizontal coordinate to center on. + * @param y The vertical coordinate to center on. + * @param centerFunc The function used to center the triangle. Defaults to Centroid centering. + */ + static CenterOn(triangle: O, x: number, y: number, centerFunc?: CenterFunction): O; + + /** + * Calculates the position of a Triangle's centroid, which is also its center of mass (center of gravity). + * + * The centroid is the point in a Triangle at which its three medians (the lines drawn from the vertices to the bisectors of the opposite sides) meet. It divides each one in a 2:1 ratio. + * @param triangle The Triangle to use. + * @param out An object to store the coordinates in. + */ + static Centroid(triangle: Phaser.Geom.Triangle, out?: O): O; + + /** + * Computes the circumcentre of a triangle. The circumcentre is the centre of + * the circumcircle, the smallest circle which encloses the triangle. It is also + * the common intersection point of the perpendicular bisectors of the sides of + * the triangle, and is the only point which has equal distance to all three + * vertices of the triangle. + * @param triangle The Triangle to get the circumcenter of. + * @param out The Vector2 object to store the position in. If not given, a new Vector2 instance is created. + */ + static CircumCenter(triangle: Phaser.Geom.Triangle, out?: O): O; + + /** + * Finds the circumscribed circle (circumcircle) of a Triangle object. The circumcircle is the circle which touches all of the triangle's vertices. + * @param triangle The Triangle to use as input. + * @param out An optional Circle to store the result in. + */ + static CircumCircle(triangle: Phaser.Geom.Triangle, out?: O): O; + + /** + * Clones a Triangle object. + * @param source The Triangle to clone. + */ + static Clone(source: Phaser.Geom.Triangle): Phaser.Geom.Triangle; + + /** + * Checks if a point (as a pair of coordinates) is inside a Triangle's bounds. + * @param triangle The Triangle to check. + * @param x The X coordinate of the point to check. + * @param y The Y coordinate of the point to check. + */ + static Contains(triangle: Phaser.Geom.Triangle, x: number, y: number): boolean; + + /** + * Filters an array of point-like objects to only those contained within a triangle. + * If `returnFirst` is true, will return an array containing only the first point in the provided array that is within the triangle (or an empty array if there are no such points). + * @param triangle The triangle that the points are being checked in. + * @param points An array of point-like objects (objects that have an `x` and `y` property) + * @param returnFirst If `true`, return an array containing only the first point found that is within the triangle. Default false. + * @param out If provided, the points that are within the triangle will be appended to this array instead of being added to a new array. If `returnFirst` is true, only the first point found within the triangle will be appended. This array will also be returned by this function. + */ + static ContainsArray(triangle: Phaser.Geom.Triangle, points: Phaser.Geom.Point[], returnFirst?: boolean, out?: any[]): Phaser.Geom.Point[]; + + /** + * Tests if a triangle contains a point. + * @param triangle The triangle. + * @param point The point to test, or any point-like object with public `x` and `y` properties. + */ + static ContainsPoint(triangle: Phaser.Geom.Triangle, point: Phaser.Geom.Point | Phaser.Math.Vector2 | any): boolean; + + /** + * Copy the values of one Triangle to a destination Triangle. + * @param source The source Triangle to copy the values from. + * @param dest The destination Triangle to copy the values to. + */ + static CopyFrom(source: Phaser.Geom.Triangle, dest: O): O; + + /** + * Decomposes a Triangle into an array of its points. + * @param triangle The Triangle to decompose. + * @param out An array to store the points into. + */ + static Decompose(triangle: Phaser.Geom.Triangle, out?: any[]): any[]; + + /** + * Returns true if two triangles have the same coordinates. + * @param triangle The first triangle to check. + * @param toCompare The second triangle to check. + */ + static Equals(triangle: Phaser.Geom.Triangle, toCompare: Phaser.Geom.Triangle): boolean; + + /** + * Returns a Point from around the perimeter of a Triangle. + * @param triangle The Triangle to get the point on its perimeter from. + * @param position The position along the perimeter of the triangle. A value between 0 and 1. + * @param out An option Point, or Point-like object to store the value in. If not given a new Point will be created. + */ + static GetPoint(triangle: Phaser.Geom.Triangle, position: number, out?: O): O; + + /** + * Returns an array of evenly spaced points on the perimeter of a Triangle. + * @param triangle The Triangle to get the points from. + * @param quantity The number of evenly spaced points to return. Set to 0 to return an arbitrary number of points based on the `stepRate`. + * @param stepRate If `quantity` is 0, the distance between each returned point. + * @param out An array to which the points should be appended. + */ + static GetPoints(triangle: Phaser.Geom.Triangle, quantity: number, stepRate: number, out?: O): O; + + /** + * Calculates the position of the incenter of a Triangle object. This is the point where its three angle bisectors meet and it's also the center of the incircle, which is the circle inscribed in the triangle. + * @param triangle The Triangle to find the incenter of. + * @param out An optional Point in which to store the coordinates. + */ + static InCenter(triangle: Phaser.Geom.Triangle, out?: O): O; + + /** + * Moves each point (vertex) of a Triangle by a given offset, thus moving the entire Triangle by that offset. + * @param triangle The Triangle to move. + * @param x The horizontal offset (distance) by which to move each point. Can be positive or negative. + * @param y The vertical offset (distance) by which to move each point. Can be positive or negative. + */ + static Offset(triangle: O, x: number, y: number): O; + + /** + * Gets the length of the perimeter of the given triangle. + * Calculated by adding together the length of each of the three sides. + * @param triangle The Triangle to get the length from. + */ + static Perimeter(triangle: Phaser.Geom.Triangle): number; + + /** + * Returns a random Point from within the area of the given Triangle. + * @param triangle The Triangle to get a random point from. + * @param out The Point object to store the position in. If not given, a new Point instance is created. + */ + static Random(triangle: Phaser.Geom.Triangle, out?: O): O; + + /** + * Rotates a Triangle about its incenter, which is the point at which its three angle bisectors meet. + * @param triangle The Triangle to rotate. + * @param angle The angle by which to rotate the Triangle, in radians. + */ + static Rotate(triangle: O, angle: number): O; + + /** + * Rotates a Triangle at a certain angle about a given Point or object with public `x` and `y` properties. + * @param triangle The Triangle to rotate. + * @param point The Point to rotate the Triangle about. + * @param angle The angle by which to rotate the Triangle, in radians. + */ + static RotateAroundPoint(triangle: O, point: Phaser.Geom.Point, angle: number): O; + + /** + * Rotates an entire Triangle at a given angle about a specific point. + * @param triangle The Triangle to rotate. + * @param x The X coordinate of the point to rotate the Triangle about. + * @param y The Y coordinate of the point to rotate the Triangle about. + * @param angle The angle by which to rotate the Triangle, in radians. + */ + static RotateAroundXY(triangle: O, x: number, y: number, angle: number): O; + + /** + * The geometry constant type of this object: `GEOM_CONST.TRIANGLE`. + * Used for fast type comparisons. + */ + readonly type: number; + + /** + * `x` coordinate of the first point. + */ + x1: number; + + /** + * `y` coordinate of the first point. + */ + y1: number; + + /** + * `x` coordinate of the second point. + */ + x2: number; + + /** + * `y` coordinate of the second point. + */ + y2: number; + + /** + * `x` coordinate of the third point. + */ + x3: number; + + /** + * `y` coordinate of the third point. + */ + y3: number; + + /** + * Checks whether a given points lies within the triangle. + * @param x The x coordinate of the point to check. + * @param y The y coordinate of the point to check. + */ + contains(x: number, y: number): boolean; + + /** + * Returns a specific point on the triangle. + * @param position Position as float within `0` and `1`. `0` equals the first point. + * @param output Optional Point, or point-like object, that the calculated point will be written to. + */ + getPoint(position: number, output?: O): O; + + /** + * Calculates a list of evenly distributed points on the triangle. It is either possible to pass an amount of points to be generated (`quantity`) or the distance between two points (`stepRate`). + * @param quantity Number of points to be generated. Can be falsey when `stepRate` should be used. All points have the same distance along the triangle. + * @param stepRate Distance between two points. Will only be used when `quantity` is falsey. + * @param output Optional Array for writing the calculated points into. Otherwise a new array will be created. + */ + getPoints(quantity: number, stepRate?: number, output?: O): O; + + /** + * Returns a random point along the triangle. + * @param point Optional `Point` that should be modified. Otherwise a new one will be created. + */ + getRandomPoint(point?: O): O; + + /** + * Sets all three points of the triangle. Leaving out any coordinate sets it to be `0`. + * @param x1 `x` coordinate of the first point. Default 0. + * @param y1 `y` coordinate of the first point. Default 0. + * @param x2 `x` coordinate of the second point. Default 0. + * @param y2 `y` coordinate of the second point. Default 0. + * @param x3 `x` coordinate of the third point. Default 0. + * @param y3 `y` coordinate of the third point. Default 0. + */ + setTo(x1?: number, y1?: number, x2?: number, y2?: number, x3?: number, y3?: number): this; + + /** + * Returns a Line object that corresponds to Line A of this Triangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineA(line?: O): O; + + /** + * Returns a Line object that corresponds to Line B of this Triangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineB(line?: O): O; + + /** + * Returns a Line object that corresponds to Line C of this Triangle. + * @param line A Line object to set the results in. If `undefined` a new Line will be created. + */ + getLineC(line?: O): O; + + /** + * Left most X coordinate of the triangle. Setting it moves the triangle on the X axis accordingly. + */ + left: number; + + /** + * Right most X coordinate of the triangle. Setting it moves the triangle on the X axis accordingly. + */ + right: number; + + /** + * Top most Y coordinate of the triangle. Setting it moves the triangle on the Y axis accordingly. + */ + top: number; + + /** + * Bottom most Y coordinate of the triangle. Setting it moves the triangle on the Y axis accordingly. + */ + bottom: number; + + } + + } + + namespace Input { + /** + * The mouse pointer is being held down. + */ + var MOUSE_DOWN: number; + + /** + * The mouse pointer is being moved. + */ + var MOUSE_MOVE: number; + + /** + * The mouse pointer is released. + */ + var MOUSE_UP: number; + + /** + * A touch pointer has been started. + */ + var TOUCH_START: number; + + /** + * A touch pointer has been started. + */ + var TOUCH_MOVE: number; + + /** + * A touch pointer has been started. + */ + var TOUCH_END: number; + + /** + * The pointer lock has changed. + */ + var POINTER_LOCK_CHANGE: number; + + /** + * A touch pointer has been been cancelled by the browser. + */ + var TOUCH_CANCEL: number; + + /** + * The mouse wheel changes. + */ + var MOUSE_WHEEL: number; + + /** + * Creates a new Interactive Object. + * + * This is called automatically by the Input Manager when you enable a Game Object for input. + * + * The resulting Interactive Object is mapped to the Game Object's `input` property. + * @param gameObject The Game Object to which this Interactive Object is bound. + * @param hitArea The hit area for this Interactive Object. Typically a geometry shape, like a Rectangle or Circle. + * @param hitAreaCallback The 'contains' check callback that the hit area shape will use for all hit tests. + */ + function CreateInteractiveObject(gameObject: Phaser.GameObjects.GameObject, hitArea: any, hitAreaCallback: Phaser.Types.Input.HitAreaCallback): Phaser.Types.Input.InteractiveObject; + + /** + * Creates a new Pixel Perfect Handler function. + * + * Access via `InputPlugin.makePixelPerfect` rather than calling it directly. + * @param textureManager A reference to the Texture Manager. + * @param alphaTolerance The alpha level that the pixel should be above to be included as a successful interaction. + */ + function CreatePixelPerfectHandler(textureManager: Phaser.Textures.TextureManager, alphaTolerance: number): Function; + + namespace Events { + /** + * The Input Plugin Boot Event. + * + * This internal event is dispatched by the Input Plugin when it boots, signalling to all of its systems to create themselves. + */ + const BOOT: string; + + /** + * The Input Plugin Destroy Event. + * + * This internal event is dispatched by the Input Plugin when it is destroyed, signalling to all of its systems to destroy themselves. + */ + const DESTROY: string; + + /** + * The Pointer Drag End Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer stops dragging a Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('dragend', listener)`. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_END]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_END} event instead. + */ + const DRAG_END: string; + + /** + * The Pointer Drag Enter Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer drags a Game Object into a Drag Target. + * + * Listen to this event from within a Scene using: `this.input.on('dragenter', listener)`. + * + * A Pointer can only drag a single Game Object at once. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_ENTER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_ENTER} event instead. + */ + const DRAG_ENTER: string; + + /** + * The Pointer Drag Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves while dragging a Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('drag', listener)`. + * + * A Pointer can only drag a single Game Object at once. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG} event instead. + */ + const DRAG: string; + + /** + * The Pointer Drag Leave Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer drags a Game Object out of a Drag Target. + * + * Listen to this event from within a Scene using: `this.input.on('dragleave', listener)`. + * + * A Pointer can only drag a single Game Object at once. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_LEAVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_LEAVE} event instead. + */ + const DRAG_LEAVE: string; + + /** + * The Pointer Drag Over Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer drags a Game Object over a Drag Target. + * + * When the Game Object first enters the drag target it will emit a `dragenter` event. If it then moves while within + * the drag target, it will emit this event instead. + * + * Listen to this event from within a Scene using: `this.input.on('dragover', listener)`. + * + * A Pointer can only drag a single Game Object at once. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_OVER} event instead. + */ + const DRAG_OVER: string; + + /** + * The Pointer Drag Start Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer starts to drag any Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('dragstart', listener)`. + * + * A Pointer can only drag a single Game Object at once. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DRAG_START]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DRAG_START} event instead. + */ + const DRAG_START: string; + + /** + * The Pointer Drop Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer drops a Game Object on a Drag Target. + * + * Listen to this event from within a Scene using: `this.input.on('drop', listener)`. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_DROP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DROP} event instead. + */ + const DROP: string; + + /** + * The Game Object Down Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is pressed down on _any_ interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('gameobjectdown', listener)`. + * + * To receive this event, the Game Objects must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN} event instead. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN} + * 2. [GAMEOBJECT_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DOWN} + * 3. [POINTER_DOWN]{@linkcode Phaser.Input.Events#event:POINTER_DOWN} or [POINTER_DOWN_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_DOWN_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_DOWN: string; + + /** + * The Game Object Drag End Event. + * + * This event is dispatched by an interactive Game Object if a pointer stops dragging it. + * + * Listen to this event from a Game Object using: `gameObject.on('dragend', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive](Phaser.GameObjects.GameObject#setInteractive) for more details. + */ + const GAMEOBJECT_DRAG_END: string; + + /** + * The Game Object Drag Enter Event. + * + * This event is dispatched by an interactive Game Object if a pointer drags it into a drag target. + * + * Listen to this event from a Game Object using: `gameObject.on('dragenter', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + */ + const GAMEOBJECT_DRAG_ENTER: string; + + /** + * The Game Object Drag Event. + * + * This event is dispatched by an interactive Game Object if a pointer moves while dragging it. + * + * Listen to this event from a Game Object using: `gameObject.on('drag', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + */ + const GAMEOBJECT_DRAG: string; + + /** + * The Game Object Drag Leave Event. + * + * This event is dispatched by an interactive Game Object if a pointer drags it out of a drag target. + * + * Listen to this event from a Game Object using: `gameObject.on('dragleave', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + */ + const GAMEOBJECT_DRAG_LEAVE: string; + + /** + * The Game Object Drag Over Event. + * + * This event is dispatched by an interactive Game Object if a pointer drags it over a drag target. + * + * When the Game Object first enters the drag target it will emit a `dragenter` event. If it then moves while within + * the drag target, it will emit this event instead. + * + * Listen to this event from a Game Object using: `gameObject.on('dragover', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + */ + const GAMEOBJECT_DRAG_OVER: string; + + /** + * The Game Object Drag Start Event. + * + * This event is dispatched by an interactive Game Object if a pointer starts to drag it. + * + * Listen to this event from a Game Object using: `gameObject.on('dragstart', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * There are lots of useful drag related properties that are set within the Game Object when dragging occurs. + * For example, `gameObject.input.dragStartX`, `dragStartY` and so on. + */ + const GAMEOBJECT_DRAG_START: string; + + /** + * The Game Object Drop Event. + * + * This event is dispatched by an interactive Game Object if a pointer drops it on a Drag Target. + * + * Listen to this event from a Game Object using: `gameObject.on('drop', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive and enabled for drag. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + */ + const GAMEOBJECT_DROP: string; + + /** + * The Game Object Move Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is moved across _any_ interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('gameobjectmove', listener)`. + * + * To receive this event, the Game Objects must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_MOVE} event instead. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_MOVE} + * 2. [GAMEOBJECT_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_MOVE} + * 3. [POINTER_MOVE]{@linkcode Phaser.Input.Events#event:POINTER_MOVE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_MOVE: string; + + /** + * The Game Object Out Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves out of _any_ interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('gameobjectout', listener)`. + * + * To receive this event, the Game Objects must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OUT} event instead. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OUT} + * 2. [GAMEOBJECT_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OUT} + * 3. [POINTER_OUT]{@linkcode Phaser.Input.Events#event:POINTER_OUT} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + * + * If the pointer leaves the game canvas itself, it will not trigger an this event. To handle those cases, + * please listen for the [GAME_OUT]{@linkcode Phaser.Input.Events#event:GAME_OUT} event. + */ + const GAMEOBJECT_OUT: string; + + /** + * The Game Object Over Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves over _any_ interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('gameobjectover', listener)`. + * + * To receive this event, the Game Objects must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OVER} event instead. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OVER} + * 2. [GAMEOBJECT_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OVER} + * 3. [POINTER_OVER]{@linkcode Phaser.Input.Events#event:POINTER_OVER} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_OVER: string; + + /** + * The Game Object Pointer Down Event. + * + * This event is dispatched by an interactive Game Object if a pointer is pressed down on it. + * + * Listen to this event from a Game Object using: `gameObject.on('pointerdown', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN} + * 2. [GAMEOBJECT_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DOWN} + * 3. [POINTER_DOWN]{@linkcode Phaser.Input.Events#event:POINTER_DOWN} or [POINTER_DOWN_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_DOWN_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_POINTER_DOWN: string; + + /** + * The Game Object Pointer Move Event. + * + * This event is dispatched by an interactive Game Object if a pointer is moved while over it. + * + * Listen to this event from a Game Object using: `gameObject.on('pointermove', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_MOVE} + * 2. [GAMEOBJECT_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_MOVE} + * 3. [POINTER_MOVE]{@linkcode Phaser.Input.Events#event:POINTER_MOVE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_POINTER_MOVE: string; + + /** + * The Game Object Pointer Out Event. + * + * This event is dispatched by an interactive Game Object if a pointer moves out of it. + * + * Listen to this event from a Game Object using: `gameObject.on('pointerout', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OUT} + * 2. [GAMEOBJECT_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OUT} + * 3. [POINTER_OUT]{@linkcode Phaser.Input.Events#event:POINTER_OUT} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + * + * If the pointer leaves the game canvas itself, it will not trigger an this event. To handle those cases, + * please listen for the [GAME_OUT]{@linkcode Phaser.Input.Events#event:GAME_OUT} event. + */ + const GAMEOBJECT_POINTER_OUT: string; + + /** + * The Game Object Pointer Over Event. + * + * This event is dispatched by an interactive Game Object if a pointer moves over it. + * + * Listen to this event from a Game Object using: `gameObject.on('pointerover', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OVER} + * 2. [GAMEOBJECT_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OVER} + * 3. [POINTER_OVER]{@linkcode Phaser.Input.Events#event:POINTER_OVER} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_POINTER_OVER: string; + + /** + * The Game Object Pointer Up Event. + * + * This event is dispatched by an interactive Game Object if a pointer is released while over it. + * + * Listen to this event from a Game Object using: `gameObject.on('pointerup', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP} + * 2. [GAMEOBJECT_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_UP} + * 3. [POINTER_UP]{@linkcode Phaser.Input.Events#event:POINTER_UP} or [POINTER_UP_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_UP_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_POINTER_UP: string; + + /** + * The Game Object Pointer Wheel Event. + * + * This event is dispatched by an interactive Game Object if a pointer has its wheel moved while over it. + * + * Listen to this event from a Game Object using: `gameObject.on('wheel', listener)`. + * Note that the scope of the listener is automatically set to be the Game Object instance itself. + * + * To receive this event, the Game Object must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_WHEEL} + * 2. [GAMEOBJECT_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_WHEEL} + * 3. [POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:POINTER_WHEEL} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_POINTER_WHEEL: string; + + /** + * The Game Object Up Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is released while over _any_ interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('gameobjectup', listener)`. + * + * To receive this event, the Game Objects must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP} event instead. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP} + * 2. [GAMEOBJECT_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_UP} + * 3. [POINTER_UP]{@linkcode Phaser.Input.Events#event:POINTER_UP} or [POINTER_UP_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_UP_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_UP: string; + + /** + * The Game Object Wheel Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer has its wheel moved while over _any_ interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('gameobjectwheel', listener)`. + * + * To receive this event, the Game Objects must have been set as interactive. + * See [GameObject.setInteractive]{@link Phaser.GameObjects.GameObject#setInteractive} for more details. + * + * To listen for this event from a _specific_ Game Object, use the [GAMEOBJECT_POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_WHEEL} event instead. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_WHEEL} + * 2. [GAMEOBJECT_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_WHEEL} + * 3. [POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:POINTER_WHEEL} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const GAMEOBJECT_WHEEL: string; + + /** + * The Input Plugin Game Out Event. + * + * This event is dispatched by the Input Plugin if the active pointer leaves the game canvas and is now + * outside of it, elsewhere on the web page. + * + * Listen to this event from within a Scene using: `this.input.on('gameout', listener)`. + */ + const GAME_OUT: string; + + /** + * The Input Plugin Game Over Event. + * + * This event is dispatched by the Input Plugin if the active pointer enters the game canvas and is now + * over of it, having previously been elsewhere on the web page. + * + * Listen to this event from within a Scene using: `this.input.on('gameover', listener)`. + */ + const GAME_OVER: string; + + /** + * The Input Manager Boot Event. + * + * This internal event is dispatched by the Input Manager when it boots. + */ + const MANAGER_BOOT: string; + + /** + * The Input Manager Process Event. + * + * This internal event is dispatched by the Input Manager when not using the legacy queue system, + * and it wants the Input Plugins to update themselves. + */ + const MANAGER_PROCESS: string; + + /** + * The Input Manager Update Event. + * + * This internal event is dispatched by the Input Manager as part of its update step. + */ + const MANAGER_UPDATE: string; + + /** + * The Input Manager Pointer Lock Change Event. + * + * This event is dispatched by the Input Manager when it is processing a native Pointer Lock Change DOM Event. + */ + const POINTERLOCK_CHANGE: string; + + /** + * The Pointer Down Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is pressed down anywhere. + * + * Listen to this event from within a Scene using: `this.input.on('pointerdown', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN} + * 2. [GAMEOBJECT_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DOWN} + * 3. [POINTER_DOWN]{@linkcode Phaser.Input.Events#event:POINTER_DOWN} or [POINTER_DOWN_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_DOWN_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_DOWN: string; + + /** + * The Pointer Down Outside Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is pressed down anywhere outside of the game canvas. + * + * Listen to this event from within a Scene using: `this.input.on('pointerdownoutside', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_DOWN} + * 2. [GAMEOBJECT_DOWN]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_DOWN} + * 3. [POINTER_DOWN]{@linkcode Phaser.Input.Events#event:POINTER_DOWN} or [POINTER_DOWN_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_DOWN_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_DOWN_OUTSIDE: string; + + /** + * The Pointer Move Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is moved anywhere. + * + * Listen to this event from within a Scene using: `this.input.on('pointermove', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_MOVE} + * 2. [GAMEOBJECT_MOVE]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_MOVE} + * 3. [POINTER_MOVE]{@linkcode Phaser.Input.Events#event:POINTER_MOVE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_MOVE: string; + + /** + * The Pointer Out Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves out of any interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('pointerout', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OUT} + * 2. [GAMEOBJECT_OUT]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OUT} + * 3. [POINTER_OUT]{@linkcode Phaser.Input.Events#event:POINTER_OUT} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + * + * If the pointer leaves the game canvas itself, it will not trigger an this event. To handle those cases, + * please listen for the [GAME_OUT]{@linkcode Phaser.Input.Events#event:GAME_OUT} event. + */ + const POINTER_OUT: string; + + /** + * The Pointer Over Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer moves over any interactive Game Object. + * + * Listen to this event from within a Scene using: `this.input.on('pointerover', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_OVER} + * 2. [GAMEOBJECT_OVER]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_OVER} + * 3. [POINTER_OVER]{@linkcode Phaser.Input.Events#event:POINTER_OVER} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_OVER: string; + + /** + * The Pointer Up Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is released anywhere. + * + * Listen to this event from within a Scene using: `this.input.on('pointerup', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP} + * 2. [GAMEOBJECT_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_UP} + * 3. [POINTER_UP]{@linkcode Phaser.Input.Events#event:POINTER_UP} or [POINTER_UP_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_UP_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_UP: string; + + /** + * The Pointer Up Outside Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer is released anywhere outside of the game canvas. + * + * Listen to this event from within a Scene using: `this.input.on('pointerupoutside', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_UP} + * 2. [GAMEOBJECT_UP]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_UP} + * 3. [POINTER_UP]{@linkcode Phaser.Input.Events#event:POINTER_UP} or [POINTER_UP_OUTSIDE]{@linkcode Phaser.Input.Events#event:POINTER_UP_OUTSIDE} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_UP_OUTSIDE: string; + + /** + * The Pointer Wheel Input Event. + * + * This event is dispatched by the Input Plugin belonging to a Scene if a pointer has its wheel updated. + * + * Listen to this event from within a Scene using: `this.input.on('wheel', listener)`. + * + * The event hierarchy is as follows: + * + * 1. [GAMEOBJECT_POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_POINTER_WHEEL} + * 2. [GAMEOBJECT_WHEEL]{@linkcode Phaser.Input.Events#event:GAMEOBJECT_WHEEL} + * 3. [POINTER_WHEEL]{@linkcode Phaser.Input.Events#event:POINTER_WHEEL} + * + * With the top event being dispatched first and then flowing down the list. Note that higher-up event handlers can stop + * the propagation of this event. + */ + const POINTER_WHEEL: string; + + /** + * The Input Plugin Pre-Update Event. + * + * This internal event is dispatched by the Input Plugin at the start of its `preUpdate` method. + * This hook is designed specifically for input plugins, but can also be listened to from user-land code. + */ + const PRE_UPDATE: string; + + /** + * The Input Plugin Shutdown Event. + * + * This internal event is dispatched by the Input Plugin when it shuts down, signalling to all of its systems to shut themselves down. + */ + const SHUTDOWN: string; + + /** + * The Input Plugin Start Event. + * + * This internal event is dispatched by the Input Plugin when it has finished setting-up, + * signalling to all of its internal systems to start. + */ + const START: string; + + /** + * The Input Plugin Update Event. + * + * This internal event is dispatched by the Input Plugin at the start of its `update` method. + * This hook is designed specifically for input plugins, but can also be listened to from user-land code. + */ + const UPDATE: string; + + } + + namespace Gamepad { + /** + * Contains information about a specific Gamepad Axis. + * Axis objects are created automatically by the Gamepad as they are needed. + */ + class Axis { + /** + * + * @param pad A reference to the Gamepad that this Axis belongs to. + * @param index The index of this Axis. + */ + constructor(pad: Phaser.Input.Gamepad.Gamepad, index: number); + + /** + * A reference to the Gamepad that this Axis belongs to. + */ + pad: Phaser.Input.Gamepad.Gamepad; + + /** + * An event emitter to use to emit the axis events. + */ + events: Phaser.Events.EventEmitter; + + /** + * The index of this Axis. + */ + index: number; + + /** + * The raw axis value, between -1 and 1 with 0 being dead center. + * Use the method `getValue` to get a normalized value with the threshold applied. + */ + value: number; + + /** + * Movement tolerance threshold below which axis values are ignored in `getValue`. + */ + threshold: number; + + /** + * Applies the `threshold` value to the axis and returns it. + */ + getValue(): number; + + /** + * Destroys this Axis instance and releases external references it holds. + */ + destroy(): void; + + } + + /** + * Contains information about a specific button on a Gamepad. + * Button objects are created automatically by the Gamepad as they are needed. + */ + class Button { + /** + * + * @param pad A reference to the Gamepad that this Button belongs to. + * @param index The index of this Button. + */ + constructor(pad: Phaser.Input.Gamepad.Gamepad, index: number); + + /** + * A reference to the Gamepad that this Button belongs to. + */ + pad: Phaser.Input.Gamepad.Gamepad; + + /** + * An event emitter to use to emit the button events. + */ + events: Phaser.Events.EventEmitter; + + /** + * The index of this Button. + */ + index: number; + + /** + * Between 0 and 1. + */ + value: number; + + /** + * Can be set for analogue buttons to enable a 'pressure' threshold, + * before a button is considered as being 'pressed'. + */ + threshold: number; + + /** + * Is the Button being pressed down or not? + */ + pressed: boolean; + + /** + * Destroys this Button instance and releases external references it holds. + */ + destroy(): void; + + } + + namespace Configs { + /** + * Tatar SNES USB Controller Gamepad Configuration. + * USB Gamepad (STANDARD GAMEPAD Vendor: 0079 Product: 0011) + */ + namespace SNES_USB { + /** + * D-Pad up + */ + const UP: number; + + /** + * D-Pad down + */ + const DOWN: number; + + /** + * D-Pad left + */ + const LEFT: number; + + /** + * D-Pad right + */ + const RIGHT: number; + + /** + * Select button + */ + const SELECT: number; + + /** + * Start button + */ + const START: number; + + /** + * B Button (Bottom) + */ + const B: number; + + /** + * A Button (Right) + */ + const A: number; + + /** + * Y Button (Left) + */ + const Y: number; + + /** + * X Button (Top) + */ + const X: number; + + /** + * Left bumper + */ + const LEFT_SHOULDER: number; + + /** + * Right bumper + */ + const RIGHT_SHOULDER: number; + + } + + /** + * PlayStation DualShock 4 Gamepad Configuration. + * Sony PlayStation DualShock 4 (v2) wireless controller + */ + namespace DUALSHOCK_4 { + /** + * D-Pad up + */ + const UP: number; + + /** + * D-Pad down + */ + const DOWN: number; + + /** + * D-Pad left + */ + const LEFT: number; + + /** + * D-Pad up + */ + const RIGHT: number; + + /** + * Share button + */ + const SHARE: number; + + /** + * Options button + */ + const OPTIONS: number; + + /** + * PlayStation logo button + */ + const PS: number; + + /** + * Touchpad click + */ + const TOUCHBAR: number; + + /** + * Cross button (Bottom) + */ + const X: number; + + /** + * Circle button (Right) + */ + const CIRCLE: number; + + /** + * Square button (Left) + */ + const SQUARE: number; + + /** + * Triangle button (Top) + */ + const TRIANGLE: number; + + /** + * Left bumper (L1) + */ + const L1: number; + + /** + * Right bumper (R1) + */ + const R1: number; + + /** + * Left trigger (L2) + */ + const L2: number; + + /** + * Right trigger (R2) + */ + const R2: number; + + /** + * Left stick click (L3) + */ + const L3: number; + + /** + * Right stick click (R3) + */ + const R3: number; + + /** + * Left stick horizontal + */ + const LEFT_STICK_H: number; + + /** + * Left stick vertical + */ + const LEFT_STICK_V: number; + + /** + * Right stick horizontal + */ + const RIGHT_STICK_H: number; + + /** + * Right stick vertical + */ + const RIGHT_STICK_V: number; + + } + + /** + * XBox 360 Gamepad Configuration. + */ + namespace XBOX_360 { + /** + * D-Pad up + */ + const UP: number; + + /** + * D-Pad down + */ + const DOWN: number; + + /** + * D-Pad left + */ + const LEFT: number; + + /** + * D-Pad right + */ + const RIGHT: number; + + /** + * XBox menu button + */ + const MENU: number; + + /** + * A button (Bottom) + */ + const A: number; + + /** + * B button (Right) + */ + const B: number; + + /** + * X button (Left) + */ + const X: number; + + /** + * Y button (Top) + */ + const Y: number; + + /** + * Left Bumper + */ + const LB: number; + + /** + * Right Bumper + */ + const RB: number; + + /** + * Left Trigger + */ + const LT: number; + + /** + * Right Trigger + */ + const RT: number; + + /** + * Back / Change View button + */ + const BACK: number; + + /** + * Start button + */ + const START: number; + + /** + * Left Stick press + */ + const LS: number; + + /** + * Right stick press + */ + const RS: number; + + /** + * Left Stick horizontal + */ + const LEFT_STICK_H: number; + + /** + * Left Stick vertical + */ + const LEFT_STICK_V: number; + + /** + * Right Stick horizontal + */ + const RIGHT_STICK_H: number; + + /** + * Right Stick vertical + */ + const RIGHT_STICK_V: number; + + } + + } + + namespace Events { + /** + * The Gamepad Button Down Event. + * + * This event is dispatched by the Gamepad Plugin when a button has been pressed on any active Gamepad. + * + * Listen to this event from within a Scene using: `this.input.gamepad.on('down', listener)`. + * + * You can also listen for a DOWN event from a Gamepad instance. See the [GAMEPAD_BUTTON_DOWN]{@linkcode Phaser.Input.Gamepad.Events#event:GAMEPAD_BUTTON_DOWN} event for details. + */ + const BUTTON_DOWN: string; + + /** + * The Gamepad Button Up Event. + * + * This event is dispatched by the Gamepad Plugin when a button has been released on any active Gamepad. + * + * Listen to this event from within a Scene using: `this.input.gamepad.on('up', listener)`. + * + * You can also listen for an UP event from a Gamepad instance. See the [GAMEPAD_BUTTON_UP]{@linkcode Phaser.Input.Gamepad.Events#event:GAMEPAD_BUTTON_UP} event for details. + */ + const BUTTON_UP: string; + + /** + * The Gamepad Connected Event. + * + * This event is dispatched by the Gamepad Plugin when a Gamepad has been connected. + * + * Listen to this event from within a Scene using: `this.input.gamepad.once('connected', listener)`. + * + * Note that the browser may require you to press a button on a gamepad before it will allow you to access it, + * this is for security reasons. However, it may also trust the page already, in which case you won't get the + * 'connected' event and instead should check `GamepadPlugin.total` to see if it thinks there are any gamepads + * already connected. + */ + const CONNECTED: string; + + /** + * The Gamepad Disconnected Event. + * + * This event is dispatched by the Gamepad Plugin when a Gamepad has been disconnected. + * + * Listen to this event from within a Scene using: `this.input.gamepad.once('disconnected', listener)`. + */ + const DISCONNECTED: string; + + /** + * The Gamepad Button Down Event. + * + * This event is dispatched by a Gamepad instance when a button has been pressed on it. + * + * Listen to this event from a Gamepad instance. Once way to get this is from the `pad1`, `pad2`, etc properties on the Gamepad Plugin: + * `this.input.gamepad.pad1.on('down', listener)`. + * + * Note that you will not receive any Gamepad button events until the browser considers the Gamepad as being 'connected'. + * + * You can also listen for a DOWN event from the Gamepad Plugin. See the [BUTTON_DOWN]{@linkcode Phaser.Input.Gamepad.Events#event:BUTTON_DOWN} event for details. + */ + const GAMEPAD_BUTTON_DOWN: string; + + /** + * The Gamepad Button Up Event. + * + * This event is dispatched by a Gamepad instance when a button has been released on it. + * + * Listen to this event from a Gamepad instance. Once way to get this is from the `pad1`, `pad2`, etc properties on the Gamepad Plugin: + * `this.input.gamepad.pad1.on('up', listener)`. + * + * Note that you will not receive any Gamepad button events until the browser considers the Gamepad as being 'connected'. + * + * You can also listen for an UP event from the Gamepad Plugin. See the [BUTTON_UP]{@linkcode Phaser.Input.Gamepad.Events#event:BUTTON_UP} event for details. + */ + const GAMEPAD_BUTTON_UP: string; + + } + + /** + * A single Gamepad. + * + * These are created, updated and managed by the Gamepad Plugin. + */ + class Gamepad extends Phaser.Events.EventEmitter { + /** + * + * @param manager A reference to the Gamepad Plugin. + * @param pad The Gamepad object, as extracted from GamepadEvent. + */ + constructor(manager: Phaser.Input.Gamepad.GamepadPlugin, pad: Phaser.Types.Input.Gamepad.Pad); + + /** + * A reference to the Gamepad Plugin. + */ + manager: Phaser.Input.Gamepad.GamepadPlugin; + + /** + * A reference to the native Gamepad object that is connected to the browser. + */ + pad: any; + + /** + * A string containing some information about the controller. + * + * This is not strictly specified, but in Firefox it will contain three pieces of information + * separated by dashes (-): two 4-digit hexadecimal strings containing the USB vendor and + * product id of the controller, and the name of the controller as provided by the driver. + * In Chrome it will contain the name of the controller as provided by the driver, + * followed by vendor and product 4-digit hexadecimal strings. + */ + id: string; + + /** + * An integer that is unique for each Gamepad currently connected to the system. + * This can be used to distinguish multiple controllers. + * Note that disconnecting a device and then connecting a new device may reuse the previous index. + */ + index: number; + + /** + * An array of Gamepad Button objects, corresponding to the different buttons available on the Gamepad. + */ + buttons: Phaser.Input.Gamepad.Button[]; + + /** + * An array of Gamepad Axis objects, corresponding to the different axes available on the Gamepad, if any. + */ + axes: Phaser.Input.Gamepad.Axis[]; + + /** + * The Gamepad's Haptic Actuator (Vibration / Rumble support). + * This is highly experimental and only set if both present on the device, + * and exposed by both the hardware and browser. + */ + vibration: GamepadHapticActuator; + + /** + * A Vector2 containing the most recent values from the Gamepad's left axis stick. + * This is updated automatically as part of the Gamepad.update cycle. + * The H Axis is mapped to the `Vector2.x` property, and the V Axis to the `Vector2.y` property. + * The values are based on the Axis thresholds. + * If the Gamepad does not have a left axis stick, the values will always be zero. + */ + leftStick: Phaser.Math.Vector2; + + /** + * A Vector2 containing the most recent values from the Gamepad's right axis stick. + * This is updated automatically as part of the Gamepad.update cycle. + * The H Axis is mapped to the `Vector2.x` property, and the V Axis to the `Vector2.y` property. + * The values are based on the Axis thresholds. + * If the Gamepad does not have a right axis stick, the values will always be zero. + */ + rightStick: Phaser.Math.Vector2; + + /** + * Gets the total number of axis this Gamepad claims to support. + */ + getAxisTotal(): number; + + /** + * Gets the value of an axis based on the given index. + * The index must be valid within the range of axes supported by this Gamepad. + * The return value will be a float between 0 and 1. + * @param index The index of the axes to get the value for. + */ + getAxisValue(index: number): number; + + /** + * Sets the threshold value of all axis on this Gamepad. + * The value is a float between 0 and 1 and is the amount below which the axis is considered as not having been moved. + * @param value A value between 0 and 1. + */ + setAxisThreshold(value: number): void; + + /** + * Gets the total number of buttons this Gamepad claims to have. + */ + getButtonTotal(): number; + + /** + * Gets the value of a button based on the given index. + * The index must be valid within the range of buttons supported by this Gamepad. + * + * The return value will be either 0 or 1 for an analogue button, or a float between 0 and 1 + * for a pressure-sensitive digital button, such as the shoulder buttons on a Dual Shock. + * @param index The index of the button to get the value for. + */ + getButtonValue(index: number): number; + + /** + * Returns if the button is pressed down or not. + * The index must be valid within the range of buttons supported by this Gamepad. + * @param index The index of the button to get the value for. + */ + isButtonDown(index: number): boolean; + + /** + * Destroys this Gamepad instance, its buttons and axes, and releases external references it holds. + */ + destroy(): void; + + /** + * Is this Gamepad currently connected or not? + */ + connected: boolean; + + /** + * A timestamp containing the most recent time this Gamepad was updated. + */ + timestamp: number; + + /** + * Is the Gamepad's Left button being pressed? + * If the Gamepad doesn't have this button it will always return false. + * This is the d-pad left button under standard Gamepad mapping. + */ + left: boolean; + + /** + * Is the Gamepad's Right button being pressed? + * If the Gamepad doesn't have this button it will always return false. + * This is the d-pad right button under standard Gamepad mapping. + */ + right: boolean; + + /** + * Is the Gamepad's Up button being pressed? + * If the Gamepad doesn't have this button it will always return false. + * This is the d-pad up button under standard Gamepad mapping. + */ + up: boolean; + + /** + * Is the Gamepad's Down button being pressed? + * If the Gamepad doesn't have this button it will always return false. + * This is the d-pad down button under standard Gamepad mapping. + */ + down: boolean; + + /** + * Is the Gamepad's bottom button in the right button cluster being pressed? + * If the Gamepad doesn't have this button it will always return false. + * On a Dual Shock controller it's the X button. + * On an XBox controller it's the A button. + */ + A: boolean; + + /** + * Is the Gamepad's top button in the right button cluster being pressed? + * If the Gamepad doesn't have this button it will always return false. + * On a Dual Shock controller it's the Triangle button. + * On an XBox controller it's the Y button. + */ + Y: boolean; + + /** + * Is the Gamepad's left button in the right button cluster being pressed? + * If the Gamepad doesn't have this button it will always return false. + * On a Dual Shock controller it's the Square button. + * On an XBox controller it's the X button. + */ + X: boolean; + + /** + * Is the Gamepad's right button in the right button cluster being pressed? + * If the Gamepad doesn't have this button it will always return false. + * On a Dual Shock controller it's the Circle button. + * On an XBox controller it's the B button. + */ + B: boolean; + + /** + * Returns the value of the Gamepad's top left shoulder button. + * If the Gamepad doesn't have this button it will always return zero. + * The value is a float between 0 and 1, corresponding to how depressed the button is. + * On a Dual Shock controller it's the L1 button. + * On an XBox controller it's the LB button. + */ + L1: number; + + /** + * Returns the value of the Gamepad's bottom left shoulder button. + * If the Gamepad doesn't have this button it will always return zero. + * The value is a float between 0 and 1, corresponding to how depressed the button is. + * On a Dual Shock controller it's the L2 button. + * On an XBox controller it's the LT button. + */ + L2: number; + + /** + * Returns the value of the Gamepad's top right shoulder button. + * If the Gamepad doesn't have this button it will always return zero. + * The value is a float between 0 and 1, corresponding to how depressed the button is. + * On a Dual Shock controller it's the R1 button. + * On an XBox controller it's the RB button. + */ + R1: number; + + /** + * Returns the value of the Gamepad's bottom right shoulder button. + * If the Gamepad doesn't have this button it will always return zero. + * The value is a float between 0 and 1, corresponding to how depressed the button is. + * On a Dual Shock controller it's the R2 button. + * On an XBox controller it's the RT button. + */ + R2: number; + + } + + /** + * The Gamepad Plugin is an input plugin that belongs to the Scene-owned Input system. + * + * Its role is to listen for native DOM Gamepad Events and then process them. + * + * You do not need to create this class directly, the Input system will create an instance of it automatically. + * + * You can access it from within a Scene using `this.input.gamepad`. + * + * To listen for a gamepad being connected: + * + * ```javascript + * this.input.gamepad.once('connected', function (pad) { + * // 'pad' is a reference to the gamepad that was just connected + * }); + * ``` + * + * Note that the browser may require you to press a button on a gamepad before it will allow you to access it, + * this is for security reasons. However, it may also trust the page already, in which case you won't get the + * 'connected' event and instead should check `GamepadPlugin.total` to see if it thinks there are any gamepads + * already connected. + * + * Once you have received the connected event, or polled the gamepads and found them enabled, you can access + * them via the built-in properties `GamepadPlugin.pad1` to `pad4`, for up to 4 game pads. With a reference + * to the gamepads you can poll its buttons and axis sticks. See the properties and methods available on + * the `Gamepad` class for more details. + * + * As of September 2020 Chrome, and likely other browsers, will soon start to require that games requesting + * access to the Gamepad API are running under SSL. They will actively block API access if they are not. + * + * For more information about Gamepad support in browsers see the following resources: + * + * https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API + * https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API/Using_the_Gamepad_API + * https://www.smashingmagazine.com/2015/11/gamepad-api-in-web-games/ + * http://html5gamepad.com/ + */ + class GamepadPlugin extends Phaser.Events.EventEmitter { + /** + * + * @param sceneInputPlugin A reference to the Scene Input Plugin that the KeyboardPlugin belongs to. + */ + constructor(sceneInputPlugin: Phaser.Input.InputPlugin); + + /** + * A reference to the Scene that this Input Plugin is responsible for. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene Systems Settings. + */ + settings: Phaser.Types.Scenes.SettingsObject; + + /** + * A reference to the Scene Input Plugin that created this Keyboard Plugin. + */ + sceneInputPlugin: Phaser.Input.InputPlugin; + + /** + * A boolean that controls if the Gamepad Manager is enabled or not. + * Can be toggled on the fly. + */ + enabled: boolean; + + /** + * The Gamepad Event target, as defined in the Game Config. + * Typically the browser window, but can be any interactive DOM element. + */ + target: any; + + /** + * An array of the connected Gamepads. + */ + gamepads: Phaser.Input.Gamepad.Gamepad[]; + + /** + * Checks to see if both this plugin and the Scene to which it belongs is active. + */ + isActive(): boolean; + + /** + * Disconnects all current Gamepads. + */ + disconnectAll(): void; + + /** + * Returns an array of all currently connected Gamepads. + */ + getAll(): Phaser.Input.Gamepad.Gamepad[]; + + /** + * Looks-up a single Gamepad based on the given index value. + * @param index The index of the Gamepad to get. + */ + getPad(index: number): Phaser.Input.Gamepad.Gamepad; + + /** + * The total number of connected game pads. + */ + total: number; + + /** + * A reference to the first connected Gamepad. + * + * This will be undefined if either no pads are connected, or the browser + * has not yet issued a gamepadconnect, which can happen even if a Gamepad + * is plugged in, but hasn't yet had any buttons pressed on it. + */ + pad1: Phaser.Input.Gamepad.Gamepad; + + /** + * A reference to the second connected Gamepad. + * + * This will be undefined if either no pads are connected, or the browser + * has not yet issued a gamepadconnect, which can happen even if a Gamepad + * is plugged in, but hasn't yet had any buttons pressed on it. + */ + pad2: Phaser.Input.Gamepad.Gamepad; + + /** + * A reference to the third connected Gamepad. + * + * This will be undefined if either no pads are connected, or the browser + * has not yet issued a gamepadconnect, which can happen even if a Gamepad + * is plugged in, but hasn't yet had any buttons pressed on it. + */ + pad3: Phaser.Input.Gamepad.Gamepad; + + /** + * A reference to the fourth connected Gamepad. + * + * This will be undefined if either no pads are connected, or the browser + * has not yet issued a gamepadconnect, which can happen even if a Gamepad + * is plugged in, but hasn't yet had any buttons pressed on it. + */ + pad4: Phaser.Input.Gamepad.Gamepad; + + } + + } + + /** + * The Input Manager is responsible for handling the pointer related systems in a single Phaser Game instance. + * + * Based on the Game Config it will create handlers for mouse and touch support. + * + * Keyboard and Gamepad are plugins, handled directly by the InputPlugin class. + * + * It then manages the events, pointer creation and general hit test related operations. + * + * You rarely need to interact with the Input Manager directly, and as such, all of its properties and methods + * should be considered private. Instead, you should use the Input Plugin, which is a Scene level system, responsible + * for dealing with all input events for a Scene. + */ + class InputManager { + /** + * + * @param game The Game instance that owns the Input Manager. + * @param config The Input Configuration object, as set in the Game Config. + */ + constructor(game: Phaser.Game, config: object); + + /** + * The Game instance that owns the Input Manager. + * A Game only maintains on instance of the Input Manager at any time. + */ + readonly game: Phaser.Game; + + /** + * A reference to the global Game Scale Manager. + * Used for all bounds checks and pointer scaling. + */ + scaleManager: Phaser.Scale.ScaleManager; + + /** + * The Canvas that is used for all DOM event input listeners. + */ + canvas: HTMLCanvasElement; + + /** + * The Game Configuration object, as set during the game boot. + */ + config: Phaser.Core.Config; + + /** + * If set, the Input Manager will run its update loop every frame. + */ + enabled: boolean; + + /** + * The Event Emitter instance that the Input Manager uses to emit events from. + */ + events: Phaser.Events.EventEmitter; + + /** + * Are any mouse or touch pointers currently over the game canvas? + * This is updated automatically by the canvas over and out handlers. + */ + readonly isOver: boolean; + + /** + * The default CSS cursor to be used when interacting with your game. + * + * See the `setDefaultCursor` method for more details. + */ + defaultCursor: string; + + /** + * A reference to the Keyboard Manager class, if enabled via the `input.keyboard` Game Config property. + */ + keyboard: Phaser.Input.Keyboard.KeyboardManager | null; + + /** + * A reference to the Mouse Manager class, if enabled via the `input.mouse` Game Config property. + */ + mouse: Phaser.Input.Mouse.MouseManager | null; + + /** + * A reference to the Touch Manager class, if enabled via the `input.touch` Game Config property. + */ + touch: Phaser.Input.Touch.TouchManager; + + /** + * An array of Pointers that have been added to the game. + * The first entry is reserved for the Mouse Pointer, the rest are Touch Pointers. + * + * By default there is 1 touch pointer enabled. If you need more use the `addPointer` method to start them, + * or set the `input.activePointers` property in the Game Config. + */ + pointers: Phaser.Input.Pointer[]; + + /** + * The number of touch objects activated and being processed each update. + * + * You can change this by either calling `addPointer` at run-time, or by + * setting the `input.activePointers` property in the Game Config. + */ + readonly pointersTotal: number; + + /** + * The mouse has its own unique Pointer object, which you can reference directly if making a _desktop specific game_. + * If you are supporting both desktop and touch devices then do not use this property, instead use `activePointer` + * which will always map to the most recently interacted pointer. + */ + mousePointer: Phaser.Input.Pointer | null; + + /** + * The most recently active Pointer object. + * + * If you've only 1 Pointer in your game then this will accurately be either the first finger touched, or the mouse. + * + * If your game doesn't need to support multi-touch then you can safely use this property in all of your game + * code and it will adapt to be either the mouse or the touch, based on device. + */ + activePointer: Phaser.Input.Pointer; + + /** + * If the top-most Scene in the Scene List receives an input it will stop input from + * propagating any lower down the scene list, i.e. if you have a UI Scene at the top + * and click something on it, that click will not then be passed down to any other + * Scene below. Disable this to have input events passed through all Scenes, all the time. + */ + globalTopOnly: boolean; + + /** + * The time this Input Manager was last updated. + * This value is populated by the Game Step each frame. + */ + readonly time: number; + + /** + * The Boot handler is called by Phaser.Game when it first starts up. + * The renderer is available by now. + */ + protected boot(): void; + + /** + * Tells the Input system to set a custom cursor. + * + * This cursor will be the default cursor used when interacting with the game canvas. + * + * If an Interactive Object also sets a custom cursor, this is the cursor that is reset after its use. + * + * Any valid CSS cursor value is allowed, including paths to image files, i.e.: + * + * ```javascript + * this.input.setDefaultCursor('url(assets/cursors/sword.cur), pointer'); + * ``` + * + * Please read about the differences between browsers when it comes to the file formats and sizes they support: + * + * https://developer.mozilla.org/en-US/docs/Web/CSS/cursor + * https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_User_Interface/Using_URL_values_for_the_cursor_property + * + * It's up to you to pick a suitable cursor format that works across the range of browsers you need to support. + * @param cursor The CSS to be used when setting the default cursor. + */ + setDefaultCursor(cursor: string): void; + + /** + * Adds new Pointer objects to the Input Manager. + * + * By default Phaser creates 2 pointer objects: `mousePointer` and `pointer1`. + * + * You can create more either by calling this method, or by setting the `input.activePointers` property + * in the Game Config, up to a maximum of 10 pointers. + * + * The first 10 pointers are available via the `InputPlugin.pointerX` properties, once they have been added + * via this method. + * @param quantity The number of new Pointers to create. A maximum of 10 is allowed in total. Default 1. + */ + addPointer(quantity?: number): Phaser.Input.Pointer[]; + + /** + * Internal method that gets a list of all the active Input Plugins in the game + * and updates each of them in turn, in reverse order (top to bottom), to allow + * for DOM top-level event handling simulation. + * @param type The type of event to process. + * @param pointers An array of Pointers on which the event occurred. + */ + updateInputPlugins(type: number, pointers: Phaser.Input.Pointer[]): void; + + /** + * Performs a hit test using the given Pointer and camera, against an array of interactive Game Objects. + * + * The Game Objects are culled against the camera, and then the coordinates are translated into the local camera space + * and used to determine if they fall within the remaining Game Objects hit areas or not. + * + * If nothing is matched an empty array is returned. + * + * This method is called automatically by InputPlugin.hitTestPointer and doesn't usually need to be invoked directly. + * @param pointer The Pointer to test against. + * @param gameObjects An array of interactive Game Objects to check. + * @param camera The Camera which is being tested against. + * @param output An array to store the results in. If not given, a new empty array is created. + */ + hitTest(pointer: Phaser.Input.Pointer, gameObjects: any[], camera: Phaser.Cameras.Scene2D.Camera, output?: any[]): any[]; + + /** + * Checks if the given x and y coordinate are within the hit area of the Game Object. + * + * This method assumes that the coordinate values have already been translated into the space of the Game Object. + * + * If the coordinates are within the hit area they are set into the Game Objects Input `localX` and `localY` properties. + * @param gameObject The interactive Game Object to check against. + * @param x The translated x coordinate for the hit test. + * @param y The translated y coordinate for the hit test. + */ + pointWithinHitArea(gameObject: Phaser.GameObjects.GameObject, x: number, y: number): boolean; + + /** + * Checks if the given x and y coordinate are within the hit area of the Interactive Object. + * + * This method assumes that the coordinate values have already been translated into the space of the Interactive Object. + * + * If the coordinates are within the hit area they are set into the Interactive Objects Input `localX` and `localY` properties. + * @param object The Interactive Object to check against. + * @param x The translated x coordinate for the hit test. + * @param y The translated y coordinate for the hit test. + */ + pointWithinInteractiveObject(object: Phaser.Types.Input.InteractiveObject, x: number, y: number): boolean; + + /** + * Transforms the pageX and pageY values of a Pointer into the scaled coordinate space of the Input Manager. + * @param pointer The Pointer to transform the values for. + * @param pageX The Page X value. + * @param pageY The Page Y value. + * @param wasMove Are we transforming the Pointer from a move event, or an up / down event? + */ + transformPointer(pointer: Phaser.Input.Pointer, pageX: number, pageY: number, wasMove: boolean): void; + + /** + * Destroys the Input Manager and all of its systems. + * + * There is no way to recover from doing this. + */ + destroy(): void; + + } + + /** + * The Input Plugin belongs to a Scene and handles all input related events and operations for it. + * + * You can access it from within a Scene using `this.input`. + * + * It emits events directly. For example, you can do: + * + * ```javascript + * this.input.on('pointerdown', callback, context); + * ``` + * + * To listen for a pointer down event anywhere on the game canvas. + * + * Game Objects can be enabled for input by calling their `setInteractive` method. After which they + * will directly emit input events: + * + * ```javascript + * var sprite = this.add.sprite(x, y, texture); + * sprite.setInteractive(); + * sprite.on('pointerdown', callback, context); + * ``` + * + * There are lots of game configuration options available relating to input. + * See the [Input Config object]{@linkcode Phaser.Types.Core.InputConfig} for more details, including how to deal with Phaser + * listening for input events outside of the canvas, how to set a default number of pointers, input + * capture settings and more. + * + * Please also see the Input examples and tutorials for further information. + * + * **Incorrect input coordinates with Angular** + * + * If you are using Phaser within Angular, and use nglf or the router, to make the component in which the Phaser game resides + * change state (i.e. appear or disappear) then you'll need to notify the Scale Manager about this, as Angular will mess with + * the DOM in a way in which Phaser can't detect directly. Call `this.scale.updateBounds()` as part of your game init in order + * to refresh the canvas DOM bounds values, which Phaser uses for input point position calculations. + */ + class InputPlugin extends Phaser.Events.EventEmitter { + /** + * + * @param scene A reference to the Scene that this Input Plugin is responsible for. + */ + constructor(scene: Phaser.Scene); + + /** + * An instance of the Gamepad Plugin class, if enabled via the `input.gamepad` Scene or Game Config property. + * Use this to create access Gamepads connected to the browser and respond to gamepad buttons. + */ + gamepad: Phaser.Input.Gamepad.GamepadPlugin | null; + + /** + * A reference to the Scene that this Input Plugin is responsible for. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene Systems class. + */ + systems: Phaser.Scenes.Systems; + + /** + * A reference to the Scene Systems Settings. + */ + settings: Phaser.Types.Scenes.SettingsObject; + + /** + * A reference to the Game Input Manager. + */ + manager: Phaser.Input.InputManager; + + /** + * If `true` this Input Plugin will process DOM input events. + */ + enabled: boolean; + + /** + * A reference to the Scene Display List. This property is set during the `boot` method. + */ + displayList: Phaser.GameObjects.DisplayList; + + /** + * A reference to the Scene Cameras Manager. This property is set during the `boot` method. + */ + cameras: Phaser.Cameras.Scene2D.CameraManager; + + /** + * A reference to the Mouse Manager. + * + * This property is only set if Mouse support has been enabled in your Game Configuration file. + * + * If you just wish to get access to the mouse pointer, use the `mousePointer` property instead. + */ + mouse: Phaser.Input.Mouse.MouseManager | null; + + /** + * When set to `true` (the default) the Input Plugin will emulate DOM behavior by only emitting events from + * the top-most Game Objects in the Display List. + * + * If set to `false` it will emit events from all Game Objects below a Pointer, not just the top one. + */ + topOnly: boolean; + + /** + * How often should the Pointers be checked? + * + * The value is a time, given in ms, and is the time that must have elapsed between game steps before + * the Pointers will be polled again. When a pointer is polled it runs a hit test to see which Game + * Objects are currently below it, or being interacted with it. + * + * Pointers will *always* be checked if they have been moved by the user, or press or released. + * + * This property only controls how often they will be polled if they have not been updated. + * You should set this if you want to have Game Objects constantly check against the pointers, even + * if the pointer didn't itself move. + * + * Set to 0 to poll constantly. Set to -1 to only poll on user movement. + */ + pollRate: number; + + /** + * The distance, in pixels, a pointer has to move while being held down, before it thinks it is being dragged. + */ + dragDistanceThreshold: number; + + /** + * The amount of time, in ms, a pointer has to be held down before it thinks it is dragging. + * + * The default polling rate is to poll only on move so once the time threshold is reached the + * drag event will not start until you move the mouse. If you want it to start immediately + * when the time threshold is reached, you must increase the polling rate by calling + * [setPollAlways]{@linkcode Phaser.Input.InputPlugin#setPollAlways} or + * [setPollRate]{@linkcode Phaser.Input.InputPlugin#setPollRate}. + */ + dragTimeThreshold: number; + + /** + * Checks to see if both this plugin and the Scene to which it belongs is active. + */ + isActive(): boolean; + + /** + * This is called automatically by the Input Manager. + * It emits events for plugins to listen to and also handles polling updates, if enabled. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + updatePoll(time: number, delta: number): boolean; + + /** + * Clears a Game Object so it no longer has an Interactive Object associated with it. + * The Game Object is then queued for removal from the Input Plugin on the next update. + * @param gameObject The Game Object that will have its Interactive Object removed. + * @param skipQueue Skip adding this Game Object into the removal queue? Default false. + */ + clear(gameObject: Phaser.GameObjects.GameObject, skipQueue?: boolean): Phaser.GameObjects.GameObject; + + /** + * Disables Input on a single Game Object. + * + * An input disabled Game Object still retains its Interactive Object component and can be re-enabled + * at any time, by passing it to `InputPlugin.enable`. + * @param gameObject The Game Object to have its input system disabled. + */ + disable(gameObject: Phaser.GameObjects.GameObject): this; + + /** + * Enable a Game Object for interaction. + * + * If the Game Object already has an Interactive Object component, it is enabled and returned. + * + * Otherwise, a new Interactive Object component is created and assigned to the Game Object's `input` property. + * + * Input works by using hit areas, these are nearly always geometric shapes, such as rectangles or circles, that act as the hit area + * for the Game Object. However, you can provide your own hit area shape and callback, should you wish to handle some more advanced + * input detection. + * + * If no arguments are provided it will try and create a rectangle hit area based on the texture frame the Game Object is using. If + * this isn't a texture-bound object, such as a Graphics or BitmapText object, this will fail, and you'll need to provide a specific + * shape for it to use. + * + * You can also provide an Input Configuration Object as the only argument to this method. + * @param gameObject The Game Object to be enabled for input. + * @param hitArea Either an input configuration object, or a geometric shape that defines the hit area for the Game Object. If not specified a Rectangle will be used. + * @param hitAreaCallback The 'contains' function to invoke to check if the pointer is within the hit area. + * @param dropZone Is this Game Object a drop zone or not? Default false. + */ + enable(gameObject: Phaser.GameObjects.GameObject, hitArea?: Phaser.Types.Input.InputConfiguration | any, hitAreaCallback?: Phaser.Types.Input.HitAreaCallback, dropZone?: boolean): this; + + /** + * Takes the given Pointer and performs a hit test against it, to see which interactive Game Objects + * it is currently above. + * + * The hit test is performed against which-ever Camera the Pointer is over. If it is over multiple + * cameras, it starts checking the camera at the top of the camera list, and if nothing is found, iterates down the list. + * @param pointer The Pointer to check against the Game Objects. + */ + hitTestPointer(pointer: Phaser.Input.Pointer): Phaser.GameObjects.GameObject[]; + + /** + * Returns the drag state of the given Pointer for this Input Plugin. + * + * The state will be one of the following: + * + * 0 = Not dragging anything + * 1 = Primary button down and objects below, so collect a draglist + * 2 = Pointer being checked if meets drag criteria + * 3 = Pointer meets criteria, notify the draglist + * 4 = Pointer actively dragging the draglist and has moved + * 5 = Pointer actively dragging but has been released, notify draglist + * @param pointer The Pointer to get the drag state for. + */ + getDragState(pointer: Phaser.Input.Pointer): number; + + /** + * Sets the drag state of the given Pointer for this Input Plugin. + * + * The state must be one of the following values: + * + * 0 = Not dragging anything + * 1 = Primary button down and objects below, so collect a draglist + * 2 = Pointer being checked if meets drag criteria + * 3 = Pointer meets criteria, notify the draglist + * 4 = Pointer actively dragging the draglist and has moved + * 5 = Pointer actively dragging but has been released, notify draglist + * @param pointer The Pointer to set the drag state for. + * @param state The drag state value. An integer between 0 and 5. + */ + setDragState(pointer: Phaser.Input.Pointer, state: number): void; + + /** + * Sets the draggable state of the given array of Game Objects. + * + * They can either be set to be draggable, or can have their draggable state removed by passing `false`. + * + * A Game Object will not fire drag events unless it has been specifically enabled for drag. + * @param gameObjects An array of Game Objects to change the draggable state on. + * @param value Set to `true` if the Game Objects should be made draggable, `false` if they should be unset. Default true. + */ + setDraggable(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], value?: boolean): this; + + /** + * Creates a function that can be passed to `setInteractive`, `enable` or `setHitArea` that will handle + * pixel-perfect input detection on an Image or Sprite based Game Object, or any custom class that extends them. + * + * The following will create a sprite that is clickable on any pixel that has an alpha value >= 1. + * + * ```javascript + * this.add.sprite(x, y, key).setInteractive(this.input.makePixelPerfect()); + * ``` + * + * The following will create a sprite that is clickable on any pixel that has an alpha value >= 150. + * + * ```javascript + * this.add.sprite(x, y, key).setInteractive(this.input.makePixelPerfect(150)); + * ``` + * + * Once you have made an Interactive Object pixel perfect it impacts all input related events for it: down, up, + * dragstart, drag, etc. + * + * As a pointer interacts with the Game Object it will constantly poll the texture, extracting a single pixel from + * the given coordinates and checking its color values. This is an expensive process, so should only be enabled on + * Game Objects that really need it. + * + * You cannot make non-texture based Game Objects pixel perfect. So this will not work on Graphics, BitmapText, + * Render Textures, Text, Tilemaps, Containers or Particles. + * @param alphaTolerance The alpha level that the pixel should be above to be included as a successful interaction. Default 1. + */ + makePixelPerfect(alphaTolerance?: number): Function; + + /** + * Sets the hit area for the given array of Game Objects. + * + * A hit area is typically one of the geometric shapes Phaser provides, such as a `Phaser.Geom.Rectangle` + * or `Phaser.Geom.Circle`. However, it can be any object as long as it works with the provided callback. + * + * If no hit area is provided a Rectangle is created based on the size of the Game Object, if possible + * to calculate. + * + * The hit area callback is the function that takes an `x` and `y` coordinate and returns a boolean if + * those values fall within the area of the shape or not. All of the Phaser geometry objects provide this, + * such as `Phaser.Geom.Rectangle.Contains`. + * + * A hit area callback can be supplied to the `hitArea` parameter without using the `hitAreaCallback` parameter. + * @param gameObjects An array of Game Objects to set the hit area on. + * @param hitArea Either an input configuration object, a geometric shape that defines the hit area or a hit area callback. If not specified a Rectangle hit area will be used. + * @param hitAreaCallback The 'contains' function to invoke to check if the pointer is within the hit area. + */ + setHitArea(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], hitArea?: Phaser.Types.Input.InputConfiguration | Phaser.Types.Input.HitAreaCallback | any, hitAreaCallback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Circle` shape, using + * the given coordinates and radius to control its position and size. + * @param gameObjects An array of Game Objects to set as having a circle hit area. + * @param x The center of the circle. + * @param y The center of the circle. + * @param radius The radius of the circle. + * @param callback The hit area callback. If undefined it uses Circle.Contains. + */ + setHitAreaCircle(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], x: number, y: number, radius: number, callback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Ellipse` shape, using + * the given coordinates and dimensions to control its position and size. + * @param gameObjects An array of Game Objects to set as having an ellipse hit area. + * @param x The center of the ellipse. + * @param y The center of the ellipse. + * @param width The width of the ellipse. + * @param height The height of the ellipse. + * @param callback The hit area callback. If undefined it uses Ellipse.Contains. + */ + setHitAreaEllipse(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], x: number, y: number, width: number, height: number, callback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Rectangle` shape, using + * the Game Objects texture frame to define the position and size of the hit area. + * @param gameObjects An array of Game Objects to set as having an ellipse hit area. + * @param callback The hit area callback. If undefined it uses Rectangle.Contains. + */ + setHitAreaFromTexture(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], callback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Rectangle` shape, using + * the given coordinates and dimensions to control its position and size. + * @param gameObjects An array of Game Objects to set as having a rectangular hit area. + * @param x The top-left of the rectangle. + * @param y The top-left of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + * @param callback The hit area callback. If undefined it uses Rectangle.Contains. + */ + setHitAreaRectangle(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], x: number, y: number, width: number, height: number, callback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Triangle` shape, using + * the given coordinates to control the position of its points. + * @param gameObjects An array of Game Objects to set as having a triangular hit area. + * @param x1 The x coordinate of the first point of the triangle. + * @param y1 The y coordinate of the first point of the triangle. + * @param x2 The x coordinate of the second point of the triangle. + * @param y2 The y coordinate of the second point of the triangle. + * @param x3 The x coordinate of the third point of the triangle. + * @param y3 The y coordinate of the third point of the triangle. + * @param callback The hit area callback. If undefined it uses Triangle.Contains. + */ + setHitAreaTriangle(gameObjects: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[], x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, callback?: Phaser.Types.Input.HitAreaCallback): this; + + /** + * Creates an Input Debug Shape for the given Game Object. + * + * The Game Object must have _already_ been enabled for input prior to calling this method. + * + * This is intended to assist you during development and debugging. + * + * Debug Shapes can only be created for Game Objects that are using standard Phaser Geometry for input, + * including: Circle, Ellipse, Line, Polygon, Rectangle and Triangle. + * + * Game Objects that are using their automatic hit areas are using Rectangles by default, so will also work. + * + * The Debug Shape is created and added to the display list and is then kept in sync with the Game Object + * it is connected with. Should you need to modify it yourself, such as to hide it, you can access it via + * the Game Object property: `GameObject.input.hitAreaDebug`. + * + * Calling this method on a Game Object that already has a Debug Shape will first destroy the old shape, + * before creating a new one. If you wish to remove the Debug Shape entirely, you should call the + * method `InputPlugin.removeDebug`. + * + * Note that the debug shape will only show the outline of the input area. If the input test is using a + * pixel perfect check, for example, then this is not displayed. If you are using a custom shape, that + * doesn't extend one of the base Phaser Geometry objects, as your hit area, then this method will not + * work. + * @param gameObject The Game Object to create the input debug shape for. + * @param color The outline color of the debug shape. Default 0x00ff00. + */ + enableDebug(gameObject: Phaser.GameObjects.GameObject, color?: number): this; + + /** + * Removes an Input Debug Shape from the given Game Object. + * + * The shape is destroyed immediately and the `hitAreaDebug` property is set to `null`. + * @param gameObject The Game Object to remove the input debug shape from. + */ + removeDebug(gameObject: Phaser.GameObjects.GameObject): this; + + /** + * Sets the Pointers to always poll. + * + * When a pointer is polled it runs a hit test to see which Game Objects are currently below it, + * or being interacted with it, regardless if the Pointer has actually moved or not. + * + * You should enable this if you want objects in your game to fire over / out events, and the objects + * are constantly moving, but the pointer may not have. Polling every frame has additional computation + * costs, especially if there are a large number of interactive objects in your game. + */ + setPollAlways(): this; + + /** + * Sets the Pointers to only poll when they are moved or updated. + * + * When a pointer is polled it runs a hit test to see which Game Objects are currently below it, + * or being interacted with it. + */ + setPollOnMove(): this; + + /** + * Sets the poll rate value. This is the amount of time that should have elapsed before a pointer + * will be polled again. See the `setPollAlways` and `setPollOnMove` methods. + * @param value The amount of time, in ms, that should elapsed before re-polling the pointers. + */ + setPollRate(value: number): this; + + /** + * When set to `true` the global Input Manager will emulate DOM behavior by only emitting events from + * the top-most Scene in the Scene List. By default, if a Scene receives an input event it will then stop the event + * from flowing down to any Scenes below it in the Scene list. To disable this behavior call this method with `false`. + * @param value Set to `true` to stop processing input events on the Scene that receives it, or `false` to let the event continue down the Scene list. + */ + setGlobalTopOnly(value: boolean): this; + + /** + * When set to `true` this Input Plugin will emulate DOM behavior by only emitting events from + * the top-most Game Objects in the Display List. + * + * If set to `false` it will emit events from all Game Objects below a Pointer, not just the top one. + * @param value `true` to only include the top-most Game Object, or `false` to include all Game Objects in a hit test. + */ + setTopOnly(value: boolean): this; + + /** + * Given an array of Game Objects and a Pointer, sort the array and return it, + * so that the objects are in render order with the lowest at the bottom. + * @param gameObjects An array of Game Objects to be sorted. + * @param pointer The Pointer to check against the Game Objects. + */ + sortGameObjects(gameObjects: Phaser.GameObjects.GameObject[], pointer: Phaser.Input.Pointer): Phaser.GameObjects.GameObject[]; + + /** + * Given an array of Drop Zone Game Objects, sort the array and return it, + * so that the objects are in depth index order with the lowest at the bottom. + * @param gameObjects An array of Game Objects to be sorted. + */ + sortDropZones(gameObjects: Phaser.GameObjects.GameObject[]): Phaser.GameObjects.GameObject[]; + + /** + * This method should be called from within an input event handler, such as `pointerdown`. + * + * When called, it stops the Input Manager from allowing _this specific event_ to be processed by any other Scene + * not yet handled in the scene list. + */ + stopPropagation(): this; + + /** + * Adds new Pointer objects to the Input Manager. + * + * By default Phaser creates 2 pointer objects: `mousePointer` and `pointer1`. + * + * You can create more either by calling this method, or by setting the `input.activePointers` property + * in the Game Config, up to a maximum of 10 pointers. + * + * The first 10 pointers are available via the `InputPlugin.pointerX` properties, once they have been added + * via this method. + * @param quantity The number of new Pointers to create. A maximum of 10 is allowed in total. Default 1. + */ + addPointer(quantity?: number): Phaser.Input.Pointer[]; + + /** + * Tells the Input system to set a custom cursor. + * + * This cursor will be the default cursor used when interacting with the game canvas. + * + * If an Interactive Object also sets a custom cursor, this is the cursor that is reset after its use. + * + * Any valid CSS cursor value is allowed, including paths to image files, i.e.: + * + * ```javascript + * this.input.setDefaultCursor('url(assets/cursors/sword.cur), pointer'); + * ``` + * + * Please read about the differences between browsers when it comes to the file formats and sizes they support: + * + * https://developer.mozilla.org/en-US/docs/Web/CSS/cursor + * https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_User_Interface/Using_URL_values_for_the_cursor_property + * + * It's up to you to pick a suitable cursor format that works across the range of browsers you need to support. + * @param cursor The CSS to be used when setting the default cursor. + */ + setDefaultCursor(cursor: string): this; + + /** + * Loops through all of the Input Manager Pointer instances and calls `reset` on them. + * + * Use this function if you find that input has been stolen from Phaser via a 3rd + * party component, such as Vue, and you need to tell Phaser to reset the Pointer states. + */ + resetPointers(): void; + + /** + * The x coordinates of the ActivePointer based on the first camera in the camera list. + * This is only safe to use if your game has just 1 non-transformed camera and doesn't use multi-touch. + */ + readonly x: number; + + /** + * The y coordinates of the ActivePointer based on the first camera in the camera list. + * This is only safe to use if your game has just 1 non-transformed camera and doesn't use multi-touch. + */ + readonly y: number; + + /** + * Are any mouse or touch pointers currently over the game canvas? + */ + readonly isOver: boolean; + + /** + * The mouse has its own unique Pointer object, which you can reference directly if making a _desktop specific game_. + * If you are supporting both desktop and touch devices then do not use this property, instead use `activePointer` + * which will always map to the most recently interacted pointer. + */ + readonly mousePointer: Phaser.Input.Pointer; + + /** + * The current active input Pointer. + */ + readonly activePointer: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer1: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer2: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer3: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer4: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer5: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer6: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer7: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer8: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer9: Phaser.Input.Pointer; + + /** + * A touch-based Pointer object. + * This will be `undefined` by default unless you add a new Pointer using `addPointer`. + */ + readonly pointer10: Phaser.Input.Pointer; + + /** + * An instance of the Keyboard Plugin class, if enabled via the `input.keyboard` Scene or Game Config property. + * Use this to create Key objects and listen for keyboard specific events. + */ + keyboard: Phaser.Input.Keyboard.KeyboardPlugin | null; + + } + + namespace InputPluginCache { + /** + * Static method called directly by the Core internal Plugins. + * Key is a reference used to get the plugin from the plugins object (i.e. InputPlugin) + * Plugin is the object to instantiate to create the plugin + * Mapping is what the plugin is injected into the Scene.Systems as (i.e. input) + * @param key A reference used to get this plugin from the plugin cache. + * @param plugin The plugin to be stored. Should be the core object, not instantiated. + * @param mapping If this plugin is to be injected into the Input Plugin, this is the property key used. + * @param settingsKey The key in the Scene Settings to check to see if this plugin should install or not. + * @param configKey The key in the Game Config to check to see if this plugin should install or not. + */ + function register(key: string, plugin: Function, mapping: string, settingsKey: string, configKey: string): void; + + /** + * Returns the input plugin object from the cache based on the given key. + * @param key The key of the input plugin to get. + */ + function getPlugin(key: string): Phaser.Types.Input.InputPluginContainer; + + /** + * Installs all of the registered Input Plugins into the given target. + * @param target The target InputPlugin to install the plugins into. + */ + function install(target: Phaser.Input.InputPlugin): void; + + /** + * Removes an input plugin based on the given key. + * @param key The key of the input plugin to remove. + */ + function remove(key: string): void; + + } + + namespace Keyboard { + /** + * A KeyCombo will listen for a specific string of keys from the Keyboard, and when it receives them + * it will emit a `keycombomatch` event from the Keyboard Manager. + * + * The keys to be listened for can be defined as: + * + * A string (i.e. 'ATARI') + * An array of either integers (key codes) or strings, or a mixture of both + * An array of objects (such as Key objects) with a public 'keyCode' property + * + * For example, to listen for the Konami code (up, up, down, down, left, right, left, right, b, a, enter) + * you could pass the following array of key codes: + * + * ```javascript + * this.input.keyboard.createCombo([ 38, 38, 40, 40, 37, 39, 37, 39, 66, 65, 13 ], { resetOnMatch: true }); + * + * this.input.keyboard.on('keycombomatch', function (event) { + * console.log('Konami Code entered!'); + * }); + * ``` + * + * Or, to listen for the user entering the word PHASER: + * + * ```javascript + * this.input.keyboard.createCombo('PHASER'); + * ``` + */ + class KeyCombo { + /** + * + * @param keyboardPlugin A reference to the Keyboard Plugin. + * @param keys The keys that comprise this combo. + * @param config A Key Combo configuration object. + */ + constructor(keyboardPlugin: Phaser.Input.Keyboard.KeyboardPlugin, keys: string | number[] | object[], config?: Phaser.Types.Input.Keyboard.KeyComboConfig); + + /** + * A reference to the Keyboard Manager + */ + manager: Phaser.Input.Keyboard.KeyboardPlugin; + + /** + * A flag that controls if this Key Combo is actively processing keys or not. + */ + enabled: boolean; + + /** + * An array of the keycodes that comprise this combo. + */ + keyCodes: any[]; + + /** + * The current keyCode the combo is waiting for. + */ + current: number; + + /** + * The current index of the key being waited for in the 'keys' string. + */ + index: number; + + /** + * The length of this combo (in keycodes) + */ + size: number; + + /** + * The time the previous key in the combo was matched. + */ + timeLastMatched: number; + + /** + * Has this Key Combo been matched yet? + */ + matched: boolean; + + /** + * The time the entire combo was matched. + */ + timeMatched: number; + + /** + * If they press the wrong key do we reset the combo? + */ + resetOnWrongKey: boolean; + + /** + * The max delay in ms between each key press. Above this the combo is reset. 0 means disabled. + */ + maxKeyDelay: number; + + /** + * If previously matched and they press the first key of the combo again, will it reset? + */ + resetOnMatch: boolean; + + /** + * If the combo matches, will it delete itself? + */ + deleteOnMatch: boolean; + + /** + * How far complete is this combo? A value between 0 and 1. + */ + readonly progress: number; + + /** + * Destroys this Key Combo and all of its references. + */ + destroy(): void; + + } + + namespace Events { + /** + * The Global Key Down Event. + * + * This event is dispatched by the Keyboard Plugin when any key on the keyboard is pressed down. + * + * Listen to this event from within a Scene using: `this.input.keyboard.on('keydown', listener)`. + * + * You can also listen for a specific key being pressed. See [Keyboard.Events.KEY_DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:KEY_DOWN} for details. + * + * Finally, you can create Key objects, which you can also listen for events from. See [Keyboard.Events.DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:DOWN} for details. + * + * _Note_: Many keyboards are unable to process certain combinations of keys due to hardware limitations known as ghosting. + * Read [this article on ghosting]{@link http://www.html5gamedevs.com/topic/4876-impossible-to-use-more-than-2-keyboard-input-buttons-at-the-same-time/} for details. + * + * Also, please be aware that some browser extensions can disable or override Phaser keyboard handling. + * For example, the Chrome extension vimium is known to disable Phaser from using the D key, while EverNote disables the backtick key. + * There are others. So, please check your extensions if you find you have specific keys that don't work. + */ + const ANY_KEY_DOWN: string; + + /** + * The Global Key Up Event. + * + * This event is dispatched by the Keyboard Plugin when any key on the keyboard is released. + * + * Listen to this event from within a Scene using: `this.input.keyboard.on('keyup', listener)`. + * + * You can also listen for a specific key being released. See [Keyboard.Events.KEY_UP]{@linkcode Phaser.Input.Keyboard.Events#event:KEY_UP} for details. + * + * Finally, you can create Key objects, which you can also listen for events from. See [Keyboard.Events.UP]{@linkcode Phaser.Input.Keyboard.Events#event:UP} for details. + */ + const ANY_KEY_UP: string; + + /** + * The Key Combo Match Event. + * + * This event is dispatched by the Keyboard Plugin when a [Key Combo]{@link Phaser.Input.Keyboard.KeyCombo} is matched. + * + * Listen for this event from the Key Plugin after a combo has been created: + * + * ```javascript + * this.input.keyboard.createCombo([ 38, 38, 40, 40, 37, 39, 37, 39, 66, 65, 13 ], { resetOnMatch: true }); + * + * this.input.keyboard.on('keycombomatch', function (event) { + * console.log('Konami Code entered!'); + * }); + * ``` + */ + const COMBO_MATCH: string; + + /** + * The Key Down Event. + * + * This event is dispatched by a [Key]{@link Phaser.Input.Keyboard.Key} object when it is pressed. + * + * Listen for this event from the Key object instance directly: + * + * ```javascript + * var spaceBar = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE); + * + * spaceBar.on('down', listener) + * ``` + * + * You can also create a generic 'global' listener. See [Keyboard.Events.ANY_KEY_DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:ANY_KEY_DOWN} for details. + */ + const DOWN: string; + + /** + * The Key Down Event. + * + * This event is dispatched by the Keyboard Plugin when any key on the keyboard is pressed down. + * + * Unlike the `ANY_KEY_DOWN` event, this one has a special dynamic event name. For example, to listen for the `A` key being pressed + * use the following from within a Scene: `this.input.keyboard.on('keydown-A', listener)`. You can replace the `-A` part of the event + * name with any valid [Key Code string]{@link Phaser.Input.Keyboard.KeyCodes}. For example, this will listen for the space bar: + * `this.input.keyboard.on('keydown-SPACE', listener)`. + * + * You can also create a generic 'global' listener. See [Keyboard.Events.ANY_KEY_DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:ANY_KEY_DOWN} for details. + * + * Finally, you can create Key objects, which you can also listen for events from. See [Keyboard.Events.DOWN]{@linkcode Phaser.Input.Keyboard.Events#event:DOWN} for details. + * + * _Note_: Many keyboards are unable to process certain combinations of keys due to hardware limitations known as ghosting. + * Read [this article on ghosting]{@link http://www.html5gamedevs.com/topic/4876-impossible-to-use-more-than-2-keyboard-input-buttons-at-the-same-time/} for details. + * + * Also, please be aware that some browser extensions can disable or override Phaser keyboard handling. + * For example, the Chrome extension vimium is known to disable Phaser from using the D key, while EverNote disables the backtick key. + * There are others. So, please check your extensions if you find you have specific keys that don't work. + */ + const KEY_DOWN: string; + + /** + * The Key Up Event. + * + * This event is dispatched by the Keyboard Plugin when any key on the keyboard is released. + * + * Unlike the `ANY_KEY_UP` event, this one has a special dynamic event name. For example, to listen for the `A` key being released + * use the following from within a Scene: `this.input.keyboard.on('keyup-A', listener)`. You can replace the `-A` part of the event + * name with any valid [Key Code string]{@link Phaser.Input.Keyboard.KeyCodes}. For example, this will listen for the space bar: + * `this.input.keyboard.on('keyup-SPACE', listener)`. + * + * You can also create a generic 'global' listener. See [Keyboard.Events.ANY_KEY_UP]{@linkcode Phaser.Input.Keyboard.Events#event:ANY_KEY_UP} for details. + * + * Finally, you can create Key objects, which you can also listen for events from. See [Keyboard.Events.UP]{@linkcode Phaser.Input.Keyboard.Events#event:UP} for details. + */ + const KEY_UP: string; + + /** + * The Key Up Event. + * + * This event is dispatched by a [Key]{@link Phaser.Input.Keyboard.Key} object when it is released. + * + * Listen for this event from the Key object instance directly: + * + * ```javascript + * var spaceBar = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE); + * + * spaceBar.on('up', listener) + * ``` + * + * You can also create a generic 'global' listener. See [Keyboard.Events.ANY_KEY_UP]{@linkcode Phaser.Input.Keyboard.Events#event:ANY_KEY_UP} for details. + */ + const UP: string; + + } + + /** + * The Keyboard Manager is a helper class that belongs to the global Input Manager. + * + * Its role is to listen for native DOM Keyboard Events and then store them for further processing by the Keyboard Plugin. + * + * You do not need to create this class directly, the Input Manager will create an instance of it automatically if keyboard + * input has been enabled in the Game Config. + */ + class KeyboardManager { + /** + * + * @param inputManager A reference to the Input Manager. + */ + constructor(inputManager: Phaser.Input.InputManager); + + /** + * A reference to the Input Manager. + */ + manager: Phaser.Input.InputManager; + + /** + * A flag that controls if the non-modified keys, matching those stored in the `captures` array, + * have `preventDefault` called on them or not. + * + * A non-modified key is one that doesn't have a modifier key held down with it. The modifier keys are + * shift, control, alt and the meta key (Command on a Mac, the Windows Key on Windows). + * Therefore, if the user presses shift + r, it won't prevent this combination, because of the modifier. + * However, if the user presses just the r key on its own, it will have its event prevented. + * + * If you wish to stop capturing the keys, for example switching out to a DOM based element, then + * you can toggle this property at run-time. + */ + preventDefault: boolean; + + /** + * An array of Key Code values that will automatically have `preventDefault` called on them, + * as long as the `KeyboardManager.preventDefault` boolean is set to `true`. + * + * By default the array is empty. + * + * The key must be non-modified when pressed in order to be captured. + * + * A non-modified key is one that doesn't have a modifier key held down with it. The modifier keys are + * shift, control, alt and the meta key (Command on a Mac, the Windows Key on Windows). + * Therefore, if the user presses shift + r, it won't prevent this combination, because of the modifier. + * However, if the user presses just the r key on its own, it will have its event prevented. + * + * If you wish to stop capturing the keys, for example switching out to a DOM based element, then + * you can toggle the `KeyboardManager.preventDefault` boolean at run-time. + * + * If you need more specific control, you can create Key objects and set the flag on each of those instead. + * + * This array can be populated via the Game Config by setting the `input.keyboard.capture` array, or you + * can call the `addCapture` method. See also `removeCapture` and `clearCaptures`. + */ + captures: number[]; + + /** + * A boolean that controls if the Keyboard Manager is enabled or not. + * Can be toggled on the fly. + */ + enabled: boolean; + + /** + * The Keyboard Event target, as defined in the Game Config. + * Typically the window in which the game is rendering, but can be any interactive DOM element. + */ + target: any; + + /** + * The Key Down Event handler. + * This function is sent the native DOM KeyEvent. + * Initially empty and bound in the `startListeners` method. + */ + onKeyDown: Function; + + /** + * The Key Up Event handler. + * This function is sent the native DOM KeyEvent. + * Initially empty and bound in the `startListeners` method. + */ + onKeyUp: Function; + + /** + * Starts the Keyboard Event listeners running. + * This is called automatically and does not need to be manually invoked. + */ + startListeners(): void; + + /** + * Stops the Key Event listeners. + * This is called automatically and does not need to be manually invoked. + */ + stopListeners(): void; + + /** + * By default when a key is pressed Phaser will not stop the event from propagating up to the browser. + * There are some keys this can be annoying for, like the arrow keys or space bar, which make the browser window scroll. + * + * This `addCapture` method enables consuming keyboard event for specific keys so it doesn't bubble up to the the browser + * and cause the default browser behavior. + * + * Please note that keyboard captures are global. This means that if you call this method from within a Scene, to say prevent + * the SPACE BAR from triggering a page scroll, then it will prevent it for any Scene in your game, not just the calling one. + * + * You can pass in a single key code value, or an array of key codes, or a string: + * + * ```javascript + * this.input.keyboard.addCapture(62); + * ``` + * + * An array of key codes: + * + * ```javascript + * this.input.keyboard.addCapture([ 62, 63, 64 ]); + * ``` + * + * Or a string: + * + * ```javascript + * this.input.keyboard.addCapture('W,S,A,D'); + * ``` + * + * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'. + * + * You can also provide an array mixing both strings and key code integers. + * + * If there are active captures after calling this method, the `preventDefault` property is set to `true`. + * @param keycode The Key Codes to enable capture for, preventing them reaching the browser. + */ + addCapture(keycode: string | number | number[] | any[]): void; + + /** + * Removes an existing key capture. + * + * Please note that keyboard captures are global. This means that if you call this method from within a Scene, to remove + * the capture of a key, then it will remove it for any Scene in your game, not just the calling one. + * + * You can pass in a single key code value, or an array of key codes, or a string: + * + * ```javascript + * this.input.keyboard.removeCapture(62); + * ``` + * + * An array of key codes: + * + * ```javascript + * this.input.keyboard.removeCapture([ 62, 63, 64 ]); + * ``` + * + * Or a string: + * + * ```javascript + * this.input.keyboard.removeCapture('W,S,A,D'); + * ``` + * + * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'. + * + * You can also provide an array mixing both strings and key code integers. + * + * If there are no captures left after calling this method, the `preventDefault` property is set to `false`. + * @param keycode The Key Codes to disable capture for, allowing them reaching the browser again. + */ + removeCapture(keycode: string | number | number[] | any[]): void; + + /** + * Removes all keyboard captures and sets the `preventDefault` property to `false`. + */ + clearCaptures(): void; + + /** + * Destroys this Keyboard Manager instance. + */ + destroy(): void; + + } + + /** + * The Keyboard Plugin is an input plugin that belongs to the Scene-owned Input system. + * + * Its role is to listen for native DOM Keyboard Events and then process them. + * + * You do not need to create this class directly, the Input system will create an instance of it automatically. + * + * You can access it from within a Scene using `this.input.keyboard`. For example, you can do: + * + * ```javascript + * this.input.keyboard.on('keydown', callback, context); + * ``` + * + * Or, to listen for a specific key: + * + * ```javascript + * this.input.keyboard.on('keydown-A', callback, context); + * ``` + * + * You can also create Key objects, which you can then poll in your game loop: + * + * ```javascript + * var spaceBar = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE); + * ``` + * + * If you have multiple parallel Scenes, each trying to get keyboard input, be sure to disable capture on them to stop them from + * stealing input from another Scene in the list. You can do this with `this.input.keyboard.enabled = false` within the + * Scene to stop all input, or `this.input.keyboard.preventDefault = false` to stop a Scene halting input on another Scene. + * + * _Note_: Many keyboards are unable to process certain combinations of keys due to hardware limitations known as ghosting. + * See http://www.html5gamedevs.com/topic/4876-impossible-to-use-more-than-2-keyboard-input-buttons-at-the-same-time/ for more details + * and use the site https://w3c.github.io/uievents/tools/key-event-viewer.html to test your n-key support in browser. + * + * Also please be aware that certain browser extensions can disable or override Phaser keyboard handling. + * For example the Chrome extension vimium is known to disable Phaser from using the D key, while EverNote disables the backtick key. + * And there are others. So, please check your extensions before opening Phaser issues about keys that don't work. + */ + class KeyboardPlugin extends Phaser.Events.EventEmitter { + /** + * + * @param sceneInputPlugin A reference to the Scene Input Plugin that the KeyboardPlugin belongs to. + */ + constructor(sceneInputPlugin: Phaser.Input.InputPlugin); + + /** + * A reference to the core game, so we can listen for visibility events. + */ + game: Phaser.Game; + + /** + * A reference to the Scene that this Input Plugin is responsible for. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene Systems Settings. + */ + settings: Phaser.Types.Scenes.SettingsObject; + + /** + * A reference to the Scene Input Plugin that created this Keyboard Plugin. + */ + sceneInputPlugin: Phaser.Input.InputPlugin; + + /** + * A reference to the global Keyboard Manager. + */ + manager: Phaser.Input.Keyboard.KeyboardManager; + + /** + * A boolean that controls if this Keyboard Plugin is enabled or not. + * Can be toggled on the fly. + */ + enabled: boolean; + + /** + * An array of Key objects to process. + */ + keys: Phaser.Input.Keyboard.Key[]; + + /** + * An array of KeyCombo objects to process. + */ + combos: Phaser.Input.Keyboard.KeyCombo[]; + + /** + * Checks to see if both this plugin and the Scene to which it belongs is active. + */ + isActive(): boolean; + + /** + * By default when a key is pressed Phaser will not stop the event from propagating up to the browser. + * There are some keys this can be annoying for, like the arrow keys or space bar, which make the browser window scroll. + * + * This `addCapture` method enables consuming keyboard events for specific keys, so they don't bubble up the browser + * and cause the default behaviors. + * + * Please note that keyboard captures are global. This means that if you call this method from within a Scene, to say prevent + * the SPACE BAR from triggering a page scroll, then it will prevent it for any Scene in your game, not just the calling one. + * + * You can pass a single key code value: + * + * ```javascript + * this.input.keyboard.addCapture(62); + * ``` + * + * An array of key codes: + * + * ```javascript + * this.input.keyboard.addCapture([ 62, 63, 64 ]); + * ``` + * + * Or, a comma-delimited string: + * + * ```javascript + * this.input.keyboard.addCapture('W,S,A,D'); + * ``` + * + * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'. + * + * You can also provide an array mixing both strings and key code integers. + * @param keycode The Key Codes to enable event capture for. + */ + addCapture(keycode: string | number | number[] | any[]): this; + + /** + * Removes an existing key capture. + * + * Please note that keyboard captures are global. This means that if you call this method from within a Scene, to remove + * the capture of a key, then it will remove it for any Scene in your game, not just the calling one. + * + * You can pass a single key code value: + * + * ```javascript + * this.input.keyboard.removeCapture(62); + * ``` + * + * An array of key codes: + * + * ```javascript + * this.input.keyboard.removeCapture([ 62, 63, 64 ]); + * ``` + * + * Or, a comma-delimited string: + * + * ```javascript + * this.input.keyboard.removeCapture('W,S,A,D'); + * ``` + * + * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'. + * + * You can also provide an array mixing both strings and key code integers. + * @param keycode The Key Codes to disable event capture for. + */ + removeCapture(keycode: string | number | number[] | any[]): this; + + /** + * Returns an array that contains all of the keyboard captures currently enabled. + */ + getCaptures(): number[]; + + /** + * Allows Phaser to prevent any key captures you may have defined from bubbling up the browser. + * You can use this to re-enable event capturing if you had paused it via `disableGlobalCapture`. + */ + enableGlobalCapture(): this; + + /** + * Disables Phaser from preventing any key captures you may have defined, without actually removing them. + * You can use this to temporarily disable event capturing if, for example, you swap to a DOM element. + */ + disableGlobalCapture(): this; + + /** + * Removes all keyboard captures. + * + * Note that this is a global change. It will clear all event captures across your game, not just for this specific Scene. + */ + clearCaptures(): this; + + /** + * Creates and returns an object containing 4 hotkeys for Up, Down, Left and Right, and also Space Bar and shift. + */ + createCursorKeys(): Phaser.Types.Input.Keyboard.CursorKeys; + + /** + * A practical way to create an object containing user selected hotkeys. + * + * For example: + * + * ```javascript + * this.input.keyboard.addKeys({ 'up': Phaser.Input.Keyboard.KeyCodes.W, 'down': Phaser.Input.Keyboard.KeyCodes.S }); + * ``` + * + * would return an object containing the properties (`up` and `down`) mapped to W and S {@link Phaser.Input.Keyboard.Key} objects. + * + * You can also pass in a comma-separated string: + * + * ```javascript + * this.input.keyboard.addKeys('W,S,A,D'); + * ``` + * + * Which will return an object with the properties W, S, A and D mapped to the relevant Key objects. + * + * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'. + * @param keys An object containing Key Codes, or a comma-separated string. + * @param enableCapture Automatically call `preventDefault` on the native DOM browser event for the key codes being added. Default true. + * @param emitOnRepeat Controls if the Key will continuously emit a 'down' event while being held down (true), or emit the event just once (false, the default). Default false. + */ + addKeys(keys: object | string, enableCapture?: boolean, emitOnRepeat?: boolean): object; + + /** + * Adds a Key object to this Keyboard Plugin. + * + * The given argument can be either an existing Key object, a string, such as `A` or `SPACE`, or a key code value. + * + * If a Key object is given, and one already exists matching the same key code, the existing one is replaced with the new one. + * @param key Either a Key object, a string, such as `A` or `SPACE`, or a key code value. + * @param enableCapture Automatically call `preventDefault` on the native DOM browser event for the key codes being added. Default true. + * @param emitOnRepeat Controls if the Key will continuously emit a 'down' event while being held down (true), or emit the event just once (false, the default). Default false. + */ + addKey(key: Phaser.Input.Keyboard.Key | string | number, enableCapture?: boolean, emitOnRepeat?: boolean): Phaser.Input.Keyboard.Key; + + /** + * Removes a Key object from this Keyboard Plugin. + * + * The given argument can be either a Key object, a string, such as `A` or `SPACE`, or a key code value. + * @param key Either a Key object, a string, such as `A` or `SPACE`, or a key code value. + * @param destroy Call `Key.destroy` on the removed Key object? Default false. + * @param removeCapture Remove this Key from being captured? Only applies if set to capture when created. Default false. + */ + removeKey(key: Phaser.Input.Keyboard.Key | string | number, destroy?: boolean, removeCapture?: boolean): this; + + /** + * Removes all Key objects created by _this_ Keyboard Plugin. + * @param destroy Call `Key.destroy` on each removed Key object? Default false. + * @param removeCapture Remove all key captures for Key objects owened by this plugin? Default false. + */ + removeAllKeys(destroy?: boolean, removeCapture?: boolean): this; + + /** + * Creates a new KeyCombo. + * + * A KeyCombo will listen for a specific string of keys from the Keyboard, and when it receives them + * it will emit a `keycombomatch` event from this Keyboard Plugin. + * + * The keys to be listened for can be defined as: + * + * A string (i.e. 'ATARI') + * An array of either integers (key codes) or strings, or a mixture of both + * An array of objects (such as Key objects) with a public 'keyCode' property + * + * For example, to listen for the Konami code (up, up, down, down, left, right, left, right, b, a, enter) + * you could pass the following array of key codes: + * + * ```javascript + * this.input.keyboard.createCombo([ 38, 38, 40, 40, 37, 39, 37, 39, 66, 65, 13 ], { resetOnMatch: true }); + * + * this.input.keyboard.on('keycombomatch', function (event) { + * console.log('Konami Code entered!'); + * }); + * ``` + * + * Or, to listen for the user entering the word PHASER: + * + * ```javascript + * this.input.keyboard.createCombo('PHASER'); + * ``` + * @param keys The keys that comprise this combo. + * @param config A Key Combo configuration object. + */ + createCombo(keys: string | number[] | object[], config?: Phaser.Types.Input.Keyboard.KeyComboConfig): Phaser.Input.Keyboard.KeyCombo; + + /** + * Checks if the given Key object is currently being held down. + * + * The difference between this method and checking the `Key.isDown` property directly is that you can provide + * a duration to this method. For example, if you wanted a key press to fire a bullet, but you only wanted + * it to be able to fire every 100ms, then you can call this method with a `duration` of 100 and it + * will only return `true` every 100ms. + * + * If the Keyboard Plugin has been disabled, this method will always return `false`. + * @param key A Key object. + * @param duration The duration which must have elapsed before this Key is considered as being down. Default 0. + */ + checkDown(key: Phaser.Input.Keyboard.Key, duration?: number): boolean; + + /** + * Resets all Key objects created by _this_ Keyboard Plugin back to their default un-pressed states. + * This can only reset keys created via the `addKey`, `addKeys` or `createCursorKeys` methods. + * If you have created a Key object directly you'll need to reset it yourself. + * + * This method is called automatically when the Keyboard Plugin shuts down, but can be + * invoked directly at any time you require. + */ + resetKeys(): this; + + } + + /** + * Returns `true` if the Key was pressed down within the `duration` value given, based on the current + * game clock time. Or `false` if it either isn't down, or was pressed down longer ago than the given duration. + * @param key The Key object to test. + * @param duration The duration, in ms, within which the key must have been pressed down. Default 50. + */ + function DownDuration(key: Phaser.Input.Keyboard.Key, duration?: number): boolean; + + /** + * The justDown value allows you to test if this Key has just been pressed down or not. + * + * When you check this value it will return `true` if the Key is down, otherwise `false`. + * + * You can only call justDown once per key press. It will only return `true` once, until the Key is released and pressed down again. + * This allows you to use it in situations where you want to check if this key is down without using an event, such as in a core game loop. + * @param key The Key to check to see if it's just down or not. + */ + function JustDown(key: Phaser.Input.Keyboard.Key): boolean; + + /** + * The justUp value allows you to test if this Key has just been released or not. + * + * When you check this value it will return `true` if the Key is up, otherwise `false`. + * + * You can only call JustUp once per key release. It will only return `true` once, until the Key is pressed down and released again. + * This allows you to use it in situations where you want to check if this key is up without using an event, such as in a core game loop. + * @param key The Key to check to see if it's just up or not. + */ + function JustUp(key: Phaser.Input.Keyboard.Key): boolean; + + /** + * A generic Key object which can be passed to the Process functions (and so on) + * keycode must be an integer + */ + class Key extends Phaser.Events.EventEmitter { + /** + * + * @param plugin The Keyboard Plugin instance that owns this Key object. + * @param keyCode The keycode of this key. + */ + constructor(plugin: Phaser.Input.Keyboard.KeyboardPlugin, keyCode: number); + + /** + * The Keyboard Plugin instance that owns this Key object. + */ + plugin: Phaser.Input.Keyboard.KeyboardPlugin; + + /** + * The keycode of this key. + */ + keyCode: number; + + /** + * The original DOM event. + */ + originalEvent: KeyboardEvent; + + /** + * Can this Key be processed? + */ + enabled: boolean; + + /** + * The "down" state of the key. This will remain `true` for as long as the keyboard thinks this key is held down. + */ + isDown: boolean; + + /** + * The "up" state of the key. This will remain `true` for as long as the keyboard thinks this key is up. + */ + isUp: boolean; + + /** + * The down state of the ALT key, if pressed at the same time as this key. + */ + altKey: boolean; + + /** + * The down state of the CTRL key, if pressed at the same time as this key. + */ + ctrlKey: boolean; + + /** + * The down state of the SHIFT key, if pressed at the same time as this key. + */ + shiftKey: boolean; + + /** + * The down state of the Meta key, if pressed at the same time as this key. + * On a Mac the Meta Key is the Command key. On Windows keyboards, it's the Windows key. + */ + metaKey: boolean; + + /** + * The location of the modifier key. 0 for standard (or unknown), 1 for left, 2 for right, 3 for numpad. + */ + location: number; + + /** + * The timestamp when the key was last pressed down. + */ + timeDown: number; + + /** + * The number of milliseconds this key was held down for in the previous down - up sequence. + * This value isn't updated every game step, only when the Key changes state. + * To get the current duration use the `getDuration` method. + */ + duration: number; + + /** + * The timestamp when the key was last released. + */ + timeUp: number; + + /** + * When a key is held down should it continuously fire the `down` event each time it repeats? + * + * By default it will emit the `down` event just once, but if you wish to receive the event + * for each repeat as well, enable this property. + */ + emitOnRepeat: boolean; + + /** + * If a key is held down this holds down the number of times the key has 'repeated'. + */ + repeats: number; + + /** + * Controls if this Key will continuously emit a `down` event while being held down (true), + * or emit the event just once, on first press, and then skip future events (false). + * @param value Emit `down` events on repeated key down actions, or just once? + */ + setEmitOnRepeat(value: boolean): this; + + /** + * Processes the Key Down action for this Key. + * Called automatically by the Keyboard Plugin. + * @param event The native DOM Keyboard event. + */ + onDown(event: KeyboardEvent): void; + + /** + * Processes the Key Up action for this Key. + * Called automatically by the Keyboard Plugin. + * @param event The native DOM Keyboard event. + */ + onUp(event: KeyboardEvent): void; + + /** + * Resets this Key object back to its default un-pressed state. + * + * As of version 3.60.0 it no longer resets the `enabled` or `preventDefault` flags. + */ + reset(): this; + + /** + * Returns the duration, in ms, that the Key has been held down for. + * + * If the key is not currently down it will return zero. + * + * To get the duration the Key was held down for in the previous up-down cycle, + * use the `Key.duration` property value instead. + */ + getDuration(): number; + + /** + * Removes any bound event handlers and removes local references. + */ + destroy(): void; + + } + + /** + * Keyboard Codes. + */ + namespace KeyCodes { + /** + * The BACKSPACE key. + */ + var BACKSPACE: number; + + /** + * The TAB key. + */ + var TAB: number; + + /** + * The ENTER key. + */ + var ENTER: number; + + /** + * The SHIFT key. + */ + var SHIFT: number; + + /** + * The CTRL key. + */ + var CTRL: number; + + /** + * The ALT key. + */ + var ALT: number; + + /** + * The PAUSE key. + */ + var PAUSE: number; + + /** + * The CAPS_LOCK key. + */ + var CAPS_LOCK: number; + + /** + * The ESC key. + */ + var ESC: number; + + /** + * The SPACE key. + */ + var SPACE: number; + + /** + * The PAGE_UP key. + */ + var PAGE_UP: number; + + /** + * The PAGE_DOWN key. + */ + var PAGE_DOWN: number; + + /** + * The END key. + */ + var END: number; + + /** + * The HOME key. + */ + var HOME: number; + + /** + * The LEFT key. + */ + var LEFT: number; + + /** + * The UP key. + */ + var UP: number; + + /** + * The RIGHT key. + */ + var RIGHT: number; + + /** + * The DOWN key. + */ + var DOWN: number; + + /** + * The PRINT_SCREEN key. + */ + var PRINT_SCREEN: number; + + /** + * The INSERT key. + */ + var INSERT: number; + + /** + * The DELETE key. + */ + var DELETE: number; + + /** + * The ZERO key. + */ + var ZERO: number; + + /** + * The ONE key. + */ + var ONE: number; + + /** + * The TWO key. + */ + var TWO: number; + + /** + * The THREE key. + */ + var THREE: number; + + /** + * The FOUR key. + */ + var FOUR: number; + + /** + * The FIVE key. + */ + var FIVE: number; + + /** + * The SIX key. + */ + var SIX: number; + + /** + * The SEVEN key. + */ + var SEVEN: number; + + /** + * The EIGHT key. + */ + var EIGHT: number; + + /** + * The NINE key. + */ + var NINE: number; + + /** + * The NUMPAD_ZERO key. + */ + var NUMPAD_ZERO: number; + + /** + * The NUMPAD_ONE key. + */ + var NUMPAD_ONE: number; + + /** + * The NUMPAD_TWO key. + */ + var NUMPAD_TWO: number; + + /** + * The NUMPAD_THREE key. + */ + var NUMPAD_THREE: number; + + /** + * The NUMPAD_FOUR key. + */ + var NUMPAD_FOUR: number; + + /** + * The NUMPAD_FIVE key. + */ + var NUMPAD_FIVE: number; + + /** + * The NUMPAD_SIX key. + */ + var NUMPAD_SIX: number; + + /** + * The NUMPAD_SEVEN key. + */ + var NUMPAD_SEVEN: number; + + /** + * The NUMPAD_EIGHT key. + */ + var NUMPAD_EIGHT: number; + + /** + * The NUMPAD_NINE key. + */ + var NUMPAD_NINE: number; + + /** + * The Numpad Addition (+) key. + */ + var NUMPAD_ADD: number; + + /** + * The Numpad Subtraction (-) key. + */ + var NUMPAD_SUBTRACT: number; + + /** + * The A key. + */ + var A: number; + + /** + * The B key. + */ + var B: number; + + /** + * The C key. + */ + var C: number; + + /** + * The D key. + */ + var D: number; + + /** + * The E key. + */ + var E: number; + + /** + * The F key. + */ + var F: number; + + /** + * The G key. + */ + var G: number; + + /** + * The H key. + */ + var H: number; + + /** + * The I key. + */ + var I: number; + + /** + * The J key. + */ + var J: number; + + /** + * The K key. + */ + var K: number; + + /** + * The L key. + */ + var L: number; + + /** + * The M key. + */ + var M: number; + + /** + * The N key. + */ + var N: number; + + /** + * The O key. + */ + var O: number; + + /** + * The P key. + */ + var P: number; + + /** + * The Q key. + */ + var Q: number; + + /** + * The R key. + */ + var R: number; + + /** + * The S key. + */ + var S: number; + + /** + * The T key. + */ + var T: number; + + /** + * The U key. + */ + var U: number; + + /** + * The V key. + */ + var V: number; + + /** + * The W key. + */ + var W: number; + + /** + * The X key. + */ + var X: number; + + /** + * The Y key. + */ + var Y: number; + + /** + * The Z key. + */ + var Z: number; + + /** + * The F1 key. + */ + var F1: number; + + /** + * The F2 key. + */ + var F2: number; + + /** + * The F3 key. + */ + var F3: number; + + /** + * The F4 key. + */ + var F4: number; + + /** + * The F5 key. + */ + var F5: number; + + /** + * The F6 key. + */ + var F6: number; + + /** + * The F7 key. + */ + var F7: number; + + /** + * The F8 key. + */ + var F8: number; + + /** + * The F9 key. + */ + var F9: number; + + /** + * The F10 key. + */ + var F10: number; + + /** + * The F11 key. + */ + var F11: number; + + /** + * The F12 key. + */ + var F12: number; + + /** + * The SEMICOLON key. + */ + var SEMICOLON: number; + + /** + * The PLUS key. + */ + var PLUS: number; + + /** + * The COMMA key. + */ + var COMMA: number; + + /** + * The MINUS key. + */ + var MINUS: number; + + /** + * The PERIOD key. + */ + var PERIOD: number; + + /** + * The FORWARD_SLASH key. + */ + var FORWARD_SLASH: number; + + /** + * The BACK_SLASH key. + */ + var BACK_SLASH: number; + + /** + * The QUOTES key. + */ + var QUOTES: number; + + /** + * The BACKTICK key. + */ + var BACKTICK: number; + + /** + * The OPEN_BRACKET key. + */ + var OPEN_BRACKET: number; + + /** + * The CLOSED_BRACKET key. + */ + var CLOSED_BRACKET: number; + + /** + * The SEMICOLON_FIREFOX key. + */ + var SEMICOLON_FIREFOX: number; + + /** + * The COLON key. + */ + var COLON: number; + + /** + * The COMMA_FIREFOX_WINDOWS key. + */ + var COMMA_FIREFOX_WINDOWS: number; + + /** + * The COMMA_FIREFOX key. + */ + var COMMA_FIREFOX: number; + + /** + * The BRACKET_RIGHT_FIREFOX key. + */ + var BRACKET_RIGHT_FIREFOX: number; + + /** + * The BRACKET_LEFT_FIREFOX key. + */ + var BRACKET_LEFT_FIREFOX: number; + + } + + /** + * Returns `true` if the Key was released within the `duration` value given, based on the current + * game clock time. Or returns `false` if it either isn't up, or was released longer ago than the given duration. + * @param key The Key object to test. + * @param duration The duration, in ms, within which the key must have been released. Default 50. + */ + function UpDuration(key: Phaser.Input.Keyboard.Key, duration?: number): boolean; + + } + + namespace Mouse { + /** + * The Mouse Manager is a helper class that belongs to the Input Manager. + * + * Its role is to listen for native DOM Mouse Events and then pass them onto the Input Manager for further processing. + * + * You do not need to create this class directly, the Input Manager will create an instance of it automatically. + */ + class MouseManager { + /** + * + * @param inputManager A reference to the Input Manager. + */ + constructor(inputManager: Phaser.Input.InputManager); + + /** + * A reference to the Input Manager. + */ + manager: Phaser.Input.InputManager; + + /** + * If `true` the DOM `mousedown` event will have `preventDefault` set. + */ + preventDefaultDown: boolean; + + /** + * If `true` the DOM `mouseup` event will have `preventDefault` set. + */ + preventDefaultUp: boolean; + + /** + * If `true` the DOM `mousemove` event will have `preventDefault` set. + */ + preventDefaultMove: boolean; + + /** + * If `true` the DOM `wheel` event will have `preventDefault` set. + */ + preventDefaultWheel: boolean; + + /** + * A boolean that controls if the Mouse Manager is enabled or not. + * Can be toggled on the fly. + */ + enabled: boolean; + + /** + * The Mouse target, as defined in the Game Config. + * Typically the canvas to which the game is rendering, but can be any interactive DOM element. + */ + target: any; + + /** + * If the mouse has been pointer locked successfully this will be set to true. + */ + locked: boolean; + + /** + * The Mouse Move Event handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseMove: Function; + + /** + * The Mouse Down Event handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseDown: Function; + + /** + * The Mouse Up Event handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseUp: Function; + + /** + * The Mouse Down Event handler specifically for events on the Window. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseDownWindow: Function; + + /** + * The Mouse Up Event handler specifically for events on the Window. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseUpWindow: Function; + + /** + * The Mouse Over Event handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseOver: Function; + + /** + * The Mouse Out Event handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseOut: Function; + + /** + * The Mouse Wheel Event handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + onMouseWheel: Function; + + /** + * Internal pointerLockChange handler. + * This function is sent the native DOM MouseEvent. + * Initially empty and bound in the `startListeners` method. + */ + pointerLockChange: Function; + + /** + * Are the event listeners hooked into `window.top` or `window`? + * + * This is set during the `boot` sequence. If the browser does not have access to `window.top`, + * such as in cross-origin iframe environments, this property gets set to `false` and the events + * are hooked into `window` instead. + */ + readonly isTop: boolean; + + /** + * Attempts to disable the context menu from appearing if you right-click on the game canvas, or specified input target. + * + * Works by listening for the `contextmenu` event and prevent defaulting it. + * + * Use this if you need to enable right-button mouse support in your game, and the context + * menu keeps getting in the way. + */ + disableContextMenu(): this; + + /** + * If the browser supports it, you can request that the pointer be locked to the browser window. + * + * This is classically known as 'FPS controls', where the pointer can't leave the browser until + * the user presses an exit key. + * + * If the browser successfully enters a locked state, a `POINTER_LOCK_CHANGE_EVENT` will be dispatched, + * from the games Input Manager, with an `isPointerLocked` property. + * + * It is important to note that pointer lock can only be enabled after an 'engagement gesture', + * see: https://w3c.github.io/pointerlock/#dfn-engagement-gesture. + * + * Note for Firefox: There is a bug in certain Firefox releases that cause native DOM events like + * `mousemove` to fire continuously when in pointer lock mode. You can get around this by setting + * `this.preventDefaultMove` to `false` in this class. You may also need to do the same for + * `preventDefaultDown` and/or `preventDefaultUp`. Please test combinations of these if you encounter + * the error. + */ + requestPointerLock(): void; + + /** + * If the browser supports pointer lock, this will request that the pointer lock is released. If + * the browser successfully enters a locked state, a 'POINTER_LOCK_CHANGE_EVENT' will be + * dispatched - from the game's input manager - with an `isPointerLocked` property. + */ + releasePointerLock(): void; + + /** + * Starts the Mouse Event listeners running. + * This is called automatically and does not need to be manually invoked. + */ + startListeners(): void; + + /** + * Stops the Mouse Event listeners. + * This is called automatically and does not need to be manually invoked. + */ + stopListeners(): void; + + /** + * Destroys this Mouse Manager instance. + */ + destroy(): void; + + } + + } + + /** + * A Pointer object encapsulates both mouse and touch input within Phaser. + * + * By default, Phaser will create 2 pointers for your game to use. If you require more, i.e. for a multi-touch + * game, then use the `InputPlugin.addPointer` method to do so, rather than instantiating this class directly, + * otherwise it won't be managed by the input system. + * + * You can reference the current active pointer via `InputPlugin.activePointer`. You can also use the properties + * `InputPlugin.pointer1` through to `pointer10`, for each pointer you have enabled in your game. + * + * The properties of this object are set by the Input Plugin during processing. This object is then sent in all + * input related events that the Input Plugin emits, so you can reference properties from it directly in your + * callbacks. + */ + class Pointer { + /** + * + * @param manager A reference to the Input Manager. + * @param id The internal ID of this Pointer. + */ + constructor(manager: Phaser.Input.InputManager, id: number); + + /** + * A reference to the Input Manager. + */ + manager: Phaser.Input.InputManager; + + /** + * The internal ID of this Pointer. + */ + readonly id: number; + + /** + * The most recent native DOM Event this Pointer has processed. + */ + event: TouchEvent | MouseEvent | WheelEvent; + + /** + * The DOM element the Pointer was pressed down on, taken from the DOM event. + * In a default set-up this will be the Canvas that Phaser is rendering to, or the Window element. + */ + readonly downElement: any; + + /** + * The DOM element the Pointer was released on, taken from the DOM event. + * In a default set-up this will be the Canvas that Phaser is rendering to, or the Window element. + */ + readonly upElement: any; + + /** + * The camera the Pointer interacted with during its last update. + * + * A Pointer can only ever interact with one camera at once, which will be the top-most camera + * in the list should multiple cameras be positioned on-top of each other. + */ + camera: Phaser.Cameras.Scene2D.Camera; + + /** + * A read-only property that indicates which button was pressed, or released, on the pointer + * during the most recent event. It is only set during `up` and `down` events. + * + * On Touch devices the value is always 0. + * + * Users may change the configuration of buttons on their pointing device so that if an event's button property + * is zero, it may not have been caused by the button that is physically left–most on the pointing device; + * however, it should behave as if the left button was clicked in the standard button layout. + */ + readonly button: number; + + /** + * 0: No button or un-initialized + * 1: Left button + * 2: Right button + * 4: Wheel button or middle button + * 8: 4th button (typically the "Browser Back" button) + * 16: 5th button (typically the "Browser Forward" button) + * + * For a mouse configured for left-handed use, the button actions are reversed. + * In this case, the values are read from right to left. + */ + buttons: number; + + /** + * The position of the Pointer in screen space. + */ + readonly position: Phaser.Math.Vector2; + + /** + * The previous position of the Pointer in screen space. + * + * The old x and y values are stored in here during the InputManager.transformPointer call. + * + * Use the properties `velocity`, `angle` and `distance` to create your own gesture recognition. + */ + readonly prevPosition: Phaser.Math.Vector2; + + /** + * The current velocity of the Pointer, based on its current and previous positions. + * + * This value is smoothed out each frame, according to the `motionFactor` property. + * + * This property is updated whenever the Pointer moves, regardless of any button states. In other words, + * it changes based on movement alone - a button doesn't have to be pressed first. + */ + readonly velocity: Phaser.Math.Vector2; + + /** + * The current angle the Pointer is moving, in radians, based on its previous and current position. + * + * The angle is based on the old position facing to the current position. + * + * This property is updated whenever the Pointer moves, regardless of any button states. In other words, + * it changes based on movement alone - a button doesn't have to be pressed first. + */ + readonly angle: number; + + /** + * The distance the Pointer has moved, based on its previous and current position. + * + * This value is smoothed out each frame, according to the `motionFactor` property. + * + * This property is updated whenever the Pointer moves, regardless of any button states. In other words, + * it changes based on movement alone - a button doesn't have to be pressed first. + * + * If you need the total distance travelled since the primary buttons was pressed down, + * then use the `Pointer.getDistance` method. + */ + readonly distance: number; + + /** + * The smoothing factor to apply to the Pointer position. + * + * Due to their nature, pointer positions are inherently noisy. While this is fine for lots of games, if you need cleaner positions + * then you can set this value to apply an automatic smoothing to the positions as they are recorded. + * + * The default value of zero means 'no smoothing'. + * Set to a small value, such as 0.2, to apply an average level of smoothing between positions. You can do this by changing this + * value directly, or by setting the `input.smoothFactor` property in the Game Config. + * + * Positions are only smoothed when the pointer moves. If the primary button on this Pointer enters an Up or Down state, then the position + * is always precise, and not smoothed. + */ + smoothFactor: number; + + /** + * The factor applied to the motion smoothing each frame. + * + * This value is passed to the Smooth Step Interpolation that is used to calculate the velocity, + * angle and distance of the Pointer. It's applied every frame, until the midPoint reaches the current + * position of the Pointer. 0.2 provides a good average but can be increased if you need a + * quicker update and are working in a high performance environment. Never set this value to + * zero. + */ + motionFactor: number; + + /** + * The x position of this Pointer, translated into the coordinate space of the most recent Camera it interacted with. + * + * If you wish to use this value _outside_ of an input event handler then you should update it first by calling + * the `Pointer.updateWorldPoint` method. + */ + worldX: number; + + /** + * The y position of this Pointer, translated into the coordinate space of the most recent Camera it interacted with. + * + * If you wish to use this value _outside_ of an input event handler then you should update it first by calling + * the `Pointer.updateWorldPoint` method. + */ + worldY: number; + + /** + * Time when this Pointer was most recently moved (regardless of the state of its buttons, if any) + */ + moveTime: number; + + /** + * X coordinate of the Pointer when Button 1 (left button), or Touch, was pressed, used for dragging objects. + */ + downX: number; + + /** + * Y coordinate of the Pointer when Button 1 (left button), or Touch, was pressed, used for dragging objects. + */ + downY: number; + + /** + * The Event timestamp when the first button, or Touch input, was pressed. Used for dragging objects. + */ + downTime: number; + + /** + * X coordinate of the Pointer when Button 1 (left button), or Touch, was released, used for dragging objects. + */ + upX: number; + + /** + * Y coordinate of the Pointer when Button 1 (left button), or Touch, was released, used for dragging objects. + */ + upY: number; + + /** + * The Event timestamp when the final button, or Touch input, was released. Used for dragging objects. + */ + upTime: number; + + /** + * Is the primary button down? (usually button 0, the left mouse button) + */ + primaryDown: boolean; + + /** + * Is _any_ button on this pointer considered as being down? + */ + isDown: boolean; + + /** + * Did the previous input event come from a Touch input (true) or Mouse? (false) + */ + wasTouch: boolean; + + /** + * Did this Pointer get canceled by a touchcancel event? + * + * Note: "canceled" is the American-English spelling of "cancelled". Please don't submit PRs correcting it! + */ + wasCanceled: boolean; + + /** + * If the mouse is locked, the horizontal relative movement of the Pointer in pixels since last frame. + */ + movementX: number; + + /** + * If the mouse is locked, the vertical relative movement of the Pointer in pixels since last frame. + */ + movementY: number; + + /** + * The identifier property of the Pointer as set by the DOM event when this Pointer is started. + */ + identifier: number; + + /** + * The pointerId property of the Pointer as set by the DOM event when this Pointer is started. + * The browser can and will recycle this value. + */ + pointerId: number; + + /** + * An active Pointer is one that is currently pressed down on the display. + * A Mouse is always considered as active. + */ + active: boolean; + + /** + * Is this pointer Pointer Locked? + * + * Only a mouse pointer can be locked and it only becomes locked when requested via + * the browsers Pointer Lock API. + * + * You can request this by calling the `this.input.mouse.requestPointerLock()` method from + * a `pointerdown` or `pointerup` event handler. + */ + readonly locked: boolean; + + /** + * The horizontal scroll amount that occurred due to the user moving a mouse wheel or similar input device. + */ + deltaX: number; + + /** + * The vertical scroll amount that occurred due to the user moving a mouse wheel or similar input device. + * This value will typically be less than 0 if the user scrolls up and greater than zero if scrolling down. + */ + deltaY: number; + + /** + * The z-axis scroll amount that occurred due to the user moving a mouse wheel or similar input device. + */ + deltaZ: number; + + /** + * Takes a Camera and updates this Pointer's `worldX` and `worldY` values so they are + * the result of a translation through the given Camera. + * + * Note that the values will be automatically replaced the moment the Pointer is + * updated by an input event, such as a mouse move, so should be used immediately. + * @param camera The Camera which is being tested against. + */ + updateWorldPoint(camera: Phaser.Cameras.Scene2D.Camera): this; + + /** + * Takes a Camera and returns a Vector2 containing the translated position of this Pointer + * within that Camera. This can be used to convert this Pointers position into camera space. + * @param camera The Camera to use for the translation. + * @param output A Vector2-like object in which to store the translated position. + */ + positionToCamera(camera: Phaser.Cameras.Scene2D.Camera, output?: Phaser.Math.Vector2 | object): Phaser.Math.Vector2 | object; + + /** + * Checks to see if any buttons are being held down on this Pointer. + */ + noButtonDown(): boolean; + + /** + * Checks to see if the left button is being held down on this Pointer. + */ + leftButtonDown(): boolean; + + /** + * Checks to see if the right button is being held down on this Pointer. + */ + rightButtonDown(): boolean; + + /** + * Checks to see if the middle button is being held down on this Pointer. + */ + middleButtonDown(): boolean; + + /** + * Checks to see if the back button is being held down on this Pointer. + */ + backButtonDown(): boolean; + + /** + * Checks to see if the forward button is being held down on this Pointer. + */ + forwardButtonDown(): boolean; + + /** + * Checks to see if the left button was just released on this Pointer. + */ + leftButtonReleased(): boolean; + + /** + * Checks to see if the right button was just released on this Pointer. + */ + rightButtonReleased(): boolean; + + /** + * Checks to see if the middle button was just released on this Pointer. + */ + middleButtonReleased(): boolean; + + /** + * Checks to see if the back button was just released on this Pointer. + */ + backButtonReleased(): boolean; + + /** + * Checks to see if the forward button was just released on this Pointer. + */ + forwardButtonReleased(): boolean; + + /** + * If the Pointer has a button pressed down at the time this method is called, it will return the + * distance between the Pointer's `downX` and `downY` values and the current position. + * + * If no button is held down, it will return the last recorded distance, based on where + * the Pointer was when the button was released. + * + * If you wish to get the distance being travelled currently, based on the velocity of the Pointer, + * then see the `Pointer.distance` property. + */ + getDistance(): number; + + /** + * If the Pointer has a button pressed down at the time this method is called, it will return the + * horizontal distance between the Pointer's `downX` and `downY` values and the current position. + * + * If no button is held down, it will return the last recorded horizontal distance, based on where + * the Pointer was when the button was released. + */ + getDistanceX(): number; + + /** + * If the Pointer has a button pressed down at the time this method is called, it will return the + * vertical distance between the Pointer's `downX` and `downY` values and the current position. + * + * If no button is held down, it will return the last recorded vertical distance, based on where + * the Pointer was when the button was released. + */ + getDistanceY(): number; + + /** + * If the Pointer has a button pressed down at the time this method is called, it will return the + * duration since the button was pressed down. + * + * If no button is held down, it will return the last recorded duration, based on the time + * the last button on the Pointer was released. + */ + getDuration(): number; + + /** + * If the Pointer has a button pressed down at the time this method is called, it will return the + * angle between the Pointer's `downX` and `downY` values and the current position. + * + * If no button is held down, it will return the last recorded angle, based on where + * the Pointer was when the button was released. + * + * The angle is based on the old position facing to the current position. + * + * If you wish to get the current angle, based on the velocity of the Pointer, then + * see the `Pointer.angle` property. + */ + getAngle(): number; + + /** + * Takes the previous and current Pointer positions and then generates an array of interpolated values between + * the two. The array will be populated up to the size of the `steps` argument. + * + * ```javaScript + * var points = pointer.getInterpolatedPosition(4); + * + * // points[0] = { x: 0, y: 0 } + * // points[1] = { x: 2, y: 1 } + * // points[2] = { x: 3, y: 2 } + * // points[3] = { x: 6, y: 3 } + * ``` + * + * Use this if you need to get smoothed values between the previous and current pointer positions. DOM pointer + * events can often fire faster than the main browser loop, and this will help you avoid janky movement + * especially if you have an object following a Pointer. + * + * Note that if you provide an output array it will only be populated up to the number of steps provided. + * It will not clear any previous data that may have existed beyond the range of the steps count. + * + * Internally it uses the Smooth Step interpolation calculation. + * @param steps The number of interpolation steps to use. Default 10. + * @param out An array to store the results in. If not provided a new one will be created. + */ + getInterpolatedPosition(steps?: number, out?: any[]): any[]; + + /** + * Fully reset this Pointer back to its unitialized state. + */ + reset(): void; + + /** + * Destroys this Pointer instance and resets its external references. + */ + destroy(): void; + + /** + * The x position of this Pointer. + * The value is in screen space. + * See `worldX` to get a camera converted position. + */ + x: number; + + /** + * The y position of this Pointer. + * The value is in screen space. + * See `worldY` to get a camera converted position. + */ + y: number; + + /** + * Time when this Pointer was most recently updated by a DOM Event. + * This comes directly from the `event.timeStamp` property. + * If no event has yet taken place, it will return zero. + */ + readonly time: number; + + } + + namespace Touch { + /** + * The Touch Manager is a helper class that belongs to the Input Manager. + * + * Its role is to listen for native DOM Touch Events and then pass them onto the Input Manager for further processing. + * + * You do not need to create this class directly, the Input Manager will create an instance of it automatically. + */ + class TouchManager { + /** + * + * @param inputManager A reference to the Input Manager. + */ + constructor(inputManager: Phaser.Input.InputManager); + + /** + * A reference to the Input Manager. + */ + manager: Phaser.Input.InputManager; + + /** + * If true the DOM events will have event.preventDefault applied to them, if false they will propagate fully. + */ + capture: boolean; + + /** + * A boolean that controls if the Touch Manager is enabled or not. + * Can be toggled on the fly. + */ + enabled: boolean; + + /** + * The Touch Event target, as defined in the Game Config. + * Typically the canvas to which the game is rendering, but can be any interactive DOM element. + */ + target: any; + + /** + * The Touch Start event handler function. + * Initially empty and bound in the `startListeners` method. + */ + onTouchStart: Function; + + /** + * The Touch Start event handler function specifically for events on the Window. + * Initially empty and bound in the `startListeners` method. + */ + onTouchStartWindow: Function; + + /** + * The Touch Move event handler function. + * Initially empty and bound in the `startListeners` method. + */ + onTouchMove: Function; + + /** + * The Touch End event handler function. + * Initially empty and bound in the `startListeners` method. + */ + onTouchEnd: Function; + + /** + * The Touch End event handler function specifically for events on the Window. + * Initially empty and bound in the `startListeners` method. + */ + onTouchEndWindow: Function; + + /** + * The Touch Cancel event handler function. + * Initially empty and bound in the `startListeners` method. + */ + onTouchCancel: Function; + + /** + * The Touch Cancel event handler function specifically for events on the Window. + * Initially empty and bound in the `startListeners` method. + */ + onTouchCancelWindow: Function; + + /** + * Are the event listeners hooked into `window.top` or `window`? + * + * This is set during the `boot` sequence. If the browser does not have access to `window.top`, + * such as in cross-origin iframe environments, this property gets set to `false` and the events + * are hooked into `window` instead. + */ + readonly isTop: boolean; + + /** + * Attempts to disable the context menu from appearing if you touch-hold on the browser. + * + * Works by listening for the `contextmenu` event and prevent defaulting it. + * + * Use this if you need to disable the OS context menu on mobile. + */ + disableContextMenu(): this; + + /** + * Starts the Touch Event listeners running as long as an input target is set. + * + * This method is called automatically if Touch Input is enabled in the game config, + * which it is by default. However, you can call it manually should you need to + * delay input capturing until later in the game. + */ + startListeners(): void; + + /** + * Stops the Touch Event listeners. + * This is called automatically and does not need to be manually invoked. + */ + stopListeners(): void; + + /** + * Destroys this Touch Manager instance. + */ + destroy(): void; + + } + + } + + } + + namespace Loader { + /** + * The Loader is idle. + */ + var LOADER_IDLE: number; + + /** + * The Loader is actively loading. + */ + var LOADER_LOADING: number; + + /** + * The Loader is processing files is has loaded. + */ + var LOADER_PROCESSING: number; + + /** + * The Loader has completed loading and processing. + */ + var LOADER_COMPLETE: number; + + /** + * The Loader is shutting down. + */ + var LOADER_SHUTDOWN: number; + + /** + * The Loader has been destroyed. + */ + var LOADER_DESTROYED: number; + + /** + * File is in the load queue but not yet started. + */ + var FILE_PENDING: number; + + /** + * File has been started to load by the loader (onLoad called) + */ + var FILE_LOADING: number; + + /** + * File has loaded successfully, awaiting processing. + */ + var FILE_LOADED: number; + + /** + * File failed to load. + */ + var FILE_FAILED: number; + + /** + * File is being processed (onProcess callback) + */ + var FILE_PROCESSING: number; + + /** + * The File has errored somehow during processing. + */ + var FILE_ERRORED: number; + + /** + * File has finished processing. + */ + var FILE_COMPLETE: number; + + /** + * File has been destroyed. + */ + var FILE_DESTROYED: number; + + /** + * File was populated from local data and doesn't need an HTTP request. + */ + var FILE_POPULATED: number; + + /** + * File is pending being destroyed. + */ + var FILE_PENDING_DESTROY: number; + + namespace Events { + /** + * The Loader Plugin Add File Event. + * + * This event is dispatched when a new file is successfully added to the Loader and placed into the load queue. + * + * Listen to it from a Scene using: `this.load.on('addfile', listener)`. + * + * If you add lots of files to a Loader from a `preload` method, it will dispatch this event for each one of them. + */ + const ADD: string; + + /** + * The Loader Plugin Complete Event. + * + * This event is dispatched when the Loader has fully processed everything in the load queue. + * By this point every loaded file will now be in its associated cache and ready for use. + * + * Listen to it from a Scene using: `this.load.on('complete', listener)`. + */ + const COMPLETE: string; + + /** + * The File Load Complete Event. + * + * This event is dispatched by the Loader Plugin when _any_ file in the queue finishes loading. + * + * Listen to it from a Scene using: `this.load.on('filecomplete', listener)`. + * + * Make sure you remove this listener when you have finished, or it will continue to fire if the Scene reloads. + * + * You can also listen for the completion of a specific file. See the [FILE_KEY_COMPLETE]{@linkcode Phaser.Loader.Events#event:FILE_KEY_COMPLETE} event. + */ + const FILE_COMPLETE: string; + + /** + * The File Load Complete Event. + * + * This event is dispatched by the Loader Plugin when any file in the queue finishes loading. + * + * It uses a special dynamic event name constructed from the key and type of the file. + * + * For example, if you have loaded an `image` with a key of `monster`, you can listen for it + * using the following: + * + * ```javascript + * this.load.on('filecomplete-image-monster', function (key, type, data) { + * // Your handler code + * }); + * ``` + * + * Or, if you have loaded a texture `atlas` with a key of `Level1`: + * + * ```javascript + * this.load.on('filecomplete-atlasjson-Level1', function (key, type, data) { + * // Your handler code + * }); + * ``` + * + * Or, if you have loaded a sprite sheet with a key of `Explosion` and a prefix of `GAMEOVER`: + * + * ```javascript + * this.load.on('filecomplete-spritesheet-GAMEOVERExplosion', function (key, type, data) { + * // Your handler code + * }); + * ``` + * + * Make sure you remove your listeners when you have finished, or they will continue to fire if the Scene reloads. + * + * You can also listen for the generic completion of files. See the [FILE_COMPLETE]{@linkcode Phaser.Loader.Events#event:FILE_COMPLETE} event. + */ + const FILE_KEY_COMPLETE: string; + + /** + * The File Load Error Event. + * + * This event is dispatched by the Loader Plugin when a file fails to load. + * + * Listen to it from a Scene using: `this.load.on('loaderror', listener)`. + */ + const FILE_LOAD_ERROR: string; + + /** + * The File Load Event. + * + * This event is dispatched by the Loader Plugin when a file finishes loading, + * but _before_ it is processed and added to the internal Phaser caches. + * + * Listen to it from a Scene using: `this.load.on('load', listener)`. + */ + const FILE_LOAD: string; + + /** + * The File Load Progress Event. + * + * This event is dispatched by the Loader Plugin during the load of a file, if the browser receives a DOM ProgressEvent and + * the `lengthComputable` event property is true. Depending on the size of the file and browser in use, this may, or may not happen. + * + * Listen to it from a Scene using: `this.load.on('fileprogress', listener)`. + */ + const FILE_PROGRESS: string; + + /** + * The Loader Plugin Post Process Event. + * + * This event is dispatched by the Loader Plugin when the Loader has finished loading everything in the load queue. + * It is dispatched before the internal lists are cleared and each File is destroyed. + * + * Use this hook to perform any last minute processing of files that can only happen once the + * Loader has completed, but prior to it emitting the `complete` event. + * + * Listen to it from a Scene using: `this.load.on('postprocess', listener)`. + */ + const POST_PROCESS: string; + + /** + * The Loader Plugin Progress Event. + * + * This event is dispatched when the Loader updates its load progress, typically as a result of a file having completed loading. + * + * Listen to it from a Scene using: `this.load.on('progress', listener)`. + */ + const PROGRESS: string; + + /** + * The Loader Plugin Start Event. + * + * This event is dispatched when the Loader starts running. At this point load progress is zero. + * + * This event is dispatched even if there aren't any files in the load queue. + * + * Listen to it from a Scene using: `this.load.on('start', listener)`. + */ + const START: string; + + } + + /** + * The base File class used by all File Types that the Loader can support. + * You shouldn't create an instance of a File directly, but should extend it with your own class, setting a custom type and processing methods. + */ + class File { + /** + * + * @param loader The Loader that is going to load this File. + * @param fileConfig The file configuration object, as created by the file type. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, fileConfig: Phaser.Types.Loader.FileConfig); + + /** + * A reference to the Loader that is going to load this file. + */ + loader: Phaser.Loader.LoaderPlugin; + + /** + * A reference to the Cache, or Texture Manager, that is going to store this file if it loads. + */ + cache: Phaser.Cache.BaseCache | Phaser.Textures.TextureManager; + + /** + * The file type string (image, json, etc) for sorting within the Loader. + */ + type: string; + + /** + * Unique cache key (unique within its file type) + */ + key: string; + + /** + * The URL of the file, not including baseURL. + * + * Automatically has Loader.path prepended to it if a string. + * + * Can also be a JavaScript Object, such as the results of parsing JSON data. + */ + url: object | string; + + /** + * The final URL this file will load from, including baseURL and path. + * Set automatically when the Loader calls 'load' on this file. + */ + src: string; + + /** + * The merged XHRSettings for this file. + */ + xhrSettings: Phaser.Types.Loader.XHRSettingsObject; + + /** + * The XMLHttpRequest instance (as created by XHR Loader) that is loading this File. + */ + xhrLoader: XMLHttpRequest | null; + + /** + * The current state of the file. One of the FILE_CONST values. + */ + state: number; + + /** + * The total size of this file. + * Set by onProgress and only if loading via XHR. + */ + bytesTotal: number; + + /** + * Updated as the file loads. + * Only set if loading via XHR. + */ + bytesLoaded: number; + + /** + * A percentage value between 0 and 1 indicating how much of this file has loaded. + * Only set if loading via XHR. + */ + percentComplete: number; + + /** + * For CORs based loading. + * If this is undefined then the File will check BaseLoader.crossOrigin and use that (if set) + */ + crossOrigin: string | undefined; + + /** + * The processed file data, stored here after the file has loaded. + */ + data: any; + + /** + * A config object that can be used by file types to store transitional data. + */ + config: any; + + /** + * If this is a multipart file, i.e. an atlas and its json together, then this is a reference + * to the parent MultiFile. Set and used internally by the Loader or specific file types. + */ + multiFile: Phaser.Loader.MultiFile | null; + + /** + * Does this file have an associated linked file? Such as an image and a normal map. + * Atlases and Bitmap Fonts use the multiFile, because those files need loading together but aren't + * actually bound by data, where-as a linkFile is. + */ + linkFile: Phaser.Loader.File | null; + + /** + * Does this File contain a data URI? + */ + base64: boolean; + + /** + * Links this File with another, so they depend upon each other for loading and processing. + * @param fileB The file to link to this one. + */ + setLink(fileB: Phaser.Loader.File): void; + + /** + * Resets the XHRLoader instance this file is using. + */ + resetXHR(): void; + + /** + * Called by the Loader, starts the actual file downloading. + * During the load the methods onLoad, onError and onProgress are called, based on the XHR events. + * You shouldn't normally call this method directly, it's meant to be invoked by the Loader. + */ + load(): void; + + /** + * Called when the file finishes loading, is sent a DOM ProgressEvent. + * @param xhr The XMLHttpRequest that caused this onload event. + * @param event The DOM ProgressEvent that resulted from this load. + */ + onLoad(xhr: XMLHttpRequest, event: ProgressEvent): void; + + /** + * Called by the XHRLoader if it was given a File with base64 data to load. + * @param xhr The FakeXHR object containing the decoded base64 data. + */ + onBase64Load(xhr: XMLHttpRequest): void; + + /** + * Called if the file errors while loading, is sent a DOM ProgressEvent. + * @param xhr The XMLHttpRequest that caused this onload event. + * @param event The DOM ProgressEvent that resulted from this error. + */ + onError(xhr: XMLHttpRequest, event: ProgressEvent): void; + + /** + * Called during the file load progress. Is sent a DOM ProgressEvent. + * @param event The DOM ProgressEvent. + */ + onProgress(event: ProgressEvent): void; + + /** + * Usually overridden by the FileTypes and is called by Loader.nextFile. + * This method controls what extra work this File does with its loaded data, for example a JSON file will parse itself during this stage. + */ + onProcess(): void; + + /** + * Called when the File has completed processing. + * Checks on the state of its multifile, if set. + */ + onProcessComplete(): void; + + /** + * Called when the File has completed processing but it generated an error. + * Checks on the state of its multifile, if set. + */ + onProcessError(): void; + + /** + * Checks if a key matching the one used by this file exists in the target Cache or not. + * This is called automatically by the LoaderPlugin to decide if the file can be safely + * loaded or will conflict. + */ + hasCacheConflict(): boolean; + + /** + * Adds this file to its target cache upon successful loading and processing. + * This method is often overridden by specific file types. + */ + addToCache(): void; + + /** + * Called once the file has been added to its cache and is now ready for deletion from the Loader. + * It will emit a `filecomplete` event from the LoaderPlugin. + */ + pendingDestroy(): void; + + /** + * Destroy this File and any references it holds. + */ + destroy(): void; + + /** + * Static method for creating object URL using URL API and setting it as image 'src' attribute. + * If URL API is not supported (usually on old browsers) it falls back to creating Base64 encoded url using FileReader. + * @param image Image object which 'src' attribute should be set to object URL. + * @param blob A Blob object to create an object URL for. + * @param defaultType Default mime type used if blob type is not available. + */ + static createObjectURL(image: HTMLImageElement, blob: Blob, defaultType: string): void; + + /** + * Static method for releasing an existing object URL which was previously created + * by calling {@link File#createObjectURL} method. + * @param image Image object which 'src' attribute should be revoked. + */ + static revokeObjectURL(image: HTMLImageElement): void; + + } + + namespace FileTypes { + /** + * A single Animation JSON File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#animation method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#animation. + */ + class AnimationJSONFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param xhrSettings Extra XHR Settings specifically for this file. + * @param dataKey When the JSON file loads only this property will be stored in the Cache. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.JSONFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject, dataKey?: string); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Called at the end of the load process, after the Loader has finished all files in its queue. + */ + onLoadComplete(): void; + + } + + /** + * A single JSON based Texture Atlas File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#atlas method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#atlas. + * + * https://www.codeandweb.com/texturepacker/tutorials/how-to-create-sprite-sheets-for-phaser3?source=photonstorm + */ + class AsepriteFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas json data file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, a well formed JSON object. + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.AsepriteFileConfig, textureURL?: string | string[], atlasURL?: object | string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single JSON based Texture Atlas File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#atlas method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#atlas. + * + * https://www.codeandweb.com/texturepacker/tutorials/how-to-create-sprite-sheets-for-phaser3?source=photonstorm + */ + class AtlasJSONFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas json data file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, a well formed JSON object. + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.AtlasJSONFileConfig, textureURL?: string | string[], atlasURL?: object | string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single XML based Texture Atlas File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#atlasXML method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#atlasXML. + */ + class AtlasXMLFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas xml data file from. If undefined or `null` it will be set to `.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml". + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas xml file. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.AtlasXMLFileConfig, textureURL?: string | string[], atlasURL?: string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Audio File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#audio method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#audio. + */ + class AudioFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param urlConfig The absolute or relative URL to load this file from in a config object. + * @param xhrSettings Extra XHR Settings specifically for this file. + * @param audioContext The AudioContext this file will use to process itself. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.AudioFileConfig, urlConfig?: Phaser.Types.Loader.FileTypes.AudioFileURLConfig, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject, audioContext?: AudioContext); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * An Audio Sprite File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#audioSprite method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#audioSprite. + */ + class AudioSpriteFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param jsonURL The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead. + * @param audioURL The absolute or relative URL to load the audio file from. If empty it will be obtained by parsing the JSON file. + * @param audioConfig The audio configuration options. + * @param audioXhrSettings An XHR Settings configuration object for the audio file. Used in replacement of the Loaders default XHR Settings. + * @param jsonXhrSettings An XHR Settings configuration object for the json file. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.AudioSpriteFileConfig, jsonURL: string, audioURL?: Object, audioConfig?: any, audioXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, jsonXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called by each File when it finishes loading. + * @param file The File that has completed processing. + */ + onFileComplete(file: Phaser.Loader.File): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Binary File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#binary method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#binary. + */ + class BinaryFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.bin`, i.e. if `key` was "alien" then the URL will be "alien.bin". + * @param xhrSettings Extra XHR Settings specifically for this file. + * @param dataType Optional type to cast the binary file to once loaded. For example, `Uint8Array`. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.BinaryFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject, dataType?: any); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single Bitmap Font based File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#bitmapFont method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#bitmapFont. + */ + class BitmapFontFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param textureURL The absolute or relative URL to load the font image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param fontDataURL The absolute or relative URL to load the font xml data file from. If undefined or `null` it will be set to `.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml". + * @param textureXhrSettings An XHR Settings configuration object for the font image file. Used in replacement of the Loaders default XHR Settings. + * @param fontDataXhrSettings An XHR Settings configuration object for the font data xml file. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.BitmapFontFileConfig, textureURL?: string | string[], fontDataURL?: string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, fontDataXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A Compressed Texture File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#texture method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#texture. + */ + class CompressedTextureFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file. + * @param entry The compressed texture file entry to load. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string, entry: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called by each File when it finishes loading. + * @param file The File that has completed processing. + */ + onFileComplete(file: Phaser.Loader.File): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + /** + * Adds all of the multi-file entties to their target caches upon successful loading and processing. + */ + addMultiToCache(): void; + + } + + /** + * A single CSS File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#css method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#css. + */ + class CSSFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.CSSFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single GLSL File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#glsl method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#glsl. + */ + class GLSLFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt". + * @param shaderType The type of shader. Either `fragment` for a fragment shader, or `vertex` for a vertex shader. This is ignored if you load a shader bundle. Default 'fragment'. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.GLSLFileConfig, url?: string, shaderType?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + /** + * Returns the name of the shader from the header block. + * @param headerSource The header data. + */ + getShaderName(headerSource: string[]): string; + + /** + * Returns the type of the shader from the header block. + * @param headerSource The header data. + */ + getShaderType(headerSource: string[]): string; + + /** + * Returns the shader uniforms from the header block. + * @param headerSource The header data. + */ + getShaderUniforms(headerSource: string[]): any; + + } + + /** + * A single Audio File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#audio method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#audio. + */ + class HTML5AudioFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param urlConfig The absolute or relative URL to load this file from. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.AudioFileConfig, urlConfig?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called when the file finishes loading. + */ + onLoad(): void; + + /** + * Called if the file errors while loading. + */ + onError(): void; + + /** + * Called during the file load progress. Is sent a DOM ProgressEvent. + */ + onProgress(): void; + + /** + * Called by the Loader, starts the actual file downloading. + * During the load the methods onLoad, onError and onProgress are called, based on the XHR events. + * You shouldn't normally call this method directly, it's meant to be invoked by the Loader. + */ + load(): void; + + } + + /** + * A single HTML File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#html method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#html. + */ + class HTMLFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.html`, i.e. if `key` was "alien" then the URL will be "alien.html". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.HTMLFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single HTML File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#htmlTexture method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#htmlTexture. + */ + class HTMLTextureFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param width The width of the texture the HTML will be rendered to. + * @param height The height of the texture the HTML will be rendered to. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.HTMLTextureFileConfig, url?: string, width?: number, height?: number, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Image File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#image method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#image. + */ + class ImageFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param xhrSettings Extra XHR Settings specifically for this file. + * @param frameConfig The frame configuration object. Only provided for, and used by, Sprite Sheets. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.ImageFileConfig, url?: string | string[], xhrSettings?: Phaser.Types.Loader.XHRSettingsObject, frameConfig?: Phaser.Types.Loader.FileTypes.ImageFrameConfig); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single JSON File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#json method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#json. + */ + class JSONFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, can be a fully formed JSON Object. + * @param xhrSettings Extra XHR Settings specifically for this file. + * @param dataKey When the JSON file loads only this property will be stored in the Cache. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.JSONFileConfig, url?: object | string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject, dataKey?: string); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single Multi Texture Atlas File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#multiatlas method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#multiatlas. + */ + class MultiAtlasFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key of the file. Must be unique within both the Loader and the Texture Manager. Or a config object. + * @param atlasURL The absolute or relative URL to load the multi atlas json file from. + * @param path Optional path to use when loading the textures defined in the atlas data. + * @param baseURL Optional Base URL to use when loading the textures defined in the atlas data. + * @param atlasXhrSettings Extra XHR Settings specifically for the atlas json file. + * @param textureXhrSettings Extra XHR Settings specifically for the texture files. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.MultiAtlasFileConfig, atlasURL?: string, path?: string, baseURL?: string, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called by each File when it finishes loading. + * @param file The File that has completed processing. + */ + onFileComplete(file: Phaser.Loader.File): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A Multi Script File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#scripts method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#scripts. + */ + class MultiScriptFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url An array of absolute or relative URLs to load the script files from. They are processed in the order given in the array. + * @param xhrSettings An XHR Settings configuration object for the script files. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.MultiScriptFileConfig, url?: string[], xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Wavefront OBJ File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#obj method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#obj. + */ + class OBJFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param objURL The absolute or relative URL to load the obj file from. If undefined or `null` it will be set to `.obj`, i.e. if `key` was "alien" then the URL will be "alien.obj". + * @param matURL The absolute or relative URL to load the material file from. If undefined or `null` it will be set to `.mat`, i.e. if `key` was "alien" then the URL will be "alien.mat". + * @param flipUV Flip the UV coordinates stored in the model data? + * @param xhrSettings Extra XHR Settings specifically for these files. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.OBJFileConfig, objURL?: string, matURL?: string, flipUV?: boolean, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single JSON Pack File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#pack method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#pack. + */ + class PackFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from or a ready formed JSON object. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param xhrSettings Extra XHR Settings specifically for this file. + * @param dataKey When the JSON file loads only this property will be stored in the Cache. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.PackFileConfig, url?: string | any, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject, dataKey?: string); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single Plugin Script File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#plugin method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#plugin. + */ + class PluginFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param start Automatically start the plugin after loading? Default false. + * @param mapping If this plugin is to be injected into the Scene, this is the property key used. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.PluginFileConfig, url?: string, start?: boolean, mapping?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * An external Scene JavaScript File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#sceneFile method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#sceneFile. + */ + class SceneFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.SceneFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Scene Plugin Script File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#scenePlugin method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#scenePlugin. + */ + class ScenePluginFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param systemKey If this plugin is to be added to Scene.Systems, this is the property key for it. + * @param sceneKey If this plugin is to be added to the Scene, this is the property key for it. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.ScenePluginFileConfig, url?: string, systemKey?: string, sceneKey?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single Script File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#script method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#script. + */ + class ScriptFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param type The script type. Should be either 'script' for classic JavaScript, or 'module' if the file contains an exported module. Default 'script'. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.ScriptFileConfig, url?: string, type?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single Sprite Sheet Image File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#spritesheet method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#spritesheet. + */ + class SpriteSheetFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param frameConfig The frame configuration object. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.SpriteSheetFileConfig, url?: string | string[], frameConfig?: Phaser.Types.Loader.FileTypes.ImageFrameConfig, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single SVG File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#svg method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#svg. + */ + class SVGFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.svg`, i.e. if `key` was "alien" then the URL will be "alien.svg". + * @param svgConfig The svg size configuration object. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.SVGFileConfig, url?: string, svgConfig?: Phaser.Types.Loader.FileTypes.SVGSizeConfig, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Text File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#text method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#text. + */ + class TextFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.TextFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + /** + * A single Tilemap CSV File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#tilemapCSV method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#tilemapCSV. + */ + class TilemapCSVFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.csv`, i.e. if `key` was "alien" then the URL will be "alien.csv". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.TilemapCSVFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Impact.js Tilemap JSON File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#tilemapImpact method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#tilemapImpact. + */ + class TilemapImpactFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.TilemapImpactFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Tiled Tilemap JSON File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#tilemapTiledJSON method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#tilemapTiledJSON. + */ + class TilemapJSONFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, a well formed JSON object. + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.TilemapJSONFileConfig, url?: object | string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single text file based Unity Texture Atlas File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#unityAtlas method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#unityAtlas. + */ + class UnityAtlasFile extends Phaser.Loader.MultiFile { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas data file from. If undefined or `null` it will be set to `.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt". + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas data file. Used in replacement of the Loaders default XHR Settings. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.UnityAtlasFileConfig, textureURL?: string | string[], atlasURL?: string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Adds this file to its target cache upon successful loading and processing. + */ + addToCache(): void; + + } + + /** + * A single Video File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#video method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#video. + */ + class VideoFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param urls The absolute or relative URL to load the video files from. + * @param noAudio Does the video have an audio track? If not you can enable auto-playing on it. Default false. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.VideoFileConfig, urls?: string | string[] | Phaser.Types.Loader.FileTypes.VideoFileURLConfig | Phaser.Types.Loader.FileTypes.VideoFileURLConfig[], noAudio?: boolean); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + /** + * Called by the Loader, starts the actual file downloading. + * During the load the methods onLoad, onError and onProgress are called, based on the XHR events. + * You shouldn't normally call this method directly, it's meant to be invoked by the Loader. + */ + load(): void; + + } + + /** + * A single XML File suitable for loading by the Loader. + * + * These are created when you use the Phaser.Loader.LoaderPlugin#xml method and are not typically created directly. + * + * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#xml. + */ + class XMLFile extends Phaser.Loader.File { + /** + * + * @param loader A reference to the Loader that is responsible for this file. + * @param key The key to use for this file, or a file configuration object. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml". + * @param xhrSettings Extra XHR Settings specifically for this file. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, key: string | Phaser.Types.Loader.FileTypes.XMLFileConfig, url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject); + + /** + * Called automatically by Loader.nextFile. + * This method controls what extra work this File does with its loaded data. + */ + onProcess(): void; + + } + + } + + namespace FileTypesManager { + /** + * Static method called when a LoaderPlugin is created. + * + * Loops through the local types object and injects all of them as + * properties into the LoaderPlugin instance. + * @param loader The LoaderPlugin to install the types into. + */ + function install(loader: Phaser.Loader.LoaderPlugin): void; + + /** + * Static method called directly by the File Types. + * + * The key is a reference to the function used to load the files via the Loader, i.e. `image`. + * @param key The key that will be used as the method name in the LoaderPlugin. + * @param factoryFunction The function that will be called when LoaderPlugin.key is invoked. + */ + function register(key: string, factoryFunction: Function): void; + + /** + * Removed all associated file types. + */ + function destroy(): void; + + } + + /** + * Given a File and a baseURL value this returns the URL the File will use to download from. + * @param file The File object. + * @param baseURL A default base URL. + */ + function GetURL(file: Phaser.Loader.File, baseURL: string): string; + + /** + * The Loader handles loading all external content such as Images, Sounds, Texture Atlases and data files. + * You typically interact with it via `this.load` in your Scene. Scenes can have a `preload` method, which is always + * called before the Scenes `create` method, allowing you to preload assets that the Scene may need. + * + * If you call any `this.load` methods from outside of `Scene.preload` then you need to start the Loader going + * yourself by calling `Loader.start()`. It's only automatically started during the Scene preload. + * + * The Loader uses a combination of tag loading (eg. Audio elements) and XHR and provides progress and completion events. + * Files are loaded in parallel by default. The amount of concurrent connections can be controlled in your Game Configuration. + * + * Once the Loader has started loading you are still able to add files to it. These can be injected as a result of a loader + * event, the type of file being loaded (such as a pack file) or other external events. As long as the Loader hasn't finished + * simply adding a new file to it, while running, will ensure it's added into the current queue. + * + * Every Scene has its own instance of the Loader and they are bound to the Scene in which they are created. However, + * assets loaded by the Loader are placed into global game-level caches. For example, loading an XML file will place that + * file inside `Game.cache.xml`, which is accessible from every Scene in your game, no matter who was responsible + * for loading it. The same is true of Textures. A texture loaded in one Scene is instantly available to all other Scenes + * in your game. + * + * The Loader works by using custom File Types. These are stored in the FileTypesManager, which injects them into the Loader + * when it's instantiated. You can create your own custom file types by extending either the File or MultiFile classes. + * See those files for more details. + */ + class LoaderPlugin extends Phaser.Events.EventEmitter { + /** + * + * @param scene The Scene which owns this Loader instance. + */ + constructor(scene: Phaser.Scene); + + /** + * Adds an Animation JSON Data file, or array of Animation JSON files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.animation('baddieAnims', 'files/BaddieAnims.json'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * The key must be a unique String. It is used to add the file to the global JSON Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the JSON Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the JSON Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.animation({ + * key: 'baddieAnims', + * url: 'files/BaddieAnims.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.JSONFileConfig` for more details. + * + * Once the file has finished loading it will automatically be passed to the global Animation Managers `fromJSON` method. + * This will parse all of the JSON data and create animation data from it. This process happens at the very end + * of the Loader, once every other file in the load queue has finished. The reason for this is to allow you to load + * both animation data and the images it relies upon in the same load call. + * + * Once the animation data has been parsed you will be able to play animations using that data. + * Please see the Animation Manager `fromJSON` method for more details about the format and playback. + * + * You can also access the raw animation data from its Cache using its key: + * + * ```javascript + * this.load.animation('baddieAnims', 'files/BaddieAnims.json'); + * // and later in your game ... + * var data = this.cache.json.get('baddieAnims'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and + * this is what you would use to retrieve the text from the JSON Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "data" + * and no URL is given then the Loader will set the URL to be "data.json". It will always add `.json` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * You can also optionally provide a `dataKey` to use. This allows you to extract only a part of the JSON and store it in the Cache, + * rather than the whole file. For example, if your JSON data had a structure like this: + * + * ```json + * { + * "level1": { + * "baddies": { + * "aliens": {}, + * "boss": {} + * } + * }, + * "level2": {}, + * "level3": {} + * } + * ``` + * + * And if you only wanted to create animations from the `boss` data, then you could pass `level1.baddies.boss`as the `dataKey`. + * + * Note: The ability to load this type of file will only be available if the JSON File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param dataKey When the Animation JSON file loads only this property will be stored in the Cache and used to create animation data. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + animation(key: string | Phaser.Types.Loader.FileTypes.JSONFileConfig | Phaser.Types.Loader.FileTypes.JSONFileConfig[], url?: string, dataKey?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Aseprite is a powerful animated sprite editor and pixel art tool. + * + * You can find more details at https://www.aseprite.org/ + * + * Adds a JSON based Aseprite Animation, or array of animations, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.aseprite('gladiator', 'images/Gladiator.png', 'images/Gladiator.json'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * To export a compatible JSON file in Aseprite, please do the following: + * + * 1. Go to "File - Export Sprite Sheet" + * + * 2. On the **Layout** tab: + * 2a. Set the "Sheet type" to "Packed" + * 2b. Set the "Constraints" to "None" + * 2c. Check the "Merge Duplicates" checkbox + * + * 3. On the **Sprite** tab: + * 3a. Set "Layers" to "Visible layers" + * 3b. Set "Frames" to "All frames", unless you only wish to export a sub-set of tags + * + * 4. On the **Borders** tab: + * 4a. Check the "Trim Sprite" and "Trim Cells" options + * 4b. Ensure "Border Padding", "Spacing" and "Inner Padding" are all > 0 (1 is usually enough) + * + * 5. On the **Output** tab: + * 5a. Check "Output File", give your image a name and make sure you choose "png files" as the file type + * 5b. Check "JSON Data" and give your json file a name + * 5c. The JSON Data type can be either a Hash or Array, Phaser doesn't mind. + * 5d. Make sure "Tags" is checked in the Meta options + * 5e. In the "Item Filename" input box, make sure it says just "{frame}" and nothing more. + * + * 6. Click export + * + * This was tested with Aseprite 1.2.25. + * + * This will export a png and json file which you can load using the Aseprite Loader, i.e.: + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.aseprite({ + * key: 'gladiator', + * textureURL: 'images/Gladiator.png', + * atlasURL: 'images/Gladiator.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.AsepriteFileConfig` for more details. + * + * Instead of passing a URL for the JSON data you can also pass in a well formed JSON object instead. + * + * Once loaded, you can call this method from within a Scene with the 'atlas' key: + * + * ```javascript + * this.anims.createFromAseprite('paladin'); + * ``` + * + * Any animations defined in the JSON will now be available to use in Phaser and you play them + * via their Tag name. For example, if you have an animation called 'War Cry' on your Aseprite timeline, + * you can play it in Phaser using that Tag name: + * + * ```javascript + * this.add.sprite(400, 300).play('War Cry'); + * ``` + * + * When calling this method you can optionally provide an array of tag names, and only those animations + * will be created. For example: + * + * ```javascript + * this.anims.createFromAseprite('paladin', [ 'step', 'War Cry', 'Magnum Break' ]); + * ``` + * + * This will only create the 3 animations defined. Note that the tag names are case-sensitive. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Aseprite File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas json data file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, a well formed JSON object. + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings. + */ + aseprite(key: string | Phaser.Types.Loader.FileTypes.AsepriteFileConfig | Phaser.Types.Loader.FileTypes.AsepriteFileConfig[], textureURL?: string | string[], atlasURL?: object | string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a JSON based Texture Atlas, or array of atlases, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.atlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.json'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * Phaser expects the atlas data to be provided in a JSON file, using either the JSON Hash or JSON Array format. + * + * These files are created by software such as: + * + * * [Texture Packer](https://www.codeandweb.com/texturepacker/tutorials/how-to-create-sprite-sheets-for-phaser3?source=photonstorm) + * * [Shoebox](https://renderhjs.net/shoebox/) + * * [Gamma Texture Packer](https://gammafp.com/tool/atlas-packer/) + * * [Adobe Flash / Animate](https://www.adobe.com/uk/products/animate.html) + * * [Free Texture Packer](http://free-tex-packer.com/) + * * [Leshy SpriteSheet Tool](https://www.leshylabs.com/apps/sstool/) + * + * If you are using Texture Packer and have enabled multi-atlas support, then please use the Phaser Multi Atlas loader + * instead of this one. + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.atlas({ + * key: 'mainmenu', + * textureURL: 'images/MainMenu.png', + * atlasURL: 'images/MainMenu.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.AtlasJSONFileConfig` for more details. + * + * Instead of passing a URL for the atlas JSON data you can also pass in a well formed JSON object instead. + * + * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key: + * + * ```javascript + * this.load.atlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.json'); + * // and later in your game ... + * this.add.image(x, y, 'mainmenu', 'background'); + * ``` + * + * To get a list of all available frames within an atlas please consult your Texture Atlas software. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image, + * then you can specify it by providing an array as the `url` where the second element is the normal map: + * + * ```javascript + * this.load.atlas('mainmenu', [ 'images/MainMenu.png', 'images/MainMenu-n.png' ], 'images/MainMenu.json'); + * ``` + * + * Or, if you are using a config object use the `normalMap` property: + * + * ```javascript + * this.load.atlas({ + * key: 'mainmenu', + * textureURL: 'images/MainMenu.png', + * normalMap: 'images/MainMenu-n.png', + * atlasURL: 'images/MainMenu.json' + * }); + * ``` + * + * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings. + * Normal maps are a WebGL only feature. + * + * Note: The ability to load this type of file will only be available if the Atlas JSON File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas json data file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, a well formed JSON object. + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings. + */ + atlas(key: string | Phaser.Types.Loader.FileTypes.AtlasJSONFileConfig | Phaser.Types.Loader.FileTypes.AtlasJSONFileConfig[], textureURL?: string | string[], atlasURL?: object | string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an XML based Texture Atlas, or array of atlases, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.atlasXML('mainmenu', 'images/MainMenu.png', 'images/MainMenu.xml'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * Phaser expects the atlas data to be provided in an XML file format. + * These files are created by software such as Shoebox and Adobe Flash / Animate. + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.atlasXML({ + * key: 'mainmenu', + * textureURL: 'images/MainMenu.png', + * atlasURL: 'images/MainMenu.xml' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.AtlasXMLFileConfig` for more details. + * + * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key: + * + * ```javascript + * this.load.atlasXML('mainmenu', 'images/MainMenu.png', 'images/MainMenu.xml'); + * // and later in your game ... + * this.add.image(x, y, 'mainmenu', 'background'); + * ``` + * + * To get a list of all available frames within an atlas please consult your Texture Atlas software. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image, + * then you can specify it by providing an array as the `url` where the second element is the normal map: + * + * ```javascript + * this.load.atlasXML('mainmenu', [ 'images/MainMenu.png', 'images/MainMenu-n.png' ], 'images/MainMenu.xml'); + * ``` + * + * Or, if you are using a config object use the `normalMap` property: + * + * ```javascript + * this.load.atlasXML({ + * key: 'mainmenu', + * textureURL: 'images/MainMenu.png', + * normalMap: 'images/MainMenu-n.png', + * atlasURL: 'images/MainMenu.xml' + * }); + * ``` + * + * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings. + * Normal maps are a WebGL only feature. + * + * Note: The ability to load this type of file will only be available if the Atlas XML File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas xml data file from. If undefined or `null` it will be set to `.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml". + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas xml file. Used in replacement of the Loaders default XHR Settings. + */ + atlasXML(key: string | Phaser.Types.Loader.FileTypes.AtlasXMLFileConfig | Phaser.Types.Loader.FileTypes.AtlasXMLFileConfig[], textureURL?: string | string[], atlasURL?: string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an Audio or HTML5Audio file, or array of audio files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.audio('title', [ 'music/Title.ogg', 'music/Title.mp3', 'music/Title.m4a' ]); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Audio Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Audio Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Audio Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.audio({ + * key: 'title', + * url: [ 'music/Title.ogg', 'music/Title.mp3', 'music/Title.m4a' ] + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.AudioFileConfig` for more details. + * + * The URLs can be relative or absolute. If the URLs are relative the `Loader.baseURL` and `Loader.path` values will be prepended to them. + * + * Due to different browsers supporting different audio file types you should usually provide your audio files in a variety of formats. + * ogg, mp3 and m4a are the most common. If you provide an array of URLs then the Loader will determine which _one_ file to load based on + * browser support. + * + * If audio has been disabled in your game, either via the game config, or lack of support from the device, then no audio will be loaded. + * + * Note: The ability to load this type of file will only be available if the Audio File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param urls The absolute or relative URL to load the audio files from. + * @param config An object containing an `instances` property for HTML5Audio. Defaults to 1. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + audio(key: string | Phaser.Types.Loader.FileTypes.AudioFileConfig | Phaser.Types.Loader.FileTypes.AudioFileConfig[], urls?: string | string[] | Phaser.Types.Loader.FileTypes.AudioFileURLConfig | Phaser.Types.Loader.FileTypes.AudioFileURLConfig[], config?: any, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a JSON based Audio Sprite, or array of audio sprites, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.audioSprite('kyobi', 'kyobi.json', [ + * 'kyobi.ogg', + * 'kyobi.mp3', + * 'kyobi.m4a' + * ]); + * } + * ``` + * + * Audio Sprites are a combination of audio files and a JSON configuration. + * The JSON follows the format of that created by https://github.com/tonistiigi/audiosprite + * + * If the JSON file includes a 'resource' object then you can let Phaser parse it and load the audio + * files automatically based on its content. To do this exclude the audio URLs from the load: + * + * ```javascript + * function preload () + * { + * this.load.audioSprite('kyobi', 'kyobi.json'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * The key must be a unique String. It is used to add the file to the global Audio Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Audio Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Audio Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.audioSprite({ + * key: 'kyobi', + * jsonURL: 'audio/Kyobi.json', + * audioURL: [ + * 'audio/Kyobi.ogg', + * 'audio/Kyobi.mp3', + * 'audio/Kyobi.m4a' + * ] + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.AudioSpriteFileConfig` for more details. + * + * Instead of passing a URL for the audio JSON data you can also pass in a well formed JSON object instead. + * + * Once the audio has finished loading you can use it create an Audio Sprite by referencing its key: + * + * ```javascript + * this.load.audioSprite('kyobi', 'kyobi.json'); + * // and later in your game ... + * var music = this.sound.addAudioSprite('kyobi'); + * music.play('title'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * Due to different browsers supporting different audio file types you should usually provide your audio files in a variety of formats. + * ogg, mp3 and m4a are the most common. If you provide an array of URLs then the Loader will determine which _one_ file to load based on + * browser support. + * + * If audio has been disabled in your game, either via the game config, or lack of support from the device, then no audio will be loaded. + * + * Note: The ability to load this type of file will only be available if the Audio Sprite File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or an array of objects. + * @param jsonURL The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead. + * @param audioURL The absolute or relative URL to load the audio file from. If empty it will be obtained by parsing the JSON file. + * @param audioConfig The audio configuration options. + * @param audioXhrSettings An XHR Settings configuration object for the audio file. Used in replacement of the Loaders default XHR Settings. + * @param jsonXhrSettings An XHR Settings configuration object for the json file. Used in replacement of the Loaders default XHR Settings. + */ + audioSprite(key: string | Phaser.Types.Loader.FileTypes.AudioSpriteFileConfig | Phaser.Types.Loader.FileTypes.AudioSpriteFileConfig[], jsonURL: string, audioURL?: string | string[], audioConfig?: any, audioXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, jsonXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Binary file, or array of Binary files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.binary('doom', 'files/Doom.wad'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Binary Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Binary Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Binary Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.binary({ + * key: 'doom', + * url: 'files/Doom.wad', + * dataType: Uint8Array + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.BinaryFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.binary('doom', 'files/Doom.wad'); + * // and later in your game ... + * var data = this.cache.binary.get('doom'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Data` the final key will be `LEVEL1.Data` and + * this is what you would use to retrieve the text from the Binary Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "doom" + * and no URL is given then the Loader will set the URL to be "doom.bin". It will always add `.bin` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Binary File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.bin`, i.e. if `key` was "alien" then the URL will be "alien.bin". + * @param dataType Optional type to cast the binary file to once loaded. For example, `Uint8Array`. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + binary(key: string | Phaser.Types.Loader.FileTypes.BinaryFileConfig | Phaser.Types.Loader.FileTypes.BinaryFileConfig[], url?: string, dataType?: any, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an XML based Bitmap Font, or array of fonts, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * ```javascript + * function preload () + * { + * this.load.bitmapFont('goldenFont', 'images/GoldFont.png', 'images/GoldFont.xml'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * Phaser expects the font data to be provided in an XML file format. + * These files are created by software such as the [Angelcode Bitmap Font Generator](http://www.angelcode.com/products/bmfont/), + * [Littera](http://kvazars.com/littera/) or [Glyph Designer](https://71squared.com/glyphdesigner) + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.bitmapFont({ + * key: 'goldenFont', + * textureURL: 'images/GoldFont.png', + * fontDataURL: 'images/GoldFont.xml' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.BitmapFontFileConfig` for more details. + * + * Once the atlas has finished loading you can use key of it when creating a Bitmap Text Game Object: + * + * ```javascript + * this.load.bitmapFont('goldenFont', 'images/GoldFont.png', 'images/GoldFont.xml'); + * // and later in your game ... + * this.add.bitmapText(x, y, 'goldenFont', 'Hello World'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use when creating a Bitmap Text object. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image, + * then you can specify it by providing an array as the `url` where the second element is the normal map: + * + * ```javascript + * this.load.bitmapFont('goldenFont', [ 'images/GoldFont.png', 'images/GoldFont-n.png' ], 'images/GoldFont.xml'); + * ``` + * + * Or, if you are using a config object use the `normalMap` property: + * + * ```javascript + * this.load.bitmapFont({ + * key: 'goldenFont', + * textureURL: 'images/GoldFont.png', + * normalMap: 'images/GoldFont-n.png', + * fontDataURL: 'images/GoldFont.xml' + * }); + * ``` + * + * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings. + * Normal maps are a WebGL only feature. + * + * Note: The ability to load this type of file will only be available if the Bitmap Font File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param textureURL The absolute or relative URL to load the font image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param fontDataURL The absolute or relative URL to load the font xml data file from. If undefined or `null` it will be set to `.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml". + * @param textureXhrSettings An XHR Settings configuration object for the font image file. Used in replacement of the Loaders default XHR Settings. + * @param fontDataXhrSettings An XHR Settings configuration object for the font data xml file. Used in replacement of the Loaders default XHR Settings. + */ + bitmapFont(key: string | Phaser.Types.Loader.FileTypes.BitmapFontFileConfig | Phaser.Types.Loader.FileTypes.BitmapFontFileConfig[], textureURL?: string | string[], fontDataURL?: string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, fontDataXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Compressed Texture file to the current load queue. This feature is WebGL only. + * + * This method takes a key and a configuration object, which lists the different formats + * and files associated with them. + * + * The texture format object should be ordered in GPU priority order, with IMG as the last entry. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * preload () + * { + * this.load.texture('yourPic', { + * ASTC: { type: 'PVR', textureURL: 'pic-astc-4x4.pvr' }, + * PVRTC: { type: 'PVR', textureURL: 'pic-pvrtc-4bpp-rgba.pvr' }, + * S3TC: { type: 'PVR', textureURL: 'pic-dxt5.pvr' }, + * IMG: { textureURL: 'pic.png' } + * }); + * ``` + * + * If you wish to load a texture atlas, provide the `atlasURL` property: + * + * ```javascript + * preload () + * { + * const path = 'assets/compressed'; + * + * this.load.texture('yourAtlas', { + * 'ASTC': { type: 'PVR', textureURL: `${path}/textures-astc-4x4.pvr`, atlasURL: `${path}/textures.json` }, + * 'PVRTC': { type: 'PVR', textureURL: `${path}/textures-pvrtc-4bpp-rgba.pvr`, atlasURL: `${path}/textures-pvrtc-4bpp-rgba.json` }, + * 'S3TC': { type: 'PVR', textureURL: `${path}/textures-dxt5.pvr`, atlasURL: `${path}/textures-dxt5.json` }, + * 'IMG': { textureURL: `${path}/textures.png`, atlasURL: `${path}/textures.json` } + * }); + * } + * ``` + * + * If you wish to load a Multi Atlas, as exported from Texture Packer Pro, use the `multiAtlasURL` property instead: + * + * ```javascript + * preload () + * { + * const path = 'assets/compressed'; + * + * this.load.texture('yourAtlas', { + * 'ASTC': { type: 'PVR', atlasURL: `${path}/textures.json` }, + * 'PVRTC': { type: 'PVR', atlasURL: `${path}/textures-pvrtc-4bpp-rgba.json` }, + * 'S3TC': { type: 'PVR', atlasURL: `${path}/textures-dxt5.json` }, + * 'IMG': { atlasURL: `${path}/textures.json` } + * }); + * } + * ``` + * + * When loading a Multi Atlas you do not need to specify the `textureURL` property as it will be read from the JSON file. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.texture({ + * key: 'yourPic', + * url: { + * ASTC: { type: 'PVR', textureURL: 'pic-astc-4x4.pvr' }, + * PVRTC: { type: 'PVR', textureURL: 'pic-pvrtc-4bpp-rgba.pvr' }, + * S3TC: { type: 'PVR', textureURL: 'pic-dxt5.pvr' }, + * IMG: { textureURL: 'pic.png' } + * } + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.CompressedTextureFileConfig` for more details. + * + * The number of formats you provide to this function is up to you, but you should ensure you + * cover the primary platforms where appropriate. + * + * The 'IMG' entry is a fallback to a JPG or PNG, should the browser be unable to load any of the other + * formats presented to this function. You should really always include this, although it is optional. + * + * Phaser supports loading both the PVR and KTX container formats. Within those, it can parse + * the following texture compression formats: + * + * ETC + * ETC1 + * ATC + * ASTC + * BPTC + * RGTC + * PVRTC + * S3TC + * S3TCSRGB + * + * For more information about the benefits of compressed textures please see the + * following articles: + * + * Texture Compression in 2020 (https://aras-p.info/blog/2020/12/08/Texture-Compression-in-2020/) + * Compressed GPU Texture Formats (https://themaister.net/blog/2020/08/12/compressed-gpu-texture-formats-a-review-and-compute-shader-decoders-part-1/) + * + * To create compressed texture files use a 3rd party application such as: + * + * Texture Packer (https://www.codeandweb.com/texturepacker/tutorials/how-to-create-sprite-sheets-for-phaser3?utm_source=ad&utm_medium=banner&utm_campaign=phaser-2018-10-16) + * PVRTexTool (https://developer.imaginationtech.com/pvrtextool/) - available for Windows, macOS and Linux. + * Mali Texture Compression Tool (https://developer.arm.com/tools-and-software/graphics-and-gaming/mali-texture-compression-tool) + * ASTC Encoder (https://github.com/ARM-software/astc-encoder) + * + * ASTCs must have a Channel Type of Unsigned Normalized Bytes (UNorm). + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Data` the final key will be `LEVEL1.Data` and + * this is what you would use to retrieve the text from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * Unlike other file loaders in Phaser, the URLs must include the file extension. + * + * Note: The ability to load this type of file will only be available if the Compressed Texture File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The compressed texture configuration object. Not required if passing a config object as the `key` parameter. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + texture(key: string | Phaser.Types.Loader.FileTypes.CompressedTextureFileConfig | Phaser.Types.Loader.FileTypes.CompressedTextureFileConfig[], url?: Phaser.Types.Loader.FileTypes.CompressedTextureFileConfig, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a CSS file, or array of CSS files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.css('headers', 'styles/headers.css'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String and not already in-use by another file in the Loader. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.css({ + * key: 'headers', + * url: 'styles/headers.css' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.CSSFileConfig` for more details. + * + * Once the file has finished loading it will automatically be converted into a style DOM element + * via `document.createElement('style')`. It will have its `defer` property set to false and then the + * resulting element will be appended to `document.head`. The CSS styles are then applied to the current document. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.css". It will always add `.css` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the CSS File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.css`, i.e. if `key` was "alien" then the URL will be "alien.css". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + css(key: string | Phaser.Types.Loader.FileTypes.CSSFileConfig | Phaser.Types.Loader.FileTypes.CSSFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a GLSL file, or array of GLSL files, to the current load queue. + * In Phaser 3 GLSL files are just plain Text files at the current moment in time. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.glsl('plasma', 'shaders/Plasma.glsl'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Shader Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Shader Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Shader Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.glsl({ + * key: 'plasma', + * shaderType: 'fragment', + * url: 'shaders/Plasma.glsl' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.GLSLFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.glsl('plasma', 'shaders/Plasma.glsl'); + * // and later in your game ... + * var data = this.cache.shader.get('plasma'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `FX.` and the key was `Plasma` the final key will be `FX.Plasma` and + * this is what you would use to retrieve the text from the Shader Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "plasma" + * and no URL is given then the Loader will set the URL to be "plasma.glsl". It will always add `.glsl` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the GLSL File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.glsl`, i.e. if `key` was "alien" then the URL will be "alien.glsl". + * @param shaderType The type of shader. Either `fragment` for a fragment shader, or `vertex` for a vertex shader. This is ignored if you load a shader bundle. Default 'fragment'. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + glsl(key: string | Phaser.Types.Loader.FileTypes.GLSLFileConfig | Phaser.Types.Loader.FileTypes.GLSLFileConfig[], url?: string, shaderType?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an HTML file, or array of HTML files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.html('story', 'files/LoginForm.html'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global HTML Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the HTML Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the HTML Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.html({ + * key: 'login', + * url: 'files/LoginForm.html' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.HTMLFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.html('login', 'files/LoginForm.html'); + * // and later in your game ... + * var data = this.cache.html.get('login'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and + * this is what you would use to retrieve the html from the HTML Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "story" + * and no URL is given then the Loader will set the URL to be "story.html". It will always add `.html` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the HTML File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.html`, i.e. if `key` was "alien" then the URL will be "alien.html". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + html(key: string | Phaser.Types.Loader.FileTypes.HTMLFileConfig | Phaser.Types.Loader.FileTypes.HTMLFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an HTML File, or array of HTML Files, to the current load queue. When the files are loaded they + * will be rendered to textures and stored in the Texture Manager. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.htmlTexture('instructions', 'content/intro.html', 256, 512); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.htmlTexture({ + * key: 'instructions', + * url: 'content/intro.html', + * width: 256, + * height: 512 + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.HTMLTextureFileConfig` for more details. + * + * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key: + * + * ```javascript + * this.load.htmlTexture('instructions', 'content/intro.html', 256, 512); + * // and later in your game ... + * this.add.image(x, y, 'instructions'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.html". It will always add `.html` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * The width and height are the size of the texture to which the HTML will be rendered. It's not possible to determine these + * automatically, so you will need to provide them, either as arguments or in the file config object. + * When the HTML file has loaded a new SVG element is created with a size and viewbox set to the width and height given. + * The SVG file has a body tag added to it, with the HTML file contents included. It then calls `window.Blob` on the SVG, + * and if successful is added to the Texture Manager, otherwise it fails processing. The overall quality of the rendered + * HTML depends on your browser, and some of them may not even support the svg / blob process used. Be aware that there are + * limitations on what HTML can be inside an SVG. You can find out more details in this + * [Mozilla MDN entry](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Drawing_DOM_objects_into_a_canvas). + * + * Note: The ability to load this type of file will only be available if the HTMLTextureFile File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.html`, i.e. if `key` was "alien" then the URL will be "alien.html". + * @param width The width of the texture the HTML will be rendered to. Default 512. + * @param height The height of the texture the HTML will be rendered to. Default 512. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + htmlTexture(key: string | Phaser.Types.Loader.FileTypes.HTMLTextureFileConfig | Phaser.Types.Loader.FileTypes.HTMLTextureFileConfig[], url?: string, width?: number, height?: number, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an Image, or array of Images, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.image('logo', 'images/phaserLogo.png'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * If you try to load an animated gif only the first frame will be rendered. Browsers do not natively support playback + * of animated gifs to Canvas elements. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.image({ + * key: 'logo', + * url: 'images/AtariLogo.png' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.ImageFileConfig` for more details. + * + * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key: + * + * ```javascript + * this.load.image('logo', 'images/AtariLogo.png'); + * // and later in your game ... + * this.add.image(x, y, 'logo'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image, + * then you can specify it by providing an array as the `url` where the second element is the normal map: + * + * ```javascript + * this.load.image('logo', [ 'images/AtariLogo.png', 'images/AtariLogo-n.png' ]); + * ``` + * + * Or, if you are using a config object use the `normalMap` property: + * + * ```javascript + * this.load.image({ + * key: 'logo', + * url: 'images/AtariLogo.png', + * normalMap: 'images/AtariLogo-n.png' + * }); + * ``` + * + * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings. + * Normal maps are a WebGL only feature. + * + * In Phaser 3.60 a new property was added that allows you to control how images are loaded. By default, images are loaded via XHR as Blobs. + * However, you can set `loader.imageLoadType: "HTMLImageElement"` in the Game Configuration and instead, the Loader will load all images + * via the Image tag instead. + * + * Note: The ability to load this type of file will only be available if the Image File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + image(key: string | Phaser.Types.Loader.FileTypes.ImageFileConfig | Phaser.Types.Loader.FileTypes.ImageFileConfig[], url?: string | string[], xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a JSON file, or array of JSON files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.json('wavedata', 'files/AlienWaveData.json'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global JSON Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the JSON Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the JSON Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.json({ + * key: 'wavedata', + * url: 'files/AlienWaveData.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.JSONFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.json('wavedata', 'files/AlienWaveData.json'); + * // and later in your game ... + * var data = this.cache.json.get('wavedata'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and + * this is what you would use to retrieve the text from the JSON Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "data" + * and no URL is given then the Loader will set the URL to be "data.json". It will always add `.json` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * You can also optionally provide a `dataKey` to use. This allows you to extract only a part of the JSON and store it in the Cache, + * rather than the whole file. For example, if your JSON data had a structure like this: + * + * ```json + * { + * "level1": { + * "baddies": { + * "aliens": {}, + * "boss": {} + * } + * }, + * "level2": {}, + * "level3": {} + * } + * ``` + * + * And you only wanted to store the `boss` data in the Cache, then you could pass `level1.baddies.boss`as the `dataKey`. + * + * Note: The ability to load this type of file will only be available if the JSON File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, can be a fully formed JSON Object. + * @param dataKey When the JSON file loads only this property will be stored in the Cache. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + json(key: string | Phaser.Types.Loader.FileTypes.JSONFileConfig | Phaser.Types.Loader.FileTypes.JSONFileConfig[], url?: object | string, dataKey?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Multi Texture Atlas, or array of multi atlases, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.multiatlas('level1', 'images/Level1.json'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * Phaser expects the atlas data to be provided in a JSON file as exported from the application Texture Packer, + * version 4.6.3 or above, where you have made sure to use the Phaser 3 Export option. + * + * The way it works internally is that you provide a URL to the JSON file. Phaser then loads this JSON, parses it and + * extracts which texture files it also needs to load to complete the process. If the JSON also defines normal maps, + * Phaser will load those as well. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.multiatlas({ + * key: 'level1', + * atlasURL: 'images/Level1.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.MultiAtlasFileConfig` for more details. + * + * Instead of passing a URL for the atlas JSON data you can also pass in a well formed JSON object instead. + * + * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key: + * + * ```javascript + * this.load.multiatlas('level1', 'images/Level1.json'); + * // and later in your game ... + * this.add.image(x, y, 'level1', 'background'); + * ``` + * + * To get a list of all available frames within an atlas please consult your Texture Atlas software. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Multi Atlas File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param atlasURL The absolute or relative URL to load the texture atlas json data file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param path Optional path to use when loading the textures defined in the atlas data. + * @param baseURL Optional Base URL to use when loading the textures defined in the atlas data. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings. + */ + multiatlas(key: string | Phaser.Types.Loader.FileTypes.MultiAtlasFileConfig | Phaser.Types.Loader.FileTypes.MultiAtlasFileConfig[], atlasURL?: string, path?: string, baseURL?: string, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an array of Script files to the current load queue. + * + * The difference between this and the `ScriptFile` file type is that you give an array of scripts to this method, + * and the scripts are then processed _exactly_ in that order. This allows you to load a bunch of scripts that + * may have dependencies on each other without worrying about the async nature of traditional script loading. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.scripts('PostProcess', [ + * 'libs/shaders/CopyShader.js', + * 'libs/postprocessing/EffectComposer.js', + * 'libs/postprocessing/RenderPass.js', + * 'libs/postprocessing/MaskPass.js', + * 'libs/postprocessing/ShaderPass.js', + * 'libs/postprocessing/AfterimagePass.js' + * ]); + * } + * ``` + * + * In the code above the script files will all be loaded in parallel but only processed (i.e. invoked) in the exact + * order given in the array. + * + * The files are **not** loaded right away. They are added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the files are queued + * it means you cannot use the files immediately after calling this method, but must wait for the files to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String and not already in-use by another file in the Loader. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.scripts({ + * key: 'PostProcess', + * url: [ + * 'libs/shaders/CopyShader.js', + * 'libs/postprocessing/EffectComposer.js', + * 'libs/postprocessing/RenderPass.js', + * 'libs/postprocessing/MaskPass.js', + * 'libs/postprocessing/ShaderPass.js', + * 'libs/postprocessing/AfterimagePass.js' + * ] + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.MultiScriptFileConfig` for more details. + * + * Once all the files have finished loading they will automatically be converted into a script element + * via `document.createElement('script')`. They will have their language set to JavaScript, `defer` set to + * false and then the resulting element will be appended to `document.head`. Any code then in the + * script will be executed. This is done in the exact order the files are specified in the url array. + * + * The URLs can be relative or absolute. If the URLs are relative the `Loader.baseURL` and `Loader.path` values will be prepended to them. + * + * Note: The ability to load this type of file will only be available if the MultiScript File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url An array of absolute or relative URLs to load the script files from. They are processed in the order given in the array. + * @param extension The default file extension to use if no url is provided. Default 'js'. + * @param xhrSettings Extra XHR Settings specifically for these files. + */ + scripts(key: string | Phaser.Types.Loader.FileTypes.MultiScriptFileConfig | Phaser.Types.Loader.FileTypes.MultiScriptFileConfig[], url?: string[], extension?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Wavefront OBJ file, or array of OBJ files, to the current load queue. + * + * Note: You should ensure your 3D package has triangulated the OBJ file prior to export. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.obj('ufo', 'files/spaceship.obj'); + * } + * ``` + * + * You can optionally also load a Wavefront Material file as well, by providing the 3rd parameter: + * + * ```javascript + * function preload () + * { + * this.load.obj('ufo', 'files/spaceship.obj', 'files/spaceship.mtl'); + * } + * ``` + * + * If given, the material will be parsed and stored along with the obj data in the cache. + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global OBJ Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the OBJ Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the OBJ Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.obj({ + * key: 'ufo', + * url: 'files/spaceship.obj', + * matURL: 'files/spaceship.mtl', + * flipUV: true + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.OBJFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.obj('ufo', 'files/spaceship.obj'); + * // and later in your game ... + * var data = this.cache.obj.get('ufo'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and + * this is what you would use to retrieve the obj from the OBJ Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "story" + * and no URL is given then the Loader will set the URL to be "story.obj". It will always add `.obj` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the OBJ File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param objURL The absolute or relative URL to load the obj file from. If undefined or `null` it will be set to `.obj`, i.e. if `key` was "alien" then the URL will be "alien.obj". + * @param matURL Optional absolute or relative URL to load the obj material file from. + * @param flipUV Flip the UV coordinates stored in the model data? + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + obj(key: string | Phaser.Types.Loader.FileTypes.OBJFileConfig | Phaser.Types.Loader.FileTypes.OBJFileConfig[], objURL?: string, matURL?: string, flipUV?: boolean, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a JSON File Pack, or array of packs, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.pack('level1', 'data/Level1Files.json'); + * } + * ``` + * + * A File Pack is a JSON file (or object) that contains details about other files that should be added into the Loader. + * Here is a small example: + * + * ```json + * { + * "test1": { + * "files": [ + * { + * "type": "image", + * "key": "taikodrummaster", + * "url": "assets/pics/taikodrummaster.jpg" + * }, + * { + * "type": "image", + * "key": "sukasuka-chtholly", + * "url": "assets/pics/sukasuka-chtholly.png" + * } + * ] + * }, + * "meta": { + * "generated": "1401380327373", + * "app": "Phaser 3 Asset Packer", + * "url": "https://phaser.io", + * "version": "1.0", + * "copyright": "Photon Storm Ltd. 2018" + * } + * } + * ``` + * + * The pack can be split into sections. In the example above you'll see a section called `test1`. You can tell + * the `load.pack` method to parse only a particular section of a pack. The pack is stored in the JSON Cache, + * so you can pass it to the Loader to process additional sections as needed in your game, or you can just load + * them all at once without specifying anything. + * + * The pack file can contain an entry for any type of file that Phaser can load. The object structures exactly + * match that of the file type configs, and all properties available within the file type configs can be used + * in the pack file too. An entry's `type` is the name of the Loader method that will load it, e.g., 'image'. + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * The key must be a unique String. It is used to add the file to the global JSON Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the JSON Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the JSON Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.pack({ + * key: 'level1', + * url: 'data/Level1Files.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.PackFileConfig` for more details. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and + * this is what you would use to retrieve the text from the JSON Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "data" + * and no URL is given then the Loader will set the URL to be "data.json". It will always add `.json` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * You can also optionally provide a `dataKey` to use. This allows you to extract only a part of the JSON and store it in the Cache, + * rather than the whole file. For example, if your JSON data had a structure like this: + * + * ```json + * { + * "level1": { + * "baddies": { + * "aliens": {}, + * "boss": {} + * } + * }, + * "level2": {}, + * "level3": {} + * } + * ``` + * + * And you only wanted to store the `boss` data in the Cache, then you could pass `level1.baddies.boss`as the `dataKey`. + * + * Note: The ability to load this type of file will only be available if the Pack File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param dataKey When the JSON file loads only this property will be stored in the Cache. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + pack(key: string | Phaser.Types.Loader.FileTypes.PackFileConfig | Phaser.Types.Loader.FileTypes.PackFileConfig[], url?: string, dataKey?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Plugin Script file, or array of plugin files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.plugin('modplayer', 'plugins/ModPlayer.js'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String and not already in-use by another file in the Loader. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.plugin({ + * key: 'modplayer', + * url: 'plugins/ModPlayer.js' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.PluginFileConfig` for more details. + * + * Once the file has finished loading it will automatically be converted into a script element + * via `document.createElement('script')`. It will have its language set to JavaScript, `defer` set to + * false and then the resulting element will be appended to `document.head`. Any code then in the + * script will be executed. It will then be passed to the Phaser PluginCache.register method. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.js". It will always add `.js` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Plugin File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". Or, a plugin function. + * @param start Automatically start the plugin after loading? + * @param mapping If this plugin is to be injected into the Scene, this is the property key used. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + plugin(key: string | Phaser.Types.Loader.FileTypes.PluginFileConfig | Phaser.Types.Loader.FileTypes.PluginFileConfig[], url?: string | Function, start?: boolean, mapping?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an external Scene file, or array of Scene files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.sceneFile('Level1', 'src/Level1.js'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Scene Manager upon a successful load. + * + * For a Scene File it's vitally important that the key matches the class name in the JavaScript file. + * + * For example here is the source file: + * + * ```javascript + * class ExternalScene extends Phaser.Scene { + * + * constructor () + * { + * super('myScene'); + * } + * + * } + * ``` + * + * Because the class is called `ExternalScene` that is the exact same key you must use when loading it: + * + * ```javascript + * function preload () + * { + * this.load.sceneFile('ExternalScene', 'src/yourScene.js'); + * } + * ``` + * + * The key that is used within the Scene Manager can either be set to the same, or you can override it in the Scene + * constructor, as we've done in the example above, where the Scene key was changed to `myScene`. + * + * The key should be unique both in terms of files being loaded and Scenes already present in the Scene Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Scene Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.sceneFile({ + * key: 'Level1', + * url: 'src/Level1.js' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.SceneFileConfig` for more details. + * + * Once the file has finished loading it will be added to the Scene Manager. + * + * ```javascript + * this.load.sceneFile('Level1', 'src/Level1.js'); + * // and later in your game ... + * this.scene.start('Level1'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `WORLD1.` and the key was `Story` the final key will be `WORLD1.Story` and + * this is what you would use to retrieve the text from the Scene Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "story" + * and no URL is given then the Loader will set the URL to be "story.js". It will always add `.js` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Scene File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + sceneFile(key: string | Phaser.Types.Loader.FileTypes.SceneFileConfig | Phaser.Types.Loader.FileTypes.SceneFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Scene Plugin Script file, or array of plugin files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.scenePlugin('ModPlayer', 'plugins/ModPlayer.js', 'modPlayer', 'mods'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String and not already in-use by another file in the Loader. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.scenePlugin({ + * key: 'modplayer', + * url: 'plugins/ModPlayer.js' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.ScenePluginFileConfig` for more details. + * + * Once the file has finished loading it will automatically be converted into a script element + * via `document.createElement('script')`. It will have its language set to JavaScript, `defer` set to + * false and then the resulting element will be appended to `document.head`. Any code then in the + * script will be executed. It will then be passed to the Phaser PluginCache.register method. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.js". It will always add `.js` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Script File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". Or, set to a plugin function. + * @param systemKey If this plugin is to be added to Scene.Systems, this is the property key for it. + * @param sceneKey If this plugin is to be added to the Scene, this is the property key for it. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + scenePlugin(key: string | Phaser.Types.Loader.FileTypes.ScenePluginFileConfig | Phaser.Types.Loader.FileTypes.ScenePluginFileConfig[], url?: string | Function, systemKey?: string, sceneKey?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Script file, or array of Script files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.script('aliens', 'lib/aliens.js'); + * } + * ``` + * + * If the script file contains a module, then you should specify that using the 'type' parameter: + * + * ```javascript + * function preload () + * { + * this.load.script('aliens', 'lib/aliens.js', 'module'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String and not already in-use by another file in the Loader. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.script({ + * key: 'aliens', + * url: 'lib/aliens.js', + * type: 'script' // or 'module' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.ScriptFileConfig` for more details. + * + * Once the file has finished loading it will automatically be converted into a script element + * via `document.createElement('script')`. It will have its language set to JavaScript, `defer` set to + * false and then the resulting element will be appended to `document.head`. Any code then in the + * script will be executed. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.js". It will always add `.js` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Script File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.js`, i.e. if `key` was "alien" then the URL will be "alien.js". + * @param type The script type. Should be either 'script' for classic JavaScript, or 'module' if the file contains an exported module. Default 'script'. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + script(key: string | Phaser.Types.Loader.FileTypes.ScriptFileConfig | Phaser.Types.Loader.FileTypes.ScriptFileConfig[], url?: string, type?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Sprite Sheet Image, or array of Sprite Sheet Images, to the current load queue. + * + * The term 'Sprite Sheet' in Phaser means a fixed-size sheet. Where every frame in the sheet is the exact same size, + * and you reference those frames using numbers, not frame names. This is not the same thing as a Texture Atlas, where + * the frames are packed in a way where they take up the least amount of space, and are referenced by their names, + * not numbers. Some articles and software use the term 'Sprite Sheet' to mean Texture Atlas, so please be aware of + * what sort of file you're actually trying to load. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.spritesheet('bot', 'images/robot.png', { frameWidth: 32, frameHeight: 38 }); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * If you try to load an animated gif only the first frame will be rendered. Browsers do not natively support playback + * of animated gifs to Canvas elements. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.spritesheet({ + * key: 'bot', + * url: 'images/robot.png', + * frameConfig: { + * frameWidth: 32, + * frameHeight: 38, + * startFrame: 0, + * endFrame: 8 + * } + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.SpriteSheetFileConfig` for more details. + * + * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key: + * + * ```javascript + * this.load.spritesheet('bot', 'images/robot.png', { frameWidth: 32, frameHeight: 38 }); + * // and later in your game ... + * this.add.image(x, y, 'bot', 0); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `PLAYER.` and the key was `Running` the final key will be `PLAYER.Running` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image, + * then you can specify it by providing an array as the `url` where the second element is the normal map: + * + * ```javascript + * this.load.spritesheet('logo', [ 'images/AtariLogo.png', 'images/AtariLogo-n.png' ], { frameWidth: 256, frameHeight: 80 }); + * ``` + * + * Or, if you are using a config object use the `normalMap` property: + * + * ```javascript + * this.load.spritesheet({ + * key: 'logo', + * url: 'images/AtariLogo.png', + * normalMap: 'images/AtariLogo-n.png', + * frameConfig: { + * frameWidth: 256, + * frameHeight: 80 + * } + * }); + * ``` + * + * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings. + * Normal maps are a WebGL only feature. + * + * Note: The ability to load this type of file will only be available if the Sprite Sheet File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param frameConfig The frame configuration object. At a minimum it should have a `frameWidth` property. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + spritesheet(key: string | Phaser.Types.Loader.FileTypes.SpriteSheetFileConfig | Phaser.Types.Loader.FileTypes.SpriteSheetFileConfig[], url?: string, frameConfig?: Phaser.Types.Loader.FileTypes.ImageFrameConfig, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an SVG File, or array of SVG Files, to the current load queue. When the files are loaded they + * will be rendered to bitmap textures and stored in the Texture Manager. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.svg('morty', 'images/Morty.svg'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.svg({ + * key: 'morty', + * url: 'images/Morty.svg' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.SVGFileConfig` for more details. + * + * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key: + * + * ```javascript + * this.load.svg('morty', 'images/Morty.svg'); + * // and later in your game ... + * this.add.image(x, y, 'morty'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.html". It will always add `.html` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * You can optionally pass an SVG Resize Configuration object when you load an SVG file. By default the SVG will be rendered to a texture + * at the same size defined in the SVG file attributes. However, this isn't always desirable. You may wish to resize the SVG (either down + * or up) to improve texture clarity, or reduce texture memory consumption. You can either specify an exact width and height to resize + * the SVG to: + * + * ```javascript + * function preload () + * { + * this.load.svg('morty', 'images/Morty.svg', { width: 300, height: 600 }); + * } + * ``` + * + * Or when using a configuration object: + * + * ```javascript + * this.load.svg({ + * key: 'morty', + * url: 'images/Morty.svg', + * svgConfig: { + * width: 300, + * height: 600 + * } + * }); + * ``` + * + * Alternatively, you can just provide a scale factor instead: + * + * ```javascript + * function preload () + * { + * this.load.svg('morty', 'images/Morty.svg', { scale: 2.5 }); + * } + * ``` + * + * Or when using a configuration object: + * + * ```javascript + * this.load.svg({ + * key: 'morty', + * url: 'images/Morty.svg', + * svgConfig: { + * scale: 2.5 + * } + * }); + * ``` + * + * If scale, width and height values are all given, the scale has priority and the width and height values are ignored. + * + * Note: The ability to load this type of file will only be available if the SVG File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.svg`, i.e. if `key` was "alien" then the URL will be "alien.svg". + * @param svgConfig The svg size configuration object. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + svg(key: string | Phaser.Types.Loader.FileTypes.SVGFileConfig | Phaser.Types.Loader.FileTypes.SVGFileConfig[], url?: string, svgConfig?: Phaser.Types.Loader.FileTypes.SVGSizeConfig, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Text file, or array of Text files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.text('story', 'files/IntroStory.txt'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Text Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Text Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Text Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.text({ + * key: 'story', + * url: 'files/IntroStory.txt' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.TextFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.text('story', 'files/IntroStory.txt'); + * // and later in your game ... + * var data = this.cache.text.get('story'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and + * this is what you would use to retrieve the text from the Text Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "story" + * and no URL is given then the Loader will set the URL to be "story.txt". It will always add `.txt` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Text File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + text(key: string | Phaser.Types.Loader.FileTypes.TextFileConfig | Phaser.Types.Loader.FileTypes.TextFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a CSV Tilemap file, or array of CSV files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.tilemapCSV('level1', 'maps/Level1.csv'); + * } + * ``` + * + * Tilemap CSV data can be created in a text editor, or a 3rd party app that exports as CSV. + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Tilemap Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Tilemap Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Text Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.tilemapCSV({ + * key: 'level1', + * url: 'maps/Level1.csv' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.TilemapCSVFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.tilemapCSV('level1', 'maps/Level1.csv'); + * // and later in your game ... + * var map = this.make.tilemap({ key: 'level1' }); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and + * this is what you would use to retrieve the text from the Tilemap Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "level" + * and no URL is given then the Loader will set the URL to be "level.csv". It will always add `.csv` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Tilemap CSV File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.csv`, i.e. if `key` was "alien" then the URL will be "alien.csv". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + tilemapCSV(key: string | Phaser.Types.Loader.FileTypes.TilemapCSVFileConfig | Phaser.Types.Loader.FileTypes.TilemapCSVFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds an Impact.js Tilemap file, or array of map files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.tilemapImpact('level1', 'maps/Level1.json'); + * } + * ``` + * + * Impact Tilemap data is created the Impact.js Map Editor called Weltmeister. + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Tilemap Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Tilemap Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Text Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.tilemapImpact({ + * key: 'level1', + * url: 'maps/Level1.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.TilemapImpactFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.tilemapImpact('level1', 'maps/Level1.json'); + * // and later in your game ... + * var map = this.make.tilemap({ key: 'level1' }); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and + * this is what you would use to retrieve the text from the Tilemap Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "level" + * and no URL is given then the Loader will set the URL to be "level.json". It will always add `.json` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Tilemap Impact File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + tilemapImpact(key: string | Phaser.Types.Loader.FileTypes.TilemapImpactFileConfig | Phaser.Types.Loader.FileTypes.TilemapImpactFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Tiled JSON Tilemap file, or array of map files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.tilemapTiledJSON('level1', 'maps/Level1.json'); + * } + * ``` + * + * The Tilemap data is created using the Tiled Map Editor and selecting JSON as the export format. + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Tilemap Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Tilemap Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Text Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.tilemapTiledJSON({ + * key: 'level1', + * url: 'maps/Level1.json' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.TilemapJSONFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.tilemapTiledJSON('level1', 'maps/Level1.json'); + * // and later in your game ... + * var map = this.make.tilemap({ key: 'level1' }); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and + * this is what you would use to retrieve the text from the Tilemap Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "level" + * and no URL is given then the Loader will set the URL to be "level.json". It will always add `.json` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the Tilemap JSON File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.json`, i.e. if `key` was "alien" then the URL will be "alien.json". Or, a well formed JSON object. + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + tilemapTiledJSON(key: string | Phaser.Types.Loader.FileTypes.TilemapJSONFileConfig | Phaser.Types.Loader.FileTypes.TilemapJSONFileConfig[], url?: object | string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Unity YAML based Texture Atlas, or array of atlases, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.unityAtlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.txt'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring + * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details. + * + * Phaser expects the atlas data to be provided in a YAML formatted text file as exported from Unity. + * + * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle. + * + * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Texture Manager. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Texture Manager first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.unityAtlas({ + * key: 'mainmenu', + * textureURL: 'images/MainMenu.png', + * atlasURL: 'images/MainMenu.txt' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.UnityAtlasFileConfig` for more details. + * + * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key: + * + * ```javascript + * this.load.unityAtlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.json'); + * // and later in your game ... + * this.add.image(x, y, 'mainmenu', 'background'); + * ``` + * + * To get a list of all available frames within an atlas please consult your Texture Atlas software. + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and + * this is what you would use to retrieve the image from the Texture Manager. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "alien" + * and no URL is given then the Loader will set the URL to be "alien.png". It will always add `.png` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image, + * then you can specify it by providing an array as the `url` where the second element is the normal map: + * + * ```javascript + * this.load.unityAtlas('mainmenu', [ 'images/MainMenu.png', 'images/MainMenu-n.png' ], 'images/MainMenu.txt'); + * ``` + * + * Or, if you are using a config object use the `normalMap` property: + * + * ```javascript + * this.load.unityAtlas({ + * key: 'mainmenu', + * textureURL: 'images/MainMenu.png', + * normalMap: 'images/MainMenu-n.png', + * atlasURL: 'images/MainMenu.txt' + * }); + * ``` + * + * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings. + * Normal maps are a WebGL only feature. + * + * Note: The ability to load this type of file will only be available if the Unity Atlas File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param textureURL The absolute or relative URL to load the texture image file from. If undefined or `null` it will be set to `.png`, i.e. if `key` was "alien" then the URL will be "alien.png". + * @param atlasURL The absolute or relative URL to load the texture atlas data file from. If undefined or `null` it will be set to `.txt`, i.e. if `key` was "alien" then the URL will be "alien.txt". + * @param textureXhrSettings An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings. + * @param atlasXhrSettings An XHR Settings configuration object for the atlas data file. Used in replacement of the Loaders default XHR Settings. + */ + unityAtlas(key: string | Phaser.Types.Loader.FileTypes.UnityAtlasFileConfig | Phaser.Types.Loader.FileTypes.UnityAtlasFileConfig[], textureURL?: string | string[], atlasURL?: string, textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject, atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * Adds a Video file, or array of video files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.video('intro', [ 'video/level1.mp4', 'video/level1.webm', 'video/level1.mov' ]); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global Video Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the Video Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the Video Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.video({ + * key: 'intro', + * url: [ 'video/level1.mp4', 'video/level1.webm', 'video/level1.mov' ], + * noAudio: true + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.VideoFileConfig` for more details. + * + * The URLs can be relative or absolute. If the URLs are relative the `Loader.baseURL` and `Loader.path` values will be prepended to them. + * + * Due to different browsers supporting different video file types you should usually provide your video files in a variety of formats. + * mp4, mov and webm are the most common. If you provide an array of URLs then the Loader will determine which _one_ file to load based on + * browser support, starting with the first in the array and progressing to the end. + * + * Unlike most asset-types, videos do not _need_ to be preloaded. You can create a Video Game Object and then call its `loadURL` method, + * to load a video at run-time, rather than in advance. + * + * Note: The ability to load this type of file will only be available if the Video File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param urls The absolute or relative URL to load the video files from. + * @param noAudio Does the video have an audio track? If not you can enable auto-playing on it. Default false. + */ + video(key: string | Phaser.Types.Loader.FileTypes.VideoFileConfig | Phaser.Types.Loader.FileTypes.VideoFileConfig[], urls?: string | string[] | Phaser.Types.Loader.FileTypes.VideoFileURLConfig | Phaser.Types.Loader.FileTypes.VideoFileURLConfig[], noAudio?: boolean): this; + + /** + * Adds an XML file, or array of XML files, to the current load queue. + * + * You can call this method from within your Scene's `preload`, along with any other files you wish to load: + * + * ```javascript + * function preload () + * { + * this.load.xml('wavedata', 'files/AlienWaveData.xml'); + * } + * ``` + * + * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts, + * or if it's already running, when the next free load slot becomes available. This happens automatically if you + * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued + * it means you cannot use the file immediately after calling this method, but must wait for the file to complete. + * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the + * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been + * loaded. + * + * The key must be a unique String. It is used to add the file to the global XML Cache upon a successful load. + * The key should be unique both in terms of files being loaded and files already present in the XML Cache. + * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file + * then remove it from the XML Cache first, before loading a new one. + * + * Instead of passing arguments you can pass a configuration object, such as: + * + * ```javascript + * this.load.xml({ + * key: 'wavedata', + * url: 'files/AlienWaveData.xml' + * }); + * ``` + * + * See the documentation for `Phaser.Types.Loader.FileTypes.XMLFileConfig` for more details. + * + * Once the file has finished loading you can access it from its Cache using its key: + * + * ```javascript + * this.load.xml('wavedata', 'files/AlienWaveData.xml'); + * // and later in your game ... + * var data = this.cache.xml.get('wavedata'); + * ``` + * + * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files + * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and + * this is what you would use to retrieve the text from the XML Cache. + * + * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it. + * + * If the URL isn't specified the Loader will take the key and create a filename from that. For example if the key is "data" + * and no URL is given then the Loader will set the URL to be "data.xml". It will always add `.xml` as the extension, although + * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL. + * + * Note: The ability to load this type of file will only be available if the XML File type has been built into Phaser. + * It is available in the default build but can be excluded from custom builds. + * @param key The key to use for this file, or a file configuration object, or array of them. + * @param url The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.xml`, i.e. if `key` was "alien" then the URL will be "alien.xml". + * @param xhrSettings An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings. + */ + xml(key: string | Phaser.Types.Loader.FileTypes.XMLFileConfig | Phaser.Types.Loader.FileTypes.XMLFileConfig[], url?: string, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject): this; + + /** + * The Scene which owns this Loader instance. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * A reference to the global Cache Manager. + */ + cacheManager: Phaser.Cache.CacheManager; + + /** + * A reference to the global Texture Manager. + */ + textureManager: Phaser.Textures.TextureManager; + + /** + * A reference to the global Scene Manager. + */ + protected sceneManager: Phaser.Scenes.SceneManager; + + /** + * An optional prefix that is automatically prepended to the start of every file key. + * If prefix was `MENU.` and you load an image with the key 'Background' the resulting key would be `MENU.Background`. + * You can set this directly, or call `Loader.setPrefix()`. It will then affect every file added to the Loader + * from that point on. It does _not_ change any file already in the load queue. + */ + prefix: string; + + /** + * The value of `path`, if set, is placed before any _relative_ file path given. For example: + * + * ```javascript + * this.load.path = "images/sprites/"; + * this.load.image("ball", "ball.png"); + * this.load.image("tree", "level1/oaktree.png"); + * this.load.image("boom", "http://server.com/explode.png"); + * ``` + * + * Would load the `ball` file from `images/sprites/ball.png` and the tree from + * `images/sprites/level1/oaktree.png` but the file `boom` would load from the URL + * given as it's an absolute URL. + * + * Please note that the path is added before the filename but *after* the baseURL (if set.) + * + * If you set this property directly then it _must_ end with a "/". Alternatively, call `setPath()` and it'll do it for you. + */ + path: string; + + /** + * If you want to append a URL before the path of any asset you can set this here. + * + * Useful if allowing the asset base url to be configured outside of the game code. + * + * If you set this property directly then it _must_ end with a "/". Alternatively, call `setBaseURL()` and it'll do it for you. + */ + baseURL: string; + + /** + * The number of concurrent / parallel resources to try and fetch at once. + * + * Old browsers limit 6 requests per domain; modern ones, especially those with HTTP/2 don't limit it at all. + * + * The default is 32 but you can change this in your Game Config, or by changing this property before the Loader starts. + */ + maxParallelDownloads: number; + + /** + * xhr specific global settings (can be overridden on a per-file basis) + */ + xhr: Phaser.Types.Loader.XHRSettingsObject; + + /** + * The crossOrigin value applied to loaded images. Very often this needs to be set to 'anonymous'. + */ + crossOrigin: string; + + /** + * Optional load type for image files. `XHR` is the default. Set to `HTMLImageElement` to load images using the Image tag instead. + */ + imageLoadType: string; + + /** + * An array of all schemes that the Loader considers as being 'local'. + * + * This is populated by the `Phaser.Core.Config#loaderLocalScheme` game configuration setting and defaults to + * `[ 'file://', 'capacitor://' ]`. Additional local schemes can be added to this array as needed. + */ + localSchemes: string[]; + + /** + * The total number of files to load. It may not always be accurate because you may add to the Loader during the process + * of loading, especially if you load a Pack File. Therefore this value can change, but in most cases remains static. + */ + totalToLoad: number; + + /** + * The progress of the current load queue, as a float value between 0 and 1. + * This is updated automatically as files complete loading. + * Note that it is possible for this value to go down again if you add content to the current load queue during a load. + */ + progress: number; + + /** + * Files are placed in this Set when they're added to the Loader via `addFile`. + * + * They are moved to the `inflight` Set when they start loading, and assuming a successful + * load, to the `queue` Set for further processing. + * + * By the end of the load process this Set will be empty. + */ + list: Phaser.Structs.Set; + + /** + * Files are stored in this Set while they're in the process of being loaded. + * + * Upon a successful load they are moved to the `queue` Set. + * + * By the end of the load process this Set will be empty. + */ + inflight: Phaser.Structs.Set; + + /** + * Files are stored in this Set while they're being processed. + * + * If the process is successful they are moved to their final destination, which could be + * a Cache or the Texture Manager. + * + * At the end of the load process this Set will be empty. + */ + queue: Phaser.Structs.Set; + + /** + * The total number of files that failed to load during the most recent load. + * This value is reset when you call `Loader.start`. + */ + totalFailed: number; + + /** + * The total number of files that successfully loaded during the most recent load. + * This value is reset when you call `Loader.start`. + */ + totalComplete: number; + + /** + * The current state of the Loader. + */ + readonly state: number; + + /** + * If you want to append a URL before the path of any asset you can set this here. + * + * Useful if allowing the asset base url to be configured outside of the game code. + * + * Once a base URL is set it will affect every file loaded by the Loader from that point on. It does _not_ change any + * file _already_ being loaded. To reset it, call this method with no arguments. + * @param url The URL to use. Leave empty to reset. + */ + setBaseURL(url?: string): this; + + /** + * The value of `path`, if set, is placed before any _relative_ file path given. For example: + * + * ```javascript + * this.load.setPath("images/sprites/"); + * this.load.image("ball", "ball.png"); + * this.load.image("tree", "level1/oaktree.png"); + * this.load.image("boom", "http://server.com/explode.png"); + * ``` + * + * Would load the `ball` file from `images/sprites/ball.png` and the tree from + * `images/sprites/level1/oaktree.png` but the file `boom` would load from the URL + * given as it's an absolute URL. + * + * Please note that the path is added before the filename but *after* the baseURL (if set.) + * + * Once a path is set it will then affect every file added to the Loader from that point on. It does _not_ change any + * file _already_ in the load queue. To reset it, call this method with no arguments. + * @param path The path to use. Leave empty to reset. + */ + setPath(path?: string): this; + + /** + * An optional prefix that is automatically prepended to the start of every file key. + * + * If prefix was `MENU.` and you load an image with the key 'Background' the resulting key would be `MENU.Background`. + * + * Once a prefix is set it will then affect every file added to the Loader from that point on. It does _not_ change any + * file _already_ in the load queue. To reset it, call this method with no arguments. + * @param prefix The prefix to use. Leave empty to reset. + */ + setPrefix(prefix?: string): this; + + /** + * Sets the Cross Origin Resource Sharing value used when loading files. + * + * Files can override this value on a per-file basis by specifying an alternative `crossOrigin` value in their file config. + * + * Once CORs is set it will then affect every file loaded by the Loader from that point on, as long as they don't have + * their own CORs setting. To reset it, call this method with no arguments. + * + * For more details about CORs see https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS + * @param crossOrigin The value to use for the `crossOrigin` property in the load request. + */ + setCORS(crossOrigin?: string): this; + + /** + * Adds a file, or array of files, into the load queue. + * + * The file must be an instance of `Phaser.Loader.File`, or a class that extends it. The Loader will check that the key + * used by the file won't conflict with any other key either in the loader, the inflight queue or the target cache. + * If allowed it will then add the file into the pending list, read for the load to start. Or, if the load has already + * started, ready for the next batch of files to be pulled from the list to the inflight queue. + * + * You should not normally call this method directly, but rather use one of the Loader methods like `image` or `atlas`, + * however you can call this as long as the file given to it is well formed. + * @param file The file, or array of files, to be added to the load queue. + */ + addFile(file: Phaser.Loader.File | Phaser.Loader.File[]): void; + + /** + * Checks the key and type of the given file to see if it will conflict with anything already + * in a Cache, the Texture Manager, or the list or inflight queues. + * @param file The file to check the key of. + */ + keyExists(file: Phaser.Loader.File): boolean; + + /** + * Takes a well formed, fully parsed pack file object and adds its entries into the load queue. Usually you do not call + * this method directly, but instead use `Loader.pack` and supply a path to a JSON file that holds the + * pack data. However, if you've got the data prepared you can pass it to this method. + * + * You can also provide an optional key. If you do then it will only add the entries from that part of the pack into + * to the load queue. If not specified it will add all entries it finds. For more details about the pack file format + * see the `LoaderPlugin.pack` method. + * @param pack The Pack File data to be parsed and each entry of it to added to the load queue. + * @param packKey An optional key to use from the pack file data. + */ + addPack(pack: any, packKey?: string): boolean; + + /** + * Is the Loader actively loading, or processing loaded files? + */ + isLoading(): boolean; + + /** + * Is the Loader ready to start a new load? + */ + isReady(): boolean; + + /** + * Starts the Loader running. This will reset the progress and totals and then emit a `start` event. + * If there is nothing in the queue the Loader will immediately complete, otherwise it will start + * loading the first batch of files. + * + * The Loader is started automatically if the queue is populated within your Scenes `preload` method. + * + * However, outside of this, you need to call this method to start it. + * + * If the Loader is already running this method will simply return. + */ + start(): void; + + /** + * Called automatically during the load process. + * It updates the `progress` value and then emits a progress event, which you can use to + * display a loading bar in your game. + */ + updateProgress(): void; + + /** + * Called automatically during the load process. + */ + update(): void; + + /** + * An internal method called automatically by the XHRLoader belong to a File. + * + * This method will remove the given file from the inflight Set and update the load progress. + * If the file was successful its `onProcess` method is called, otherwise it is added to the delete queue. + * @param file The File that just finished loading, or errored during load. + * @param success `true` if the file loaded successfully, otherwise `false`. + */ + nextFile(file: Phaser.Loader.File, success: boolean): void; + + /** + * An internal method that is called automatically by the File when it has finished processing. + * + * If the process was successful, and the File isn't part of a MultiFile, its `addToCache` method is called. + * + * It this then removed from the queue. If there are no more files to load `loadComplete` is called. + * @param file The file that has finished processing. + */ + fileProcessComplete(file: Phaser.Loader.File): void; + + /** + * Called at the end when the load queue is exhausted and all files have either loaded or errored. + * By this point every loaded file will now be in its associated cache and ready for use. + * + * Also clears down the Sets, puts progress to 1 and clears the deletion queue. + */ + loadComplete(): void; + + /** + * Adds a File into the pending-deletion queue. + * @param file The File to be queued for deletion when the Loader completes. + */ + flagForRemoval(file: Phaser.Loader.File): void; + + /** + * Converts the given JSON data into a file that the browser then prompts you to download so you can save it locally. + * + * The data must be well formed JSON and ready-parsed, not a JavaScript object. + * @param data The JSON data, ready parsed. + * @param filename The name to save the JSON file as. Default file.json. + */ + saveJSON(data: any, filename?: string): this; + + /** + * Causes the browser to save the given data as a file to its default Downloads folder. + * + * Creates a DOM level anchor link, assigns it as being a `download` anchor, sets the href + * to be an ObjectURL based on the given data, and then invokes a click event. + * @param data The data to be saved. Will be passed through URL.createObjectURL. + * @param filename The filename to save the file as. Default file.json. + * @param filetype The file type to use when saving the file. Defaults to JSON. Default application/json. + */ + save(data: any, filename?: string, filetype?: string): this; + + /** + * Resets the Loader. + * + * This will clear all lists and reset the base URL, path and prefix. + * + * Warning: If the Loader is currently downloading files, or has files in its queue, they will be aborted. + */ + reset(): void; + + } + + /** + * Takes two XHRSettings Objects and creates a new XHRSettings object from them. + * + * The new object is seeded by the values given in the global settings, but any setting in + * the local object overrides the global ones. + * @param global The global XHRSettings object. + * @param local The local XHRSettings object. + */ + function MergeXHRSettings(global: Phaser.Types.Loader.XHRSettingsObject, local: Phaser.Types.Loader.XHRSettingsObject): Phaser.Types.Loader.XHRSettingsObject; + + /** + * A MultiFile is a special kind of parent that contains two, or more, Files as children and looks after + * the loading and processing of them all. It is commonly extended and used as a base class for file types such as AtlasJSON or BitmapFont. + * + * You shouldn't create an instance of a MultiFile directly, but should extend it with your own class, setting a custom type and processing methods. + */ + class MultiFile { + /** + * + * @param loader The Loader that is going to load this File. + * @param type The file type string for sorting within the Loader. + * @param key The key of the file within the loader. + * @param files An array of Files that make-up this MultiFile. + */ + constructor(loader: Phaser.Loader.LoaderPlugin, type: string, key: string, files: Phaser.Loader.File[]); + + /** + * A reference to the Loader that is going to load this file. + */ + loader: Phaser.Loader.LoaderPlugin; + + /** + * The file type string for sorting within the Loader. + */ + type: string; + + /** + * Unique cache key (unique within its file type) + */ + key: string; + + /** + * Array of files that make up this MultiFile. + */ + files: Phaser.Loader.File[]; + + /** + * The current state of the file. One of the FILE_CONST values. + */ + state: number; + + /** + * The completion status of this MultiFile. + */ + complete: boolean; + + /** + * The number of files to load. + */ + pending: number; + + /** + * The number of files that failed to load. + */ + failed: number; + + /** + * A storage container for transient data that the loading files need. + */ + config: any; + + /** + * A reference to the Loaders baseURL at the time this MultiFile was created. + * Used to populate child-files. + */ + baseURL: string; + + /** + * A reference to the Loaders path at the time this MultiFile was created. + * Used to populate child-files. + */ + path: string; + + /** + * A reference to the Loaders prefix at the time this MultiFile was created. + * Used to populate child-files. + */ + prefix: string; + + /** + * Checks if this MultiFile is ready to process its children or not. + */ + isReadyToProcess(): boolean; + + /** + * Adds another child to this MultiFile, increases the pending count and resets the completion status. + * @param files The File to add to this MultiFile. + */ + addToMultiFile(files: Phaser.Loader.File): Phaser.Loader.MultiFile; + + /** + * Called by each File when it finishes loading. + * @param file The File that has completed processing. + */ + onFileComplete(file: Phaser.Loader.File): void; + + /** + * Called by each File that fails to load. + * @param file The File that has failed to load. + */ + onFileFailed(file: Phaser.Loader.File): void; + + /** + * Called once all children of this multi file have been added to their caches and is now + * ready for deletion from the Loader. + * + * It will emit a `filecomplete` event from the LoaderPlugin. + */ + pendingDestroy(): void; + + /** + * Destroy this Multi File and any references it holds. + */ + destroy(): void; + + } + + /** + * Creates a new XMLHttpRequest (xhr) object based on the given File and XHRSettings + * and starts the download of it. It uses the Files own XHRSettings and merges them + * with the global XHRSettings object to set the xhr values before download. + * @param file The File to download. + * @param globalXHRSettings The global XHRSettings object. + */ + function XHRLoader(file: Phaser.Loader.File, globalXHRSettings: Phaser.Types.Loader.XHRSettingsObject): XMLHttpRequest; + + /** + * Creates an XHRSettings Object with default values. + * @param responseType The responseType, such as 'text'. Default ''. + * @param async Should the XHR request use async or not? Default true. + * @param user Optional username for the XHR request. Default ''. + * @param password Optional password for the XHR request. Default ''. + * @param timeout Optional XHR timeout value. Default 0. + * @param withCredentials Optional XHR withCredentials value. Default false. + */ + function XHRSettings(responseType?: XMLHttpRequestResponseType, async?: boolean, user?: string, password?: string, timeout?: number, withCredentials?: boolean): Phaser.Types.Loader.XHRSettingsObject; + + } + + namespace Math { + namespace Angle { + /** + * Find the angle of a segment from (x1, y1) -> (x2, y2). + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + */ + function Between(x1: number, y1: number, x2: number, y2: number): number; + + /** + * Find the angle of a segment from (point1.x, point1.y) -> (point2.x, point2.y). + * + * Calculates the angle of the vector from the first point to the second point. + * @param point1 The first point. + * @param point2 The second point. + */ + function BetweenPoints(point1: Phaser.Types.Math.Vector2Like, point2: Phaser.Types.Math.Vector2Like): number; + + /** + * Find the angle of a segment from (point1.x, point1.y) -> (point2.x, point2.y). + * + * The difference between this method and {@link Phaser.Math.Angle.BetweenPoints} is that this assumes the y coordinate + * travels down the screen. + * @param point1 The first point. + * @param point2 The second point. + */ + function BetweenPointsY(point1: Phaser.Types.Math.Vector2Like, point2: Phaser.Types.Math.Vector2Like): number; + + /** + * Find the angle of a segment from (x1, y1) -> (x2, y2). + * + * The difference between this method and {@link Phaser.Math.Angle.Between} is that this assumes the y coordinate + * travels down the screen. + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + */ + function BetweenY(x1: number, y1: number, x2: number, y2: number): number; + + /** + * Takes an angle in Phasers default clockwise format and converts it so that + * 0 is North, 90 is West, 180 is South and 270 is East, + * therefore running counter-clockwise instead of clockwise. + * + * You can pass in the angle from a Game Object using: + * + * ```javascript + * var converted = CounterClockwise(gameobject.rotation); + * ``` + * + * All values for this function are in radians. + * @param angle The angle to convert, in radians. + */ + function CounterClockwise(angle: number): number; + + /** + * Normalize an angle to the [0, 2pi] range. + * @param angle The angle to normalize, in radians. + */ + function Normalize(angle: number): number; + + /** + * Returns a random angle in the range [-pi, pi]. + */ + function Random(): number; + + /** + * Returns a random angle in the range [-180, 180]. + */ + function RandomDegrees(): number; + + /** + * Reverse the given angle. + * @param angle The angle to reverse, in radians. + */ + function Reverse(angle: number): number; + + /** + * Rotates `currentAngle` towards `targetAngle`, taking the shortest rotation distance. The `lerp` argument is the amount to rotate by in this call. + * @param currentAngle The current angle, in radians. + * @param targetAngle The target angle to rotate to, in radians. + * @param lerp The lerp value to add to the current angle. Default 0.05. + */ + function RotateTo(currentAngle: number, targetAngle: number, lerp?: number): number; + + /** + * Gets the shortest angle between `angle1` and `angle2`. + * + * Both angles must be in the range -180 to 180, which is the same clamped + * range that `sprite.angle` uses, so you can pass in two sprite angles to + * this method and get the shortest angle back between the two of them. + * + * The angle returned will be in the same range. If the returned angle is + * greater than 0 then it's a counter-clockwise rotation, if < 0 then it's + * a clockwise rotation. + * @param angle1 The first angle in the range -180 to 180. + * @param angle2 The second angle in the range -180 to 180. + */ + function ShortestBetween(angle1: number, angle2: number): number; + + /** + * Wrap an angle. + * + * Wraps the angle to a value in the range of -PI to PI. + * @param angle The angle to wrap, in radians. + */ + function Wrap(angle: number): number; + + /** + * Wrap an angle in degrees. + * + * Wraps the angle to a value in the range of -180 to 180. + * @param angle The angle to wrap, in degrees. + */ + function WrapDegrees(angle: number): number; + + } + + /** + * Calculate the mean average of the given values. + * @param values The values to average. + */ + function Average(values: number[]): number; + + /** + * Calculates the Bernstein basis from the three factorial coefficients. + * @param n The first value. + * @param i The second value. + */ + function Bernstein(n: number, i: number): number; + + /** + * Compute a random integer between the `min` and `max` values, inclusive. + * @param min The minimum value. + * @param max The maximum value. + */ + function Between(min: number, max: number): number; + + /** + * Calculates a Catmull-Rom value from the given points, based on an alpha of 0.5. + * @param t The amount to interpolate by. + * @param p0 The first control point. + * @param p1 The second control point. + * @param p2 The third control point. + * @param p3 The fourth control point. + */ + function CatmullRom(t: number, p0: number, p1: number, p2: number, p3: number): number; + + /** + * Ceils to some place comparative to a `base`, default is 10 for decimal place. + * + * The `place` is represented by the power applied to `base` to get that place. + * @param value The value to round. + * @param place The place to round to. Default 0. + * @param base The base to round in. Default is 10 for decimal. Default 10. + */ + function CeilTo(value: number, place?: number, base?: number): number; + + /** + * Force a value within the boundaries by clamping it to the range `min`, `max`. + * @param value The value to be clamped. + * @param min The minimum bounds. + * @param max The maximum bounds. + */ + function Clamp(value: number, min: number, max: number): number; + + /** + * The value of PI * 2. + */ + var PI2: number; + + /** + * The value of PI * 0.5. + * + * Yes, we understand that this should actually be PI * 2, but + * it has been like this for so long we can't change it now. + * If you need PI * 2, use the PI2 constant instead. + */ + var TAU: number; + + /** + * An epsilon value (1.0e-6) + */ + var EPSILON: number; + + /** + * For converting degrees to radians (PI / 180) + */ + var DEG_TO_RAD: number; + + /** + * For converting radians to degrees (180 / PI) + */ + var RAD_TO_DEG: number; + + /** + * An instance of the Random Number Generator. + * This is not set until the Game boots. + */ + var RND: Phaser.Math.RandomDataGenerator; + + /** + * The minimum safe integer this browser supports. + * We use a const for backward compatibility with Internet Explorer. + */ + var MIN_SAFE_INTEGER: number; + + /** + * The maximum safe integer this browser supports. + * We use a const for backward compatibility with Internet Explorer. + */ + var MAX_SAFE_INTEGER: number; + + /** + * Convert the given angle from degrees, to the equivalent angle in radians. + * @param degrees The angle (in degrees) to convert to radians. + */ + function DegToRad(degrees: number): number; + + /** + * Calculates the positive difference of two given numbers. + * @param a The first number in the calculation. + * @param b The second number in the calculation. + */ + function Difference(a: number, b: number): number; + + namespace Distance { + /** + * Calculate the distance between two sets of coordinates (points). + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + */ + function Between(x1: number, y1: number, x2: number, y2: number): number; + + /** + * Calculate the distance between two points. + * @param a The first point. + * @param b The second point. + */ + function BetweenPoints(a: Phaser.Types.Math.Vector2Like, b: Phaser.Types.Math.Vector2Like): number; + + /** + * Calculate the squared distance between two points. + * @param a The first point. + * @param b The second point. + */ + function BetweenPointsSquared(a: Phaser.Types.Math.Vector2Like, b: Phaser.Types.Math.Vector2Like): number; + + /** + * Calculate the Chebyshev distance between two sets of coordinates (points). + * + * Chebyshev distance (or chessboard distance) is the maximum of the horizontal and vertical distances. + * It's the effective distance when movement can be horizontal, vertical, or diagonal. + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + */ + function Chebyshev(x1: number, y1: number, x2: number, y2: number): number; + + /** + * Calculate the distance between two sets of coordinates (points) to the power of `pow`. + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + * @param pow The exponent. + */ + function Power(x1: number, y1: number, x2: number, y2: number, pow: number): number; + + /** + * Calculate the snake distance between two sets of coordinates (points). + * + * Snake distance (rectilinear distance, Manhattan distance) is the sum of the horizontal and vertical distances. + * It's the effective distance when movement is allowed only horizontally or vertically (but not both). + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + */ + function Snake(x1: number, y1: number, x2: number, y2: number): number; + + /** + * Calculate the distance between two sets of coordinates (points), squared. + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + */ + function Squared(x1: number, y1: number, x2: number, y2: number): number; + + } + + namespace Easing { + namespace Back { + /** + * Back ease-in. + * @param v The value to be tweened. + * @param overshoot The overshoot amount. Default 1.70158. + */ + function In(v: number, overshoot?: number): number; + + /** + * Back ease-in/out. + * @param v The value to be tweened. + * @param overshoot The overshoot amount. Default 1.70158. + */ + function InOut(v: number, overshoot?: number): number; + + /** + * Back ease-out. + * @param v The value to be tweened. + * @param overshoot The overshoot amount. Default 1.70158. + */ + function Out(v: number, overshoot?: number): number; + + } + + namespace Bounce { + /** + * Bounce ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Bounce ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Bounce ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Circular { + /** + * Circular ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Circular ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Circular ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Cubic { + /** + * Cubic ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Cubic ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Cubic ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Elastic { + /** + * Elastic ease-in. + * @param v The value to be tweened. + * @param amplitude The amplitude of the elastic ease. Default 0.1. + * @param period Sets how tight the sine-wave is, where smaller values are tighter waves, which result in more cycles. Default 0.1. + */ + function In(v: number, amplitude?: number, period?: number): number; + + /** + * Elastic ease-in/out. + * @param v The value to be tweened. + * @param amplitude The amplitude of the elastic ease. Default 0.1. + * @param period Sets how tight the sine-wave is, where smaller values are tighter waves, which result in more cycles. Default 0.1. + */ + function InOut(v: number, amplitude?: number, period?: number): number; + + /** + * Elastic ease-out. + * @param v The value to be tweened. + * @param amplitude The amplitude of the elastic ease. Default 0.1. + * @param period Sets how tight the sine-wave is, where smaller values are tighter waves, which result in more cycles. Default 0.1. + */ + function Out(v: number, amplitude?: number, period?: number): number; + + } + + namespace Expo { + /** + * Exponential ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Exponential ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Exponential ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + /** + * Linear easing (no variation). + * @param v The value to be tweened. + */ + function Linear(v: number): number; + + namespace Quadratic { + /** + * Quadratic ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Quadratic ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Quadratic ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Quartic { + /** + * Quartic ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Quartic ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Quartic ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Quintic { + /** + * Quintic ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Quintic ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Quintic ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Sine { + /** + * Sinusoidal ease-in. + * @param v The value to be tweened. + */ + function In(v: number): number; + + /** + * Sinusoidal ease-in/out. + * @param v The value to be tweened. + */ + function InOut(v: number): number; + + /** + * Sinusoidal ease-out. + * @param v The value to be tweened. + */ + function Out(v: number): number; + + } + + namespace Stepped { + } + + /** + * Stepped easing. + * @param v The value to be tweened. + * @param steps The number of steps in the ease. Default 1. + */ + function Stepped(v: number, steps?: number): number; + + } + + class Euler { + /** + * + * @param x The x component. + * @param y The y component. + * @param z The z component. + */ + constructor(x?: number, y?: number, z?: number); + + } + + /** + * Calculates the factorial of a given number for integer values greater than 0. + * @param value A positive integer to calculate the factorial of. + */ + function Factorial(value: number): number; + + /** + * Generate a random floating point number between the two given bounds, minimum inclusive, maximum exclusive. + * @param min The lower bound for the float, inclusive. + * @param max The upper bound for the float exclusive. + */ + function FloatBetween(min: number, max: number): number; + + /** + * Floors to some place comparative to a `base`, default is 10 for decimal place. + * + * The `place` is represented by the power applied to `base` to get that place. + * @param value The value to round. + * @param place The place to round to. Default 0. + * @param base The base to round in. Default is 10 for decimal. Default 10. + */ + function FloorTo(value: number, place?: number, base?: number): number; + + /** + * Return a value based on the range between `min` and `max` and the percentage given. + * @param percent A value between 0 and 1 representing the percentage. + * @param min The minimum value. + * @param max The maximum value. + */ + function FromPercent(percent: number, min: number, max?: number): number; + + namespace Fuzzy { + /** + * Calculate the fuzzy ceiling of the given value. + * @param value The value. + * @param epsilon The epsilon. Default 0.0001. + */ + function Ceil(value: number, epsilon?: number): number; + + /** + * Check whether the given values are fuzzily equal. + * + * Two numbers are fuzzily equal if their difference is less than `epsilon`. + * @param a The first value. + * @param b The second value. + * @param epsilon The epsilon. Default 0.0001. + */ + function Equal(a: number, b: number, epsilon?: number): boolean; + + /** + * Calculate the fuzzy floor of the given value. + * @param value The value. + * @param epsilon The epsilon. Default 0.0001. + */ + function Floor(value: number, epsilon?: number): number; + + /** + * Check whether `a` is fuzzily greater than `b`. + * + * `a` is fuzzily greater than `b` if it is more than `b - epsilon`. + * @param a The first value. + * @param b The second value. + * @param epsilon The epsilon. Default 0.0001. + */ + function GreaterThan(a: number, b: number, epsilon?: number): boolean; + + /** + * Check whether `a` is fuzzily less than `b`. + * + * `a` is fuzzily less than `b` if it is less than `b + epsilon`. + * @param a The first value. + * @param b The second value. + * @param epsilon The epsilon. Default 0.0001. + */ + function LessThan(a: number, b: number, epsilon?: number): boolean; + + } + + /** + * Calculate a per-ms speed from a distance and time (given in seconds). + * @param distance The distance. + * @param time The time, in seconds. + */ + function GetSpeed(distance: number, time: number): number; + + namespace Interpolation { + /** + * A bezier interpolation method. + * @param v The input array of values to interpolate between. + * @param k The percentage of interpolation, between 0 and 1. + */ + function Bezier(v: number[], k: number): number; + + /** + * A Catmull-Rom interpolation method. + * @param v The input array of values to interpolate between. + * @param k The percentage of interpolation, between 0 and 1. + */ + function CatmullRom(v: number[], k: number): number; + + /** + * A cubic bezier interpolation method. + * + * https://medium.com/@adrian_cooney/bezier-interpolation-13b68563313a + * @param t The percentage of interpolation, between 0 and 1. + * @param p0 The start point. + * @param p1 The first control point. + * @param p2 The second control point. + * @param p3 The end point. + */ + function CubicBezier(t: number, p0: number, p1: number, p2: number, p3: number): number; + + /** + * A linear interpolation method. + * @param v The input array of values to interpolate between. + * @param k The percentage of interpolation, between 0 and 1. + */ + function Linear(v: number[], k: number): number; + + /** + * A quadratic bezier interpolation method. + * @param t The percentage of interpolation, between 0 and 1. + * @param p0 The start point. + * @param p1 The control point. + * @param p2 The end point. + */ + function QuadraticBezier(t: number, p0: number, p1: number, p2: number): number; + + /** + * A Smoother Step interpolation method. + * @param t The percentage of interpolation, between 0 and 1. + * @param min The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'. + * @param max The maximum value, also known as the 'right edge', assumed greater than the 'left edge'. + */ + function SmootherStep(t: number, min: number, max: number): number; + + /** + * A Smooth Step interpolation method. + * @param t The percentage of interpolation, between 0 and 1. + * @param min The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'. + * @param max The maximum value, also known as the 'right edge', assumed greater than the 'left edge'. + */ + function SmoothStep(t: number, min: number, max: number): number; + + } + + /** + * Check if a given value is an even number. + * @param value The number to perform the check with. + */ + function IsEven(value: number): boolean; + + /** + * Check if a given value is an even number using a strict type check. + * @param value The number to perform the check with. + */ + function IsEvenStrict(value: number): boolean; + + /** + * Calculates a linear (interpolation) value over t. + * @param p0 The first point. + * @param p1 The second point. + * @param t The percentage between p0 and p1 to return, represented as a number between 0 and 1. + */ + function Linear(p0: number, p1: number, t: number): number; + + /** + * Interpolates two given Vectors and returns a new Vector between them. + * + * Does not modify either of the passed Vectors. + * @param vector1 Starting vector + * @param vector2 Ending vector + * @param t The percentage between vector1 and vector2 to return, represented as a number between 0 and 1. Default 0. + */ + function LinearXY(vector1: Phaser.Math.Vector2, vector2: Phaser.Math.Vector2, t?: number): Phaser.Math.Vector2; + + /** + * A three-dimensional matrix. + * + * Defaults to the identity matrix when instantiated. + */ + class Matrix3 { + /** + * + * @param m Optional Matrix3 to copy values from. + */ + constructor(m?: Phaser.Math.Matrix3); + + /** + * The matrix values. + */ + val: Float32Array; + + /** + * Make a clone of this Matrix3. + */ + clone(): Phaser.Math.Matrix3; + + /** + * This method is an alias for `Matrix3.copy`. + * @param src The Matrix to set the values of this Matrix's from. + */ + set(src: Phaser.Math.Matrix3): Phaser.Math.Matrix3; + + /** + * Copy the values of a given Matrix into this Matrix. + * @param src The Matrix to copy the values from. + */ + copy(src: Phaser.Math.Matrix3): Phaser.Math.Matrix3; + + /** + * Copy the values of a given Matrix4 into this Matrix3. + * @param m The Matrix4 to copy the values from. + */ + fromMat4(m: Phaser.Math.Matrix4): Phaser.Math.Matrix3; + + /** + * Set the values of this Matrix from the given array. + * @param a The array to copy the values from. + */ + fromArray(a: any[]): Phaser.Math.Matrix3; + + /** + * Reset this Matrix to an identity (default) matrix. + */ + identity(): Phaser.Math.Matrix3; + + /** + * Transpose this Matrix. + */ + transpose(): Phaser.Math.Matrix3; + + /** + * Invert this Matrix. + */ + invert(): Phaser.Math.Matrix3; + + /** + * Calculate the adjoint, or adjugate, of this Matrix. + */ + adjoint(): Phaser.Math.Matrix3; + + /** + * Calculate the determinant of this Matrix. + */ + determinant(): number; + + /** + * Multiply this Matrix by the given Matrix. + * @param src The Matrix to multiply this Matrix by. + */ + multiply(src: Phaser.Math.Matrix3): Phaser.Math.Matrix3; + + /** + * Translate this Matrix using the given Vector. + * @param v The Vector to translate this Matrix with. + */ + translate(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): Phaser.Math.Matrix3; + + /** + * Apply a rotation transformation to this Matrix. + * @param rad The angle in radians to rotate by. + */ + rotate(rad: number): Phaser.Math.Matrix3; + + /** + * Apply a scale transformation to this Matrix. + * + * Uses the `x` and `y` components of the given Vector to scale the Matrix. + * @param v The Vector to scale this Matrix with. + */ + scale(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): Phaser.Math.Matrix3; + + /** + * Set the values of this Matrix from the given Quaternion. + * @param q The Quaternion to set the values of this Matrix from. + */ + fromQuat(q: Phaser.Math.Quaternion): Phaser.Math.Matrix3; + + /** + * Set the values of this Matrix3 to be normalized from the given Matrix4. + * @param m The Matrix4 to normalize the values from. + */ + normalFromMat4(m: Phaser.Math.Matrix4): Phaser.Math.Matrix3; + + } + + /** + * A four-dimensional matrix. + * + * Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji + * and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl + */ + class Matrix4 { + /** + * + * @param m Optional Matrix4 to copy values from. + */ + constructor(m?: Phaser.Math.Matrix4); + + /** + * The matrix values. + */ + val: Float32Array; + + /** + * Make a clone of this Matrix4. + */ + clone(): Phaser.Math.Matrix4; + + /** + * This method is an alias for `Matrix4.copy`. + * @param src The Matrix to set the values of this Matrix's from. + */ + set(src: Phaser.Math.Matrix4): this; + + /** + * Sets all values of this Matrix4. + * @param m00 The m00 value. + * @param m01 The m01 value. + * @param m02 The m02 value. + * @param m03 The m03 value. + * @param m10 The m10 value. + * @param m11 The m11 value. + * @param m12 The m12 value. + * @param m13 The m13 value. + * @param m20 The m20 value. + * @param m21 The m21 value. + * @param m22 The m22 value. + * @param m23 The m23 value. + * @param m30 The m30 value. + * @param m31 The m31 value. + * @param m32 The m32 value. + * @param m33 The m33 value. + */ + setValues(m00: number, m01: number, m02: number, m03: number, m10: number, m11: number, m12: number, m13: number, m20: number, m21: number, m22: number, m23: number, m30: number, m31: number, m32: number, m33: number): this; + + /** + * Copy the values of a given Matrix into this Matrix. + * @param src The Matrix to copy the values from. + */ + copy(src: Phaser.Math.Matrix4): this; + + /** + * Set the values of this Matrix from the given array. + * @param a The array to copy the values from. Must have at least 16 elements. + */ + fromArray(a: number[]): this; + + /** + * Reset this Matrix. + * + * Sets all values to `0`. + */ + zero(): Phaser.Math.Matrix4; + + /** + * Generates a transform matrix based on the given position, scale and rotation. + * @param position The position vector. + * @param scale The scale vector. + * @param rotation The rotation quaternion. + */ + transform(position: Phaser.Math.Vector3, scale: Phaser.Math.Vector3, rotation: Phaser.Math.Quaternion): this; + + /** + * Set the `x`, `y` and `z` values of this Matrix. + * @param x The x value. + * @param y The y value. + * @param z The z value. + */ + xyz(x: number, y: number, z: number): this; + + /** + * Set the scaling values of this Matrix. + * @param x The x scaling value. + * @param y The y scaling value. + * @param z The z scaling value. + */ + scaling(x: number, y: number, z: number): this; + + /** + * Reset this Matrix to an identity (default) matrix. + */ + identity(): this; + + /** + * Transpose this Matrix. + */ + transpose(): this; + + /** + * Copies the given Matrix4 into this Matrix and then inverses it. + * @param m The Matrix4 to invert into this Matrix4. + */ + getInverse(m: Phaser.Math.Matrix4): this; + + /** + * Invert this Matrix. + */ + invert(): this; + + /** + * Calculate the adjoint, or adjugate, of this Matrix. + */ + adjoint(): this; + + /** + * Calculate the determinant of this Matrix. + */ + determinant(): number; + + /** + * Multiply this Matrix by the given Matrix. + * @param src The Matrix to multiply this Matrix by. + */ + multiply(src: Phaser.Math.Matrix4): this; + + /** + * Multiply the values of this Matrix4 by those given in the `src` argument. + * @param src The source Matrix4 that this Matrix4 is multiplied by. + */ + multiplyLocal(src: Phaser.Math.Matrix4): this; + + /** + * Multiplies the given Matrix4 object with this Matrix. + * + * This is the same as calling `multiplyMatrices(m, this)`. + * @param m The Matrix4 to multiply with this one. + */ + premultiply(m: Phaser.Math.Matrix4): this; + + /** + * Multiplies the two given Matrix4 objects and stores the results in this Matrix. + * @param a The first Matrix4 to multiply. + * @param b The second Matrix4 to multiply. + */ + multiplyMatrices(a: Phaser.Math.Matrix4, b: Phaser.Math.Matrix4): this; + + /** + * Translate this Matrix using the given Vector. + * @param v The Vector to translate this Matrix with. + */ + translate(v: Phaser.Math.Vector3 | Phaser.Math.Vector4): this; + + /** + * Translate this Matrix using the given values. + * @param x The x component. + * @param y The y component. + * @param z The z component. + */ + translateXYZ(x: number, y: number, z: number): this; + + /** + * Apply a scale transformation to this Matrix. + * + * Uses the `x`, `y` and `z` components of the given Vector to scale the Matrix. + * @param v The Vector to scale this Matrix with. + */ + scale(v: Phaser.Math.Vector3 | Phaser.Math.Vector4): this; + + /** + * Apply a scale transformation to this Matrix. + * @param x The x component. + * @param y The y component. + * @param z The z component. + */ + scaleXYZ(x: number, y: number, z: number): this; + + /** + * Derive a rotation matrix around the given axis. + * @param axis The rotation axis. + * @param angle The rotation angle in radians. + */ + makeRotationAxis(axis: Phaser.Math.Vector3 | Phaser.Math.Vector4, angle: number): this; + + /** + * Apply a rotation transformation to this Matrix. + * @param rad The angle in radians to rotate by. + * @param axis The axis to rotate upon. + */ + rotate(rad: number, axis: Phaser.Math.Vector3): this; + + /** + * Rotate this matrix on its X axis. + * @param rad The angle in radians to rotate by. + */ + rotateX(rad: number): this; + + /** + * Rotate this matrix on its Y axis. + * @param rad The angle to rotate by, in radians. + */ + rotateY(rad: number): this; + + /** + * Rotate this matrix on its Z axis. + * @param rad The angle to rotate by, in radians. + */ + rotateZ(rad: number): this; + + /** + * Set the values of this Matrix from the given rotation Quaternion and translation Vector. + * @param q The Quaternion to set rotation from. + * @param v The Vector to set translation from. + */ + fromRotationTranslation(q: Phaser.Math.Quaternion, v: Phaser.Math.Vector3): this; + + /** + * Set the values of this Matrix from the given Quaternion. + * @param q The Quaternion to set the values of this Matrix from. + */ + fromQuat(q: Phaser.Math.Quaternion): this; + + /** + * Generate a frustum matrix with the given bounds. + * @param left The left bound of the frustum. + * @param right The right bound of the frustum. + * @param bottom The bottom bound of the frustum. + * @param top The top bound of the frustum. + * @param near The near bound of the frustum. + * @param far The far bound of the frustum. + */ + frustum(left: number, right: number, bottom: number, top: number, near: number, far: number): this; + + /** + * Generate a perspective projection matrix with the given bounds. + * @param fovy Vertical field of view in radians + * @param aspect Aspect ratio. Typically viewport width /height. + * @param near Near bound of the frustum. + * @param far Far bound of the frustum. + */ + perspective(fovy: number, aspect: number, near: number, far: number): this; + + /** + * Generate a perspective projection matrix with the given bounds. + * @param width The width of the frustum. + * @param height The height of the frustum. + * @param near Near bound of the frustum. + * @param far Far bound of the frustum. + */ + perspectiveLH(width: number, height: number, near: number, far: number): this; + + /** + * Generate an orthogonal projection matrix with the given bounds. + * @param left The left bound of the frustum. + * @param right The right bound of the frustum. + * @param bottom The bottom bound of the frustum. + * @param top The top bound of the frustum. + * @param near The near bound of the frustum. + * @param far The far bound of the frustum. + */ + ortho(left: number, right: number, bottom: number, top: number, near: number, far: number): this; + + /** + * Generate a right-handed look-at matrix with the given eye position, target and up axis. + * @param eye Position of the viewer. + * @param target Point the viewer is looking at. + * @param up vec3 pointing up. + */ + lookAtRH(eye: Phaser.Math.Vector3, target: Phaser.Math.Vector3, up: Phaser.Math.Vector3): this; + + /** + * Generate a look-at matrix with the given eye position, focal point, and up axis. + * @param eye Position of the viewer + * @param center Point the viewer is looking at + * @param up vec3 pointing up. + */ + lookAt(eye: Phaser.Math.Vector3, center: Phaser.Math.Vector3, up: Phaser.Math.Vector3): this; + + /** + * Set the values of this matrix from the given `yaw`, `pitch` and `roll` values. + * @param yaw The yaw value. + * @param pitch The pitch value. + * @param roll The roll value. + */ + yawPitchRoll(yaw: number, pitch: number, roll: number): this; + + /** + * Generate a world matrix from the given rotation, position, scale, view matrix and projection matrix. + * @param rotation The rotation of the world matrix. + * @param position The position of the world matrix. + * @param scale The scale of the world matrix. + * @param viewMatrix The view matrix. + * @param projectionMatrix The projection matrix. + */ + setWorldMatrix(rotation: Phaser.Math.Vector3, position: Phaser.Math.Vector3, scale: Phaser.Math.Vector3, viewMatrix?: Phaser.Math.Matrix4, projectionMatrix?: Phaser.Math.Matrix4): this; + + /** + * Multiplies this Matrix4 by the given `src` Matrix4 and stores the results in the `out` Matrix4. + * @param src The Matrix4 to multiply with this one. + * @param out The receiving Matrix. + */ + multiplyToMat4(src: Phaser.Math.Matrix4, out: Phaser.Math.Matrix4): Phaser.Math.Matrix4; + + /** + * Takes the rotation and position vectors and builds this Matrix4 from them. + * @param rotation The rotation vector. + * @param position The position vector. + * @param translateFirst Should the operation translate then rotate (`true`), or rotate then translate? (`false`) + */ + fromRotationXYTranslation(rotation: Phaser.Math.Vector3, position: Phaser.Math.Vector3, translateFirst: boolean): this; + + /** + * Returns the maximum axis scale from this Matrix4. + */ + getMaxScaleOnAxis(): number; + + } + + /** + * Add an `amount` to a `value`, limiting the maximum result to `max`. + * @param value The value to add to. + * @param amount The amount to add. + * @param max The maximum value to return. + */ + function MaxAdd(value: number, amount: number, max: number): number; + + /** + * Calculate the median of the given values. The values are sorted and the middle value is returned. + * In case of an even number of values, the average of the two middle values is returned. + * @param values The values to average. + */ + function Median(values: number[]): number; + + /** + * Subtract an `amount` from `value`, limiting the minimum result to `min`. + * @param value The value to subtract from. + * @param amount The amount to subtract. + * @param min The minimum value to return. + */ + function MinSub(value: number, amount: number, min: number): number; + + /** + * Work out what percentage `value` is of the range between `min` and `max`. + * If `max` isn't given then it will return the percentage of `value` to `min`. + * + * You can optionally specify an `upperMax` value, which is a mid-way point in the range that represents 100%, after which the % starts to go down to zero again. + * @param value The value to determine the percentage of. + * @param min The minimum value. + * @param max The maximum value. + * @param upperMax The mid-way point in the range that represents 100%. + */ + function Percent(value: number, min: number, max?: number, upperMax?: number): number; + + namespace Pow2 { + /** + * Returns the nearest power of 2 to the given `value`. + * @param value The value. + */ + function GetNext(value: number): number; + + /** + * Checks if the given `width` and `height` are a power of two. + * Useful for checking texture dimensions. + * @param width The width. + * @param height The height. + */ + function IsSize(width: number, height: number): boolean; + + /** + * Tests the value and returns `true` if it is a power of two. + * @param value The value to check if it's a power of two. + */ + function IsValue(value: number): boolean; + + } + + /** + * A quaternion. + */ + class Quaternion { + /** + * + * @param x The x component. Default 0. + * @param y The y component. Default 0. + * @param z The z component. Default 0. + * @param w The w component. Default 1. + */ + constructor(x?: number, y?: number, z?: number, w?: number); + + /** + * This callback is invoked, if set, each time a value in this quaternion is changed. + * The callback is passed one argument, a reference to this quaternion. + */ + onChangeCallback: Function; + + /** + * The x component of this Quaternion. + */ + x: number; + + /** + * The y component of this Quaternion. + */ + y: number; + + /** + * The z component of this Quaternion. + */ + z: number; + + /** + * The w component of this Quaternion. + */ + w: number; + + /** + * Copy the components of a given Quaternion or Vector into this Quaternion. + * @param src The Quaternion or Vector to copy the components from. + */ + copy(src: Phaser.Math.Quaternion | Phaser.Math.Vector4): Phaser.Math.Quaternion; + + /** + * Set the components of this Quaternion and optionally call the `onChangeCallback`. + * @param x The x component, or an object containing x, y, z, and w components. Default 0. + * @param y The y component. Default 0. + * @param z The z component. Default 0. + * @param w The w component. Default 0. + * @param update Call the `onChangeCallback`? Default true. + */ + set(x?: number | object, y?: number, z?: number, w?: number, update?: boolean): Phaser.Math.Quaternion; + + /** + * Add a given Quaternion or Vector to this Quaternion. Addition is component-wise. + * @param v The Quaternion or Vector to add to this Quaternion. + */ + add(v: Phaser.Math.Quaternion | Phaser.Math.Vector4): Phaser.Math.Quaternion; + + /** + * Subtract a given Quaternion or Vector from this Quaternion. Subtraction is component-wise. + * @param v The Quaternion or Vector to subtract from this Quaternion. + */ + subtract(v: Phaser.Math.Quaternion | Phaser.Math.Vector4): Phaser.Math.Quaternion; + + /** + * Scale this Quaternion by the given value. + * @param scale The value to scale this Quaternion by. + */ + scale(scale: number): Phaser.Math.Quaternion; + + /** + * Calculate the length of this Quaternion. + */ + length(): number; + + /** + * Calculate the length of this Quaternion squared. + */ + lengthSq(): number; + + /** + * Normalize this Quaternion. + */ + normalize(): Phaser.Math.Quaternion; + + /** + * Calculate the dot product of this Quaternion and the given Quaternion or Vector. + * @param v The Quaternion or Vector to dot product with this Quaternion. + */ + dot(v: Phaser.Math.Quaternion | Phaser.Math.Vector4): number; + + /** + * Linearly interpolate this Quaternion towards the given Quaternion or Vector. + * @param v The Quaternion or Vector to interpolate towards. + * @param t The percentage of interpolation. Default 0. + */ + lerp(v: Phaser.Math.Quaternion | Phaser.Math.Vector4, t?: number): Phaser.Math.Quaternion; + + /** + * Rotates this Quaternion based on the two given vectors. + * @param a The transform rotation vector. + * @param b The target rotation vector. + */ + rotationTo(a: Phaser.Math.Vector3, b: Phaser.Math.Vector3): Phaser.Math.Quaternion; + + /** + * Set the axes of this Quaternion. + * @param view The view axis. + * @param right The right axis. + * @param up The upwards axis. + */ + setAxes(view: Phaser.Math.Vector3, right: Phaser.Math.Vector3, up: Phaser.Math.Vector3): Phaser.Math.Quaternion; + + /** + * Reset this Matrix to an identity (default) Quaternion. + */ + identity(): Phaser.Math.Quaternion; + + /** + * Set the axis angle of this Quaternion. + * @param axis The axis. + * @param rad The angle in radians. + */ + setAxisAngle(axis: Phaser.Math.Vector3, rad: number): Phaser.Math.Quaternion; + + /** + * Multiply this Quaternion by the given Quaternion or Vector. + * @param b The Quaternion or Vector to multiply this Quaternion by. + */ + multiply(b: Phaser.Math.Quaternion | Phaser.Math.Vector4): Phaser.Math.Quaternion; + + /** + * Smoothly linearly interpolate this Quaternion towards the given Quaternion or Vector. + * @param b The Quaternion or Vector to interpolate towards. + * @param t The percentage of interpolation. + */ + slerp(b: Phaser.Math.Quaternion | Phaser.Math.Vector4, t: number): Phaser.Math.Quaternion; + + /** + * Invert this Quaternion. + */ + invert(): Phaser.Math.Quaternion; + + /** + * Convert this Quaternion into its conjugate. + * + * Sets the x, y and z components. + */ + conjugate(): Phaser.Math.Quaternion; + + /** + * Rotate this Quaternion on the X axis. + * @param rad The rotation angle in radians. + */ + rotateX(rad: number): Phaser.Math.Quaternion; + + /** + * Rotate this Quaternion on the Y axis. + * @param rad The rotation angle in radians. + */ + rotateY(rad: number): Phaser.Math.Quaternion; + + /** + * Rotate this Quaternion on the Z axis. + * @param rad The rotation angle in radians. + */ + rotateZ(rad: number): Phaser.Math.Quaternion; + + /** + * Create a unit (or rotation) Quaternion from its x, y, and z components. + * + * Sets the w component. + */ + calculateW(): Phaser.Math.Quaternion; + + /** + * Set this Quaternion from the given Euler, based on Euler order. + * @param euler The Euler to convert from. + * @param update Run the `onChangeCallback`? Default true. + */ + setFromEuler(euler: Phaser.Math.Euler, update?: boolean): Phaser.Math.Quaternion; + + /** + * Sets the rotation of this Quaternion from the given Matrix4. + * @param mat4 The Matrix4 to set the rotation from. + */ + setFromRotationMatrix(mat4: Phaser.Math.Matrix4): Phaser.Math.Quaternion; + + /** + * Convert the given Matrix into this Quaternion. + * @param mat The Matrix to convert from. + */ + fromMat3(mat: Phaser.Math.Matrix3): Phaser.Math.Quaternion; + + } + + /** + * Convert the given angle in radians, to the equivalent angle in degrees. + * @param radians The angle in radians to convert ot degrees. + */ + function RadToDeg(radians: number): number; + + /** + * A seeded Random Data Generator. + * + * Access via `Phaser.Math.RND` which is an instance of this class pre-defined + * by Phaser. Or, create your own instance to use as you require. + * + * The `Math.RND` generator is seeded by the Game Config property value `seed`. + * If no such config property exists, a random number is used. + * + * If you create your own instance of this class you should provide a seed for it. + * If no seed is given it will use a 'random' one based on Date.now. + */ + class RandomDataGenerator { + /** + * + * @param seeds The seeds to use for the random number generator. + */ + constructor(seeds?: string | string[]); + + /** + * Signs to choose from. + */ + signs: number[]; + + /** + * Initialize the state of the random data generator. + * @param seeds The seeds to initialize the random data generator with. + */ + init(seeds: string | string[]): void; + + /** + * Reset the seed of the random data generator. + * + * _Note_: the seed array is only processed up to the first `undefined` (or `null`) value, should such be present. + * @param seeds The array of seeds: the `toString()` of each value is used. + */ + sow(seeds: string[]): void; + + /** + * Returns a random integer between 0 and 2^32. + */ + integer(): number; + + /** + * Returns a random real number between 0 and 1. + */ + frac(): number; + + /** + * Returns a random real number between 0 and 2^32. + */ + real(): number; + + /** + * Returns a random integer between and including min and max. + * @param min The minimum value in the range. + * @param max The maximum value in the range. + */ + integerInRange(min: number, max: number): number; + + /** + * Returns a random integer between and including min and max. + * This method is an alias for RandomDataGenerator.integerInRange. + * @param min The minimum value in the range. + * @param max The maximum value in the range. + */ + between(min: number, max: number): number; + + /** + * Returns a random real number between min and max. + * @param min The minimum value in the range. + * @param max The maximum value in the range. + */ + realInRange(min: number, max: number): number; + + /** + * Returns a random real number between -1 and 1. + */ + normal(): number; + + /** + * Returns a valid RFC4122 version4 ID hex string from https://gist.github.com/1308368 + */ + uuid(): string; + + /** + * Returns a random element from within the given array. + * @param array The array to pick a random element from. + */ + pick(array: T[]): T; + + /** + * Returns a sign to be used with multiplication operator. + */ + sign(): number; + + /** + * Returns a random element from within the given array, favoring the earlier entries. + * @param array The array to pick a random element from. + */ + weightedPick(array: T[]): T; + + /** + * Returns a random timestamp between min and max, or between the beginning of 2000 and the end of 2020 if min and max aren't specified. + * @param min The minimum value in the range. + * @param max The maximum value in the range. + */ + timestamp(min: number, max: number): number; + + /** + * Returns a random angle between -180 and 180. + */ + angle(): number; + + /** + * Returns a random rotation in radians, between -3.141 and 3.141 + */ + rotation(): number; + + /** + * Gets or Sets the state of the generator. This allows you to retain the values + * that the generator is using between games, i.e. in a game save file. + * + * To seed this generator with a previously saved state you can pass it as the + * `seed` value in your game config, or call this method directly after Phaser has booted. + * + * Call this method with no parameters to return the current state. + * + * If providing a state it should match the same format that this method + * returns, which is a string with a header `!rnd` followed by the `c`, + * `s0`, `s1` and `s2` values respectively, each comma-delimited. + * @param state Generator state to be set. + */ + state(state?: string): string; + + /** + * Shuffles the given array, using the current seed. + * @param array The array to be shuffled. + */ + shuffle(array?: T[]): T[]; + + } + + /** + * Compute a random unit vector. + * + * Computes random values for the given vector between -1 and 1 that can be used to represent a direction. + * + * Optionally accepts a scale value to scale the resulting vector by. + * @param vector The Vector to compute random values for. + * @param scale The scale of the random values. Default 1. + */ + function RandomXY(vector: Phaser.Math.Vector2, scale?: number): Phaser.Math.Vector2; + + /** + * Compute a random position vector in a spherical area, optionally defined by the given radius. + * @param vec3 The Vector to compute random values for. + * @param radius The radius. Default 1. + */ + function RandomXYZ(vec3: Phaser.Math.Vector3, radius?: number): Phaser.Math.Vector3; + + /** + * Compute a random four-dimensional vector. + * @param vec4 The Vector to compute random values for. + * @param scale The scale of the random values. Default 1. + */ + function RandomXYZW(vec4: Phaser.Math.Vector4, scale?: number): Phaser.Math.Vector4; + + /** + * Rotate a given point by a given angle around the origin (0, 0), in an anti-clockwise direction. + * @param point The point to be rotated. + * @param angle The angle to be rotated by in an anticlockwise direction. + */ + function Rotate(point: Phaser.Geom.Point | object, angle: number): Phaser.Geom.Point; + + /** + * Rotate a `point` around `x` and `y` to the given `angle`, at the same distance. + * + * In polar notation, this maps a point from (r, t) to (r, angle), vs. the origin (x, y). + * @param point The point to be rotated. + * @param x The horizontal coordinate to rotate around. + * @param y The vertical coordinate to rotate around. + * @param angle The angle of rotation in radians. + */ + function RotateAround(point: T, x: number, y: number, angle: number): T; + + /** + * Rotate a `point` around `x` and `y` by the given `angle` and `distance`. + * + * In polar notation, this maps a point from (r, t) to (distance, t + angle), vs. the origin (x, y). + * @param point The point to be rotated. + * @param x The horizontal coordinate to rotate around. + * @param y The vertical coordinate to rotate around. + * @param angle The angle of rotation in radians. + * @param distance The distance from (x, y) to place the point at. + */ + function RotateAroundDistance(point: T, x: number, y: number, angle: number, distance: number): T; + + /** + * Position a `point` at the given `angle` and `distance` to (`x`, `y`). + * @param point The point to be positioned. + * @param x The horizontal coordinate to position from. + * @param y The vertical coordinate to position from. + * @param angle The angle of rotation in radians. + * @param distance The distance from (x, y) to place the point at. + */ + function RotateTo(point: T, x: number, y: number, angle: number, distance: number): T; + + /** + * Rotates a vector in place by axis angle. + * + * This is the same as transforming a point by an + * axis-angle quaternion, but it has higher precision. + * @param vec The vector to be rotated. + * @param axis The axis to rotate around. + * @param radians The angle of rotation in radians. + */ + function RotateVec3(vec: Phaser.Math.Vector3, axis: Phaser.Math.Vector3, radians: number): Phaser.Math.Vector3; + + /** + * Round a given number so it is further away from zero. That is, positive numbers are rounded up, and negative numbers are rounded down. + * @param value The number to round. + */ + function RoundAwayFromZero(value: number): number; + + /** + * Round a value to the given precision. + * + * For example: + * + * ```javascript + * RoundTo(123.456, 0) = 123 + * RoundTo(123.456, 1) = 120 + * RoundTo(123.456, 2) = 100 + * ``` + * + * To round the decimal, i.e. to round to precision, pass in a negative `place`: + * + * ```javascript + * RoundTo(123.456789, 0) = 123 + * RoundTo(123.456789, -1) = 123.5 + * RoundTo(123.456789, -2) = 123.46 + * RoundTo(123.456789, -3) = 123.457 + * ``` + * @param value The value to round. + * @param place The place to round to. Positive to round the units, negative to round the decimal. Default 0. + * @param base The base to round in. Default is 10 for decimal. Default 10. + */ + function RoundTo(value: number, place?: number, base?: number): number; + + /** + * Generate a series of sine and cosine values. + * @param length The number of values to generate. + * @param sinAmp The sine value amplitude. Default 1. + * @param cosAmp The cosine value amplitude. Default 1. + * @param frequency The frequency of the values. Default 1. + */ + function SinCosTableGenerator(length: number, sinAmp?: number, cosAmp?: number, frequency?: number): Phaser.Types.Math.SinCosTable; + + /** + * Calculate a smoother interpolation percentage of `x` between `min` and `max`. + * + * The function receives the number `x` as an argument and returns 0 if `x` is less than or equal to the left edge, + * 1 if `x` is greater than or equal to the right edge, and smoothly interpolates, using a Hermite polynomial, + * between 0 and 1 otherwise. + * + * Produces an even smoother interpolation than {@link Phaser.Math.SmoothStep}. + * @param x The input value. + * @param min The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'. + * @param max The maximum value, also known as the 'right edge', assumed greater than the 'left edge'. + */ + function SmootherStep(x: number, min: number, max: number): number; + + /** + * Calculate a smooth interpolation percentage of `x` between `min` and `max`. + * + * The function receives the number `x` as an argument and returns 0 if `x` is less than or equal to the left edge, + * 1 if `x` is greater than or equal to the right edge, and smoothly interpolates, using a Hermite polynomial, + * between 0 and 1 otherwise. + * @param x The input value. + * @param min The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'. + * @param max The maximum value, also known as the 'right edge', assumed greater than the 'left edge'. + */ + function SmoothStep(x: number, min: number, max: number): number; + + namespace Snap { + /** + * Snap a value to nearest grid slice, using ceil. + * + * Example: if you have an interval gap of `5` and a position of `12`... you will snap to `15`. + * As will `14` snap to `15`... but `16` will snap to `20`. + * @param value The value to snap. + * @param gap The interval gap of the grid. + * @param start Optional starting offset for gap. Default 0. + * @param divide If `true` it will divide the snapped value by the gap before returning. Default false. + */ + function Ceil(value: number, gap: number, start?: number, divide?: boolean): number; + + /** + * Snap a value to nearest grid slice, using floor. + * + * Example: if you have an interval gap of `5` and a position of `12`... you will snap to `10`. + * As will `14` snap to `10`... but `16` will snap to `15`. + * @param value The value to snap. + * @param gap The interval gap of the grid. + * @param start Optional starting offset for gap. Default 0. + * @param divide If `true` it will divide the snapped value by the gap before returning. Default false. + */ + function Floor(value: number, gap: number, start?: number, divide?: boolean): number; + + /** + * Snap a value to nearest grid slice, using rounding. + * + * Example: if you have an interval gap of `5` and a position of `12`... you will snap to `10` whereas `14` will snap to `15`. + * @param value The value to snap. + * @param gap The interval gap of the grid. + * @param start Optional starting offset for gap. Default 0. + * @param divide If `true` it will divide the snapped value by the gap before returning. Default false. + */ + function To(value: number, gap: number, start?: number, divide?: boolean): number; + + } + + /** + * Returns a Vector2 containing the x and y position of the given index in a `width` x `height` sized grid. + * + * For example, in a 6 x 4 grid, index 16 would equal x: 4 y: 2. + * + * If the given index is out of range an empty Vector2 is returned. + * @param index The position within the grid to get the x/y value for. + * @param width The width of the grid. + * @param height The height of the grid. + * @param out An optional Vector2 to store the result in. If not given, a new Vector2 instance will be created. + */ + function ToXY(index: number, width: number, height: number, out?: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Takes the `x` and `y` coordinates and transforms them into the same space as + * defined by the position, rotation and scale values. + * @param x The x coordinate to be transformed. + * @param y The y coordinate to be transformed. + * @param positionX Horizontal position of the transform point. + * @param positionY Vertical position of the transform point. + * @param rotation Rotation of the transform point, in radians. + * @param scaleX Horizontal scale of the transform point. + * @param scaleY Vertical scale of the transform point. + * @param output The output vector, point or object for the translated coordinates. + */ + function TransformXY(x: number, y: number, positionX: number, positionY: number, rotation: number, scaleX: number, scaleY: number, output?: Phaser.Math.Vector2 | Phaser.Geom.Point | object): Phaser.Math.Vector2 | Phaser.Geom.Point | object; + + /** + * A representation of a vector in 2D space. + * + * A two-component vector. + */ + class Vector2 { + /** + * + * @param x The x component, or an object with `x` and `y` properties. Default 0. + * @param y The y component. Default x. + */ + constructor(x?: number | Phaser.Types.Math.Vector2Like, y?: number); + + /** + * The x component of this Vector. + */ + x: number; + + /** + * The y component of this Vector. + */ + y: number; + + /** + * Make a clone of this Vector2. + */ + clone(): Phaser.Math.Vector2; + + /** + * Copy the components of a given Vector into this Vector. + * @param src The Vector to copy the components from. + */ + copy(src: Phaser.Types.Math.Vector2Like): Phaser.Math.Vector2; + + /** + * Set the component values of this Vector from a given Vector2Like object. + * @param obj The object containing the component values to set for this Vector. + */ + setFromObject(obj: Phaser.Types.Math.Vector2Like): Phaser.Math.Vector2; + + /** + * Set the `x` and `y` components of the this Vector to the given `x` and `y` values. + * @param x The x value to set for this Vector. + * @param y The y value to set for this Vector. Default x. + */ + set(x: number, y?: number): Phaser.Math.Vector2; + + /** + * This method is an alias for `Vector2.set`. + * @param x The x value to set for this Vector. + * @param y The y value to set for this Vector. Default x. + */ + setTo(x: number, y?: number): Phaser.Math.Vector2; + + /** + * Sets the `x` and `y` values of this object from a given polar coordinate. + * @param azimuth The angular coordinate, in radians. + * @param radius The radial coordinate (length). Default 1. + */ + setToPolar(azimuth: number, radius?: number): Phaser.Math.Vector2; + + /** + * Check whether this Vector is equal to a given Vector. + * + * Performs a strict equality check against each Vector's components. + * @param v The vector to compare with this Vector. + */ + equals(v: Phaser.Types.Math.Vector2Like): boolean; + + /** + * Check whether this Vector is approximately equal to a given Vector. + * @param v The vector to compare with this Vector. + * @param epsilon The tolerance value. Default 0.0001. + */ + fuzzyEquals(v: Phaser.Types.Math.Vector2Like, epsilon?: number): boolean; + + /** + * Calculate the angle between this Vector and the positive x-axis, in radians. + */ + angle(): number; + + /** + * Set the angle of this Vector. + * @param angle The angle, in radians. + */ + setAngle(angle: number): Phaser.Math.Vector2; + + /** + * Add a given Vector to this Vector. Addition is component-wise. + * @param src The Vector to add to this Vector. + */ + add(src: Phaser.Types.Math.Vector2Like): Phaser.Math.Vector2; + + /** + * Subtract the given Vector from this Vector. Subtraction is component-wise. + * @param src The Vector to subtract from this Vector. + */ + subtract(src: Phaser.Types.Math.Vector2Like): Phaser.Math.Vector2; + + /** + * Perform a component-wise multiplication between this Vector and the given Vector. + * + * Multiplies this Vector by the given Vector. + * @param src The Vector to multiply this Vector by. + */ + multiply(src: Phaser.Types.Math.Vector2Like): Phaser.Math.Vector2; + + /** + * Scale this Vector by the given value. + * @param value The value to scale this Vector by. + */ + scale(value: number): Phaser.Math.Vector2; + + /** + * Perform a component-wise division between this Vector and the given Vector. + * + * Divides this Vector by the given Vector. + * @param src The Vector to divide this Vector by. + */ + divide(src: Phaser.Types.Math.Vector2Like): Phaser.Math.Vector2; + + /** + * Negate the `x` and `y` components of this Vector. + */ + negate(): Phaser.Math.Vector2; + + /** + * Calculate the distance between this Vector and the given Vector. + * @param src The Vector to calculate the distance to. + */ + distance(src: Phaser.Types.Math.Vector2Like): number; + + /** + * Calculate the distance between this Vector and the given Vector, squared. + * @param src The Vector to calculate the distance to. + */ + distanceSq(src: Phaser.Types.Math.Vector2Like): number; + + /** + * Calculate the length (or magnitude) of this Vector. + */ + length(): number; + + /** + * Set the length (or magnitude) of this Vector. + */ + setLength(length: number): Phaser.Math.Vector2; + + /** + * Calculate the length of this Vector squared. + */ + lengthSq(): number; + + /** + * Normalize this Vector. + * + * Makes the vector a unit length vector (magnitude of 1) in the same direction. + */ + normalize(): Phaser.Math.Vector2; + + /** + * Rotate this Vector to its perpendicular, in the positive direction. + */ + normalizeRightHand(): Phaser.Math.Vector2; + + /** + * Rotate this Vector to its perpendicular, in the negative direction. + */ + normalizeLeftHand(): Phaser.Math.Vector2; + + /** + * Calculate the dot product of this Vector and the given Vector. + * @param src The Vector2 to dot product with this Vector2. + */ + dot(src: Phaser.Types.Math.Vector2Like): number; + + /** + * Calculate the cross product of this Vector and the given Vector. + * @param src The Vector2 to cross with this Vector2. + */ + cross(src: Phaser.Types.Math.Vector2Like): number; + + /** + * Linearly interpolate between this Vector and the given Vector. + * + * Interpolates this Vector towards the given Vector. + * @param src The Vector2 to interpolate towards. + * @param t The interpolation percentage, between 0 and 1. Default 0. + */ + lerp(src: Phaser.Types.Math.Vector2Like, t?: number): Phaser.Math.Vector2; + + /** + * Transform this Vector with the given Matrix. + * @param mat The Matrix3 to transform this Vector2 with. + */ + transformMat3(mat: Phaser.Math.Matrix3): Phaser.Math.Vector2; + + /** + * Transform this Vector with the given Matrix. + * @param mat The Matrix4 to transform this Vector2 with. + */ + transformMat4(mat: Phaser.Math.Matrix4): Phaser.Math.Vector2; + + /** + * Make this Vector the zero vector (0, 0). + */ + reset(): Phaser.Math.Vector2; + + /** + * Limit the length (or magnitude) of this Vector. + * @param max The maximum length. + */ + limit(max: number): Phaser.Math.Vector2; + + /** + * Reflect this Vector off a line defined by a normal. + * @param normal A vector perpendicular to the line. + */ + reflect(normal: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Reflect this Vector across another. + * @param axis A vector to reflect across. + */ + mirror(axis: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Rotate this Vector by an angle amount. + * @param delta The angle to rotate by, in radians. + */ + rotate(delta: number): Phaser.Math.Vector2; + + /** + * Project this Vector onto another. + * @param src The vector to project onto. + */ + project(src: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * A static zero Vector2 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly ZERO: Phaser.Math.Vector2; + + /** + * A static right Vector2 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly RIGHT: Phaser.Math.Vector2; + + /** + * A static left Vector2 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly LEFT: Phaser.Math.Vector2; + + /** + * A static up Vector2 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly UP: Phaser.Math.Vector2; + + /** + * A static down Vector2 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly DOWN: Phaser.Math.Vector2; + + /** + * A static one Vector2 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly ONE: Phaser.Math.Vector2; + + } + + /** + * A representation of a vector in 3D space. + * + * A three-component vector. + */ + class Vector3 { + /** + * + * @param x The x component. + * @param y The y component. + * @param z The z component. + */ + constructor(x?: number, y?: number, z?: number); + + /** + * The x component of this Vector. + */ + x: number; + + /** + * The y component of this Vector. + */ + y: number; + + /** + * The z component of this Vector. + */ + z: number; + + /** + * Set this Vector to point up. + * + * Sets the y component of the vector to 1, and the others to 0. + */ + up(): Phaser.Math.Vector3; + + /** + * Sets the components of this Vector to be the `Math.min` result from the given vector. + * @param v The Vector3 to check the minimum values against. + */ + min(v: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Sets the components of this Vector to be the `Math.max` result from the given vector. + * @param v The Vector3 to check the maximum values against. + */ + max(v: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Make a clone of this Vector3. + */ + clone(): Phaser.Math.Vector3; + + /** + * Adds the two given Vector3s and sets the results into this Vector3. + * @param a The first Vector to add. + * @param b The second Vector to add. + */ + addVectors(a: Phaser.Math.Vector3, b: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Calculate the cross (vector) product of two given Vectors. + * @param a The first Vector to multiply. + * @param b The second Vector to multiply. + */ + crossVectors(a: Phaser.Math.Vector3, b: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Check whether this Vector is equal to a given Vector. + * + * Performs a strict equality check against each Vector's components. + * @param v The Vector3 to compare against. + */ + equals(v: Phaser.Math.Vector3): boolean; + + /** + * Copy the components of a given Vector into this Vector. + * @param src The Vector to copy the components from. + */ + copy(src: Phaser.Math.Vector2 | Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Set the `x`, `y`, and `z` components of this Vector to the given `x`, `y`, and `z` values. + * @param x The x value to set for this Vector, or an object containing x, y and z components. + * @param y The y value to set for this Vector. + * @param z The z value to set for this Vector. + */ + set(x: number | object, y?: number, z?: number): Phaser.Math.Vector3; + + /** + * Sets the components of this Vector3 from the position of the given Matrix4. + * @param mat4 The Matrix4 to get the position from. + */ + setFromMatrixPosition(mat4: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Sets the components of this Vector3 from the Matrix4 column specified. + * @param mat4 The Matrix4 to get the column from. + * @param index The column index. + */ + setFromMatrixColumn(mat4: Phaser.Math.Matrix4, index: number): Phaser.Math.Vector3; + + /** + * Sets the components of this Vector3 from the given array, based on the offset. + * + * Vector3.x = array[offset] + * Vector3.y = array[offset + 1] + * Vector3.z = array[offset + 2] + * @param array The array of values to get this Vector from. + * @param offset The offset index into the array. Default 0. + */ + fromArray(array: number[], offset?: number): Phaser.Math.Vector3; + + /** + * Add a given Vector to this Vector. Addition is component-wise. + * @param v The Vector to add to this Vector. + */ + add(v: Phaser.Math.Vector2 | Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Add the given value to each component of this Vector. + * @param s The amount to add to this Vector. + */ + addScalar(s: number): Phaser.Math.Vector3; + + /** + * Add and scale a given Vector to this Vector. Addition is component-wise. + * @param v The Vector to add to this Vector. + * @param scale The amount to scale `v` by. + */ + addScale(v: Phaser.Math.Vector2 | Phaser.Math.Vector3, scale: number): Phaser.Math.Vector3; + + /** + * Subtract the given Vector from this Vector. Subtraction is component-wise. + * @param v The Vector to subtract from this Vector. + */ + subtract(v: Phaser.Math.Vector2 | Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Perform a component-wise multiplication between this Vector and the given Vector. + * + * Multiplies this Vector by the given Vector. + * @param v The Vector to multiply this Vector by. + */ + multiply(v: Phaser.Math.Vector2 | Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Scale this Vector by the given value. + * @param scale The value to scale this Vector by. + */ + scale(scale: number): Phaser.Math.Vector3; + + /** + * Perform a component-wise division between this Vector and the given Vector. + * + * Divides this Vector by the given Vector. + * @param v The Vector to divide this Vector by. + */ + divide(v: Phaser.Math.Vector2 | Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Negate the `x`, `y` and `z` components of this Vector. + */ + negate(): Phaser.Math.Vector3; + + /** + * Calculate the distance between this Vector and the given Vector. + * @param v The Vector to calculate the distance to. + */ + distance(v: Phaser.Math.Vector2 | Phaser.Math.Vector3): number; + + /** + * Calculate the distance between this Vector and the given Vector, squared. + * @param v The Vector to calculate the distance to. + */ + distanceSq(v: Phaser.Math.Vector2 | Phaser.Math.Vector3): number; + + /** + * Calculate the length (or magnitude) of this Vector. + */ + length(): number; + + /** + * Calculate the length of this Vector squared. + */ + lengthSq(): number; + + /** + * Normalize this Vector. + * + * Makes the vector a unit length vector (magnitude of 1) in the same direction. + */ + normalize(): Phaser.Math.Vector3; + + /** + * Calculate the dot product of this Vector and the given Vector. + * @param v The Vector3 to dot product with this Vector3. + */ + dot(v: Phaser.Math.Vector3): number; + + /** + * Calculate the cross (vector) product of this Vector (which will be modified) and the given Vector. + * @param v The Vector to cross product with. + */ + cross(v: Phaser.Math.Vector3): Phaser.Math.Vector3; + + /** + * Linearly interpolate between this Vector and the given Vector. + * + * Interpolates this Vector towards the given Vector. + * @param v The Vector3 to interpolate towards. + * @param t The interpolation percentage, between 0 and 1. Default 0. + */ + lerp(v: Phaser.Math.Vector3, t?: number): Phaser.Math.Vector3; + + /** + * Takes a Matrix3 and applies it to this Vector3. + * @param mat3 The Matrix3 to apply to this Vector3. + */ + applyMatrix3(mat3: Phaser.Math.Matrix3): Phaser.Math.Vector3; + + /** + * Takes a Matrix4 and applies it to this Vector3. + * @param mat4 The Matrix4 to apply to this Vector3. + */ + applyMatrix4(mat4: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Transform this Vector with the given Matrix. + * @param mat The Matrix3 to transform this Vector3 with. + */ + transformMat3(mat: Phaser.Math.Matrix3): Phaser.Math.Vector3; + + /** + * Transform this Vector with the given Matrix4. + * @param mat The Matrix4 to transform this Vector3 with. + */ + transformMat4(mat: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Transforms the coordinates of this Vector3 with the given Matrix4. + * @param mat The Matrix4 to transform this Vector3 with. + */ + transformCoordinates(mat: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Transform this Vector with the given Quaternion. + * @param q The Quaternion to transform this Vector with. + */ + transformQuat(q: Phaser.Math.Quaternion): Phaser.Math.Vector3; + + /** + * Multiplies this Vector3 by the specified matrix, applying a W divide. This is useful for projection, + * e.g. unprojecting a 2D point into 3D space. + * @param mat The Matrix4 to multiply this Vector3 with. + */ + project(mat: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Multiplies this Vector3 by the given view and projection matrices. + * @param viewMatrix A View Matrix. + * @param projectionMatrix A Projection Matrix. + */ + projectViewMatrix(viewMatrix: Phaser.Math.Matrix4, projectionMatrix: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Multiplies this Vector3 by the given inversed projection matrix and world matrix. + * @param projectionMatrix An inversed Projection Matrix. + * @param worldMatrix A World View Matrix. + */ + unprojectViewMatrix(projectionMatrix: Phaser.Math.Matrix4, worldMatrix: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Unproject this point from 2D space to 3D space. + * The point should have its x and y properties set to + * 2D screen space, and the z either at 0 (near plane) + * or 1 (far plane). The provided matrix is assumed to already + * be combined, i.e. projection * view * model. + * + * After this operation, this vector's (x, y, z) components will + * represent the unprojected 3D coordinate. + * @param viewport Screen x, y, width and height in pixels. + * @param invProjectionView Combined projection and view matrix. + */ + unproject(viewport: Phaser.Math.Vector4, invProjectionView: Phaser.Math.Matrix4): Phaser.Math.Vector3; + + /** + * Make this Vector the zero vector (0, 0, 0). + */ + reset(): Phaser.Math.Vector3; + + /** + * A static zero Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly ZERO: Phaser.Math.Vector3; + + /** + * A static right Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly RIGHT: Phaser.Math.Vector3; + + /** + * A static left Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly LEFT: Phaser.Math.Vector3; + + /** + * A static up Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly UP: Phaser.Math.Vector3; + + /** + * A static down Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly DOWN: Phaser.Math.Vector3; + + /** + * A static forward Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly FORWARD: Phaser.Math.Vector3; + + /** + * A static back Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly BACK: Phaser.Math.Vector3; + + /** + * A static one Vector3 for use by reference. + * + * This constant is meant for comparison operations and should not be modified directly. + */ + static readonly ONE: Phaser.Math.Vector3; + + } + + /** + * A representation of a vector in 4D space. + * + * A four-component vector. + */ + class Vector4 { + /** + * + * @param x The x component. + * @param y The y component. + * @param z The z component. + * @param w The w component. + */ + constructor(x?: number, y?: number, z?: number, w?: number); + + /** + * The x component of this Vector. + */ + x: number; + + /** + * The y component of this Vector. + */ + y: number; + + /** + * The z component of this Vector. + */ + z: number; + + /** + * The w component of this Vector. + */ + w: number; + + /** + * Make a clone of this Vector4. + */ + clone(): Phaser.Math.Vector4; + + /** + * Copy the components of a given Vector into this Vector. + * @param src The Vector to copy the components from. + */ + copy(src: Phaser.Math.Vector4): Phaser.Math.Vector4; + + /** + * Check whether this Vector is equal to a given Vector. + * + * Performs a strict quality check against each Vector's components. + * @param v The vector to check equality with. + */ + equals(v: Phaser.Math.Vector4): boolean; + + /** + * Set the `x`, `y`, `z` and `w` components of the this Vector to the given `x`, `y`, `z` and `w` values. + * @param x The x value to set for this Vector, or an object containing x, y, z and w components. + * @param y The y value to set for this Vector. + * @param z The z value to set for this Vector. + * @param w The z value to set for this Vector. + */ + set(x: number | object, y: number, z: number, w: number): Phaser.Math.Vector4; + + /** + * Add a given Vector to this Vector. Addition is component-wise. + * @param v The Vector to add to this Vector. + */ + add(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): Phaser.Math.Vector4; + + /** + * Subtract the given Vector from this Vector. Subtraction is component-wise. + * @param v The Vector to subtract from this Vector. + */ + subtract(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): Phaser.Math.Vector4; + + /** + * Scale this Vector by the given value. + * @param scale The value to scale this Vector by. + */ + scale(scale: number): Phaser.Math.Vector4; + + /** + * Calculate the length (or magnitude) of this Vector. + */ + length(): number; + + /** + * Calculate the length of this Vector squared. + */ + lengthSq(): number; + + /** + * Normalize this Vector. + * + * Makes the vector a unit length vector (magnitude of 1) in the same direction. + */ + normalize(): Phaser.Math.Vector4; + + /** + * Calculate the dot product of this Vector and the given Vector. + * @param v The Vector4 to dot product with this Vector4. + */ + dot(v: Phaser.Math.Vector4): number; + + /** + * Linearly interpolate between this Vector and the given Vector. + * + * Interpolates this Vector towards the given Vector. + * @param v The Vector4 to interpolate towards. + * @param t The interpolation percentage, between 0 and 1. Default 0. + */ + lerp(v: Phaser.Math.Vector4, t?: number): Phaser.Math.Vector4; + + /** + * Perform a component-wise multiplication between this Vector and the given Vector. + * + * Multiplies this Vector by the given Vector. + * @param v The Vector to multiply this Vector by. + */ + multiply(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): Phaser.Math.Vector4; + + /** + * Perform a component-wise division between this Vector and the given Vector. + * + * Divides this Vector by the given Vector. + * @param v The Vector to divide this Vector by. + */ + divide(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): Phaser.Math.Vector4; + + /** + * Calculate the distance between this Vector and the given Vector. + * @param v The Vector to calculate the distance to. + */ + distance(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): number; + + /** + * Calculate the distance between this Vector and the given Vector, squared. + * @param v The Vector to calculate the distance to. + */ + distanceSq(v: Phaser.Math.Vector2 | Phaser.Math.Vector3 | Phaser.Math.Vector4): number; + + /** + * Negate the `x`, `y`, `z` and `w` components of this Vector. + */ + negate(): Phaser.Math.Vector4; + + /** + * Transform this Vector with the given Matrix. + * @param mat The Matrix4 to transform this Vector4 with. + */ + transformMat4(mat: Phaser.Math.Matrix4): Phaser.Math.Vector4; + + /** + * Transform this Vector with the given Quaternion. + * @param q The Quaternion to transform this Vector with. + */ + transformQuat(q: Phaser.Math.Quaternion): Phaser.Math.Vector4; + + /** + * Make this Vector the zero vector (0, 0, 0, 0). + */ + reset(): Phaser.Math.Vector4; + + } + + /** + * Checks if the two values are within the given `tolerance` of each other. + * @param a The first value to use in the calculation. + * @param b The second value to use in the calculation. + * @param tolerance The tolerance. Anything equal to or less than this value is considered as being within range. + */ + function Within(a: number, b: number, tolerance: number): boolean; + + /** + * Wrap the given `value` between `min` and `max`. + * @param value The value to wrap. + * @param min The minimum value. + * @param max The maximum value. + */ + function Wrap(value: number, min: number, max: number): number; + + } + + /** + * The root types namespace. + */ + namespace Types { + namespace Actions { + type CallCallback = (item: Phaser.GameObjects.GameObject)=>void; + + type GridAlignConfig = { + /** + * The width of the grid in items (not pixels). -1 means lay all items out horizontally, regardless of quantity. + * If both this value and height are set to -1 then this value overrides it and the `height` value is ignored. + */ + width?: number; + /** + * The height of the grid in items (not pixels). -1 means lay all items out vertically, regardless of quantity. + * If both this value and `width` are set to -1 then `width` overrides it and this value is ignored. + */ + height?: number; + /** + * The width of the cell, in pixels, in which the item is positioned. + */ + cellWidth?: number; + /** + * The height of the cell, in pixels, in which the item is positioned. + */ + cellHeight?: number; + /** + * The alignment position. One of the Phaser.Display.Align consts such as `TOP_LEFT` or `RIGHT_CENTER`. + */ + position?: number; + /** + * Optionally place the top-left of the final grid at this coordinate. + */ + x?: number; + /** + * Optionally place the top-left of the final grid at this coordinate. + */ + y?: number; + }; + + } + + namespace Animations { + type Animation = { + /** + * The key that the animation will be associated with. i.e. sprite.animations.play(key) + */ + key?: string; + /** + * Either a string, in which case it will use all frames from a texture with the matching key, or an array of Animation Frame configuration objects. + */ + frames?: string | Phaser.Types.Animations.AnimationFrame[]; + /** + * If you provide a string for `frames` you can optionally have the frame names numerically sorted. + */ + sortFrames?: boolean; + /** + * The key of the texture all frames of the animation will use. Can be overridden on a per frame basis. + */ + defaultTextureKey?: string; + /** + * The frame rate of playback in frames per second (default 24 if duration is null) + */ + frameRate?: number; + /** + * How long the animation should play for in milliseconds. If not given its derived from frameRate. + */ + duration?: number; + /** + * Skip frames if the time lags, or always advanced anyway? + */ + skipMissedFrames?: boolean; + /** + * Delay before starting playback. Value given in milliseconds. + */ + delay?: number; + /** + * Number of times to repeat the animation (-1 for infinity) + */ + repeat?: number; + /** + * Delay before the animation repeats. Value given in milliseconds. + */ + repeatDelay?: number; + /** + * Should the animation yoyo? (reverse back down to the start) before repeating? + */ + yoyo?: boolean; + /** + * If this animation has a delay, should it show the first frame immediately (true), or only after the delay (false) + */ + showBeforeDelay?: boolean; + /** + * Should sprite.visible = true when the animation starts to play? This happens _after_ any delay, if set. + */ + showOnStart?: boolean; + /** + * Should sprite.visible = false when the animation finishes? + */ + hideOnComplete?: boolean; + /** + * Start playback of this animation from a randomly selected frame? + */ + randomFrame?: boolean; + }; + + type AnimationFrame = { + /** + * The key of the texture within the Texture Manager to use for this Animation Frame. + */ + key?: string; + /** + * The key, or index number, of the frame within the texture to use for this Animation Frame. + */ + frame?: string | number; + /** + * The duration, in ms, of this frame of the animation. + */ + duration?: number; + /** + * Should the parent Game Object be visible during this frame of the animation? + */ + visible?: boolean; + }; + + type GenerateFrameNames = { + /** + * The string to append to every resulting frame name if using a range or an array of `frames`. + */ + prefix?: string; + /** + * If `frames` is not provided, the number of the first frame to return. + */ + start?: number; + /** + * If `frames` is not provided, the number of the last frame to return. + */ + end?: number; + /** + * The string to append to every resulting frame name if using a range or an array of `frames`. + */ + suffix?: string; + /** + * The minimum expected lengths of each resulting frame's number. Numbers will be left-padded with zeroes until they are this long, then prepended and appended to create the resulting frame name. + */ + zeroPad?: number; + /** + * The array to append the created configuration objects to. + */ + outputArray?: Phaser.Types.Animations.AnimationFrame[]; + /** + * If provided as an array, the range defined by `start` and `end` will be ignored and these frame numbers will be used. + */ + frames?: boolean | number[]; + }; + + type GenerateFrameNumbers = { + /** + * The starting frame of the animation. + */ + start?: number; + /** + * The ending frame of the animation. + */ + end?: number; + /** + * A frame to put at the beginning of the animation, before `start` or `outputArray` or `frames`. + */ + first?: boolean | number; + /** + * An array to concatenate the output onto. + */ + outputArray?: Phaser.Types.Animations.AnimationFrame[]; + /** + * A custom sequence of frames. + */ + frames?: boolean | number[]; + }; + + type JSONAnimation = { + /** + * The key that the animation will be associated with. i.e. sprite.animations.play(key) + */ + key: string; + /** + * A frame based animation (as opposed to a bone based animation) + */ + type: string; + /** + * An array of the AnimationFrame objects inside this Animation. + */ + frames: Phaser.Types.Animations.JSONAnimationFrame[]; + /** + * The frame rate of playback in frames per second (default 24 if duration is null) + */ + frameRate: number; + /** + * How long the animation should play for in milliseconds. If not given its derived from frameRate. + */ + duration: number; + /** + * Skip frames if the time lags, or always advanced anyway? + */ + skipMissedFrames: boolean; + /** + * Delay before starting playback. Value given in milliseconds. + */ + delay: number; + /** + * Number of times to repeat the animation (-1 for infinity) + */ + repeat: number; + /** + * Delay before the animation repeats. Value given in milliseconds. + */ + repeatDelay: number; + /** + * Should the animation yoyo? (reverse back down to the start) before repeating? + */ + yoyo: boolean; + /** + * If this animation has a delay, should it show the first frame immediately (true), or only after the delay (false) + */ + showBeforeDelay: boolean; + /** + * Should sprite.visible = true when the animation starts to play? + */ + showOnStart: boolean; + /** + * Should sprite.visible = false when the animation finishes? + */ + hideOnComplete: boolean; + /** + * Start playback of this animation from a randomly selected frame? + */ + randomFrame?: boolean; + }; + + type JSONAnimationFrame = { + /** + * The key of the Texture this AnimationFrame uses. + */ + key: string; + /** + * The key of the Frame within the Texture that this AnimationFrame uses. + */ + frame: string | number; + /** + * Additional time (in ms) that this frame should appear for during playback. + */ + duration: number; + }; + + type JSONAnimations = { + /** + * An array of all Animations added to the Animation Manager. + */ + anims: Phaser.Types.Animations.JSONAnimation[]; + /** + * The global time scale of the Animation Manager. + */ + globalTimeScale: number; + }; + + type PlayAnimationConfig = { + /** + * The string-based key of the animation to play, or an Animation instance. + */ + key: string | Phaser.Animations.Animation; + /** + * The frame rate of playback in frames per second (default 24 if duration is null) + */ + frameRate?: number; + /** + * How long the animation should play for in milliseconds. If not given its derived from frameRate. + */ + duration?: number; + /** + * Delay before starting playback. Value given in milliseconds. + */ + delay?: number; + /** + * Number of times to repeat the animation (-1 for infinity) + */ + repeat?: number; + /** + * Delay before the animation repeats. Value given in milliseconds. + */ + repeatDelay?: number; + /** + * Should the animation yoyo? (reverse back down to the start) before repeating? + */ + yoyo?: boolean; + /** + * If this animation has a delay, should it show the first frame immediately (true), or only after the delay (false) + */ + showBeforeDelay?: boolean; + /** + * Should sprite.visible = true when the animation starts to play? + */ + showOnStart?: boolean; + /** + * Should sprite.visible = false when the animation finishes? + */ + hideOnComplete?: boolean; + /** + * Skip frames if the time lags, or always advanced anyway? + */ + skipMissedFrames?: boolean; + /** + * The frame of the animation to start playback from. + */ + startFrame?: number; + /** + * The time scale to be applied to playback of this animation. + */ + timeScale?: number; + /** + * Start playback of this animation from a randomly selected frame? + */ + randomFrame?: boolean; + }; + + } + + namespace Cameras { + namespace Scene2D { + type CameraConfig = { + /** + * The name of the Camera. + */ + name?: string; + /** + * The horizontal position of the Camera viewport. + */ + x?: number; + /** + * The vertical position of the Camera viewport. + */ + y?: number; + /** + * The width of the Camera viewport. + */ + width?: number; + /** + * The height of the Camera viewport. + */ + height?: number; + /** + * The default zoom level of the Camera. + */ + zoom?: number; + /** + * The rotation of the Camera, in radians. + */ + rotation?: number; + /** + * Should the Camera round pixels before rendering? + */ + roundPixels?: boolean; + /** + * The horizontal scroll position of the Camera. + */ + scrollX?: number; + /** + * The vertical scroll position of the Camera. + */ + scrollY?: number; + /** + * A CSS color string controlling the Camera background color. + */ + backgroundColor?: false | string; + /** + * Defines the Camera bounds. + */ + bounds?: object | null; + /** + * The top-left extent of the Camera bounds. + */ + "bounds.x"?: number; + /** + * The top-left extent of the Camera bounds. + */ + "bounds.y"?: number; + /** + * The width of the Camera bounds. + */ + "bounds.width"?: number; + /** + * The height of the Camera bounds. + */ + "bounds.height"?: number; + }; + + type CameraFadeCallback = (camera: Phaser.Cameras.Scene2D.Camera, progress: number)=>void; + + type CameraFlashCallback = (camera: Phaser.Cameras.Scene2D.Camera, progress: number)=>void; + + type CameraPanCallback = (camera: Phaser.Cameras.Scene2D.Camera, progress: number, x: number, y: number)=>void; + + type CameraShakeCallback = (camera: Phaser.Cameras.Scene2D.Camera, progress: number)=>void; + + type CameraZoomCallback = (camera: Phaser.Cameras.Scene2D.Camera, progress: number, zoom: number)=>void; + + type JSONCamera = { + /** + * The name of the camera + */ + name: string; + /** + * The horizontal position of camera + */ + x: number; + /** + * The vertical position of camera + */ + y: number; + /** + * The width size of camera + */ + width: number; + /** + * The height size of camera + */ + height: number; + /** + * The zoom of camera + */ + zoom: number; + /** + * The rotation of camera + */ + rotation: number; + /** + * The round pixels st status of camera + */ + roundPixels: boolean; + /** + * The horizontal scroll of camera + */ + scrollX: number; + /** + * The vertical scroll of camera + */ + scrollY: number; + /** + * The background color of camera + */ + backgroundColor: string; + /** + * The bounds of camera + */ + bounds?: Phaser.Types.Cameras.Scene2D.JSONCameraBounds | undefined; + }; + + type JSONCameraBounds = { + /** + * The horizontal position of camera + */ + x: number; + /** + * The vertical position of camera + */ + y: number; + /** + * The width size of camera + */ + width: number; + /** + * The height size of camera + */ + height: number; + }; + + } + + namespace Controls { + type FixedKeyControlConfig = { + /** + * The Camera that this Control will update. + */ + camera?: Phaser.Cameras.Scene2D.Camera; + /** + * The Key to be pressed that will move the Camera left. + */ + left?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will move the Camera right. + */ + right?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will move the Camera up. + */ + up?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will move the Camera down. + */ + down?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will zoom the Camera in. + */ + zoomIn?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will zoom the Camera out. + */ + zoomOut?: Phaser.Input.Keyboard.Key; + /** + * The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed. + */ + zoomSpeed?: number; + /** + * The horizontal and vertical speed the camera will move. + */ + speed?: number | Object; + /** + * The smallest zoom value the camera will reach when zoomed out. + */ + minZoom?: number; + /** + * The largest zoom value the camera will reach when zoomed in. + */ + maxZoom?: number; + }; + + type SmoothedKeyControlConfig = { + /** + * The Camera that this Control will update. + */ + camera?: Phaser.Cameras.Scene2D.Camera; + /** + * The Key to be pressed that will move the Camera left. + */ + left?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will move the Camera right. + */ + right?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will move the Camera up. + */ + up?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will move the Camera down. + */ + down?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will zoom the Camera in. + */ + zoomIn?: Phaser.Input.Keyboard.Key; + /** + * The Key to be pressed that will zoom the Camera out. + */ + zoomOut?: Phaser.Input.Keyboard.Key; + /** + * The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed. + */ + zoomSpeed?: number; + /** + * The horizontal and vertical acceleration the camera will move. + */ + acceleration?: number | Object; + /** + * The horizontal and vertical drag applied to the camera when it is moving. + */ + drag?: number | Object; + /** + * The maximum horizontal and vertical speed the camera will move. + */ + maxSpeed?: number | Object; + /** + * The smallest zoom value the camera will reach when zoomed out. + */ + minZoom?: number; + /** + * The largest zoom value the camera will reach when zoomed in. + */ + maxZoom?: number; + }; + + } + + } + + namespace Core { + /** + * Config object containing various sound settings. + */ + type AudioConfig = { + /** + * Use HTML5 Audio instead of Web Audio. + */ + disableWebAudio?: boolean; + /** + * An existing Web Audio context. + */ + context?: AudioContext; + /** + * Disable all audio output. + */ + noAudio?: boolean; + }; + + type BannerConfig = { + /** + * Omit Phaser's name and version from the banner. + */ + hidePhaser?: boolean; + /** + * The color of the banner text. + */ + text?: string; + /** + * The background colors of the banner. + */ + background?: string[]; + }; + + type BootCallback = (game: Phaser.Game)=>void; + + type CallbacksConfig = { + /** + * A function to run at the start of the boot sequence. + */ + preBoot?: Phaser.Types.Core.BootCallback; + /** + * A function to run at the end of the boot sequence. At this point, all the game systems have started and plugins have been loaded. + */ + postBoot?: Phaser.Types.Core.BootCallback; + }; + + type DOMContainerConfig = { + /** + * Should the game create a div element to act as a DOM Container? Only enable if you're using DOM Element objects. You must provide a parent object if you use this feature. + */ + createContainer?: boolean; + /** + * Should the DOM Container that is created (if `dom.createContainer` is true) be positioned behind (true) or over the top (false, the default) of the game canvas? + */ + behindCanvas?: boolean; + /** + * The default `pointerEvents` attribute set on the DOM Container. + */ + pointerEvents?: string; + }; + + type FPSConfig = { + /** + * The minimum acceptable rendering rate, in frames per second. + */ + min?: number; + /** + * The optimum rendering rate, in frames per second. This does not enforce the fps rate, it merely tells Phaser what rate is considered optimal for this game. + */ + target?: number; + /** + * Enforces an fps rate limit that the game step will run at, regardless of browser frequency. 0 means 'no limit'. Never set this higher than RAF can handle. + */ + limit?: number; + /** + * Use setTimeout instead of requestAnimationFrame to run the game loop. + */ + forceSetTimeOut?: boolean; + /** + * Calculate the average frame delta from this many consecutive frame intervals. + */ + deltaHistory?: number; + /** + * The amount of frames the time step counts before we trust the delta values again. + */ + panicMax?: number; + /** + * Apply delta smoothing during the game update to help avoid spikes? + */ + smoothStep?: boolean; + }; + + type GameConfig = { + /** + * The width of the game, in game pixels. + */ + width?: number | string; + /** + * The height of the game, in game pixels. + */ + height?: number | string; + /** + * Simple scale applied to the game canvas. 2 is double size, 0.5 is half size, etc. + */ + zoom?: number; + /** + * Which renderer to use. Phaser.AUTO, Phaser.CANVAS, Phaser.HEADLESS, or Phaser.WEBGL. AUTO picks WEBGL if available, otherwise CANVAS. + */ + type?: number; + /** + * `true` or `1` = Use the built-in StableSort (needed for older browsers), `false` or `0` = Rely on ES2019 Array.sort being stable (modern browsers only), or `-1` = Try and determine this automatically based on browser inspection (not guaranteed to work, errs on side of caution). + */ + stableSort?: number | boolean; + /** + * The DOM element that will contain the game canvas, or its `id`. If undefined, or if the named element doesn't exist, the game canvas is appended to the document body. If `null` no parent will be used and you are responsible for adding the canvas to the dom. + */ + parent?: HTMLElement | string; + /** + * Provide your own Canvas element for Phaser to use instead of creating one. + */ + canvas?: HTMLCanvasElement; + /** + * CSS styles to apply to the game canvas instead of Phasers default styles. + */ + canvasStyle?: string; + /** + * Is Phaser running under a custom (non-native web) environment? If so, set this to `true` to skip internal Feature detection. If `true` the `renderType` cannot be left as `AUTO`. + */ + customEnvironment?: boolean; + /** + * Provide your own Canvas Context for Phaser to use, instead of creating one. + */ + context?: CanvasRenderingContext2D; + /** + * A scene or scenes to add to the game. If several are given, the first is started; the remainder are started only if they have `{ active: true }`. See the `sceneConfig` argument in `Phaser.Scenes.SceneManager#add`. + */ + scene?: Phaser.Types.Scenes.SceneType | Phaser.Types.Scenes.SceneType[]; + /** + * Seed for the random number generator. + */ + seed?: string[]; + /** + * The title of the game. Shown in the browser console. + */ + title?: string; + /** + * The URL of the game. Shown in the browser console. + */ + url?: string; + /** + * The version of the game. Shown in the browser console. + */ + version?: string; + /** + * Automatically call window.focus() when the game boots. Usually necessary to capture input events if the game is in a separate frame. + */ + autoFocus?: boolean; + /** + * Input configuration, or `false` to disable all game input. + */ + input?: boolean | Phaser.Types.Core.InputConfig; + /** + * Disable the browser's default 'contextmenu' event (usually triggered by a right-button mouse click). + */ + disableContextMenu?: boolean; + /** + * Configuration for the banner printed in the browser console when the game starts. + */ + banner?: boolean | Phaser.Types.Core.BannerConfig; + /** + * The DOM Container configuration object. + */ + dom?: Phaser.Types.Core.DOMContainerConfig; + /** + * Game loop configuration. + */ + fps?: Phaser.Types.Core.FPSConfig; + /** + * Game renderer configuration. + */ + render?: Phaser.Types.Core.RenderConfig; + /** + * Optional callbacks to run before or after game boot. + */ + callbacks?: Phaser.Types.Core.CallbacksConfig; + /** + * Loader configuration. + */ + loader?: Phaser.Types.Core.LoaderConfig; + /** + * Images configuration. + */ + images?: Phaser.Types.Core.ImagesConfig; + /** + * Physics configuration. + */ + physics?: Phaser.Types.Core.PhysicsConfig; + /** + * Plugins to install. + */ + plugins?: Phaser.Types.Core.PluginObject | Phaser.Types.Core.PluginObjectItem[]; + /** + * The Scale Manager configuration. + */ + scale?: Phaser.Types.Core.ScaleConfig; + /** + * The Audio Configuration object. + */ + audio?: Phaser.Types.Core.AudioConfig; + /** + * A WebGL Pipeline configuration object. Can also be part of the `RenderConfig`. + */ + pipeline?: Phaser.Types.Core.PipelineConfig; + /** + * The background color of the game canvas. The default is black. + */ + backgroundColor?: string | number; + /** + * When set to `true`, WebGL uses linear interpolation to draw scaled or rotated textures, giving a smooth appearance. When set to `false`, WebGL uses nearest-neighbor interpolation, giving a crisper appearance. `false` also disables antialiasing of the game canvas itself, if the browser supports it, when the game canvas is scaled. + */ + antialias?: boolean; + /** + * Sets the `antialias` property when the WebGL context is created. Setting this value does not impact any subsequent textures that are created, or the canvas style attributes. + */ + antialiasGL?: boolean; + /** + * When set to `true` it will create a desynchronized context for both 2D and WebGL. See https://developers.google.com/web/updates/2019/05/desynchronized for details. + */ + desynchronized?: boolean; + /** + * Sets `antialias` to false and `roundPixels` to true. This is the best setting for pixel-art games. + */ + pixelArt?: boolean; + /** + * Draw texture-based Game Objects at only whole-integer positions. Game Objects without textures, like Graphics, ignore this property. + */ + roundPixels?: boolean; + /** + * Whether the game canvas will be transparent. Boolean that indicates if the canvas contains an alpha channel. If set to false, the browser now knows that the backdrop is always opaque, which can speed up drawing of transparent content and images. + */ + transparent?: boolean; + /** + * Whether the game canvas will be cleared between each rendering frame. + */ + clearBeforeRender?: boolean; + /** + * If the value is true the WebGL buffers will not be cleared and will preserve their values until cleared or overwritten by the author. + */ + preserveDrawingBuffer?: boolean; + /** + * In WebGL mode, the drawing buffer contains colors with pre-multiplied alpha. + */ + premultipliedAlpha?: boolean; + /** + * Let the browser abort creating a WebGL context if it judges performance would be unacceptable. + */ + failIfMajorPerformanceCaveat?: boolean; + /** + * "high-performance", "low-power" or "default". A hint to the browser on how much device power the game might use. + */ + powerPreference?: string; + /** + * The default WebGL batch size. Represents the number of _quads_ that can be added to a single batch. + */ + batchSize?: number; + /** + * The maximum number of lights allowed to be visible within range of a single Camera in the LightManager. + */ + maxLights?: number; + /** + * When in WebGL mode, this sets the maximum number of GPU Textures to use. The default, -1, will use all available units. The WebGL1 spec says all browsers should provide a minimum of 8. + */ + maxTextures?: number; + /** + * The mipmap magFilter to be used when creating WebGL textures. + */ + mipmapFilter?: string; + /** + * Automatically enable the Mobile Pipeline if iOS or Android detected? + */ + autoMobilePipeline?: boolean; + /** + * The WebGL Pipeline that Game Objects will use by default. Set to 'MultiPipeline' as standard. + */ + defaultPipeline?: string; + /** + * Is the Scale Manager allowed to adjust the CSS height property of the parent and/or document body to be 100%? + */ + expandParent?: boolean; + /** + * The scale mode. + */ + mode?: Phaser.Scale.ScaleModeType; + /** + * The minimum width and height the canvas can be scaled down to. + */ + min?: WidthHeight; + /** + * The maximum width the canvas can be scaled up to. + */ + max?: WidthHeight; + /** + * Automatically round the display and style sizes of the canvas. This can help with performance in lower-powered devices. + */ + autoRound?: boolean; + /** + * Automatically center the canvas within the parent? + */ + autoCenter?: Phaser.Scale.CenterType; + /** + * How many ms should elapse before checking if the browser size has changed? + */ + resizeInterval?: number; + /** + * The DOM element that will be sent into full screen mode, or its `id`. If undefined Phaser will create its own div and insert the canvas into it when entering fullscreen mode. + */ + fullscreenTarget?: HTMLElement | string | null; + /** + * Disables the automatic creation of the Pre FX Pipelines. If disabled, you cannot use the built-in Pre FX on Game Objects. + */ + disablePreFX?: boolean; + /** + * Disables the automatic creation of the Post FX Pipelines. If disabled, you cannot use the built-in Post FX on Game Objects. + */ + disablePostFX?: boolean; + }; + + type GamepadInputConfig = { + /** + * Where the Gamepad Manager listens for gamepad input events. + */ + target?: any; + }; + + type ImagesConfig = { + /** + * A base64 encoded image file to use as the 'default' texture. + */ + default?: string; + /** + * A base64 encoded image file to use as the 'missing' texture. + */ + missing?: string; + /** + * A base64 encoded image file to use as the 'white' texture. + */ + white?: string; + }; + + type InputConfig = { + /** + * Keyboard input configuration. `true` uses the default configuration and `false` disables keyboard input. + */ + keyboard?: boolean | Phaser.Types.Core.KeyboardInputConfig; + /** + * Mouse input configuration. `true` uses the default configuration and `false` disables mouse input. + */ + mouse?: boolean | Phaser.Types.Core.MouseInputConfig; + /** + * Touch input configuration. `true` uses the default configuration and `false` disables touch input. + */ + touch?: boolean | Phaser.Types.Core.TouchInputConfig; + /** + * Gamepad input configuration. `true` enables gamepad input. + */ + gamepad?: boolean | Phaser.Types.Core.GamepadInputConfig; + /** + * The maximum number of touch pointers. See {@link Phaser.Input.InputManager#pointers}. + */ + activePointers?: number; + /** + * The smoothing factor to apply during Pointer movement. See {@link Phaser.Input.Pointer#smoothFactor}. + */ + smoothFactor?: number; + /** + * Should Phaser listen for input events on the Window? If you disable this, events like 'POINTER_UP_OUTSIDE' will no longer fire. + */ + windowEvents?: boolean; + }; + + type KeyboardInputConfig = { + /** + * Where the Keyboard Manager listens for keyboard input events. + */ + target?: any; + /** + * `preventDefault` will be called on every non-modified key which has a key code in this array. By default it is empty. + */ + capture?: number[] | null; + }; + + type LoaderConfig = { + /** + * A URL used to resolve paths given to the loader. Example: 'http://labs.phaser.io/assets/'. + */ + baseURL?: string; + /** + * A URL path used to resolve relative paths given to the loader. Example: 'images/sprites/'. + */ + path?: string; + /** + * The maximum number of resources the loader will start loading at once. + */ + maxParallelDownloads?: number; + /** + * 'anonymous', 'use-credentials', or `undefined`. If you're not making cross-origin requests, leave this as `undefined`. See {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes}. + */ + crossOrigin?: string | undefined; + /** + * The response type of the XHR request, e.g. `blob`, `text`, etc. + */ + responseType?: string; + /** + * Should the XHR request use async or not? + */ + async?: boolean; + /** + * Optional username for all XHR requests. + */ + user?: string; + /** + * Optional password for all XHR requests. + */ + password?: string; + /** + * Optional XHR timeout value, in ms. + */ + timeout?: number; + /** + * An optional array of schemes that the Loader considers as being 'local' files. Defaults to: `[ 'file://', 'capacitor://' ]` if not specified. + */ + localScheme?: string[]; + }; + + type MouseInputConfig = { + /** + * Where the Mouse Manager listens for mouse input events. The default is the game canvas. + */ + target?: any; + /** + * If `true` the DOM `mousedown` event will have `preventDefault` set. + */ + preventDefaultDown?: boolean; + /** + * If `true` the DOM `mouseup` event will have `preventDefault` set. + */ + preventDefaultUp?: boolean; + /** + * If `true` the DOM `mousemove` event will have `preventDefault` set. + */ + preventDefaultMove?: boolean; + /** + * If `true` the DOM `wheel` event will have `preventDefault` set. + */ + preventDefaultWheel?: boolean; + }; + + /** + * This callback type is completely empty, a no-operation. + */ + type NOOP = ()=>void; + + type PhysicsConfig = { + /** + * The default physics system. It will be started for each scene. Phaser provides 'arcade', 'impact', and 'matter'. + */ + default?: string; + /** + * Arcade Physics configuration. + */ + arcade?: Phaser.Types.Physics.Arcade.ArcadeWorldConfig; + /** + * Matter Physics configuration. + */ + matter?: Phaser.Types.Physics.Matter.MatterWorldConfig; + }; + + type PipelineConfig = { + /** + * The name of the pipeline. Must be unique within the Pipeline Manager. + */ + name: string; + /** + * The pipeline class. This should be a constructable object, **not** an instance of a class. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + /** + * Sets the `PipelineManager.frameInc` value to control the dimension increase in the Render Targets. + */ + frameInc?: number; + }; + + type PluginObject = { + /** + * Global plugins to install. + */ + global?: Phaser.Types.Core.PluginObjectItem[] | null; + /** + * Scene plugins to install. + */ + scene?: Phaser.Types.Core.PluginObjectItem[] | null; + /** + * The default set of scene plugins (names). + */ + default?: string[]; + /** + * Plugins to *add* to the default set of scene plugins. + */ + defaultMerge?: string[]; + }; + + type PluginObjectItem = { + /** + * A key to identify the plugin in the Plugin Manager. + */ + key?: string; + /** + * The plugin itself. Usually a class/constructor. + */ + plugin?: any; + /** + * Whether the plugin should be started automatically. + */ + start?: boolean; + /** + * For a scene plugin, add the plugin to the scene's systems object under this key (`this.sys.KEY`, from the scene). + */ + systemKey?: string; + /** + * For a scene plugin, add the plugin to the scene object under this key (`this.KEY`, from the scene). + */ + sceneKey?: string; + /** + * If this plugin is to be injected into the Scene Systems, this is the property key map used. + */ + mapping?: string; + /** + * Arbitrary data passed to the plugin's init() method. + */ + data?: any; + }; + + type RenderConfig = { + /** + * When set to `true`, WebGL uses linear interpolation to draw scaled or rotated textures, giving a smooth appearance. When set to `false`, WebGL uses nearest-neighbor interpolation, giving a crisper appearance. `false` also disables antialiasing of the game canvas itself, if the browser supports it, when the game canvas is scaled. + */ + antialias?: boolean; + /** + * Sets the `antialias` property when the WebGL context is created. Setting this value does not impact any subsequent textures that are created, or the canvas style attributes. + */ + antialiasGL?: boolean; + /** + * When set to `true` it will create a desynchronized context for both 2D and WebGL. See https://developers.google.com/web/updates/2019/05/desynchronized for details. + */ + desynchronized?: boolean; + /** + * Sets `antialias` to false and `roundPixels` to true. This is the best setting for pixel-art games. + */ + pixelArt?: boolean; + /** + * Draw texture-based Game Objects at only whole-integer positions. Game Objects without textures, like Graphics, ignore this property. + */ + roundPixels?: boolean; + /** + * Whether the game canvas will be transparent. Boolean that indicates if the canvas contains an alpha channel. If set to false, the browser now knows that the backdrop is always opaque, which can speed up drawing of transparent content and images. + */ + transparent?: boolean; + /** + * Whether the game canvas will be cleared between each rendering frame. + */ + clearBeforeRender?: boolean; + /** + * If the value is true the WebGL buffers will not be cleared and will preserve their values until cleared or overwritten by the author. + */ + preserveDrawingBuffer?: boolean; + /** + * In WebGL mode, the drawing buffer contains colors with pre-multiplied alpha. + */ + premultipliedAlpha?: boolean; + /** + * Let the browser abort creating a WebGL context if it judges performance would be unacceptable. + */ + failIfMajorPerformanceCaveat?: boolean; + /** + * "high-performance", "low-power" or "default". A hint to the browser on how much device power the game might use. + */ + powerPreference?: string; + /** + * The default WebGL batch size. Represents the number of _quads_ that can be added to a single batch. + */ + batchSize?: number; + /** + * The maximum number of lights allowed to be visible within range of a single Camera in the LightManager. + */ + maxLights?: number; + /** + * When in WebGL mode, this sets the maximum number of GPU Textures to use. The default, -1, will use all available units. The WebGL1 spec says all browsers should provide a minimum of 8. + */ + maxTextures?: number; + /** + * The mipmap magFilter to be used when creating WebGL textures. Don't set unless you wish to create mipmaps. Set to one of the following: 'NEAREST', 'LINEAR', 'NEAREST_MIPMAP_NEAREST', 'LINEAR_MIPMAP_NEAREST', 'NEAREST_MIPMAP_LINEAR' or 'LINEAR_MIPMAP_LINEAR'. + */ + mipmapFilter?: string; + /** + * The WebGL Pipeline configuration object. + */ + pipeline?: Phaser.Types.Core.PipelineConfig | Phaser.Renderer.WebGL.WebGLPipeline[]; + /** + * Automatically enable the Mobile Pipeline if iOS or Android detected? + */ + autoMobilePipeline?: boolean; + /** + * The WebGL Pipeline that Game Objects will use by default. Set to 'MultiPipeline' as standard. + */ + defaultPipeline?: string; + }; + + type ScaleConfig = { + /** + * The base width of your game. Can be an integer or a string: '100%'. If a string it will only work if you have set a parent element that has a size. + */ + width?: number | string; + /** + * The base height of your game. Can be an integer or a string: '100%'. If a string it will only work if you have set a parent element that has a size. + */ + height?: number | string; + /** + * The zoom value of the game canvas. + */ + zoom?: Phaser.Scale.ZoomType | number; + /** + * The DOM element that will contain the game canvas, or its `id`. If undefined, or if the named element doesn't exist, the game canvas is inserted directly into the document body. If `null` no parent will be used and you are responsible for adding the canvas to your environment. + */ + parent?: HTMLElement | string | null; + /** + * Is the Scale Manager allowed to adjust the CSS height property of the parent and/or document body to be 100%? + */ + expandParent?: boolean; + /** + * The scale mode. + */ + mode?: Phaser.Scale.ScaleModeType; + /** + * The minimum width and height the canvas can be scaled down to. + */ + min?: WidthHeight; + /** + * The maximum width the canvas can be scaled up to. + */ + max?: WidthHeight; + /** + * Set the snapping values used by the Scale Manager when resizing the canvas. See `ScaleManager.setSnap` for details. + */ + snap?: WidthHeight; + /** + * Automatically round the display and style sizes of the canvas. This can help with performance in lower-powered devices. + */ + autoRound?: boolean; + /** + * Automatically center the canvas within the parent? + */ + autoCenter?: Phaser.Scale.CenterType; + /** + * How many ms should elapse before checking if the browser size has changed? + */ + resizeInterval?: number; + /** + * The DOM element that will be sent into full screen mode, or its `id`. If undefined Phaser will create its own div and insert the canvas into it when entering fullscreen mode. + */ + fullscreenTarget?: HTMLElement | string | null; + }; + + type TimeStepCallback = (time: number, average: number)=>void; + + type TouchInputConfig = { + /** + * Where the Touch Manager listens for touch input events. The default is the game canvas. + */ + target?: any; + /** + * Whether touch input events have preventDefault() called on them. + */ + capture?: boolean; + }; + + type WidthHeight = { + /** + * The width. + */ + width?: number; + /** + * The height. + */ + height?: number; + }; + + } + + namespace Create { + type GenerateTextureCallback = (canvas: HTMLCanvasElement, context: CanvasRenderingContext2D)=>void; + + type GenerateTextureConfig = { + /** + * An array of data, where each row is a string of single values 0-9A-F, or the period character. + */ + data?: any[]; + /** + * The HTML Canvas to draw the texture to. + */ + canvas?: HTMLCanvasElement; + /** + * The indexed palette that the data cell values map to. + */ + palette?: Phaser.Types.Create.Palette; + /** + * The width of each 'pixel' in the generated texture. + */ + pixelWidth?: number; + /** + * The height of each 'pixel' in the generated texture. + */ + pixelHeight?: number; + /** + * Should the canvas be resized before the texture is drawn? + */ + resizeCanvas?: boolean; + /** + * Should the canvas be cleared before the texture is drawn? + */ + clearCanvas?: boolean; + /** + * A callback to send the canvas to prior to the texture being drawn. + */ + preRender?: Phaser.Types.Create.GenerateTextureCallback; + /** + * A callback to send the canvas to after the texture has been drawn. + */ + postRender?: Phaser.Types.Create.GenerateTextureCallback; + }; + + type Palette = { + /** + * Color value 1. + */ + "0": string; + /** + * Color value 2. + */ + "1": string; + /** + * Color value 3. + */ + "2": string; + /** + * Color value 4. + */ + "3": string; + /** + * Color value 5. + */ + "4": string; + /** + * Color value 6. + */ + "5": string; + /** + * Color value 7. + */ + "6": string; + /** + * Color value 8. + */ + "7": string; + /** + * Color value 9. + */ + "8": string; + /** + * Color value 10. + */ + "9": string; + /** + * Color value 11. + */ + A: string; + /** + * Color value 12. + */ + B: string; + /** + * Color value 13. + */ + C: string; + /** + * Color value 14. + */ + D: string; + /** + * Color value 15. + */ + E: string; + /** + * Color value 16. + */ + F: string; + }; + + } + + namespace Curves { + type EllipseCurveConfig = { + /** + * The x coordinate of the ellipse. + */ + x?: number; + /** + * The y coordinate of the ellipse. + */ + y?: number; + /** + * The horizontal radius of the ellipse. + */ + xRadius?: number; + /** + * The vertical radius of the ellipse. + */ + yRadius?: number; + /** + * The start angle of the ellipse, in degrees. + */ + startAngle?: number; + /** + * The end angle of the ellipse, in degrees. + */ + endAngle?: number; + /** + * Sets if the the ellipse rotation is clockwise (true) or anti-clockwise (false) + */ + clockwise?: boolean; + /** + * The rotation of the ellipse, in degrees. + */ + rotation?: number; + }; + + type JSONCurve = { + /** + * The of the curve + */ + type: string; + /** + * The arrays of points like `[x1, y1, x2, y2]` + */ + points: number[]; + }; + + type JSONEllipseCurve = { + /** + * The of the curve. + */ + type: string; + /** + * The x coordinate of the ellipse. + */ + x: number; + /** + * The y coordinate of the ellipse. + */ + y: number; + /** + * The horizontal radius of ellipse. + */ + xRadius: number; + /** + * The vertical radius of ellipse. + */ + yRadius: number; + /** + * The start angle of the ellipse, in degrees. + */ + startAngle: number; + /** + * The end angle of the ellipse, in degrees. + */ + endAngle: number; + /** + * Sets if the the ellipse rotation is clockwise (true) or anti-clockwise (false) + */ + clockwise: boolean; + /** + * The rotation of ellipse, in degrees. + */ + rotation: number; + }; + + type JSONPath = { + /** + * The of the curve. + */ + type: string; + /** + * The X coordinate of the curve's starting point. + */ + x: number; + /** + * The Y coordinate of the path's starting point. + */ + y: number; + /** + * The path is auto closed. + */ + autoClose: boolean; + /** + * The list of the curves + */ + curves: Phaser.Types.Curves.JSONCurve[]; + }; + + } + + namespace Display { + type ColorObject = { + /** + * The red color value in the range 0 to 255. + */ + r: number; + /** + * The green color value in the range 0 to 255. + */ + g: number; + /** + * The blue color value in the range 0 to 255. + */ + b: number; + /** + * The alpha color value in the range 0 to 255. + */ + a: number; + /** + * The combined color value. + */ + color: number; + }; + + type HSVColorObject = { + /** + * The hue color value. A number between 0 and 1 + */ + h: number; + /** + * The saturation color value. A number between 0 and 1 + */ + s: number; + /** + * The lightness color value. A number between 0 and 1 + */ + v: number; + }; + + type InputColorObject = { + /** + * The red color value in the range 0 to 255. + */ + r?: number; + /** + * The green color value in the range 0 to 255. + */ + g?: number; + /** + * The blue color value in the range 0 to 255. + */ + b?: number; + /** + * The alpha color value in the range 0 to 255. + */ + a?: number; + }; + + } + + namespace GameObjects { + namespace BitmapText { + /** + * The font data for an individual character of a Bitmap Font. + * + * Describes the character's position, size, offset and kerning. + * + * As of version 3.50 it also includes the WebGL texture uv data. + */ + type BitmapFontCharacterData = { + /** + * The x position of the character. + */ + x: number; + /** + * The y position of the character. + */ + y: number; + /** + * The width of the character. + */ + width: number; + /** + * The height of the character. + */ + height: number; + /** + * The center x position of the character. + */ + centerX: number; + /** + * The center y position of the character. + */ + centerY: number; + /** + * The x offset of the character. + */ + xOffset: number; + /** + * The y offset of the character. + */ + yOffset: number; + /** + * WebGL texture u0. + */ + u0: number; + /** + * WebGL texture v0. + */ + v0: number; + /** + * WebGL texture u1. + */ + u1: number; + /** + * WebGL texture v1. + */ + v1: number; + /** + * Extra data for the character. + */ + data: object; + /** + * Kerning values, keyed by character code. + */ + kerning: {[key: string]: number}; + }; + + /** + * Bitmap Font data that can be used by a BitmapText Game Object. + */ + type BitmapFontData = { + /** + * The name of the font. + */ + font: string; + /** + * The size of the font. + */ + size: number; + /** + * The line height of the font. + */ + lineHeight: number; + /** + * Whether this font is a retro font (monospace). + */ + retroFont: boolean; + /** + * The character data of the font, keyed by character code. Each character datum includes a position, size, offset and more. + */ + chars: {[key: number]: Phaser.Types.GameObjects.BitmapText.BitmapFontCharacterData}; + }; + + /** + * A single entry from the `BitmapTextSize` characters array. + * + * The position and dimensions take the font size into account, + * but are not translated into the local space of the Game Object itself. + */ + type BitmapTextCharacter = { + /** + * The index of this character within the BitmapText wrapped text string. + */ + i: number; + /** + * The index of this character within the BitmapText text string. + */ + idx: number; + /** + * The character. + */ + char: string; + /** + * The character code of the character. + */ + code: number; + /** + * The x position of the character in the BitmapText. + */ + x: number; + /** + * The y position of the character in the BitmapText. + */ + y: number; + /** + * The width of the character. + */ + w: number; + /** + * The height of the character. + */ + h: number; + /** + * The top of the line this character is on. + */ + t: number; + /** + * The right-most point of this character, including xAdvance. + */ + r: number; + /** + * The bottom of the line this character is on. + */ + b: number; + /** + * The line number the character appears on. + */ + line: number; + /** + * Reference to the glyph object this character is using. + */ + glyph: Phaser.Types.GameObjects.BitmapText.BitmapFontCharacterData; + }; + + type BitmapTextConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key of the font to use from the BitmapFont cache. + */ + font?: string; + /** + * The string, or array of strings, to be set as the content of this Bitmap Text. + */ + text?: string; + /** + * The font size to set. + */ + size?: number | false; + }; + + /** + * Details about the line data in the `BitmapTextSize` object. + */ + type BitmapTextLines = { + /** + * The width of the shortest line of text. + */ + shortest: number; + /** + * The width of the longest line of text. + */ + longest: number; + /** + * The height of a line of text. + */ + height: number; + /** + * An array where each entry contains the length of that line of text. + */ + lengths: number[]; + }; + + type BitmapTextSize = { + /** + * The position and size of the BitmapText, taking into account the position and scale of the Game Object. + */ + global: Phaser.Types.GameObjects.BitmapText.GlobalBitmapTextSize; + /** + * The position and size of the BitmapText, taking just the font size into account. + */ + local: Phaser.Types.GameObjects.BitmapText.LocalBitmapTextSize; + /** + * Data about the lines of text within the BitmapText. + */ + lines: Phaser.Types.GameObjects.BitmapText.BitmapTextLines; + /** + * An array containing per-character data. Only populated if `includeChars` is `true` in the `getTextBounds` call. + */ + characters: Phaser.Types.GameObjects.BitmapText.BitmapTextCharacter[]; + /** + * An array containing the word data from the BitmapText. + */ + words: Phaser.Types.GameObjects.BitmapText.BitmapTextWord[]; + /** + * The scale of the BitmapText font being rendered vs. font size in the text data. + */ + scale: number; + /** + * The scale X value of the BitmapText. + */ + scaleX: number; + /** + * The scale Y value of the BitmapText. + */ + scaleY: number; + /** + * The wrapped text, if wrapping enabled and required. + */ + wrappedText: string; + }; + + /** + * Details about a single world entry in the `BitmapTextSize` object words array. + */ + type BitmapTextWord = { + /** + * The x position of the word in the BitmapText. + */ + x: number; + /** + * The y position of the word in the BitmapText. + */ + y: number; + /** + * The width of the word. + */ + w: number; + /** + * The height of the word. + */ + h: number; + /** + * The index of the first character of this word within the entire string. Note: this index factors in spaces, quotes, carriage-returns, etc. + */ + i: number; + /** + * The word. + */ + word: string; + }; + + type DisplayCallbackConfig = { + /** + * The Dynamic Bitmap Text object that owns this character being rendered. + */ + parent: Phaser.GameObjects.DynamicBitmapText; + /** + * The tint of the character being rendered. Always zero in Canvas. + */ + tint: Phaser.Types.GameObjects.BitmapText.TintConfig; + /** + * The index of the character being rendered. + */ + index: number; + /** + * The character code of the character being rendered. + */ + charCode: number; + /** + * The x position of the character being rendered. + */ + x: number; + /** + * The y position of the character being rendered. + */ + y: number; + /** + * The scale of the character being rendered. + */ + scale: number; + /** + * The rotation of the character being rendered. + */ + rotation: number; + /** + * Custom data stored with the character being rendered. + */ + data: any; + }; + + type DisplayCallback = (display: Phaser.Types.GameObjects.BitmapText.DisplayCallbackConfig)=>Phaser.Types.GameObjects.BitmapText.DisplayCallbackConfig; + + /** + * The position and size of the Bitmap Text in global space, taking into account the Game Object's scale and world position. + */ + type GlobalBitmapTextSize = { + /** + * The x position of the BitmapText, taking into account the x position and scale of the Game Object. + */ + x: number; + /** + * The y position of the BitmapText, taking into account the y position and scale of the Game Object. + */ + y: number; + /** + * The width of the BitmapText, taking into account the x scale of the Game Object. + */ + width: number; + /** + * The height of the BitmapText, taking into account the y scale of the Game Object. + */ + height: number; + }; + + type JSONBitmapText = Phaser.Types.GameObjects.JSONGameObject & { + /** + * The name of the font. + */ + font: string; + /** + * The text that this Bitmap Text displays. + */ + text: string; + /** + * The size of the font. + */ + fontSize: number; + /** + * Adds / Removes spacing between characters. + */ + letterSpacing: number; + /** + * Adds / Removes spacing between lines in multi-line text. + */ + lineSpacing: number; + /** + * The alignment of the text in a multi-line BitmapText object. + */ + align: number; + }; + + /** + * The position and size of the Bitmap Text in local space, taking just the font size into account. + */ + type LocalBitmapTextSize = { + /** + * The x position of the BitmapText. + */ + x: number; + /** + * The y position of the BitmapText. + */ + y: number; + /** + * The width of the BitmapText. + */ + width: number; + /** + * The height of the BitmapText. + */ + height: number; + }; + + type RetroFontConfig = { + /** + * The key of the image containing the font. + */ + image: string; + /** + * If the font set doesn't start at the top left of the given image, specify the X coordinate offset here. + */ + "offset.x": number; + /** + * If the font set doesn't start at the top left of the given image, specify the Y coordinate offset here. + */ + "offset.y": number; + /** + * The width of each character in the font set. + */ + width: number; + /** + * The height of each character in the font set. + */ + height: number; + /** + * The characters used in the font set, in display order. You can use the TEXT_SET consts for common font set arrangements. + */ + chars: string; + /** + * The number of characters per row in the font set. If not given charsPerRow will be the image width / characterWidth. + */ + charsPerRow: number; + /** + * If the characters in the font set have horizontal spacing between them set the required amount here. + */ + "spacing.x": number; + /** + * If the characters in the font set have vertical spacing between them set the required amount here. + */ + "spacing.y": number; + /** + * The amount of vertical space to add to the line height of the font. + */ + lineSpacing: number; + }; + + type TintConfig = { + /** + * The top left tint value. Always zero in canvas. + */ + topLeft: number; + /** + * The top right tint value. Always zero in canvas. + */ + topRight: number; + /** + * The bottom left tint value. Always zero in canvas. + */ + bottomLeft: number; + /** + * The bottom right tint value. Always zero in canvas. + */ + bottomRight: number; + }; + + } + + namespace Container { + type ContainerConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * An optional array of Game Objects to add to the Container. + */ + children?: Phaser.GameObjects.GameObject[]; + }; + + } + + namespace Graphics { + /** + * Graphics fill style settings. + */ + type FillStyle = { + /** + * The fill color. + */ + color?: number; + /** + * The fill alpha. + */ + alpha?: number; + }; + + /** + * Graphics line style (or stroke style) settings. + */ + type LineStyle = { + /** + * The stroke width. + */ + width?: number; + /** + * The stroke color. + */ + color?: number; + /** + * The stroke alpha. + */ + alpha?: number; + }; + + /** + * Options for the Graphics Game Object. + */ + type Options = Phaser.Types.GameObjects.Graphics.Styles & { + /** + * The x coordinate of the Graphics. + */ + x?: number; + /** + * The y coordinate of the Graphics. + */ + y?: number; + }; + + type RoundedRectRadius = { + /** + * Top left corner radius. Draw concave arc if this radius is negative. + */ + tl?: number; + /** + * Top right corner radius. Draw concave arc if this radius is negative. + */ + tr?: number; + /** + * Bottom right corner radius. Draw concave arc if this radius is negative. + */ + br?: number; + /** + * Bottom left corner radius. Draw concave arc if this radius is negative. + */ + bl?: number; + }; + + /** + * Graphics style settings. + */ + type Styles = { + /** + * The style applied to shape outlines. + */ + lineStyle?: Phaser.Types.GameObjects.Graphics.LineStyle; + /** + * The style applied to shape areas. + */ + fillStyle?: Phaser.Types.GameObjects.Graphics.FillStyle; + }; + + } + + namespace Group { + type GroupCallback = (item: Phaser.GameObjects.GameObject)=>void; + + type GroupClassTypeConstructor = (scene: Phaser.Scene, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number)=>void; + + type GroupConfig = { + /** + * Sets {@link Phaser.GameObjects.Group#classType}. + */ + classType?: Function | null; + /** + * Sets {@link Phaser.GameObjects.Group#name}. + */ + name?: string | null; + /** + * Sets {@link Phaser.GameObjects.Group#active}. + */ + active?: boolean | null; + /** + * Sets {@link Phaser.GameObjects.Group#maxSize}. + */ + maxSize?: number | null; + /** + * Sets {@link Phaser.GameObjects.Group#defaultKey}. + */ + defaultKey?: string | null; + /** + * Sets {@link Phaser.GameObjects.Group#defaultFrame}. + */ + defaultFrame?: string | number | null; + /** + * Sets {@link Phaser.GameObjects.Group#runChildUpdate}. + */ + runChildUpdate?: boolean | null; + /** + * Sets {@link Phaser.GameObjects.Group#createCallback}. + */ + createCallback?: Phaser.Types.GameObjects.Group.GroupCallback | null; + /** + * Sets {@link Phaser.GameObjects.Group#removeCallback}. + */ + removeCallback?: Phaser.Types.GameObjects.Group.GroupCallback | null; + /** + * Sets {@link Phaser.GameObjects.Group#createMultipleCallback}. + */ + createMultipleCallback?: Phaser.Types.GameObjects.Group.GroupMultipleCreateCallback | null; + }; + + /** + * The total number of objects created will be + * + * key.length * frame.length * frameQuantity * (yoyo ? 2 : 1) * (1 + repeat) + * + * If `max` is nonzero, then the total created will not exceed `max`. + * + * `key` is required. {@link Phaser.GameObjects.Group#defaultKey} is not used. + */ + type GroupCreateConfig = { + /** + * The texture key of each new Game Object. Must be provided or not objects will be created. + */ + key: string | string[]; + /** + * The class of each new Game Object. + */ + classType?: Function | null; + /** + * The texture frame of each new Game Object. + */ + frame?: string | string[] | number | number[] | null; + /** + * The number of Game Objects to create. If set, this overrides the `frameQuantity` value. Use `frameQuantity` for more advanced control. + */ + quantity?: number | null; + /** + * The visible state of each new Game Object. + */ + visible?: boolean | null; + /** + * The active state of each new Game Object. + */ + active?: boolean | null; + /** + * The number of times each `key` × `frame` combination will be *repeated* (after the first combination). + */ + repeat?: number | null; + /** + * Select a `key` at random. + */ + randomKey?: boolean | null; + /** + * Select a `frame` at random. + */ + randomFrame?: boolean | null; + /** + * Select keys and frames by moving forward then backward through `key` and `frame`. + */ + yoyo?: boolean | null; + /** + * The number of times each `frame` should be combined with one `key`. + */ + frameQuantity?: number | null; + /** + * The maximum number of new Game Objects to create. 0 is no maximum. + */ + max?: number | null; + setXY?: object | null; + /** + * The horizontal position of each new Game Object. + */ + "setXY.x"?: number | null; + /** + * The vertical position of each new Game Object. + */ + "setXY.y"?: number | null; + /** + * Increment each Game Object's horizontal position from the previous by this amount, starting from `setXY.x`. + */ + "setXY.stepX"?: number | null; + /** + * Increment each Game Object's vertical position from the previous by this amount, starting from `setXY.y`. + */ + "setXY.stepY"?: number | null; + setRotation?: object | null; + /** + * Rotation of each new Game Object. + */ + "setRotation.value"?: number | null; + /** + * Increment each Game Object's rotation from the previous by this amount, starting at `setRotation.value`. + */ + "setRotation.step"?: number | null; + setScale?: object | null; + /** + * The horizontal scale of each new Game Object. + */ + "setScale.x"?: number | null; + /** + * The vertical scale of each new Game Object. + */ + "setScale.y"?: number | null; + /** + * Increment each Game Object's horizontal scale from the previous by this amount, starting from `setScale.x`. + */ + "setScale.stepX"?: number | null; + /** + * Increment each Game object's vertical scale from the previous by this amount, starting from `setScale.y`. + */ + "setScale.stepY"?: number | null; + setOrigin?: object | null; + /** + * The horizontal origin of each new Game Object. + */ + "setOrigin.x"?: number | null; + /** + * The vertical origin of each new Game Object. + */ + "setOrigin.y"?: number | null; + /** + * Increment each Game Object's horizontal origin from the previous by this amount, starting from `setOrigin.x`. + */ + "setOrigin.stepX"?: number | null; + /** + * Increment each Game object's vertical origin from the previous by this amount, starting from `setOrigin.y`. + */ + "setOrigin.stepY"?: number | null; + setAlpha?: object | null; + /** + * The alpha value of each new Game Object. + */ + "setAlpha.value"?: number | null; + /** + * Increment each Game Object's alpha from the previous by this amount, starting from `setAlpha.value`. + */ + "setAlpha.step"?: number | null; + setDepth?: object | null; + /** + * The depth value of each new Game Object. + */ + "setDepth.value"?: number | null; + /** + * Increment each Game Object's depth from the previous by this amount, starting from `setDepth.value`. + */ + "setDepth.step"?: number | null; + setScrollFactor?: object | null; + /** + * The horizontal scroll factor of each new Game Object. + */ + "setScrollFactor.x"?: number | null; + /** + * The vertical scroll factor of each new Game Object. + */ + "setScrollFactor.y"?: number | null; + /** + * Increment each Game Object's horizontal scroll factor from the previous by this amount, starting from `setScrollFactor.x`. + */ + "setScrollFactor.stepX"?: number | null; + /** + * Increment each Game object's vertical scroll factor from the previous by this amount, starting from `setScrollFactor.y`. + */ + "setScrollFactor.stepY"?: number | null; + /** + * A geometric shape that defines the hit area for the Game Object. + */ + hitArea?: any | null; + /** + * A callback to be invoked when the Game Object is interacted with. + */ + hitAreaCallback?: Phaser.Types.Input.HitAreaCallback | null; + /** + * Align the new Game Objects in a grid using these settings. + */ + gridAlign?: false | Phaser.Types.Actions.GridAlignConfig | null; + }; + + type GroupMultipleCreateCallback = (items: Phaser.GameObjects.GameObject[])=>void; + + } + + namespace Mesh { + type MeshConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + */ + key?: string | Phaser.Textures.Texture; + /** + * An optional frame from the Texture this Game Object is rendering with. + */ + frame?: string | number; + /** + * The vertices array. Either `xy` pairs, or `xyz` if the `containsZ` parameter is `true`. + */ + vertices?: number[]; + /** + * The UVs pairs array. + */ + uvs?: number[]; + /** + * Optional vertex indicies array. If you don't have one, pass `null` or an empty array. + */ + indicies?: number[]; + /** + * Does the vertices data include a `z` component? + */ + containsZ?: boolean; + /** + * Optional vertex normals array. If you don't have one, pass `null` or an empty array. + */ + normals?: number[]; + /** + * An array of colors, one per vertex, or a single color value applied to all vertices. + */ + colors?: number | number[]; + /** + * An array of alpha values, one per vertex, or a single alpha value applied to all vertices. + */ + alphas?: number | number[]; + }; + + } + + namespace NineSlice { + type NineSliceConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + */ + key?: string | Phaser.Textures.Texture; + /** + * An optional frame from the Texture this Game Object is rendering with. + */ + frame?: string | number; + /** + * The width of the Nine Slice Game Object. You can adjust the width post-creation. + */ + width?: number; + /** + * The height of the Nine Slice Game Object. If this is a 3 slice object the height will be fixed to the height of the texture and cannot be changed. + */ + height?: number; + /** + * The size of the left vertical column (A). + */ + leftWidth?: number; + /** + * The size of the right vertical column (B). + */ + rightWidth?: number; + /** + * The size of the top horiztonal row (C). Set to zero or undefined to create a 3 slice object. + */ + topHeight?: number; + /** + * The size of the bottom horiztonal row (D). Set to zero or undefined to create a 3 slice object. + */ + bottomHeight?: number; + }; + + } + + namespace Particles { + type DeathZoneObject = Phaser.GameObjects.Particles.Zones.DeathZone | Phaser.Types.GameObjects.Particles.ParticleEmitterDeathZoneConfig | Phaser.Types.GameObjects.Particles.DeathZoneSource; + + type DeathZoneSource = { + contains: Phaser.Types.GameObjects.Particles.DeathZoneSourceCallback; + }; + + type DeathZoneSourceCallback = (x: number, y: number)=>boolean; + + type EdgeZoneSource = { + /** + * A function placing points on the sources edge or edges. + */ + getPoints: Phaser.Types.GameObjects.Particles.EdgeZoneSourceCallback; + }; + + type EdgeZoneSourceCallback = (quantity: number, stepRate?: number)=>Phaser.Types.Math.Vector2Like[]; + + type EmitterOpCustomEmitConfig = { + /** + * A callback that is invoked each time the emitter emits a particle. + */ + onEmit: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitCallback; + }; + + type EmitterOpCustomUpdateConfig = { + /** + * A callback that is invoked each time the emitter emits a particle. + */ + onEmit?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitCallback; + /** + * A callback that is invoked each time the emitter updates. + */ + onUpdate: Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateCallback; + }; + + /** + * Defines an operation yielding a value incremented continuously across a range. + */ + type EmitterOpEaseConfig = { + /** + * The starting value. + */ + start: number; + /** + * The ending value. + */ + end: number; + /** + * If true, the particle starts with a minimum random value between the start and end values. + */ + random?: boolean; + /** + * The ease to find. This can be either a string from the EaseMap, or a custom function. + */ + ease?: string | Function; + /** + * An optional array of ease parameters to go with the ease. + */ + easeParams?: number[]; + }; + + /** + * Defines an operation yielding a value incremented continuously across an interpolated data set. + */ + type EmitterOpInterpolationConfig = { + /** + * The array of number values to interpolate through. + */ + values: number[]; + /** + * The interpolation function to use. Typically one of `linear`, `bezier` or `catmull` or a custom function. + */ + interpolation?: string | Function; + /** + * An optional ease function to use. This can be either a string from the EaseMap, or a custom function. + */ + ease?: string | Function; + /** + * An optional array of ease parameters to go with the ease. + */ + easeParams?: number[]; + }; + + /** + * The returned value sets what the property will be at the START of the particle's life, on emit. + */ + type EmitterOpOnEmitCallback = (particle?: Phaser.GameObjects.Particles.Particle, key?: string, value?: number)=>number; + + type EmitterOpOnEmitType = number | number[] | Phaser.Types.GameObjects.Particles.EmitterOpOnEmitCallback | Phaser.Types.GameObjects.Particles.EmitterOpRandomConfig | Phaser.Types.GameObjects.Particles.EmitterOpRandomMinMaxConfig | Phaser.Types.GameObjects.Particles.EmitterOpSteppedConfig | Phaser.Types.GameObjects.Particles.EmitterOpCustomEmitConfig; + + /** + * The returned value updates the property for the duration of the particle's life. + */ + type EmitterOpOnUpdateCallback = (particle: Phaser.GameObjects.Particles.Particle, key: string, t: number, value: number)=>number; + + type EmitterOpOnUpdateType = Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateCallback | Phaser.Types.GameObjects.Particles.EmitterOpEaseConfig | Phaser.Types.GameObjects.Particles.EmitterOpCustomUpdateConfig | Phaser.Types.GameObjects.Particles.EmitterOpInterpolationConfig; + + /** + * Defines an operation yielding a random value within a range. + */ + type EmitterOpRandomConfig = { + /** + * The minimum and maximum values, as [min, max]. + */ + random: number[]; + }; + + /** + * Defines an operation yielding a random value within a range. + */ + type EmitterOpRandomMinMaxConfig = { + /** + * The minimum value. + */ + min: number; + /** + * The maximum value. + */ + max: number; + /** + * If true, only integers are selected from the range. + */ + int?: boolean; + }; + + /** + * Defines an operation yielding a value incremented by steps across a range. + */ + type EmitterOpSteppedConfig = { + /** + * The starting value. + */ + start: number; + /** + * The ending value. + */ + end: number; + /** + * The number of steps between start and end. + */ + steps: number; + }; + + type EmitZoneData = Phaser.Types.GameObjects.Particles.ParticleEmitterEdgeZoneConfig | Phaser.Types.GameObjects.Particles.ParticleEmitterRandomZoneConfig | Phaser.GameObjects.Particles.Zones.EdgeZone | Phaser.GameObjects.Particles.Zones.RandomZone; + + type EmitZoneObject = Phaser.GameObjects.Particles.Zones.EdgeZone | Phaser.GameObjects.Particles.Zones.RandomZone; + + type GravityWellConfig = { + /** + * The x coordinate of the Gravity Well, in world space. + */ + x?: number; + /** + * The y coordinate of the Gravity Well, in world space. + */ + y?: number; + /** + * The strength of the gravity force - larger numbers produce a stronger force. + */ + power?: number; + /** + * The minimum distance for which the gravity force is calculated. + */ + epsilon?: number; + /** + * The gravitational force of this Gravity Well. + */ + gravity?: number; + }; + + type ParticleClassConstructor = (emitter: Phaser.GameObjects.Particles.ParticleEmitter)=>void; + + type ParticleData = { + tint?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + alpha?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + rotate?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + scaleX?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + scaleY?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + x?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + y?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + accelerationX?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + accelerationY?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + maxVelocityX?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + maxVelocityY?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + moveToX?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + moveToY?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + bounce?: Phaser.Types.GameObjects.Particles.ParticleDataValue; + }; + + type ParticleDataValue = { + /** + * The minimum value. + */ + min: number; + /** + * The maximum value. + */ + max: number; + }; + + type ParticleDeathCallback = (particle: Phaser.GameObjects.Particles.Particle)=>void; + + type ParticleEmitterAnimConfig = { + /** + * One or more animations names, or Play Animation Config objects. + */ + anims?: string | string[] | Phaser.Types.Animations.PlayAnimationConfig | Phaser.Types.Animations.PlayAnimationConfig[]; + /** + * Whether animations will be assigned consecutively (true) or at random (false). + */ + cycle?: boolean; + /** + * The number of consecutive particles receiving each animation, when `cycle` is true. + */ + quantity?: number; + }; + + type ParticleEmitterBounds = { + /** + * The left edge of the rectangle. + */ + x: number; + /** + * The top edge of the rectangle. + */ + y: number; + /** + * The width of the rectangle. + */ + width: number; + /** + * The height of the rectangle. + */ + height: number; + }; + + type ParticleEmitterBoundsAlt = { + /** + * The left edge of the rectangle. + */ + x: number; + /** + * The top edge of the rectangle. + */ + y: number; + /** + * The width of the rectangle. + */ + w: number; + /** + * The height of the rectangle. + */ + h: number; + }; + + type ParticleEmitterCallback = (particle: Phaser.GameObjects.Particles.Particle, emitter: Phaser.GameObjects.Particles.ParticleEmitter)=>void; + + type ParticleEmitterConfig = { + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#active}. Setting this to false will stop the emitter from running at all. If you just wish to stop particles from emitting, set `emitting` property instead. + */ + active?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#blendMode}. + */ + blendMode?: Phaser.BlendModes | string; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallbackScope} and {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallbackScope}. + */ + callbackScope?: any; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideBottom}. + */ + collideBottom?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideLeft}. + */ + collideLeft?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideRight}. + */ + collideRight?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideTop}. + */ + collideTop?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallback}. + */ + deathCallback?: Function; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallbackScope}. + */ + deathCallbackScope?: any; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallback}. + */ + emitCallback?: Function; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallbackScope}. + */ + emitCallbackScope?: any; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#follow}. + */ + follow?: Phaser.Types.Math.Vector2Like; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#frequency}. + */ + frequency?: number; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#gravityX}. + */ + gravityX?: number; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#gravityY}. + */ + gravityY?: number; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxParticles}. + */ + maxParticles?: number; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxAliveParticles}. + */ + maxAliveParticles?: number; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#name}. + */ + name?: string; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#emitting}. + */ + emitting?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleBringToTop}. + */ + particleBringToTop?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleClass}. + */ + particleClass?: Function; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#radial}. + */ + radial?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#timeScale}. + */ + timeScale?: number; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#trackVisible}. + */ + trackVisible?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#visible}. + */ + visible?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#accelerationX}. + */ + accelerationX?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#accelerationY}. + */ + accelerationY?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleAlpha}. + */ + alpha?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleAngle} (emit only). + */ + angle?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#bounce}. + */ + bounce?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#delay} (emit only). + */ + delay?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#hold} (emit only). + */ + hold?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#lifespan} (emit only). + */ + lifespan?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxVelocityX}. + */ + maxVelocityX?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxVelocityY}. + */ + maxVelocityY?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#moveToX}. If set, overrides `angle` and `speed` properties. + */ + moveToX?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#moveToY}. If set, overrides `angle` and `speed` properties. + */ + moveToY?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#quantity} (emit only). + */ + quantity?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleRotate}. + */ + rotate?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * As {@link Phaser.GameObjects.Particles.ParticleEmitter#setScale}. + */ + scale?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleScaleX}. + */ + scaleX?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleScaleY}. + */ + scaleY?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * As {@link Phaser.GameObjects.Particles.ParticleEmitter#setSpeed} (emit only). + */ + speed?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#speedX} (emit only). + */ + speedX?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#speedY} (emit only). + */ + speedY?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleTint}. + */ + tint?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * An array of color values that the Particles interpolate through during their life. If set, overrides any `tint` property. + */ + color?: number[]; + /** + * The string-based name of the Easing function to use if you have enabled Particle color interpolation via the `color` property, otherwise has no effect. + */ + colorEase?: string; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleX}. + */ + x?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleY}. + */ + y?: Phaser.Types.GameObjects.Particles.EmitterOpOnEmitType | Phaser.Types.GameObjects.Particles.EmitterOpOnUpdateType; + /** + * As {@link Phaser.GameObjects.Particles.ParticleEmitter#setEmitZone}. + */ + emitZone?: Phaser.Types.GameObjects.Particles.EmitZoneData | Phaser.Types.GameObjects.Particles.EmitZoneData[]; + /** + * As {@link Phaser.GameObjects.Particles.ParticleEmitter#setDeathZone}. + */ + deathZone?: Phaser.Types.GameObjects.Particles.DeathZoneObject | Phaser.Types.GameObjects.Particles.DeathZoneObject[]; + /** + * As {@link Phaser.GameObjects.Particles.ParticleEmitter#setBounds}. + */ + bounds?: Phaser.Types.GameObjects.Particles.ParticleEmitterBounds | Phaser.Types.GameObjects.Particles.ParticleEmitterBoundsAlt; + /** + * Offset coordinates that assigns to {@link Phaser.GameObjects.Particles.ParticleEmitter#followOffset}. + */ + followOffset?: Phaser.Types.Math.Vector2Like; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#anims}. + */ + anim?: string | string[] | Phaser.Types.GameObjects.Particles.ParticleEmitterAnimConfig; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#frames}. + */ + frame?: number | number[] | string | string[] | Phaser.Textures.Frame | Phaser.Textures.Frame[] | Phaser.Types.GameObjects.Particles.ParticleEmitterFrameConfig; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#texture}. Overrides any texture already set on the Emitter. + */ + texture?: string | Phaser.Textures.Texture; + /** + * Creates specified number of inactive particles and adds them to this emitter's pool. {@link Phaser.GameObjects.Particles.ParticleEmitter#reserve} + */ + reserve?: number; + /** + * If you wish to 'fast forward' the emitter in time, set this value to a number representing the amount of ms the emitter should advance. Doing so implicitly sets `emitting` to `true`. + */ + advance?: number; + /** + * Limit the emitter to emit particles for a maximum of `duration` ms. Default to zero, meaning 'forever'. + */ + duration?: number; + /** + * Limit the emitter to emit this exact number of particles and then stop. Default to zero, meaning no limit. + */ + stopAfter?: number; + /** + * A custom callback that sorts particles prior to rendering. Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#sortCallback}. + */ + sortCallback?: Phaser.Types.GameObjects.Particles.ParticleSortCallback; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#sortOrderAsc}. + */ + sortOrderAsc?: boolean; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#sortProperty}. + */ + sortProperty?: string; + /** + * Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#tintFill}. + */ + tintFill?: boolean; + }; + + type ParticleEmitterCreatorConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key of the Texture this Emitter will use to render particles, as stored in the Texture Manager. + */ + key?: string; + /** + * The Particle Emitter configuration object. + */ + config?: Phaser.Types.GameObjects.Particles.ParticleEmitterConfig; + }; + + type ParticleEmitterDeathZoneConfig = { + /** + * A shape representing the zone. See {@link Phaser.GameObjects.Particles.Zones.DeathZone#source}. + */ + source: Phaser.Types.GameObjects.Particles.DeathZoneSource; + /** + * 'onEnter' or 'onLeave'. + */ + type?: string; + }; + + type ParticleEmitterEdgeZoneConfig = { + /** + * A shape representing the zone. See {@link Phaser.GameObjects.Particles.Zones.EdgeZone#source}. + */ + source: Phaser.Types.GameObjects.Particles.EdgeZoneSource; + /** + * 'edge'. + */ + type: string; + /** + * The number of particles to place on the source edge. Set to 0 to use `stepRate` instead. + */ + quantity: number; + /** + * The distance between each particle. When set, `quantity` is implied and should be set to 0. + */ + stepRate?: number; + /** + * Whether particles are placed from start to end and then end to start. + */ + yoyo?: boolean; + /** + * Whether one endpoint will be removed if it's identical to the other. + */ + seamless?: boolean; + /** + * The total number of particles this zone will emit before passing over to the next emission zone in the Emitter. + */ + total?: number; + }; + + type ParticleEmitterFrameConfig = { + /** + * Array of texture frames. + */ + frames?: number[] | string[] | Phaser.Textures.Frame[]; + /** + * Whether texture frames will be assigned consecutively (true) or at random (false). + */ + cycle?: boolean; + /** + * The number of consecutive particles receiving each texture frame, when `cycle` is true. + */ + quantity?: number; + }; + + type ParticleEmitterOps = { + /** + * The accelerationX EmitterOp instance. This is an onEmit and onUpdate operator. + */ + accelerationX: Phaser.GameObjects.Particles.EmitterOp; + /** + * The accelerationY EmitterOp instance. This is an onEmit and onUpdate operator. + */ + accelerationY: Phaser.GameObjects.Particles.EmitterOp; + /** + * The alpha EmitterOp instance. This is an onEmit and onUpdate operator. + */ + alpha: Phaser.GameObjects.Particles.EmitterOp; + /** + * The angle EmitterOp instance. This is an onEmit operator only. + */ + angle: Phaser.GameObjects.Particles.EmitterOp; + /** + * The bounce EmitterOp instance. This is an onEmit and onUpdate operator. + */ + bounce: Phaser.GameObjects.Particles.EmitterOp; + /** + * The color EmitterColorOp instance. This is an onEmit and onUpdate operator. + */ + color: Phaser.GameObjects.Particles.EmitterColorOp; + /** + * The delay EmitterOp instance. This is an onEmit operator only. + */ + delay: Phaser.GameObjects.Particles.EmitterOp; + /** + * The hold EmitterOp instance. This is an onEmit operator only. + */ + hold: Phaser.GameObjects.Particles.EmitterOp; + /** + * The lifespan EmitterOp instance. This is an onEmit operator only. + */ + lifespan: Phaser.GameObjects.Particles.EmitterOp; + /** + * The maxVelocityX EmitterOp instance. This is an onEmit and onUpdate operator. + */ + maxVelocityX: Phaser.GameObjects.Particles.EmitterOp; + /** + * The maxVelocityY EmitterOp instance. This is an onEmit and onUpdate operator. + */ + maxVelocityY: Phaser.GameObjects.Particles.EmitterOp; + /** + * The moveToX EmitterOp instance. This is an onEmit and onUpdate operator. + */ + moveToX: Phaser.GameObjects.Particles.EmitterOp; + /** + * The moveToY EmitterOp instance. This is an onEmit and onUpdate operator. + */ + moveToY: Phaser.GameObjects.Particles.EmitterOp; + /** + * The quantity EmitterOp instance. This is an onEmit operator only. + */ + quantity: Phaser.GameObjects.Particles.EmitterOp; + /** + * The rotate EmitterOp instance. This is an onEmit and onUpdate operator. + */ + rotate: Phaser.GameObjects.Particles.EmitterOp; + /** + * The scaleX EmitterOp instance. This is an onEmit and onUpdate operator. + */ + scaleX: Phaser.GameObjects.Particles.EmitterOp; + /** + * The scaleY EmitterOp instance. This is an onEmit and onUpdate operator. + */ + scaleY: Phaser.GameObjects.Particles.EmitterOp; + /** + * The speedX EmitterOp instance. This is an onEmit operator only. + */ + speedX: Phaser.GameObjects.Particles.EmitterOp; + /** + * The speedY EmitterOp instance. This is an onEmit operator only. + */ + speedY: Phaser.GameObjects.Particles.EmitterOp; + /** + * The tint EmitterOp instance. This is an onEmit and onUpdate operator. + */ + tint: Phaser.GameObjects.Particles.EmitterOp; + /** + * The x EmitterOp instance. This is an onEmit and onUpdate operator. + */ + x: Phaser.GameObjects.Particles.EmitterOp; + /** + * The y EmitterOp instance. This is an onEmit and onUpdate operator. + */ + y: Phaser.GameObjects.Particles.EmitterOp; + }; + + type ParticleEmitterRandomZoneConfig = { + /** + * A shape representing the zone. See {@link Phaser.GameObjects.Particles.Zones.RandomZone#source}. + */ + source: Phaser.Types.GameObjects.Particles.RandomZoneSource; + /** + * 'random'. + */ + type?: string; + }; + + type ParticleSortCallback = (a: Phaser.GameObjects.Particles.Particle, b: Phaser.GameObjects.Particles.Particle)=>void; + + type RandomZoneSource = { + /** + * A function modifying its point argument. + */ + getRandomPoint: Phaser.Types.GameObjects.Particles.RandomZoneSourceCallback; + }; + + type RandomZoneSourceCallback = (point: Phaser.Types.Math.Vector2Like)=>void; + + } + + namespace PathFollower { + /** + * Settings for a PathFollower. + */ + type PathConfig = { + /** + * The duration of the path follow in ms. Must be `> 0`. + */ + duration?: number; + /** + * The start position of the path follow, between 0 and 1. Must be less than `to`. + */ + from?: number; + /** + * The end position of the path follow, between 0 and 1. Must be more than `from`. + */ + to?: number; + /** + * Whether to position the PathFollower on the Path using its path offset. + */ + positionOnPath?: boolean; + /** + * Should the PathFollower automatically rotate to point in the direction of the Path? + */ + rotateToPath?: boolean; + /** + * If the PathFollower is rotating to match the Path, this value is added to the rotation value. This allows you to rotate objects to a path but control the angle of the rotation as well. + */ + rotationOffset?: number; + /** + * Current start position of the path follow, must be between `from` and `to`. + */ + startAt?: number; + }; + + } + + namespace Plane { + type PlaneCheckerboardConfig = { + /** + * The odd cell color, specified as a hex value. + */ + color1?: number; + /** + * The even cell color, specified as a hex value. + */ + color2?: number; + /** + * The odd cell alpha value, specified as a number between 0 and 255. + */ + alpha1?: number; + /** + * The even cell alpha value, specified as a number between 0 and 255. + */ + alpha2?: number; + /** + * The view height of the Plane after creation, in pixels. + */ + height?: number; + }; + + type PlaneConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + */ + key?: string | Phaser.Textures.Texture; + /** + * An optional frame from the Texture this Game Object is rendering with. + */ + frame?: string | number; + /** + * The width of this Plane, in cells, not pixels. + */ + width?: number; + /** + * The height of this Plane, in cells, not pixels. + */ + height?: number; + /** + * Is the texture tiled? I.e. repeated across each cell. + */ + tile?: boolean; + /** + * Plane checkerboard configuration object. + */ + checkerboard?: Phaser.Types.GameObjects.Plane.PlaneCheckerboardConfig; + }; + + } + + namespace RenderTexture { + type RenderTextureConfig = { + /** + * The x coordinate of the RenderTextures position. + */ + x?: number; + /** + * The y coordinate of the RenderTextures position. + */ + y?: number; + /** + * The width of the RenderTexture. + */ + width?: number; + /** + * The height of the RenderTexture. + */ + height?: number; + }; + + } + + namespace Rope { + type RopeConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. If not given, `__DEFAULT` is used. + */ + key?: string; + /** + * An optional frame from the Texture this Game Object is rendering with. + */ + frame?: string | integer | null; + /** + * An array containing the vertices data for this Rope, or a number that indicates how many segments to split the texture frame into. If none is provided a simple quad is created. See `setPoints` to set this post-creation. + */ + points?: integer | Phaser.Types.Math.Vector2Like[]; + /** + * Should the vertices of this Rope be aligned horizontally (`true`), or vertically (`false`)? + */ + horizontal?: boolean; + /** + * An optional array containing the color data for this Rope. You should provide one color value per pair of vertices. + */ + colors?: number[]; + /** + * An optional array containing the alpha data for this Rope. You should provide one alpha value per pair of vertices. + */ + alphas?: number[]; + }; + + } + + namespace Shader { + type ShaderConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key of the shader to use from the shader cache, or a BaseShader instance. + */ + key: string | Phaser.Display.BaseShader; + /** + * The width of the Game Object. + */ + width?: number; + /** + * The height of the Game Object. + */ + height?: number; + }; + + } + + namespace Sprite { + type SpriteConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + */ + key?: string | Phaser.Textures.Texture; + /** + * An optional frame from the Texture this Game Object is rendering with. + */ + frame?: string | number; + /** + * The string-based key of the animation to play, or an Animation instance, or a `PlayAnimationConfig` object. + */ + anims?: string | Phaser.Animations.Animation | Phaser.Types.Animations.PlayAnimationConfig; + }; + + } + + namespace Text { + /** + * Results object from a call to GetTextSize. + */ + type GetTextSizeObject = { + /** + * The width of the longest line in the Text object. + */ + width: number; + /** + * The height of the Text object. + */ + height: number; + /** + * The number of lines in the Text object. + */ + lines: number; + /** + * An array of the lines for each line in the Text object. + */ + lineWidths: number[]; + /** + * The line spacing of the Text object. + */ + lineSpacing: number; + /** + * The height of a line factoring in font and stroke. + */ + lineHeight: number; + }; + + type TextConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The text this Text object will display. + */ + text?: string | string[]; + /** + * The Text style configuration object. + */ + style?: Phaser.Types.GameObjects.Text.TextStyle; + /** + * A Text Padding object. + */ + padding?: Phaser.Types.GameObjects.Text.TextPadding; + }; + + /** + * Font metrics for a Text Style object. + */ + type TextMetrics = { + /** + * The ascent of the font. + */ + ascent: number; + /** + * The descent of the font. + */ + descent: number; + /** + * The size of the font. + */ + fontSize: number; + }; + + /** + * A Text Padding configuration object as used by the Text Style. + */ + type TextPadding = { + /** + * If set this value is used for both the left and right padding. + */ + x?: number; + /** + * If set this value is used for both the top and bottom padding. + */ + y?: number; + /** + * The amount of padding added to the left of the Text object. + */ + left?: number; + /** + * The amount of padding added to the right of the Text object. + */ + right?: number; + /** + * The amount of padding added to the top of the Text object. + */ + top?: number; + /** + * The amount of padding added to the bottom of the Text object. + */ + bottom?: number; + }; + + /** + * A Text Shadow configuration object as used by the Text Style. + */ + type TextShadow = { + /** + * The horizontal offset of the shadow. + */ + offsetX?: number; + /** + * The vertical offset of the shadow. + */ + offsetY?: number; + /** + * The color of the shadow, given as a CSS string value. + */ + color?: string; + /** + * The amount of blur applied to the shadow. Leave as zero for a hard shadow. + */ + blur?: number; + /** + * Apply the shadow to the stroke effect on the Text object? + */ + stroke?: boolean; + /** + * Apply the shadow to the fill effect on the Text object? + */ + fill?: boolean; + }; + + /** + * A Text Style configuration object as used by the Text Game Object. + */ + type TextStyle = { + /** + * The font the Text object will render with. This is a Canvas style font string. + */ + fontFamily?: string; + /** + * The font size, as a CSS size string. + */ + fontSize?: number | string; + /** + * Any addition font styles, such as 'strong'. + */ + fontStyle?: string; + /** + * The font family or font settings to set. Overrides the other font settings. + */ + font?: string; + /** + * A solid fill color that is rendered behind the Text object. Given as a CSS string color such as `#ff0`. + */ + backgroundColor?: string; + /** + * The color the Text is drawn in. Given as a CSS string color such as `#fff` or `rgb()`. + */ + color?: string | CanvasGradient | CanvasPattern; + /** + * The color used to stroke the Text if the `strokeThickness` property is greater than zero. + */ + stroke?: string | CanvasGradient | CanvasPattern; + /** + * The thickness of the stroke around the Text. Set to zero for no stroke. + */ + strokeThickness?: number; + /** + * The Text shadow configuration object. + */ + shadow?: Phaser.Types.GameObjects.Text.TextShadow; + /** + * A Text Padding object. + */ + padding?: Phaser.Types.GameObjects.Text.TextPadding; + /** + * The alignment of the Text. This only impacts multi-line text. Either `left`, `right`, `center` or `justify`. + */ + align?: string; + /** + * The maximum number of lines to display within the Text object. + */ + maxLines?: number; + /** + * Force the Text object to have the exact width specified in this property. Leave as zero for it to change accordingly to content. + */ + fixedWidth?: number; + /** + * Force the Text object to have the exact height specified in this property. Leave as zero for it to change accordingly to content. + */ + fixedHeight?: number; + /** + * Sets the resolution (DPI setting) of the Text object. Leave at zero for it to use the game resolution. + */ + resolution?: number; + /** + * Set to `true` if this Text object should render from right-to-left. + */ + rtl?: boolean; + /** + * This is the string used to aid Canvas in calculating the height of the font. + */ + testString?: string; + /** + * The amount of horizontal padding added to the width of the text when calculating the font metrics. + */ + baselineX?: number; + /** + * The amount of vertical padding added to the height of the text when calculating the font metrics. + */ + baselineY?: number; + /** + * The Text Word wrap configuration object. + */ + wordWrap?: Phaser.Types.GameObjects.Text.TextWordWrap; + /** + * A Text Metrics object. Use this to avoid expensive font size calculations in text heavy games. + */ + metrics?: Phaser.Types.GameObjects.Text.TextMetrics; + /** + * The amount to add to the font height to achieve the overall line height. + */ + lineSpacing?: number; + }; + + /** + * A Text Word Wrap configuration object as used by the Text Style configuration. + */ + type TextWordWrap = { + /** + * The width at which text should be considered for word-wrapping. + */ + width?: number; + /** + * Provide a custom callback when word wrapping is enabled. + */ + callback?: TextStyleWordWrapCallback; + /** + * The context in which the word wrap callback is invoked. + */ + callbackScope?: any; + /** + * Use basic or advanced word wrapping? + */ + useAdvancedWrap?: boolean; + }; + + } + + namespace TileSprite { + type TileSpriteConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The x coordinate of the Tile Sprite. + */ + x?: number; + /** + * The y coordinate of the Tile Sprite. + */ + y?: number; + /** + * The width of the Tile Sprite. If zero it will use the size of the texture frame. + */ + width?: number; + /** + * The height of the Tile Sprite. If zero it will use the size of the texture frame. + */ + height?: number; + /** + * The key of the Texture this Tile Sprite will use to render with, as stored in the Texture Manager. + */ + key?: string; + /** + * An optional frame from the Texture this Tile Sprite is rendering with. + */ + frame?: number | string | Phaser.Textures.Frame; + }; + + } + + type DecomposeMatrixResults = { + /** + * The translated x value. + */ + translateX: number; + /** + * The translated y value. + */ + translateY: number; + /** + * The rotation value. + */ + rotation: number; + /** + * The scale x value. + */ + scaleX: number; + /** + * The scale y value. + */ + scaleY: number; + }; + + type Face = { + /** + * The first face vertex. + */ + vertex1: Phaser.Types.GameObjects.Vertex; + /** + * The second face vertex. + */ + vertex2: Phaser.Types.GameObjects.Vertex; + /** + * The third face vertex. + */ + vertex3: Phaser.Types.GameObjects.Vertex; + /** + * Are the vertices counter-clockwise? + */ + isCounterClockwise: boolean; + }; + + type GameObjectConfig = { + /** + * The x position of the Game Object. + */ + x?: number | object; + /** + * The y position of the Game Object. + */ + y?: number | object; + /** + * The depth of the GameObject. + */ + depth?: number; + /** + * The horizontally flipped state of the Game Object. + */ + flipX?: boolean; + /** + * The vertically flipped state of the Game Object. + */ + flipY?: boolean; + /** + * The scale of the GameObject. + */ + scale?: number | object | null; + /** + * The scroll factor of the GameObject. + */ + scrollFactor?: number | object | null; + /** + * The rotation angle of the Game Object, in radians. + */ + rotation?: number | object; + /** + * The rotation angle of the Game Object, in degrees. + */ + angle?: number | object | null; + /** + * The alpha (opacity) of the Game Object. + */ + alpha?: number | object; + /** + * The origin of the Game Object. + */ + origin?: number | object | null; + /** + * The scale mode of the GameObject. + */ + scaleMode?: number; + /** + * The blend mode of the GameObject. + */ + blendMode?: number; + /** + * The visible state of the Game Object. + */ + visible?: boolean; + /** + * Add the GameObject to the scene. + */ + add?: boolean; + }; + + type GetCalcMatrixResults = { + /** + * The calculated Camera matrix. + */ + camera: Phaser.GameObjects.Components.TransformMatrix; + /** + * The calculated Sprite (Game Object) matrix. + */ + sprite: Phaser.GameObjects.Components.TransformMatrix; + /** + * The calculated results matrix, factoring all others in. + */ + calc: Phaser.GameObjects.Components.TransformMatrix; + }; + + type JSONGameObject = { + /** + * The name of this Game Object. + */ + name: string; + /** + * A textual representation of this Game Object, i.e. `sprite`. + */ + type: string; + /** + * The x position of this Game Object. + */ + x: number; + /** + * The y position of this Game Object. + */ + y: number; + /** + * The scale of this Game Object + */ + scale: object; + /** + * The horizontal scale of this Game Object. + */ + "scale.x": number; + /** + * The vertical scale of this Game Object. + */ + "scale.y": number; + /** + * The origin of this Game Object. + */ + origin: object; + /** + * The horizontal origin of this Game Object. + */ + "origin.x": number; + /** + * The vertical origin of this Game Object. + */ + "origin.y": number; + /** + * The horizontally flipped state of the Game Object. + */ + flipX: boolean; + /** + * The vertically flipped state of the Game Object. + */ + flipY: boolean; + /** + * The angle of this Game Object in radians. + */ + rotation: number; + /** + * The alpha value of the Game Object. + */ + alpha: number; + /** + * The visible state of the Game Object. + */ + visible: boolean; + /** + * The Scale Mode being used by this Game Object. + */ + scaleMode: number; + /** + * Sets the Blend Mode being used by this Game Object. + */ + blendMode: number | string; + /** + * The texture key of this Game Object. + */ + textureKey: string; + /** + * The frame key of this Game Object. + */ + frameKey: string; + /** + * The data of this Game Object. + */ + data: object; + }; + + type Vertex = { + /** + * The x coordinate of the vertex. + */ + x: number; + /** + * The y coordinate of the vertex. + */ + y: number; + /** + * The z coordinate of the vertex. + */ + z: number; + /** + * The x normal of the vertex. + */ + normalX: number; + /** + * The y normal of the vertex. + */ + normalY: number; + /** + * The z normal of the vertex. + */ + normalZ: number; + /** + * UV u texture coordinate of the vertex. + */ + u: number; + /** + * UV v texture coordinate of the vertex. + */ + v: number; + /** + * The alpha value of the vertex. + */ + alpha: number; + }; + + namespace Video { + type VideoConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * Optional key of the Video this Game Object will play, as stored in the Video Cache. + */ + key?: string; + }; + + } + + namespace Zone { + type ZoneConfig = Phaser.Types.GameObjects.GameObjectConfig & { + /** + * The width of the Game Object. + */ + width?: number; + /** + * The height of the Game Object. + */ + height?: number; + }; + + } + + } + + namespace Geom { + namespace Mesh { + type GenerateGridConfig = { + /** + * The texture to be used for this Grid. Must be a Texture instance. Can also be a string but only if the `mesh` property is set. + */ + texture: string | Phaser.Textures.Texture; + /** + * The name or index of the frame within the Texture. + */ + frame?: string | number; + /** + * If specified, the vertices of the generated grid will be added to this Mesh Game Object. + */ + mesh?: Phaser.GameObjects.Mesh; + /** + * The width of the grid in 3D units. If you wish to get a pixel accurate grid based on a texture, you can use an Ortho Mesh or the `isOrtho` parameter. + */ + width?: number; + /** + * The height of the grid in 3D units. + */ + height?: number; + /** + * The number of segments to split the grid horizontally in to. + */ + widthSegments?: number; + /** + * The number of segments to split the grid vertically in to. + */ + heightSegments?: number; + /** + * Offset the grid x position by this amount. + */ + x?: number; + /** + * Offset the grid y position by this amount. + */ + y?: number; + /** + * An array of colors, one per vertex, or a single color value applied to all vertices. + */ + colors?: number | number[]; + /** + * An array of alpha values, one per vertex, or a single alpha value applied to all vertices. + */ + alphas?: number | number[]; + /** + * Should the texture tile (repeat) across the grid segments, or display as a single texture? + */ + tile?: boolean; + /** + * If set and using a texture with an ortho Mesh, the `width` and `height` parameters will be calculated based on the frame size for you. + */ + isOrtho?: boolean; + /** + * If set and using a texture, vertically flipping render result. + */ + flipY?: boolean; + }; + + type GenerateGridVertsResult = { + /** + * An array of vertex values in x, y pairs. + */ + verts: number[]; + /** + * An array of vertex indexes. This array will be empty if the `tile` parameter was `true`. + */ + indices: number[]; + /** + * An array of UV values, two per vertex. + */ + uvs: number[]; + /** + * An array of colors, one per vertex, or a single color value applied to all vertices. + */ + colors?: number | number[]; + /** + * An array of alpha values, one per vertex, or a single alpha value applied to all vertices. + */ + alphas?: number | number[]; + }; + + type GenerateVertsResult = { + /** + * An array of Face objects generated from the OBJ Data. + */ + faces: Phaser.Geom.Mesh.Face[]; + /** + * An array of Vertex objects generated from the OBJ Data. + */ + vertices: Phaser.Geom.Mesh.Vertex[]; + }; + + type OBJData = { + /** + * An array of material library filenames found in the OBJ file. + */ + materialLibraries: string[]; + /** + * If the obj was loaded with an mtl file, the parsed material names are stored in this object. + */ + materials: object; + /** + * An array of parsed models extracted from the OBJ file. + */ + models: Phaser.Types.Geom.Mesh.OBJModel[]; + }; + + type OBJFace = { + /** + * The name of the Group this Face is in. + */ + group: string; + /** + * The name of the material this Face uses. + */ + material: string; + /** + * An array of vertices in this Face. + */ + vertices: Phaser.Types.Geom.Mesh.OBJFaceVertice[]; + }; + + type OBJFaceVertice = { + /** + * The index in the `textureCoords` array that this vertex uses. + */ + textureCoordsIndex: number; + /** + * The index in the `vertices` array that this vertex uses. + */ + vertexIndex: number; + /** + * The index in the `vertexNormals` array that this vertex uses. + */ + vertexNormalIndex: number; + }; + + type OBJModel = { + /** + * An array of Faces. + */ + faces: Phaser.Types.Geom.Mesh.OBJFace[]; + /** + * The name of the model. + */ + name: string; + /** + * An array of texture coordinates. + */ + textureCoords: Phaser.Types.Geom.Mesh.UV[]; + /** + * An array of vertex normals. + */ + vertexNormals: Phaser.Types.Math.Vector3Like[]; + /** + * An array of vertices in the model. + */ + vertices: Phaser.Types.Math.Vector3Like[]; + }; + + type UV = { + /** + * The u component. + */ + u: number; + /** + * The v component. + */ + v: number; + /** + * The w component. + */ + w: number; + }; + + } + + } + + namespace Input { + namespace Gamepad { + /** + * The Gamepad object, as extracted from GamepadEvent. + */ + type Pad = { + /** + * The ID of the Gamepad. + */ + id: string; + /** + * The index of the Gamepad. + */ + index: number; + }; + + } + + namespace Keyboard { + type CursorKeys = { + /** + * A Key object mapping to the UP arrow key. + */ + up: Phaser.Input.Keyboard.Key; + /** + * A Key object mapping to the DOWN arrow key. + */ + down: Phaser.Input.Keyboard.Key; + /** + * A Key object mapping to the LEFT arrow key. + */ + left: Phaser.Input.Keyboard.Key; + /** + * A Key object mapping to the RIGHT arrow key. + */ + right: Phaser.Input.Keyboard.Key; + /** + * A Key object mapping to the SPACE BAR key. + */ + space: Phaser.Input.Keyboard.Key; + /** + * A Key object mapping to the SHIFT key. + */ + shift: Phaser.Input.Keyboard.Key; + }; + + type KeyboardKeydownCallback = (event: KeyboardEvent)=>void; + + type KeyComboConfig = { + /** + * If they press the wrong key do we reset the combo? + */ + resetOnWrongKey?: boolean; + /** + * The max delay in ms between each key press. Above this the combo is reset. 0 means disabled. + */ + maxKeyDelay?: number; + /** + * If previously matched and they press the first key of the combo again, will it reset? + */ + resetOnMatch?: boolean; + /** + * If the combo matches, will it delete itself? + */ + deleteOnMatch?: boolean; + }; + + } + + /** + * A Phaser Input Event Data object. + * + * This object is passed to the registered event listeners and allows you to stop any further propagation. + */ + type EventData = { + /** + * The cancelled state of this Event. + */ + cancelled?: boolean; + /** + * Call this method to stop this event from passing any further down the event chain. + */ + stopPropagation: Function; + }; + + type HitAreaCallback = (hitArea: any, x: number, y: number, gameObject: Phaser.GameObjects.GameObject)=>boolean; + + type InputConfiguration = { + /** + * The object / shape to use as the Hit Area. If not given it will try to create a Rectangle based on the texture frame. + */ + hitArea?: any; + /** + * The callback that determines if the pointer is within the Hit Area shape or not. + */ + hitAreaCallback?: Phaser.Types.Input.HitAreaCallback; + /** + * If `true` the Interactive Object will be set to be draggable and emit drag events. + */ + draggable?: boolean; + /** + * If `true` the Interactive Object will be set to be a drop zone for draggable objects. + */ + dropZone?: boolean; + /** + * If `true` the Interactive Object will set the `pointer` hand cursor when a pointer is over it. This is a short-cut for setting `cursor: 'pointer'`. + */ + useHandCursor?: boolean; + /** + * The CSS string to be used when the cursor is over this Interactive Object. + */ + cursor?: string; + /** + * If `true` the a pixel perfect function will be set for the hit area callback. Only works with image texture based Game Objects, not Render Textures. + */ + pixelPerfect?: boolean; + /** + * If `pixelPerfect` is set, this is the alpha tolerance threshold value used in the callback. A value of 255 will match only fully opaque pixels. + */ + alphaTolerance?: number; + }; + + type InputPluginContainer = { + /** + * The unique name of this plugin in the input plugin cache. + */ + key: string; + /** + * The plugin to be stored. Should be the source object, not instantiated. + */ + plugin: Function; + /** + * If this plugin is to be injected into the Input Plugin, this is the property key map used. + */ + mapping?: string; + }; + + type InteractiveObject = { + /** + * The Game Object to which this Interactive Object is bound. + */ + gameObject: Phaser.GameObjects.GameObject; + /** + * Is this Interactive Object currently enabled for input events? + */ + enabled: boolean; + /** + * Is this Interactive Object draggable? Enable with `InputPlugin.setDraggable`. + */ + draggable: boolean; + /** + * Is this Interactive Object a drag-targets drop zone? Set when the object is created. + */ + dropZone: boolean; + /** + * Should this Interactive Object change the cursor (via css) when over? (desktop only) + */ + cursor: boolean | string; + /** + * An optional drop target for a draggable Interactive Object. + */ + target: Phaser.GameObjects.GameObject | null; + /** + * The most recent Camera to be tested against this Interactive Object. + */ + camera: Phaser.Cameras.Scene2D.Camera; + /** + * The hit area for this Interactive Object. Typically a geometry shape, like a Rectangle or Circle. + */ + hitArea: any; + /** + * The 'contains' check callback that the hit area shape will use for all hit tests. + */ + hitAreaCallback: Phaser.Types.Input.HitAreaCallback; + /** + * If this Interactive Object has been enabled for debug, via `InputPlugin.enableDebug` then this property holds its debug shape. + */ + hitAreaDebug: Phaser.GameObjects.Shape; + /** + * Was the hitArea for this Interactive Object created based on texture size (false), or a custom shape? (true) + */ + customHitArea: boolean; + /** + * The x coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position. + */ + localX: number; + /** + * The y coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position. + */ + localY: number; + /** + * The current drag state of this Interactive Object. 0 = Not being dragged, 1 = being checked for drag, or 2 = being actively dragged. + */ + dragState: 0 | 1 | 2; + /** + * The x coordinate of the Game Object that owns this Interactive Object when the drag started. + */ + dragStartX: number; + /** + * The y coordinate of the Game Object that owns this Interactive Object when the drag started. + */ + dragStartY: number; + /** + * The x coordinate that the Pointer started dragging this Interactive Object from. + */ + dragStartXGlobal: number; + /** + * The y coordinate that the Pointer started dragging this Interactive Object from. + */ + dragStartYGlobal: number; + /** + * The x coordinate that this Interactive Object is currently being dragged to. + */ + dragX: number; + /** + * The y coordinate that this Interactive Object is currently being dragged to. + */ + dragY: number; + }; + + } + + namespace Loader { + namespace FileTypes { + type AsepriteFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the texture image file from. + */ + textureURL?: string; + /** + * The default file extension to use for the image texture if no url is provided. + */ + textureExtension?: string; + /** + * Extra XHR Settings specifically for the texture image file. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The absolute or relative URL to load the atlas json file from. Or, a well formed JSON object to use instead. + */ + atlasURL?: object | string; + /** + * The default file extension to use for the atlas json if no url is provided. + */ + atlasExtension?: string; + /** + * Extra XHR Settings specifically for the atlas json file. + */ + atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type AtlasJSONFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the texture image file from. + */ + textureURL?: string; + /** + * The default file extension to use for the image texture if no url is provided. + */ + textureExtension?: string; + /** + * Extra XHR Settings specifically for the texture image file. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The filename of an associated normal map. It uses the same path and url to load as the texture image. + */ + normalMap?: string; + /** + * The absolute or relative URL to load the atlas json file from. Or, a well formed JSON object to use instead. + */ + atlasURL?: object | string; + /** + * The default file extension to use for the atlas json if no url is provided. + */ + atlasExtension?: string; + /** + * Extra XHR Settings specifically for the atlas json file. + */ + atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type AtlasXMLFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the texture image file from. + */ + textureURL?: string; + /** + * The default file extension to use for the image texture if no url is provided. + */ + textureExtension?: string; + /** + * Extra XHR Settings specifically for the texture image file. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The filename of an associated normal map. It uses the same path and url to load as the texture image. + */ + normalMap?: string; + /** + * The absolute or relative URL to load the atlas xml file from. + */ + atlasURL?: string; + /** + * The default file extension to use for the atlas xml if no url is provided. + */ + atlasExtension?: string; + /** + * Extra XHR Settings specifically for the atlas xml file. + */ + atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type AudioFileConfig = { + /** + * The key of the file. Must be unique within the Loader and Audio Cache. + */ + key: string; + /** + * The absolute or relative URLs to load the audio files from. + */ + url?: string | string[] | Phaser.Types.Loader.FileTypes.AudioFileURLConfig | Phaser.Types.Loader.FileTypes.AudioFileURLConfig[]; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The optional AudioContext this file will use to process itself. + */ + context?: AudioContext; + }; + + type AudioFileURLConfig = { + /** + * The audio file format. See property names in {@link Phaser.Device.Audio}. + */ + type: string; + /** + * The absolute or relative URL of the audio file. + */ + url: string; + }; + + type AudioSpriteFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Audio Cache. + */ + key: string; + /** + * The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead. + */ + jsonURL: string; + /** + * Extra XHR Settings specifically for the json file. + */ + jsonXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The absolute or relative URL to load the audio file from. + */ + audioURL?: Object; + /** + * The audio configuration options. + */ + audioConfig?: any; + /** + * Extra XHR Settings specifically for the audio file. + */ + audioXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type BinaryFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Binary Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * Optional type to cast the binary file to once loaded. For example, `Uint8Array`. + */ + dataType?: any; + }; + + type BitmapFontFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the texture image file from. + */ + textureURL?: string; + /** + * The default file extension to use for the image texture if no url is provided. + */ + textureExtension?: string; + /** + * Extra XHR Settings specifically for the texture image file. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The filename of an associated normal map. It uses the same path and url to load as the texture image. + */ + normalMap?: string; + /** + * The absolute or relative URL to load the font data xml file from. + */ + fontDataURL?: string; + /** + * The default file extension to use for the font data xml if no url is provided. + */ + fontDataExtension?: string; + /** + * Extra XHR Settings specifically for the font data xml file. + */ + fontDataXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type CompressedTextureFileEntry = { + /** + * The texture compression base format that the browser must support in order to load this file. Can be any of: 'ETC', 'ETC1', 'ATC', 'ASTC', 'BPTC', 'RGTC', 'PVRTC', 'S3TC', 'S3TCSRGB' or the fallback format of 'IMG'. + */ + format?: string; + /** + * The container format, either PVR or KTX. If not given it will try to extract it from the textureURL extension. + */ + type?: string; + /** + * The URL of the compressed texture file to load. + */ + textureURL?: string; + /** + * Optional URL of a texture atlas JSON data file. If not given, the texture will be loaded as a single image. + */ + atlasURL?: string; + /** + * Optional URL of a multi-texture atlas JSON data file as created by Texture Packer Pro. + */ + multiAtlasURL?: string; + /** + * Optional path to use when loading the textures defined in the multi atlas data. + */ + multiPath?: string; + /** + * Optional Base URL to use when loading the textures defined in the multi atlas data. + */ + multiBaseURL?: string; + }; + + type CompressedTextureFileConfig = { + /** + * The string, or file entry object, for an ETC format texture. + */ + ETC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an ETC1 format texture. + */ + ETC1?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an ATC format texture. + */ + ATC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an ASTC format texture. + */ + ASTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an BPTC format texture. + */ + BPTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an RGTC format texture. + */ + RGTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an PVRTC format texture. + */ + PVRTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an S3TC format texture. + */ + S3TC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an S3TCSRGB format texture. + */ + S3TCSRGB?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for the fallback image file. + */ + IMG?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + }; + + type CSSFileConfig = { + /** + * The key of the file. Must be unique within the Loader. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type GLSLFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Text Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The type of shader. Either `fragment` for a fragment shader, or `vertex` for a vertex shader. This is ignored if you load a shader bundle. + */ + shaderType?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type HTMLFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Text Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type HTMLTextureFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The width of the texture the HTML will be rendered to. + */ + width?: number; + /** + * The height of the texture the HTML will be rendered to. + */ + height?: number; + }; + + type ImageFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * The filename of an associated normal map. It uses the same path and url to load as the image. + */ + normalMap?: string; + /** + * The frame configuration object. Only provided for, and used by, Sprite Sheets. + */ + frameConfig?: Phaser.Types.Loader.FileTypes.ImageFrameConfig; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type ImageFrameConfig = { + /** + * The width of the frame in pixels. + */ + frameWidth: number; + /** + * The height of the frame in pixels. Uses the `frameWidth` value if not provided. + */ + frameHeight?: number; + /** + * The first frame to start parsing from. + */ + startFrame?: number; + /** + * The frame to stop parsing at. If not provided it will calculate the value based on the image and frame dimensions. + */ + endFrame?: number; + /** + * The margin in the image. This is the space around the edge of the frames. + */ + margin?: number; + /** + * The spacing between each frame in the image. + */ + spacing?: number; + }; + + type JSONFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the JSON Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. Or can be a ready formed JSON object, in which case it will be directly added to the Cache. + */ + url?: string | any; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * If specified instead of the whole JSON file being parsed and added to the Cache, only the section corresponding to this property key will be added. If the property you want to extract is nested, use periods to divide it. + */ + dataKey?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type MultiAtlasFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the multi atlas json file from. Or, a well formed JSON object. + */ + atlasURL?: string; + /** + * An alias for 'atlasURL'. If given, it overrides anything set in 'atlasURL'. + */ + url?: string; + /** + * The default file extension to use for the atlas json if no url is provided. + */ + atlasExtension?: string; + /** + * Extra XHR Settings specifically for the atlas json file. + */ + atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * Optional path to use when loading the textures defined in the atlas data. + */ + path?: string; + /** + * Optional Base URL to use when loading the textures defined in the atlas data. + */ + baseURL?: string; + /** + * Extra XHR Settings specifically for the texture files. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type MultiScriptFileConfig = { + /** + * The key of the file. Must be unique within the Loader. + */ + key: string; + /** + * An array of absolute or relative URLs to load the script files from. They are processed in the order given in the array. + */ + url?: string[]; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for these files. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type OBJFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the OBJ Cache. + */ + key: string; + /** + * The absolute or relative URL to load this file from. If undefined or `null` it will be set to `.obj`, i.e. if `key` was "alien" then the URL will be "alien.obj". + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Flip the UV coordinates stored in the model data? + */ + flipUV?: boolean; + /** + * An optional absolute or relative URL to the object material file from. If undefined or `null`, no material file will be loaded. + */ + matURL?: string; + /** + * The default material file extension to use if no url is provided. + */ + matExtension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type PackFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the JSON Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. Or can be a ready formed JSON object, in which case it will be directly processed. + */ + url?: string | any; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * If specified instead of the whole JSON file being parsed, only the section corresponding to this property key will be added. If the property you want to extract is nested, use periods to divide it. + */ + dataKey?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type PackFileSection = { + /** + * The files to load. See {@link Phaser.Types.Loader.FileTypes}. + */ + files: Phaser.Types.Loader.FileConfig[]; + /** + * A URL used to resolve paths in `files`. Example: 'http://labs.phaser.io/assets/'. + */ + baseURL?: string; + /** + * The default {@link Phaser.Types.Loader.FileConfig} `type`. + */ + defaultType?: string; + /** + * A URL path used to resolve relative paths in `files`. Example: 'images/sprites/'. + */ + path?: string; + /** + * An optional prefix that is automatically prepended to each file key. + */ + prefix?: string; + }; + + type PluginFileConfig = { + /** + * The key of the file. Must be unique within the Loader. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Automatically start the plugin after loading? + */ + start?: boolean; + /** + * If this plugin is to be injected into the Scene, this is the property key used. + */ + mapping?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type SceneFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Text Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type ScenePluginFileConfig = { + /** + * The key of the file. Must be unique within the Loader. + */ + key: string; + /** + * The absolute or relative URL to load the file from. Or, a Scene Plugin. + */ + url?: string | Function; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * If this plugin is to be added to Scene.Systems, this is the property key for it. + */ + systemKey?: string; + /** + * If this plugin is to be added to the Scene, this is the property key for it. + */ + sceneKey?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type ScriptFileConfig = { + /** + * The key of the file. Must be unique within the Loader. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * The script type. Should be either 'script' for classic JavaScript, or 'module' if the file contains an exported module. + */ + type?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type SpriteSheetFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * The filename of an associated normal map. It uses the same path and url to load as the image. + */ + normalMap?: string; + /** + * The frame configuration object. + */ + frameConfig?: Phaser.Types.Loader.FileTypes.ImageFrameConfig; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type SVGFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The svg size configuration object. + */ + svgConfig?: Phaser.Types.Loader.FileTypes.SVGSizeConfig; + }; + + type SVGSizeConfig = { + /** + * An optional width. The SVG will be resized to this size before being rendered to a texture. + */ + width?: number; + /** + * An optional height. The SVG will be resized to this size before being rendered to a texture. + */ + height?: number; + /** + * An optional scale. If given it overrides the width / height properties. The SVG is scaled by the scale factor before being rendered to a texture. + */ + scale?: number; + }; + + type TextFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Text Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type TilemapCSVFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Tilemap Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type TilemapImpactFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Tilemap Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type TilemapJSONFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Tilemap Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. Or, a well formed JSON object. + */ + url?: object | string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type UnityAtlasFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Texture Manager. + */ + key: string; + /** + * The absolute or relative URL to load the texture image file from. + */ + textureURL?: string; + /** + * The default file extension to use for the image texture if no url is provided. + */ + textureExtension?: string; + /** + * Extra XHR Settings specifically for the texture image file. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The filename of an associated normal map. It uses the same path and url to load as the texture image. + */ + normalMap?: string; + /** + * The absolute or relative URL to load the atlas data file from. + */ + atlasURL?: string; + /** + * The default file extension to use for the atlas data if no url is provided. + */ + atlasExtension?: string; + /** + * Extra XHR Settings specifically for the atlas data file. + */ + atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + type VideoFileConfig = { + /** + * The key to use for this file, or a file configuration object. + */ + key: string | Phaser.Types.Loader.FileTypes.VideoFileConfig; + /** + * The absolute or relative URLs to load the video files from. + */ + url?: string | string[] | Phaser.Types.Loader.FileTypes.VideoFileURLConfig | Phaser.Types.Loader.FileTypes.VideoFileURLConfig[]; + /** + * Does the video have an audio track? If not you can enable auto-playing on it. + */ + noAudio?: boolean; + }; + + type VideoFileURLConfig = { + /** + * The video file format. See property names in {@link Phaser.Device.Video}. + */ + type: string; + /** + * The absolute or relative URL of the video file. + */ + url: string; + }; + + type XMLFileConfig = { + /** + * The key of the file. Must be unique within both the Loader and the Text Cache. + */ + key: string; + /** + * The absolute or relative URL to load the file from. + */ + url?: string; + /** + * The default file extension to use if no url is provided. + */ + extension?: string; + /** + * Extra XHR Settings specifically for this file. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + }; + + } + + type FileConfig = { + /** + * The name of the Loader method that loads this file, e.g., 'image', 'json', 'spritesheet'. + */ + type: string; + /** + * Unique cache key (unique within its file type) + */ + key: string; + /** + * The URL of the file, not including baseURL. + */ + url?: object | string; + /** + * The path of the file, not including the baseURL. + */ + path?: string; + /** + * The default extension this file uses. + */ + extension?: string; + /** + * The responseType to be used by the XHR request. + */ + responseType?: XMLHttpRequestResponseType; + /** + * Custom XHR Settings specific to this file and merged with the Loader defaults. + */ + xhrSettings?: Phaser.Types.Loader.XHRSettingsObject | false; + /** + * A config object that can be used by file types to store transitional data. + */ + config?: any; + /** + * The absolute or relative URL to load the texture image file from. + */ + textureURL?: string; + /** + * The default file extension to use for the image texture if no url is provided. + */ + textureExtension?: string; + /** + * Extra XHR Settings specifically for the texture image file. + */ + textureXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The absolute or relative URL to load the atlas json file from. Or, a well formed JSON object to use instead. + */ + atlasURL?: object | string; + /** + * The default file extension to use for the atlas json if no url is provided. + */ + atlasExtension?: string; + /** + * Extra XHR Settings specifically for the atlas json file. + */ + atlasXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The filename of an associated normal map. It uses the same path and url to load as the texture image. + */ + normalMap?: string; + /** + * The optional AudioContext this file will use to process itself (only used by Sound objects). + */ + context?: AudioContext; + /** + * The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead. + */ + jsonURL?: string; + /** + * Extra XHR Settings specifically for the json file. + */ + jsonXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The absolute or relative URL to load the audio file from. + */ + audioURL?: Object; + /** + * The audio configuration options. + */ + audioConfig?: any; + /** + * Extra XHR Settings specifically for the audio file. + */ + audioXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * Optional type to cast the binary file to once loaded. For example, `Uint8Array`. + */ + dataType?: any; + /** + * The absolute or relative URL to load the font data xml file from. + */ + fontDataURL?: string; + /** + * The default file extension to use for the font data xml if no url is provided. + */ + fontDataExtension?: string; + /** + * Extra XHR Settings specifically for the font data xml file. + */ + fontDataXhrSettings?: Phaser.Types.Loader.XHRSettingsObject; + /** + * The string, or file entry object, for an ETC format texture. + */ + ETC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an ETC1 format texture. + */ + ETC1?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an ATC format texture. + */ + ATC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an ASTC format texture. + */ + ASTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an BPTC format texture. + */ + BPTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an RGTC format texture. + */ + RGTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an PVRTC format texture. + */ + PVRTC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an S3TC format texture. + */ + S3TC?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for an S3TCSRGB format texture. + */ + S3TCSRGB?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The string, or file entry object, for the fallback image file. + */ + IMG?: Phaser.Types.Loader.FileTypes.CompressedTextureFileEntry | string; + /** + * The type of shader. Either `fragment` for a fragment shader, or `vertex` for a vertex shader. This is ignored if you load a shader bundle. + */ + shaderType?: string; + /** + * The width of the texture the HTML will be rendered to. + */ + width?: number; + /** + * The height of the texture the HTML will be rendered to. + */ + height?: number; + /** + * The frame configuration object. Only provided for, and used by, Sprite Sheets. + */ + frameConfig?: Phaser.Types.Loader.FileTypes.ImageFrameConfig; + /** + * If specified instead of the whole JSON file being parsed and added to the Cache, only the section corresponding to this property key will be added. If the property you want to extract is nested, use periods to divide it. + */ + dataKey?: string; + /** + * Optional Base URL to use when loading the textures defined in the atlas data. + */ + baseURL?: string; + /** + * Flip the UV coordinates stored in the model data? + */ + flipUV?: boolean; + /** + * An optional absolute or relative URL to the object material file from. If undefined or `null`, no material file will be loaded. + */ + matURL?: string; + /** + * The default material file extension to use if no url is provided. + */ + matExtension?: string; + /** + * Automatically start the plugin after loading? + */ + start?: boolean; + /** + * If this plugin is to be injected into the Scene, this is the property key used. + */ + mapping?: string; + /** + * If this plugin is to be added to Scene.Systems, this is the property key for it. + */ + systemKey?: string; + /** + * If this plugin is to be added to the Scene, this is the property key for it. + */ + sceneKey?: string; + /** + * The svg size configuration object. + */ + svgConfig?: Phaser.Types.Loader.FileTypes.SVGSizeConfig; + }; + + type XHRSettingsObject = { + /** + * The response type of the XHR request, i.e. `blob`, `text`, etc. + */ + responseType: XMLHttpRequestResponseType; + /** + * Should the XHR request use async or not? + */ + async?: boolean; + /** + * Optional username for the XHR request. + */ + user?: string; + /** + * Optional password for the XHR request. + */ + password?: string; + /** + * Optional XHR timeout value. + */ + timeout?: number; + /** + * This value is used to populate the XHR `setRequestHeader` and is undefined by default. + */ + headers?: object | undefined; + /** + * This value is used to populate the XHR `setRequestHeader` and is undefined by default. + */ + header?: string | undefined; + /** + * This value is used to populate the XHR `setRequestHeader` and is undefined by default. + */ + headerValue?: string | undefined; + /** + * This value is used to populate the XHR `setRequestHeader` and is undefined by default. + */ + requestedWith?: string | undefined; + /** + * Provide a custom mime-type to use instead of the default. + */ + overrideMimeType?: string | undefined; + /** + * The withCredentials property indicates whether or not cross-site Access-Control requests should be made using credentials such as cookies, authorization headers or TLS client certificates. Setting withCredentials has no effect on same-site requests. + */ + withCredentials?: boolean; + }; + + } + + namespace Math { + type RectangleLike = { + /** + * The x component. + */ + x: number; + /** + * The y component. + */ + y: number; + /** + * The width component. + */ + width: number; + /** + * The height component. + */ + height: number; + }; + + type SinCosTable = { + /** + * The sine value. + */ + sin: number; + /** + * The cosine value. + */ + cos: number; + /** + * The length. + */ + length: number; + }; + + type Vector2Like = { + /** + * The x component. + */ + x: number; + /** + * The y component. + */ + y: number; + }; + + type Vector3Like = { + /** + * The x component. + */ + x?: number; + /** + * The y component. + */ + y?: number; + /** + * The z component. + */ + z?: number; + }; + + type Vector4Like = { + /** + * The x component. + */ + x?: number; + /** + * The y component. + */ + y?: number; + /** + * The z component. + */ + z?: number; + /** + * The w component. + */ + w?: number; + }; + + } + + namespace Physics { + namespace Arcade { + type ArcadeBodyBounds = { + /** + * The left edge. + */ + x: number; + /** + * The upper edge. + */ + y: number; + /** + * The right edge. + */ + right: number; + /** + * The lower edge. + */ + bottom: number; + }; + + type ArcadeBodyCollision = { + /** + * True if the Body is not colliding. + */ + none: boolean; + /** + * True if the Body is colliding on its upper edge. + */ + up: boolean; + /** + * True if the Body is colliding on its lower edge. + */ + down: boolean; + /** + * True if the Body is colliding on its left edge. + */ + left: boolean; + /** + * True if the Body is colliding on its right edge. + */ + right: boolean; + }; + + /** + * An Arcade Physics Collider Type. + */ + type ArcadeCollider = Phaser.Physics.Arcade.Sprite | Phaser.Physics.Arcade.Image | Phaser.Physics.Arcade.StaticGroup | Phaser.Physics.Arcade.Group | Phaser.Tilemaps.TilemapLayer; + + /** + * An Arcade Physics Collider Type. + */ + type ArcadeColliderType = Phaser.GameObjects.GameObject | Phaser.GameObjects.Group | Phaser.Physics.Arcade.Sprite | Phaser.Physics.Arcade.Image | Phaser.Physics.Arcade.StaticGroup | Phaser.Physics.Arcade.Group | Phaser.Tilemaps.TilemapLayer | Phaser.GameObjects.GameObject[] | Phaser.Physics.Arcade.Sprite[] | Phaser.Physics.Arcade.Image[] | Phaser.Physics.Arcade.StaticGroup[] | Phaser.Physics.Arcade.Group[] | Phaser.Tilemaps.TilemapLayer[]; + + type ArcadePhysicsCallback = (object1: Phaser.Types.Physics.Arcade.GameObjectWithBody | Phaser.Tilemaps.Tile, object2: Phaser.Types.Physics.Arcade.GameObjectWithBody | Phaser.Tilemaps.Tile)=>void; + + type ArcadeWorldConfig = { + /** + * Sets {@link Phaser.Physics.Arcade.World#fps}. + */ + fps?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#fixedStep}. + */ + fixedStep?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#timeScale}. + */ + timeScale?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#gravity}. + */ + gravity?: Phaser.Types.Math.Vector2Like; + /** + * Sets {@link Phaser.Physics.Arcade.World#bounds bounds.x}. + */ + x?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#bounds bounds.y}. + */ + y?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#bounds bounds.width}. + */ + width?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#bounds bounds.height}. + */ + height?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#checkCollision}. + */ + checkCollision?: Phaser.Types.Physics.Arcade.CheckCollisionObject; + /** + * Sets {@link Phaser.Physics.Arcade.World#OVERLAP_BIAS}. + */ + overlapBias?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#TILE_BIAS}. + */ + tileBias?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#forceX}. + */ + forceX?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#isPaused}. + */ + isPaused?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#debug}. + */ + debug?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#defaults debugShowBody}. + */ + debugShowBody?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#defaults debugShowStaticBody}. + */ + debugShowStaticBody?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#defaults debugShowStaticBody}. + */ + debugShowVelocity?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.World#defaults bodyDebugColor}. + */ + debugBodyColor?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#defaults staticBodyDebugColor}. + */ + debugStaticBodyColor?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#defaults velocityDebugColor}. + */ + debugVelocityColor?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#maxEntries}. + */ + maxEntries?: number; + /** + * Sets {@link Phaser.Physics.Arcade.World#useTree}. + */ + useTree?: boolean; + /** + * If enabled, you need to call `World.update` yourself. + */ + customUpdate?: boolean; + }; + + type ArcadeWorldDefaults = { + /** + * Set to `true` to render dynamic body outlines to the debug display. + */ + debugShowBody: boolean; + /** + * Set to `true` to render static body outlines to the debug display. + */ + debugShowStaticBody: boolean; + /** + * Set to `true` to render body velocity markers to the debug display. + */ + debugShowVelocity: boolean; + /** + * The color of dynamic body outlines when rendered to the debug display. + */ + bodyDebugColor: number; + /** + * The color of static body outlines when rendered to the debug display. + */ + staticBodyDebugColor: number; + /** + * The color of the velocity markers when rendered to the debug display. + */ + velocityDebugColor: number; + }; + + type ArcadeWorldTreeMinMax = { + /** + * The minimum x value used in RTree searches. + */ + minX: number; + /** + * The minimum y value used in RTree searches. + */ + minY: number; + /** + * The maximum x value used in RTree searches. + */ + maxX: number; + /** + * The maximum y value used in RTree searches. + */ + maxY: number; + }; + + type CheckCollisionObject = { + /** + * Will bodies collide with the top side of the world bounds? + */ + up: boolean; + /** + * Will bodies collide with the bottom side of the world bounds? + */ + down: boolean; + /** + * Will bodies collide with the left side of the world bounds? + */ + left: boolean; + /** + * Will bodies collide with the right side of the world bounds? + */ + right: boolean; + }; + + type GameObjectWithBody = Phaser.GameObjects.GameObject & { + body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody; + }; + + type GameObjectWithDynamicBody = Phaser.GameObjects.GameObject & { + body: Phaser.Physics.Arcade.Body; + }; + + type GameObjectWithStaticBody = Phaser.GameObjects.GameObject & { + body: Phaser.Physics.Arcade.StaticBody; + }; + + type ImageWithDynamicBody = Phaser.Physics.Arcade.Image & { + body: Phaser.Physics.Arcade.Body; + }; + + type ImageWithStaticBody = Phaser.Physics.Arcade.Image & { + body: Phaser.Physics.Arcade.StaticBody; + }; + + type PhysicsGroupConfig = Phaser.Types.GameObjects.Group.GroupConfig & { + /** + * Sets {@link Phaser.Physics.Arcade.Body#collideWorldBounds}. + */ + collideWorldBounds?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.Body#setBoundsRectangle setBoundsRectangle}. + */ + customBoundsRectangle?: Phaser.Geom.Rectangle; + /** + * Sets {@link Phaser.Physics.Arcade.Body#acceleration acceleration.x}. + */ + accelerationX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#acceleration acceleration.y}. + */ + accelerationY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#allowDrag}. + */ + allowDrag?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.Body#allowGravity}. + */ + allowGravity?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.Body#allowRotation}. + */ + allowRotation?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.Body#useDamping useDamping}. + */ + useDamping?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.Body#bounce bounce.x}. + */ + bounceX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#bounce bounce.y}. + */ + bounceY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#drag drag.x}. + */ + dragX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#drag drag.y}. + */ + dragY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#enable enable}. + */ + enable?: boolean; + /** + * Sets {@link Phaser.Physics.Arcade.Body#gravity gravity.x}. + */ + gravityX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#gravity gravity.y}. + */ + gravityY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#friction friction.x}. + */ + frictionX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#friction friction.y}. + */ + frictionY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#maxSpeed maxSpeed}. + */ + maxSpeed?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#maxVelocity maxVelocity.x}. + */ + maxVelocityX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#maxVelocity maxVelocity.y}. + */ + maxVelocityY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#velocity velocity.x}. + */ + velocityX?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#velocity velocity.y}. + */ + velocityY?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#angularVelocity}. + */ + angularVelocity?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#angularAcceleration}. + */ + angularAcceleration?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#angularDrag}. + */ + angularDrag?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#mass}. + */ + mass?: number; + /** + * Sets {@link Phaser.Physics.Arcade.Body#immovable}. + */ + immovable?: boolean; + }; + + type PhysicsGroupDefaults = { + /** + * As {@link Phaser.Physics.Arcade.Body#setCollideWorldBounds}. + */ + setCollideWorldBounds: boolean; + /** + * As {@link Phaser.Physics.Arcade.Body#setBoundsRectangle}. + */ + setBoundsRectangle: Phaser.Geom.Rectangle; + /** + * As {@link Phaser.Physics.Arcade.Body#setAccelerationX}. + */ + setAccelerationX: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setAccelerationY}. + */ + setAccelerationY: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setAllowDrag}. + */ + setAllowDrag: boolean; + /** + * As {@link Phaser.Physics.Arcade.Body#setAllowGravity}. + */ + setAllowGravity: boolean; + /** + * As {@link Phaser.Physics.Arcade.Body#setAllowRotation}. + */ + setAllowRotation: boolean; + /** + * As {@link Phaser.Physics.Arcade.Body#setDamping}. + */ + setDamping: boolean; + /** + * As {@link Phaser.Physics.Arcade.Body#setBounceX}. + */ + setBounceX: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setBounceY}. + */ + setBounceY: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setDragX}. + */ + setDragX: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setDragY}. + */ + setDragY: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setEnable}. + */ + setEnable: boolean; + /** + * As {@link Phaser.Physics.Arcade.Body#setGravityX}. + */ + setGravityX: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setGravityY}. + */ + setGravityY: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setFrictionX}. + */ + setFrictionX: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setFrictionY}. + */ + setFrictionY: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setMaxSpeed}. + */ + setMaxSpeed: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setVelocityX}. + */ + setVelocityX: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setVelocityY}. + */ + setVelocityY: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setAngularVelocity}. + */ + setAngularVelocity: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setAngularAcceleration}. + */ + setAngularAcceleration: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setAngularDrag}. + */ + setAngularDrag: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setMass}. + */ + setMass: number; + /** + * As {@link Phaser.Physics.Arcade.Body#setImmovable}. + */ + setImmovable: boolean; + }; + + type SpriteWithDynamicBody = Phaser.Physics.Arcade.Sprite & { + body: Phaser.Physics.Arcade.Body; + }; + + type SpriteWithStaticBody = Phaser.Physics.Arcade.Sprite & { + body: Phaser.Physics.Arcade.StaticBody; + }; + + } + + namespace Matter { + type MatterBody = MatterJS.BodyType | Phaser.GameObjects.GameObject | Phaser.Physics.Matter.Image | Phaser.Physics.Matter.Sprite | Phaser.Physics.Matter.TileBody; + + type MatterBodyConfig = { + /** + * An arbitrary string-based name to help identify this body. + */ + label?: string; + /** + * Set this Game Object to create and use a new Body based on the configuration object given. + */ + shape?: string | Phaser.Types.Physics.Matter.MatterSetBodyConfig; + /** + * An array of bodies that make up this body. The first body in the array must always be a self reference to the current body instance. All bodies in the `parts` array together form a single rigid compound body. + */ + parts?: MatterJS.BodyType[]; + /** + * An object reserved for storing plugin-specific properties. + */ + plugin?: any; + /** + * A number specifying the angle of the body, in radians. + */ + angle?: number; + /** + * An array of `Vector` objects that specify the convex hull of the rigid body. These should be provided about the origin `(0, 0)`. + */ + vertices?: Phaser.Types.Math.Vector2Like[]; + /** + * A `Vector` that specifies the current world-space position of the body. + */ + position?: Phaser.Types.Math.Vector2Like; + /** + * A `Vector` that specifies the force to apply in the current step. It is zeroed after every `Body.update`. See also `Body.applyForce`. + */ + force?: Phaser.Types.Math.Vector2Like; + /** + * A `Number` that specifies the torque (turning force) to apply in the current step. It is zeroed after every `Body.update`. + */ + torque?: number; + /** + * A flag that indicates whether a body is a sensor. Sensor triggers collision events, but doesn't react with colliding body physically. + */ + isSensor?: boolean; + /** + * A flag that indicates whether a body is considered static. A static body can never change position or angle and is completely fixed. + */ + isStatic?: boolean; + /** + * A `Number` that defines the number of updates in which this body must have near-zero velocity before it is set as sleeping by the `Matter.Sleeping` module (if sleeping is enabled by the engine). + */ + sleepThreshold?: number; + /** + * A `Number` that defines the density of the body, that is its mass per unit area. If you pass the density via `Body.create` the `mass` property is automatically calculated for you based on the size (area) of the object. This is generally preferable to simply setting mass and allows for more intuitive definition of materials (e.g. rock has a higher density than wood). + */ + density?: number; + /** + * A `Number` that defines the restitution (elasticity) of the body. The value is always positive and is in the range `(0, 1)`. + */ + restitution?: number; + /** + * A `Number` that defines the friction of the body. The value is always positive and is in the range `(0, 1)`. A value of `0` means that the body may slide indefinitely. A value of `1` means the body may come to a stop almost instantly after a force is applied. + */ + friction?: number; + /** + * A `Number` that defines the static friction of the body (in the Coulomb friction model). A value of `0` means the body will never 'stick' when it is nearly stationary and only dynamic `friction` is used. The higher the value (e.g. `10`), the more force it will take to initially get the body moving when nearly stationary. This value is multiplied with the `friction` property to make it easier to change `friction` and maintain an appropriate amount of static friction. + */ + frictionStatic?: number; + /** + * A `Number` that defines the air friction of the body (air resistance). A value of `0` means the body will never slow as it moves through space. The higher the value, the faster a body slows when moving through space. + */ + frictionAir?: number; + /** + * An `Object` that specifies the collision filtering properties of this body. + */ + collisionFilter?: Phaser.Types.Physics.Matter.MatterCollisionFilter; + /** + * A `Number` that specifies a tolerance on how far a body is allowed to 'sink' or rotate into other bodies. Avoid changing this value unless you understand the purpose of `slop` in physics engines. The default should generally suffice, although very large bodies may require larger values for stable stacking. + */ + slop?: number; + /** + * A `Number` that allows per-body time scaling, e.g. a force-field where bodies inside are in slow-motion, while others are at full speed. + */ + timeScale?: number; + /** + * A number, or array of numbers, to chamfer the vertices of the body, or a full Chamfer configuration object. + */ + chamfer?: number | number[] | Phaser.Types.Physics.Matter.MatterChamferConfig; + /** + * The radius of this body if a circle. + */ + circleRadius?: number; + /** + * A `Number` that defines the mass of the body, although it may be more appropriate to specify the `density` property instead. If you modify this value, you must also modify the `body.inverseMass` property (`1 / mass`). + */ + mass?: number; + /** + * A `Number` that defines the inverse mass of the body (`1 / mass`). If you modify this value, you must also modify the `body.mass` property. + */ + inverseMass?: number; + /** + * A `Vector` that specifies the initial scale of the body. + */ + scale?: Phaser.Types.Math.Vector2Like; + /** + * A `Vector` that scales the influence of World gravity when applied to this body. + */ + gravityScale?: Phaser.Types.Math.Vector2Like; + /** + * A boolean that toggles if this body should ignore world gravity or not. + */ + ignoreGravity?: boolean; + /** + * A boolean that toggles if this body should ignore pointer / mouse constraints or not. + */ + ignorePointer?: boolean; + /** + * The Debug Render configuration object for this body. + */ + render?: Phaser.Types.Physics.Matter.MatterBodyRenderConfig; + /** + * A callback that is invoked when this Body starts colliding with any other Body. You can register callbacks by providing a function of type `( pair: Matter.Pair) => void`. + */ + onCollideCallback?: Function; + /** + * A callback that is invoked when this Body stops colliding with any other Body. You can register callbacks by providing a function of type `( pair: Matter.Pair) => void`. + */ + onCollideEndCallback?: Function; + /** + * A callback that is invoked for the duration that this Body is colliding with any other Body. You can register callbacks by providing a function of type `( pair: Matter.Pair) => void`. + */ + onCollideActiveCallback?: Function; + /** + * A collision callback dictionary used by the `Body.setOnCollideWith` function. + */ + onCollideWith?: any; + }; + + type MatterBodyRenderConfig = { + /** + * Should this body be rendered by the Debug Renderer? + */ + visible?: boolean; + /** + * The opacity of the body and all parts within it. + */ + opacity?: number; + /** + * The color value of the fill when rendering this body. + */ + fillColor?: number; + /** + * The opacity of the fill when rendering this body, a value between 0 and 1. + */ + fillOpacity?: number; + /** + * The color value of the line stroke when rendering this body. + */ + lineColor?: number; + /** + * The opacity of the line when rendering this body, a value between 0 and 1. + */ + lineOpacity?: number; + /** + * If rendering lines, the thickness of the line. + */ + lineThickness?: number; + /** + * Controls the offset between the body and the parent Game Object, if it has one. + */ + sprite?: object; + /** + * The horizontal offset between the body and the parent Game Object texture, if it has one. + */ + "sprite.xOffset"?: number; + /** + * The vertical offset between the body and the parent Game Object texture, if it has one. + */ + "sprite.yOffset"?: number; + }; + + type MatterBodyTileOptions = { + /** + * Whether or not the newly created body should be made static. This defaults to true since typically tiles should not be moved. + */ + isStatic?: boolean; + /** + * Whether or not to add the newly created body (or existing body if options.body is used) to the Matter world. + */ + addToWorld?: boolean; + }; + + type MatterChamferConfig = { + /** + * A single number, or an array, to specify the radius for each vertex. + */ + radius?: number | number[]; + /** + * The quality of the chamfering. -1 means 'auto'. + */ + quality?: number; + /** + * The minimum quality of the chamfering. The higher this value, the more vertices are created. + */ + qualityMin?: number; + /** + * The maximum quality of the chamfering. The higher this value, the more vertices are created. + */ + qualityMax?: number; + }; + + type MatterCollisionData = { + /** + * Have the pair collided or not? + */ + collided: boolean; + /** + * A reference to the first body involved in the collision. + */ + bodyA: MatterJS.BodyType; + /** + * A reference to the second body involved in the collision. + */ + bodyB: MatterJS.BodyType; + /** + * A reference to the dominant axis body. + */ + axisBody: MatterJS.BodyType; + /** + * The index of the dominant collision axis vector (edge normal) + */ + axisNumber: number; + /** + * The depth of the collision on the minimum overlap. + */ + depth: number; + /** + * A reference to the parent of Body A, or to Body A itself if it has no parent. + */ + parentA: MatterJS.BodyType; + /** + * A reference to the parent of Body B, or to Body B itself if it has no parent. + */ + parentB: MatterJS.BodyType; + /** + * The collision normal, facing away from Body A. + */ + normal: MatterJS.Vector; + /** + * The tangent of the collision normal. + */ + tangent: MatterJS.Vector; + /** + * The penetration distances between the two bodies. + */ + penetration: MatterJS.Vector; + /** + * An array of support points, either exactly one or two points. + */ + supports: MatterJS.Vector[]; + /** + * The resulting inverse mass from the collision. + */ + inverseMass: number; + /** + * The resulting friction from the collision. + */ + friction: number; + /** + * The resulting static friction from the collision. + */ + frictionStatic: number; + /** + * The resulting restitution from the collision. + */ + restitution: number; + /** + * The resulting slop from the collision. + */ + slop: number; + }; + + /** + * An `Object` that specifies the collision filtering properties of this body. + * + * Collisions between two bodies will obey the following rules: + * - If the two bodies have the same non-zero value of `collisionFilter.group`, + * they will always collide if the value is positive, and they will never collide + * if the value is negative. + * - If the two bodies have different values of `collisionFilter.group` or if one + * (or both) of the bodies has a value of 0, then the category/mask rules apply as follows: + * + * Each body belongs to a collision category, given by `collisionFilter.category`. This + * value is used as a bit field and the category should have only one bit set, meaning that + * the value of this property is a power of two in the range [1, 2^31]. Thus, there are 32 + * different collision categories available. + * + * Each body also defines a collision bitmask, given by `collisionFilter.mask` which specifies + * the categories it collides with (the value is the bitwise AND value of all these categories). + * + * Using the category/mask rules, two bodies `A` and `B` collide if each includes the other's + * category in its mask, i.e. `(categoryA & maskB) !== 0` and `(categoryB & maskA) !== 0` + * are both true. + */ + type MatterCollisionFilter = { + /** + * A bit field that specifies the collision category this body belongs to. The category value should have only one bit set, for example `0x0001`. This means there are up to 32 unique collision categories available. + */ + category?: number; + /** + * A bit mask that specifies the collision categories this body may collide with. + */ + mask?: number; + /** + * An Integer `Number`, that specifies the collision group this body belongs to. + */ + group?: number; + }; + + type MatterCollisionPair = { + /** + * The unique auto-generated collision pair id. A combination of the body A and B IDs. + */ + id: string; + /** + * A reference to the first body involved in the collision. + */ + bodyA: MatterJS.BodyType; + /** + * A reference to the second body involved in the collision. + */ + bodyB: MatterJS.BodyType; + /** + * An array containing all of the active contacts between bodies A and B. + */ + contacts: MatterJS.Vector[]; + /** + * The amount of separation that occurred between bodies A and B. + */ + separation: number; + /** + * Is the collision still active or not? + */ + isActive: boolean; + /** + * Has Matter determined the collision are being active yet? + */ + confirmedActive: boolean; + /** + * Is either body A or B a sensor? + */ + isSensor: boolean; + /** + * The timestamp when the collision pair was created. + */ + timeCreated: number; + /** + * The timestamp when the collision pair was most recently updated. + */ + timeUpdated: number; + /** + * The collision data object. + */ + collision: Phaser.Types.Physics.Matter.MatterCollisionData; + /** + * The resulting inverse mass from the collision. + */ + inverseMass: number; + /** + * The resulting friction from the collision. + */ + friction: number; + /** + * The resulting static friction from the collision. + */ + frictionStatic: number; + /** + * The resulting restitution from the collision. + */ + restitution: number; + /** + * The resulting slop from the collision. + */ + slop: number; + }; + + type MatterConstraintConfig = { + /** + * An arbitrary string-based name to help identify this constraint. + */ + label?: string; + /** + * The first possible `Body` that this constraint is attached to. + */ + bodyA?: MatterJS.BodyType; + /** + * The second possible `Body` that this constraint is attached to. + */ + bodyB?: MatterJS.BodyType; + /** + * A `Vector` that specifies the offset of the constraint from center of the `constraint.bodyA` if defined, otherwise a world-space position. + */ + pointA?: Phaser.Types.Math.Vector2Like; + /** + * A `Vector` that specifies the offset of the constraint from center of the `constraint.bodyB` if defined, otherwise a world-space position. + */ + pointB?: Phaser.Types.Math.Vector2Like; + /** + * A `Number` that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`. A value of `1` means the constraint should be very stiff. A value of `0.2` means the constraint acts like a soft spring. + */ + stiffness?: number; + /** + * A `Number` that specifies the angular stiffness of the constraint. + */ + angularStiffness?: number; + /** + * The angleA of the constraint. If bodyA is set, the angle of bodyA is used instead. + */ + angleA?: number; + /** + * The angleB of the constraint. If bodyB is set, the angle of bodyB is used instead. + */ + angleB?: number; + /** + * A `Number` that specifies the damping of the constraint, i.e. the amount of resistance applied to each body based on their velocities to limit the amount of oscillation. Damping will only be apparent when the constraint also has a very low `stiffness`. A value of `0.1` means the constraint will apply heavy damping, resulting in little to no oscillation. A value of `0` means the constraint will apply no damping. + */ + damping?: number; + /** + * A `Number` that specifies the target resting length of the constraint. It is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`. + */ + length?: number; + /** + * An object reserved for storing plugin-specific properties. + */ + plugin?: any; + /** + * The Debug Render configuration object for this constraint. + */ + render?: Phaser.Types.Physics.Matter.MatterConstraintRenderConfig; + }; + + type MatterConstraintRenderConfig = { + /** + * Should this constraint be rendered by the Debug Renderer? + */ + visible?: boolean; + /** + * If this constraint has anchors, should they be rendered? Pin constraints never have anchors. + */ + anchors?: boolean; + /** + * The color value of the line stroke when rendering this constraint. + */ + lineColor?: number; + /** + * The opacity of the line when rendering this constraint, a value between 0 and 1. + */ + lineOpacity?: number; + /** + * If rendering lines, the thickness of the line. + */ + lineThickness?: number; + /** + * The size of the circles drawn when rendering pin constraints. + */ + pinSize?: number; + /** + * The size of the circles drawn as the constraint anchors. + */ + anchorSize?: number; + /** + * The color value of constraint anchors. + */ + anchorColor?: number; + }; + + type MatterDebugConfig = { + /** + * Render all of the body axes? + */ + showAxes?: boolean; + /** + * Render just a single body axis? + */ + showAngleIndicator?: boolean; + /** + * The color of the body angle / axes lines. + */ + angleColor?: number; + /** + * Render the broadphase grid? + */ + showBroadphase?: boolean; + /** + * The color of the broadphase grid. + */ + broadphaseColor?: number; + /** + * Render the bounds of the bodies in the world? + */ + showBounds?: boolean; + /** + * The color of the body bounds. + */ + boundsColor?: number; + /** + * Render the velocity of the bodies in the world? + */ + showVelocity?: boolean; + /** + * The color of the body velocity line. + */ + velocityColor?: number; + /** + * Render the collision points and normals for colliding pairs. + */ + showCollisions?: boolean; + /** + * The color of the collision points. + */ + collisionColor?: number; + /** + * Render lines showing the separation between bodies. + */ + showSeparation?: boolean; + /** + * The color of the body separation line. + */ + separationColor?: number; + /** + * Render the dynamic bodies in the world to the Graphics object? + */ + showBody?: boolean; + /** + * Render the static bodies in the world to the Graphics object? + */ + showStaticBody?: boolean; + /** + * When rendering bodies, render the internal edges as well? + */ + showInternalEdges?: boolean; + /** + * Render the bodies using a fill color. + */ + renderFill?: boolean; + /** + * Render the bodies using a line stroke. + */ + renderLine?: boolean; + /** + * The color value of the fill when rendering dynamic bodies. + */ + fillColor?: number; + /** + * The opacity of the fill when rendering dynamic bodies, a value between 0 and 1. + */ + fillOpacity?: number; + /** + * The color value of the line stroke when rendering dynamic bodies. + */ + lineColor?: number; + /** + * The opacity of the line when rendering dynamic bodies, a value between 0 and 1. + */ + lineOpacity?: number; + /** + * If rendering lines, the thickness of the line. + */ + lineThickness?: number; + /** + * The color value of the fill when rendering static bodies. + */ + staticFillColor?: number; + /** + * The color value of the line stroke when rendering static bodies. + */ + staticLineColor?: number; + /** + * Render any sleeping bodies (dynamic or static) in the world to the Graphics object? + */ + showSleeping?: boolean; + /** + * The amount to multiply the opacity of sleeping static bodies by. + */ + staticBodySleepOpacity?: number; + /** + * The color value of the fill when rendering sleeping dynamic bodies. + */ + sleepFillColor?: number; + /** + * The color value of the line stroke when rendering sleeping dynamic bodies. + */ + sleepLineColor?: number; + /** + * Render bodies or body parts that are flagged as being a sensor? + */ + showSensors?: boolean; + /** + * The fill color when rendering body sensors. + */ + sensorFillColor?: number; + /** + * The line color when rendering body sensors. + */ + sensorLineColor?: number; + /** + * Render the position of non-static bodies? + */ + showPositions?: boolean; + /** + * The size of the rectangle drawn when rendering the body position. + */ + positionSize?: number; + /** + * The color value of the rectangle drawn when rendering the body position. + */ + positionColor?: number; + /** + * Render all world constraints to the Graphics object? + */ + showJoint?: boolean; + /** + * The color value of joints when `showJoint` is set. + */ + jointColor?: number; + /** + * The line opacity when rendering joints, a value between 0 and 1. + */ + jointLineOpacity?: number; + /** + * The line thickness when rendering joints. + */ + jointLineThickness?: number; + /** + * The size of the circles drawn when rendering pin constraints. + */ + pinSize?: number; + /** + * The color value of the circles drawn when rendering pin constraints. + */ + pinColor?: number; + /** + * The color value of spring constraints. + */ + springColor?: number; + /** + * The color value of constraint anchors. + */ + anchorColor?: number; + /** + * The size of the circles drawn as the constraint anchors. + */ + anchorSize?: number; + /** + * When rendering polygon bodies, render the convex hull as well? + */ + showConvexHulls?: boolean; + /** + * The color value of hulls when `showConvexHulls` is set. + */ + hullColor?: number; + }; + + type MatterRunnerConfig = { + /** + * A boolean that specifies if the runner should use a fixed timestep (otherwise it is variable). If timing is fixed, then the apparent simulation speed will change depending on the frame rate (but behaviour will be deterministic). If the timing is variable, then the apparent simulation speed will be constant (approximately, but at the cost of determininism). + */ + isFixed?: boolean; + /** + * A number that specifies the frame rate in seconds. If you don't specify this, but do specify `delta`, those values set the fps rate. + */ + fps?: number; + /** + * A number that specifies the time correction factor to apply to the update. This can help improve the accuracy of the simulation in cases where delta is changing between updates. + */ + correction?: number; + /** + * The size of the delta smoothing array when `isFixed` is `false`. + */ + deltaSampleSize?: number; + /** + * A number that specifies the time step between updates in milliseconds. If you set the `fps` property, this value is set based on that. If `isFixed` is set to `true`, then `delta` is fixed. If it is `false`, then `delta` can dynamically change to maintain the correct apparent simulation speed. + */ + delta?: number; + /** + * A number that specifies the minimum time step between updates in milliseconds. + */ + deltaMin?: number; + /** + * A number that specifies the maximum time step between updates in milliseconds. + */ + deltaMax?: number; + }; + + type MatterSetBodyConfig = { + /** + * The shape type. Either `rectangle`, `circle`, `trapezoid`, `polygon`, `fromVertices`, `fromVerts` or `fromPhysicsEditor`. + */ + type?: string; + /** + * The horizontal world position to place the body at. + */ + x?: number; + /** + * The vertical world position to place the body at. + */ + y?: number; + /** + * The width of the body. + */ + width?: number; + /** + * The height of the body. + */ + height?: number; + /** + * The radius of the body. Used by `circle` and `polygon` shapes. + */ + radius?: number; + /** + * The max sizes of the body. Used by the `circle` shape. + */ + maxSides?: number; + /** + * Used by the `trapezoid` shape. The slope of the trapezoid. 0 creates a rectangle, while 1 creates a triangle. Positive values make the top side shorter, while negative values make the bottom side shorter. + */ + slope?: number; + /** + * Used by the `polygon` shape. The number of sides the polygon will have. + */ + sides?: number; + /** + * Used by the `fromVerts` shape. The vertices data. Either a path string or an array of vertices. + */ + verts?: string | any[]; + /** + * Used by the `fromVerts` shape. Flag internal edges (coincident part edges) + */ + flagInternal?: boolean; + /** + * Used by the `fromVerts` shape. Whether Matter.js will discard collinear edges (to improve performance). + */ + removeCollinear?: number; + /** + * Used by the `fromVerts` shape. During decomposition discard parts that have an area less than this. + */ + minimumArea?: number; + /** + * Should the new body be automatically added to the world? + */ + addToWorld?: boolean; + }; + + type MatterTileOptions = { + /** + * An existing Matter body to be used instead of creating a new one. + */ + body?: MatterJS.BodyType; + /** + * Whether or not the newly created body should be made static. This defaults to true since typically tiles should not be moved. + */ + isStatic?: boolean; + /** + * Whether or not to add the newly created body (or existing body if options.body is used) to the Matter world. + */ + addToWorld?: boolean; + }; + + type MatterWalls = { + /** + * The left wall for the Matter World. + */ + left?: MatterJS.BodyType; + /** + * The right wall for the Matter World. + */ + right?: MatterJS.BodyType; + /** + * The top wall for the Matter World. + */ + top?: MatterJS.BodyType; + /** + * The bottom wall for the Matter World. + */ + bottom?: MatterJS.BodyType; + }; + + type MatterWorldConfig = { + /** + * Sets {@link Phaser.Physics.Matter.World#gravity}. + */ + gravity?: Phaser.Types.Math.Vector2Like; + /** + * Should the world have bounds enabled by default? + */ + setBounds?: object | boolean; + /** + * The x coordinate of the world bounds. + */ + "setBounds.x"?: number; + /** + * The y coordinate of the world bounds. + */ + "setBounds.y"?: number; + /** + * The width of the world bounds. + */ + "setBounds.width"?: number; + /** + * The height of the world bounds. + */ + "setBounds.height"?: number; + /** + * The thickness of the walls of the world bounds. + */ + "setBounds.thickness"?: number; + /** + * Should the left-side world bounds wall be created? + */ + "setBounds.left"?: boolean; + /** + * Should the right-side world bounds wall be created? + */ + "setBounds.right"?: boolean; + /** + * Should the top world bounds wall be created? + */ + "setBounds.top"?: boolean; + /** + * Should the bottom world bounds wall be created? + */ + "setBounds.bottom"?: boolean; + /** + * The number of position iterations to perform each update. The higher the value, the higher quality the simulation will be at the expense of performance. + */ + positionIterations?: number; + /** + * The number of velocity iterations to perform each update. The higher the value, the higher quality the simulation will be at the expense of performance. + */ + velocityIterations?: number; + /** + * The number of constraint iterations to perform each update. The higher the value, the higher quality the simulation will be at the expense of performance. + */ + constraintIterations?: number; + /** + * A flag that specifies whether the engine should allow sleeping via the `Matter.Sleeping` module. Sleeping can improve stability and performance, but often at the expense of accuracy. + */ + enableSleeping?: boolean; + /** + * A `Number` that specifies the current simulation-time in milliseconds starting from `0`. It is incremented on every `Engine.update` by the given `delta` argument. + */ + "timing.timestamp"?: number; + /** + * A `Number` that specifies the global scaling factor of time for all bodies. A value of `0` freezes the simulation. A value of `0.1` gives a slow-motion effect. A value of `1.2` gives a speed-up effect. + */ + "timing.timeScale"?: number; + /** + * Should the Matter Attractor Plugin be enabled? An attractors plugin that makes it easy to apply continual forces on bodies. It's possible to simulate effects such as wind, gravity and magnetism. + */ + "plugins.attractors"?: boolean; + /** + * Should the Matter Wrap Plugin be enabled? A coordinate wrapping plugin that automatically wraps the position of bodies such that they always stay within the given bounds. Upon crossing a boundary the body will appear on the opposite side of the bounds, while maintaining its velocity. + */ + "plugins.wrap"?: boolean; + /** + * Should the Matter Collision Events Plugin be enabled? + */ + "plugins.collisionevents"?: boolean; + /** + * Toggles if the world is enabled or not. + */ + enabled?: boolean; + /** + * An optional Number that specifies the time correction factor to apply to the update. + */ + correction?: number; + /** + * This function is called every time the core game loop steps, which is bound to the Request Animation Frame frequency unless otherwise modified. + */ + getDelta?: Function; + /** + * Automatically call Engine.update every time the game steps. + */ + autoUpdate?: boolean; + /** + * Sets the Resolver resting threshold property. + */ + restingThresh?: number; + /** + * Sets the Resolver resting threshold tangent property. + */ + restingThreshTangent?: number; + /** + * Sets the Resolver position dampen property. + */ + positionDampen?: number; + /** + * Sets the Resolver position warming property. + */ + positionWarming?: number; + /** + * Sets the Resolver friction normal multiplier property. + */ + frictionNormalMultiplier?: number; + /** + * Controls the Matter Debug Rendering options. If a boolean it will use the default values, otherwise, specify a Debug Config object. + */ + debug?: boolean | Phaser.Types.Physics.Matter.MatterDebugConfig; + /** + * Sets the Matter Runner options. + */ + runner?: Phaser.Types.Physics.Matter.MatterRunnerConfig; + }; + + } + + } + + namespace Plugins { + type CorePluginContainer = { + /** + * The unique name of this plugin in the core plugin cache. + */ + key: string; + /** + * The plugin to be stored. Should be the source object, not instantiated. + */ + plugin: Function; + /** + * If this plugin is to be injected into the Scene Systems, this is the property key map used. + */ + mapping?: string; + /** + * Core Scene plugin or a Custom Scene plugin? + */ + custom?: boolean; + }; + + type CustomPluginContainer = { + /** + * The unique name of this plugin in the custom plugin cache. + */ + key: string; + /** + * The plugin to be stored. Should be the source object, not instantiated. + */ + plugin: Function; + }; + + type GlobalPlugin = { + /** + * The unique name of this plugin within the plugin cache. + */ + key: string; + /** + * An instance of the plugin. + */ + plugin: Function; + /** + * Is the plugin active or not? + */ + active?: boolean; + /** + * If this plugin is to be injected into the Scene Systems, this is the property key map used. + */ + mapping?: string; + }; + + } + + namespace Renderer { + namespace Snapshot { + type SnapshotCallback = (snapshot: Phaser.Display.Color | HTMLImageElement)=>void; + + type SnapshotState = { + /** + * The function to call after the snapshot is taken. + */ + callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback; + /** + * The format of the image to create, usually `image/png` or `image/jpeg`. + */ + type?: string; + /** + * The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. + */ + encoderOptions?: number; + /** + * The x coordinate to start the snapshot from. + */ + x?: number; + /** + * The y coordinate to start the snapshot from. + */ + y?: number; + /** + * The width of the snapshot. + */ + width?: number; + /** + * The height of the snapshot. + */ + height?: number; + /** + * Is this a snapshot to get a single pixel, or an area? + */ + getPixel?: boolean; + /** + * Is this snapshot grabbing from a frame buffer or a canvas? + */ + isFramebuffer?: boolean; + /** + * The width of the frame buffer, if a frame buffer grab. + */ + bufferWidth?: number; + /** + * The height of the frame buffer, if a frame buffer grab. + */ + bufferHeight?: number; + }; + + } + + namespace WebGL { + type RenderTargetConfig = { + /** + * A value between 0 and 1. Controls the size of this Render Target in relation to the Renderer. A value of 1 matches it. 0.5 makes the Render Target half the size of the renderer, etc. + */ + scale?: number; + /** + * The minFilter mode of the texture. 0 is `LINEAR`, 1 is `NEAREST`. + */ + minFilter?: number; + /** + * Controls if this Render Target is automatically cleared (via `gl.COLOR_BUFFER_BIT`) during the bind. + */ + autoClear?: boolean; + /** + * Controls if this Render Target is automatically resized when the Renderer resizes. + */ + autoResize?: boolean; + /** + * The width of the Render Target. This is optional. If given it overrides the `scale` property. + */ + width?: number; + /** + * The height of the Render Target. This is optional. If not given, it will be set to the same as the `width` value. + */ + height?: number; + }; + + type WebGLConst = { + /** + * The data type of the attribute, i.e. `gl.BYTE`, `gl.SHORT`, `gl.UNSIGNED_BYTE`, `gl.FLOAT`, etc. + */ + enum: GLenum; + /** + * The size, in bytes, of the data type. + */ + size: number; + }; + + type WebGLPipelineAttribute = { + /** + * The name of the attribute as defined in the vertex shader. + */ + name: string; + /** + * The number of components in the attribute, i.e. 1 for a float, 2 for a vec2, 3 for a vec3, etc. + */ + size: number; + /** + * The data type of the attribute. Either `gl.BYTE`, `gl.SHORT`, `gl.UNSIGNED_BYTE`, `gl.UNSIGNED_SHORT` or `gl.FLOAT`. + */ + type: GLenum; + /** + * The offset, in bytes, of this attribute data in the vertex array. Equivalent to `offsetof(vertex, attrib)` in C. + */ + offset: number; + /** + * Should the attribute data be normalized? + */ + normalized: boolean; + /** + * You should set this to `false` by default. The pipeline will enable it on boot. + */ + enabled: boolean; + undefined: any; + }; + + type WebGLPipelineAttributeConfig = { + /** + * The name of the attribute as defined in the vertex shader. + */ + name: string; + /** + * The number of components in the attribute, i.e. 1 for a float, 2 for a vec2, 3 for a vec3, etc. + */ + size: number; + /** + * The data type of the attribute, one of the `WEBGL_CONST` values, i.e. `WEBGL_CONST.FLOAT`, `WEBGL_CONST.UNSIGNED_BYTE`, etc. + */ + type: Phaser.Types.Renderer.WebGL.WebGLConst; + /** + * Should the attribute data be normalized? + */ + normalized?: boolean; + }; + + type WebGLPipelineBatchEntry = { + /** + * The vertext count this batch entry starts from. + */ + start: number; + /** + * The total number of vertices in this batch entry. + */ + count: number; + /** + * The current texture unit of the batch entry. + */ + unit: number; + /** + * The maximum number of texture units in this batch entry. + */ + maxUnit: number; + /** + * An array of WebGLTextureWrapper references used in this batch entry. + */ + texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper[]; + }; + + type WebGLPipelineConfig = { + /** + * The Phaser.Game instance that owns this pipeline. + */ + game: Phaser.Game; + /** + * The name of the pipeline. + */ + name?: string; + /** + * How the primitives are rendered. The default value is GL_TRIANGLES. Here is the full list of rendering primitives: (https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants). + */ + topology?: GLenum; + /** + * The source code, as a string, for the vertex shader. If you need to assign multiple shaders, see the `shaders` property. + */ + vertShader?: string; + /** + * The source code, as a string, for the fragment shader. Can include `%count%` and `%forloop%` declarations for multi-texture support. If you need to assign multiple shaders, see the `shaders` property. + */ + fragShader?: string; + /** + * The number of quads to hold in the batch. Defaults to `RenderConfig.batchSize`. This amount * 6 gives the vertex capacity. + */ + batchSize?: number; + /** + * The size, in bytes, of a single entry in the vertex buffer. Defaults to Float32Array.BYTES_PER_ELEMENT * 6 + Uint8Array.BYTES_PER_ELEMENT * 4. + */ + vertexSize?: number; + /** + * An optional Array or Typed Array of pre-calculated vertices data that is copied into the vertex data. + */ + vertices?: number[] | Float32Array; + /** + * An array of shader attribute data. All shaders bound to this pipeline must use the same attributes. + */ + attributes?: Phaser.Types.Renderer.WebGL.WebGLPipelineAttributeConfig[]; + /** + * An array of shaders, all of which are created for this one pipeline. Uses the `vertShader`, `fragShader`, `attributes` and `uniforms` properties of this object as defaults. + */ + shaders?: Phaser.Types.Renderer.WebGL.WebGLPipelineShaderConfig[]; + /** + * Force the shader to use just a single sampler2d? Set for anything that extends the Single Pipeline. + */ + forceZero?: boolean; + /** + * Create Render Targets for this pipeline. Can be a number, which determines the quantity, a boolean (sets quantity to 1), or an array of Render Target configuration objects. + */ + renderTarget?: boolean | number | Phaser.Types.Renderer.WebGL.RenderTargetConfig[]; + /** + * If the WebGL renderer resizes, this uniform will be set with the new width and height values as part of the pipeline resize call. + */ + resizeUniform?: string; + }; + + type WebGLPipelineShaderConfig = { + /** + * The name of the shader. Doesn't have to be unique, but makes shader look-up easier if it is. + */ + name?: string; + /** + * The source code, as a string, for the vertex shader. If not given, uses the `Phaser.Types.Renderer.WebGL.WebGLPipelineConfig.vertShader` property instead. + */ + vertShader?: string; + /** + * The source code, as a string, for the fragment shader. Can include `%count%` and `%forloop%` declarations for multi-texture support. If not given, uses the `Phaser.Types.Renderer.WebGL.WebGLPipelineConfig.fragShader` property instead. + */ + fragShader?: string; + /** + * An array of shader attribute data. All shaders bound to this pipeline must use the same attributes. + */ + attributes?: Phaser.Types.Renderer.WebGL.WebGLPipelineAttributeConfig[]; + }; + + type WebGLPipelineUniformsConfig = { + /** + * The name of the uniform as defined in the shader. + */ + name: string; + /** + * The location of the uniform. + */ + location: number; + /** + * The setter function called on the WebGL context to set the uniform value. + */ + setter: Function | null; + /** + * The first cached value of the uniform. + */ + value1?: number; + /** + * The first cached value of the uniform. + */ + value2?: number; + /** + * The first cached value of the uniform. + */ + value3?: number; + /** + * The first cached value of the uniform. + */ + value4?: number; + }; + + type WebGLTextureCompression = { + /** + * Indicates if ASTC compression is supported (mostly iOS). + */ + ASTC: object | undefined; + /** + * Indicates if ATC compression is supported. + */ + ATC: object | undefined; + /** + * Indicates if BPTC compression is supported. + */ + BPTC: object | undefined; + /** + * Indicates if ETC compression is supported (mostly Android). + */ + ETC: object | undefined; + /** + * Indicates if ETC1 compression is supported (mostly Android). + */ + ETC1: object | undefined; + /** + * Indicates the browser supports true color images (all browsers). + */ + IMG: object | undefined; + /** + * Indicates if PVRTC compression is supported (mostly iOS). + */ + PVRTC: object | undefined; + /** + * Indicates if RGTC compression is supported (mostly iOS). + */ + RGTC: object | undefined; + /** + * Indicates if S3TC compression is supported on current device (mostly Windows). + */ + S3TC: object | undefined; + /** + * Indicates if S3TCSRGB compression is supported on current device (mostly Windows). + */ + S3TCSRGB: object | undefined; + }; + + } + + } + + namespace Scenes { + type CreateSceneFromObjectConfig = { + /** + * The scene's init callback. + */ + init?: Phaser.Types.Scenes.SceneInitCallback; + /** + * The scene's preload callback. + */ + preload?: Phaser.Types.Scenes.ScenePreloadCallback; + /** + * The scene's create callback. + */ + create?: Phaser.Types.Scenes.SceneCreateCallback; + /** + * The scene's update callback. See {@link Phaser.Scene#update}. + */ + update?: Phaser.Types.Scenes.SceneUpdateCallback; + /** + * Any additional properties, which will be copied to the Scene after it's created (except `data` or `sys`). + */ + extend?: any; + /** + * Any values, which will be merged into the Scene's Data Manager store. + */ + "extend.data"?: any; + }; + + /** + * Can be defined on your own Scenes. Use it to create your game objects. + * This method is called by the Scene Manager when the scene starts, after `init()` and `preload()`. + * If the LoaderPlugin started after `preload()`, then this method is called only after loading is complete. + */ + type SceneCreateCallback = (this: Phaser.Scene, data: object)=>void; + + /** + * Can be defined on your own Scenes. + * This method is called by the Scene Manager when the scene starts, before `preload()` and `create()`. + */ + type SceneInitCallback = (this: Phaser.Scene, data: object)=>void; + + /** + * Can be defined on your own Scenes. Use it to load assets. + * This method is called by the Scene Manager, after `init()` and before `create()`, only if the Scene has a LoaderPlugin. + * After this method completes, if the LoaderPlugin's queue isn't empty, the LoaderPlugin will start automatically. + */ + type ScenePreloadCallback = (this: Phaser.Scene)=>void; + + type SceneTransitionConfig = { + /** + * The Scene key to transition to. + */ + target: string; + /** + * The duration, in ms, for the transition to last. + */ + duration?: number; + /** + * Will the Scene responsible for the transition be sent to sleep on completion (`true`), or stopped? (`false`) + */ + sleep?: boolean; + /** + * Will the Scene responsible for the transition be removed from the Scene Manager after the transition completes? + */ + remove?: boolean; + /** + * Will the Scenes Input system be able to process events while it is transitioning in or out? + */ + allowInput?: boolean; + /** + * Move the target Scene to be above this one before the transition starts. + */ + moveAbove?: boolean; + /** + * Move the target Scene to be below this one before the transition starts. + */ + moveBelow?: boolean; + /** + * This callback is invoked every frame for the duration of the transition. + */ + onUpdate?: Function; + /** + * The context in which the callback is invoked. + */ + onUpdateScope?: any; + /** + * This callback is invoked when transition starting. + */ + onStart?: Phaser.Types.Scenes.SceneTransitionOnStartCallback; + /** + * The context in which the callback is invoked. + */ + onStartScope?: any; + /** + * An object containing any data you wish to be passed to the target scene's init / create methods (if sleep is false) or to the target scene's wake event callback (if sleep is true). + */ + data?: any; + }; + + type SceneTransitionOnStartCallback = (this: Phaser.Scene, fromScene: Phaser.Scene, toScene: Phaser.Scene)=>void; + + type SceneType = Phaser.Scene | Phaser.Types.Scenes.SettingsConfig | Phaser.Types.Scenes.CreateSceneFromObjectConfig | Function; + + type SceneUpdateCallback = (this: Phaser.Scene, time: number, delta: number)=>void; + + type SettingsConfig = { + /** + * The unique key of this Scene. Must be unique within the entire Game instance. + */ + key?: string; + /** + * Does the Scene start as active or not? An active Scene updates each step. + */ + active?: boolean; + /** + * Does the Scene start as visible or not? A visible Scene renders each step. + */ + visible?: boolean; + /** + * Files to be loaded before the Scene begins. + */ + pack?: false | Phaser.Types.Loader.FileTypes.PackFileSection; + /** + * An optional Camera configuration object. + */ + cameras?: Phaser.Types.Cameras.Scene2D.CameraConfig | Phaser.Types.Cameras.Scene2D.CameraConfig[] | null; + /** + * Overwrites the default injection map for a scene. + */ + map?: {[key: string]: string}; + /** + * Extends the injection map for a scene. + */ + mapAdd?: {[key: string]: string}; + /** + * The physics configuration object for the Scene. + */ + physics?: Phaser.Types.Core.PhysicsConfig; + /** + * The loader configuration object for the Scene. + */ + loader?: Phaser.Types.Core.LoaderConfig; + /** + * The plugin configuration object for the Scene. + */ + plugins?: false | any; + }; + + type SettingsObject = { + /** + * The current status of the Scene. Maps to the Scene constants. + */ + status: number; + /** + * The unique key of this Scene. Unique within the entire Game instance. + */ + key: string; + /** + * The active state of this Scene. An active Scene updates each step. + */ + active: boolean; + /** + * The visible state of this Scene. A visible Scene renders each step. + */ + visible: boolean; + /** + * Has the Scene finished booting? + */ + isBooted: boolean; + /** + * Is the Scene in a state of transition? + */ + isTransition: boolean; + /** + * The Scene this Scene is transitioning from, if set. + */ + transitionFrom: Phaser.Scene | null; + /** + * The duration of the transition, if set. + */ + transitionDuration: number; + /** + * Is this Scene allowed to receive input during transitions? + */ + transitionAllowInput: boolean; + /** + * a data bundle passed to this Scene from the Scene Manager. + */ + data: object; + /** + * Files to be loaded before the Scene begins. + */ + pack: false | Phaser.Types.Loader.FileTypes.PackFileSection; + /** + * The Camera configuration object. + */ + cameras: Phaser.Types.Cameras.Scene2D.CameraConfig | Phaser.Types.Cameras.Scene2D.CameraConfig[] | null; + /** + * The Scene's Injection Map. + */ + map: {[key: string]: string}; + /** + * The physics configuration object for the Scene. + */ + physics: Phaser.Types.Core.PhysicsConfig; + /** + * The loader configuration object for the Scene. + */ + loader: Phaser.Types.Core.LoaderConfig; + /** + * The plugin configuration object for the Scene. + */ + plugins: false | any; + }; + + } + + namespace Sound { + /** + * Audio sprite sound type. + */ + type AudioSpriteSound = { + /** + * Local reference to 'spritemap' object form json file generated by audiosprite tool. + */ + spritemap: object; + }; + + /** + * A Audio Data object. + * + * You can pass an array of these objects to the WebAudioSoundManager `decodeAudio` method to have it decode + * them all at once. + */ + type DecodeAudioConfig = { + /** + * The string-based key to be used to reference the decoded audio in the audio cache. + */ + key: string; + /** + * The audio data, either a base64 encoded string, an audio media-type data uri, or an ArrayBuffer instance. + */ + data: ArrayBuffer | string; + }; + + type EachActiveSoundCallback = (manager: Phaser.Sound.BaseSoundManager, sound: Phaser.Sound.BaseSound, index: number, sounds: Phaser.Sound.BaseSound[])=>void; + + /** + * Config object containing various sound settings. + */ + type SoundConfig = { + /** + * Boolean indicating whether the sound should be muted or not. + */ + mute?: boolean; + /** + * A value between 0 (silence) and 1 (full volume). + */ + volume?: number; + /** + * Defines the speed at which the sound should be played. + */ + rate?: number; + /** + * Represents detuning of sound in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + */ + detune?: number; + /** + * Position of playback for this sound, in seconds. + */ + seek?: number; + /** + * Whether or not the sound or current sound marker should loop. + */ + loop?: boolean; + /** + * Time, in seconds, that should elapse before the sound actually starts its playback. + */ + delay?: number; + /** + * A value between -1 (full left pan) and 1 (full right pan). 0 means no pan. + */ + pan?: number; + /** + * An optional config object containing default spatial sound settings. + */ + source?: Phaser.Types.Sound.SpatialSoundConfig; + }; + + /** + * Marked section of a sound represented by name, and optionally start time, duration, and config object. + */ + type SoundMarker = { + /** + * Unique identifier of a sound marker. + */ + name: string; + /** + * Sound position offset at witch playback should start. + */ + start?: number; + /** + * Playback duration of this marker. + */ + duration?: number; + /** + * An optional config object containing default marker settings. + */ + config?: Phaser.Types.Sound.SoundConfig; + }; + + /** + * Config object containing settings for the source of the spatial sound. + * + * See https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Web_audio_spatialization_basics + */ + type SpatialSoundConfig = { + /** + * The horizontal position of the audio in a right-hand Cartesian coordinate system. + */ + x?: number; + /** + * The vertical position of the audio in a right-hand Cartesian coordinate system. + */ + y?: number; + /** + * Represents the longitudinal (back and forth) position of the audio in a right-hand Cartesian coordinate system. + */ + z?: number; + /** + * An enumerated value determining which spatialization algorithm to use to position the audio in 3D space. + */ + panningModel?: 'equalpower' | 'HRTF'; + /** + * Which algorithm to use to reduce the volume of the audio source as it moves away from the listener. Possible values are "linear", "inverse" and "exponential". The default value is "inverse". + */ + distanceModel?: 'linear' | 'inverse' | 'exponential'; + /** + * The horizontal position of the audio source's vector in a right-hand Cartesian coordinate system. + */ + orientationX?: number; + /** + * The vertical position of the audio source's vector in a right-hand Cartesian coordinate system. + */ + orientationY?: number; + /** + * Represents the longitudinal (back and forth) position of the audio source's vector in a right-hand Cartesian coordinate system. + */ + orientationZ?: number; + /** + * A double value representing the reference distance for reducing volume as the audio source moves further from the listener. For distances greater than this the volume will be reduced based on `rolloffFactor` and `distanceModel`. + */ + refDistance?: number; + /** + * The maximum distance between the audio source and the listener, after which the volume is not reduced any further. + */ + maxDistance?: number; + /** + * A double value describing how quickly the volume is reduced as the source moves away from the listener. This value is used by all distance models. + */ + rolloffFactor?: number; + /** + * The angle, in degrees, of a cone inside of which there will be no volume reduction. + */ + coneInnerAngle?: number; + /** + * The angle, in degrees, of a cone outside of which the volume will be reduced by a constant value, defined by the `coneOuterGain` property. + */ + coneOuterAngle?: number; + /** + * The amount of volume reduction outside the cone defined by the `coneOuterAngle` attribute. Its default value is 0, meaning that no sound can be heard. A value between 0 and 1. + */ + coneOuterGain?: number; + /** + * Set this Sound object to automatically track the x/y position of this object. Can be a Phaser Game Object, Vec2 or anything that exposes public x/y properties. + */ + follow?: Phaser.Types.Math.Vector2Like; + }; + + /** + * An entry in the Web Audio Decoding Queue. + */ + type WebAudioDecodeEntry = { + /** + * The key of the sound. + */ + key: string; + /** + * The callback to invoke on successful decoding. + */ + success: Function; + /** + * The callback to invoke if the decoding fails. + */ + failure: Function; + /** + * Has the decoding of this sound file started? + */ + decoding: boolean; + }; + + } + + namespace Textures { + /** + * An object containing the dimensions and mipmap data for a Compressed Texture. + */ + type CompressedTextureData = { + /** + * Is this a compressed texture? + */ + compressed: boolean; + /** + * Should this texture have mipmaps generated? + */ + generateMipmap: boolean; + /** + * The width of the maximum size of the texture. + */ + width: number; + /** + * The height of the maximum size of the texture. + */ + height: number; + /** + * The WebGL internal texture format. + */ + internalFormat: GLenum; + /** + * An array of MipmapType objects. + */ + mipmaps: Phaser.Types.Textures.MipmapType[]; + }; + + /** + * A Mipmap Data entry for a Compressed Texture. + */ + type MipmapType = { + /** + * The width of this level of the mipmap. + */ + width: number; + /** + * The height of this level of the mipmap. + */ + height: number; + /** + * The decoded pixel data. + */ + data: Uint8Array; + }; + + /** + * An object containing the position and color data for a single pixel in a CanvasTexture. + */ + type PixelConfig = { + /** + * The x-coordinate of the pixel. + */ + x: number; + /** + * The y-coordinate of the pixel. + */ + y: number; + /** + * The color of the pixel, not including the alpha channel. + */ + color: number; + /** + * The alpha of the pixel, between 0 and 1. + */ + alpha: number; + }; + + type SpriteSheetConfig = { + /** + * The fixed width of each frame. + */ + frameWidth: number; + /** + * The fixed height of each frame. If not set it will use the frameWidth as the height. + */ + frameHeight?: number; + /** + * Skip a number of frames. Useful when there are multiple sprite sheets in one Texture. + */ + startFrame?: number; + /** + * The total number of frames to extract from the Sprite Sheet. The default value of -1 means "extract all frames". + */ + endFrame?: number; + /** + * If the frames have been drawn with a margin, specify the amount here. + */ + margin?: number; + /** + * If the frames have been drawn with spacing between them, specify the amount here. + */ + spacing?: number; + }; + + type SpriteSheetFromAtlasConfig = { + /** + * The key of the Texture Atlas in which this Sprite Sheet can be found. + */ + atlas: string; + /** + * The key of the Texture Atlas Frame in which this Sprite Sheet can be found. + */ + frame: string; + /** + * The fixed width of each frame. + */ + frameWidth: number; + /** + * The fixed height of each frame. If not set it will use the frameWidth as the height. + */ + frameHeight?: number; + /** + * Skip a number of frames. Useful when there are multiple sprite sheets in one Texture. + */ + startFrame?: number; + /** + * The total number of frames to extract from the Sprite Sheet. The default value of -1 means "extract all frames". + */ + endFrame?: number; + /** + * If the frames have been drawn with a margin, specify the amount here. + */ + margin?: number; + /** + * If the frames have been drawn with spacing between them, specify the amount here. + */ + spacing?: number; + }; + + /** + * An object containing the position and color data for a single pixel in a CanvasTexture. + */ + type StampConfig = { + /** + * The alpha value used by the stamp. + */ + alpha?: number; + /** + * The tint color value used by the stamp. WebGL only. + */ + tint?: number; + /** + * The angle of the stamp in degrees. Rotation takes place around its origin. + */ + angle?: number; + /** + * The rotation of the stamp in radians. Rotation takes place around its origin. + */ + rotation?: number; + /** + * Sets both the horizontal and vertical scale of the stamp with a single value. + */ + scale?: number; + /** + * Set the horizontal scale of the stamp. Overrides the scale property, if provided. + */ + scaleX?: number; + /** + * Set the vertical scale of the stamp. Overrides the scale property, if provided. + */ + scaleY?: number; + /** + * The horizontal origin of the stamp. 0 is the left, 0.5 is the center and 1 is the right. + */ + originX?: number; + /** + * The vertical origin of the stamp. 0 is the top, 0.5 is the center and 1 is the bottom. + */ + originY?: number; + /** + * The blend mode used when drawing the stamp. Defaults to 0 (normal). + */ + blendMode?: string | Phaser.BlendModes | number; + /** + * Erase this stamp from the texture? + */ + erase?: boolean; + /** + * Skip beginning and ending a batch with this call. Use if this is part of a bigger batched draw. + */ + skipBatch?: boolean; + }; + + } + + namespace Tilemaps { + type CreateFromObjectLayerConfig = { + /** + * A unique Object ID to convert. + */ + id?: number; + /** + * An Object GID to convert. + */ + gid?: number; + /** + * An Object Name to convert. + */ + name?: string; + /** + * An Object Type to convert. + */ + type?: string; + /** + * A custom class type to convert the objects in to. The default is {@link Phaser.GameObjects.Sprite}. A custom class should resemble Sprite or Image; see {@link Phaser.Types.Tilemaps.CreateFromObjectsClassTypeConstructor}. + */ + classType?: Function; + /** + * By default, gid-based objects copy properties and respect the type of the tile at that gid and treat the object as an override. If this is true, they don't, and use only the fields set on the object itself. + */ + ignoreTileset?: boolean; + /** + * A Scene reference, passed to the Game Objects constructors. + */ + scene?: Phaser.Scene; + /** + * Optional Container to which the Game Objects are added. + */ + container?: Phaser.GameObjects.Container; + /** + * Optional key of a Texture to be used, as stored in the Texture Manager, or a Texture instance. If omitted, the object's gid's tileset key is used if available. + */ + key?: string | Phaser.Textures.Texture; + /** + * Optional name or index of the frame within the Texture. If omitted, the tileset index is used, assuming that spritesheet frames exactly match tileset indices & geometries -- if available. + */ + frame?: string | number; + }; + + type CreateFromObjectsClassTypeConstructor = (scene: Phaser.Scene)=>void; + + type DebugStyleOptions = { + /** + * Color to use for drawing a filled rectangle at + * non-colliding tile locations. If set to null, non-colliding tiles will not be drawn. + */ + "styleConfig.tileColor"?: Phaser.Display.Color | null; + /** + * Color to use for drawing a filled + * rectangle at colliding tile locations. If set to null, colliding tiles will not be drawn. + */ + "styleConfig.collidingTileColor"?: Phaser.Display.Color | null; + /** + * Color to use for drawing a line at interesting + * tile faces. If set to null, interesting tile faces will not be drawn. + */ + "styleConfig.faceColor"?: Phaser.Display.Color | null; + }; + + type FilteringOptions = { + /** + * If true, only return tiles that don't have -1 for an index. + */ + isNotEmpty?: boolean; + /** + * If true, only return tiles that collide on at least one side. + */ + isColliding?: boolean; + /** + * If true, only return tiles that have at least one interesting face. + */ + hasInterestingFace?: boolean; + }; + + type GIDData = { + /** + * The Tiled GID. + */ + gid: number; + /** + * Horizontal flip flag. + */ + flippedHorizontal: boolean; + /** + * Vertical flip flag. + */ + flippedVertical: boolean; + /** + * Diagonal flip flag. + */ + flippedAntiDiagonal: boolean; + /** + * Amount of rotation. + */ + rotation: number; + /** + * Is flipped? + */ + flipped: boolean; + }; + + type LayerDataConfig = { + /** + * The name of the layer, if specified in Tiled. + */ + name?: string; + /** + * The x offset of where to draw from the top left. + */ + x?: number; + /** + * The y offset of where to draw from the top left. + */ + y?: number; + /** + * The width of the layer in tiles. + */ + width?: number; + /** + * The height of the layer in tiles. + */ + height?: number; + /** + * The pixel width of the tiles. + */ + tileWidth?: number; + /** + * The pixel height of the tiles. + */ + tileHeight?: number; + /** + * The base tile width. + */ + baseTileWidth?: number; + /** + * The base tile height. + */ + baseTileHeight?: number; + /** + * The width in pixels of the entire layer. + */ + widthInPixels?: number; + /** + * The height in pixels of the entire layer. + */ + heightInPixels?: number; + /** + * The alpha value of the layer. + */ + alpha?: number; + /** + * Is the layer visible or not? + */ + visible?: boolean; + /** + * Layer specific properties (can be specified in Tiled) + */ + properties?: object[]; + /** + * Tile ID index map. + */ + indexes?: any[]; + /** + * Tile Collision ID index map. + */ + collideIndexes?: any[]; + /** + * An array of callbacks. + */ + callbacks?: any[]; + /** + * An array of physics bodies. + */ + bodies?: any[]; + /** + * An array of the tile data indexes. + */ + data?: any[]; + /** + * A reference to the Tilemap layer that owns this data. + */ + tilemapLayer?: Phaser.Tilemaps.TilemapLayer; + }; + + type MapDataConfig = { + /** + * The key in the Phaser cache that corresponds to the loaded tilemap data. + */ + name?: string; + /** + * The width of the entire tilemap. + */ + width?: number; + /** + * The height of the entire tilemap. + */ + height?: number; + /** + * The width of the tiles. + */ + tileWidth?: number; + /** + * The height of the tiles. + */ + tileHeight?: number; + /** + * The width in pixels of the entire tilemap. + */ + widthInPixels?: number; + /** + * The height in pixels of the entire tilemap. + */ + heightInPixels?: number; + /** + * The format of the Tilemap, as defined in Tiled. + */ + format?: number; + /** + * The orientation of the map data (i.e. orthogonal, isometric, hexagonal), default 'orthogonal'. + */ + orientation?: string | Phaser.Tilemaps.Orientation; + /** + * Determines the draw order of tilemap. Default is right-down. + */ + renderOrder?: string; + /** + * The version of Tiled the map uses. + */ + version?: number; + /** + * Map specific properties (can be specified in Tiled). + */ + properties?: number; + /** + * The layers of the tilemap. + */ + layers?: Phaser.Tilemaps.LayerData[]; + /** + * An array with all the layers configured to the MapData. + */ + images?: any[]; + /** + * An array of Tiled Image Layers. + */ + objects?: object; + /** + * An object of Tiled Object Layers. + */ + collision?: object; + /** + * The tilesets the map uses. + */ + tilesets?: Phaser.Tilemaps.Tileset[]; + /** + * The collection of images the map uses(specified in Tiled). + */ + imageCollections?: any[]; + /** + * Array of Tile instances. + */ + tiles?: any[]; + }; + + type ObjectLayerConfig = { + /** + * The name of the Object Layer. + */ + name?: string; + /** + * The opacity of the layer, between 0 and 1. + */ + opacity?: number; + /** + * The custom properties defined on the Object Layer, keyed by their name. + */ + properties?: any; + /** + * The type of each custom property defined on the Object Layer, keyed by its name. + */ + propertytypes?: any; + /** + * The type of the layer, which should be `objectgroup`. + */ + type?: string; + /** + * Whether the layer is shown (`true`) or hidden (`false`). + */ + visible?: boolean; + /** + * An array of all objects on this Object Layer. + */ + objects?: any[]; + }; + + type StyleConfig = { + /** + * Color to use for drawing a filled rectangle at non-colliding tile locations. If set to null, non-colliding tiles will not be drawn. + */ + tileColor?: Phaser.Display.Color | number | null | null; + /** + * Color to use for drawing a filled rectangle at colliding tile locations. If set to null, colliding tiles will not be drawn. + */ + collidingTileColor?: Phaser.Display.Color | number | null | null; + /** + * Color to use for drawing a line at interesting tile faces. If set to null, interesting tile faces will not be drawn. + */ + faceColor?: Phaser.Display.Color | number | null | null; + }; + + type TiledObject = { + /** + * The unique object ID. + */ + id: number; + /** + * The name this object was assigned in Tiled. + */ + name: string; + /** + * The string type of this instance, as assigned in Tiled. Tiled supports inheriting instance types from tilesets; in that case, the type will be set in the tile's data, but will be `''` here; use the `gid` to fetch the tile data or properties. + */ + type: string; + /** + * The visible state of this object. + */ + visible?: boolean; + /** + * The horizontal position of this object, in pixels, relative to the tilemap. + */ + x?: number; + /** + * The vertical position of this object, in pixels, relative to the tilemap. + */ + y?: number; + /** + * The width of this object, in pixels. + */ + width?: number; + /** + * The height of this object, in pixels. + */ + height?: number; + /** + * The rotation of the object in clockwise degrees. + */ + rotation?: number; + /** + * Custom properties object. + */ + properties?: any; + /** + * Only set if of type 'tile'. + */ + gid?: number; + /** + * Only set if a tile object. The horizontal flip value. + */ + flippedHorizontal?: boolean; + /** + * Only set if a tile object. The vertical flip value. + */ + flippedVertical?: boolean; + /** + * Only set if a tile object. The diagonal flip value. + */ + flippedAntiDiagonal?: boolean; + /** + * Only set if a polyline object. An array of objects corresponding to points, where each point has an `x` property and a `y` property. + */ + polyline?: Phaser.Types.Math.Vector2Like[]; + /** + * Only set if a polygon object. An array of objects corresponding to points, where each point has an `x` property and a `y` property. + */ + polygon?: Phaser.Types.Math.Vector2Like[]; + /** + * Only set if a text object. Contains the text objects properties. + */ + text?: any; + /** + * Only set, and set to `true`, if a rectangle object. + */ + rectangle?: boolean; + /** + * Only set, and set to `true`, if a ellipse object. + */ + ellipse?: boolean; + /** + * Only set, and set to `true`, if a point object. + */ + point?: boolean; + }; + + type TilemapConfig = { + /** + * The key in the Phaser cache that corresponds to the loaded tilemap data. + */ + key?: string; + /** + * Instead of loading from the cache, you can also load directly from a 2D array of tile indexes. + */ + data?: number[][]; + /** + * The width of a tile in pixels. + */ + tileWidth?: number; + /** + * The height of a tile in pixels. + */ + tileHeight?: number; + /** + * The width of the map in tiles. + */ + width?: number; + /** + * The height of the map in tiles. + */ + height?: number; + /** + * Controls how empty tiles, tiles with an index of -1, + * in the map data are handled. If `true`, empty locations will get a value of `null`. If `false`, + * empty location will get a Tile object with an index of -1. If you've a large sparsely populated + * map and the tile data doesn't need to change then setting this value to `true` will help with + * memory consumption. However if your map is small or you need to update the tiles dynamically, + * then leave the default value set. + */ + insertNull?: boolean; + }; + + } + + namespace Time { + type TimelineEvent = { + /** + * Has this event completed yet? + */ + complete: boolean; + /** + * Is this a once only event? + */ + once: boolean; + /** + * The time (in elapsed ms) at which this event will fire. + */ + time: number; + /** + * The amount of times this Event has repeated. + */ + repeat?: Function; + /** + * User-land callback which will be called if set. If it returns `true` then this event run all of its actions, otherwise it will be skipped. + */ + if?: Function; + /** + * User-land callback which will be called when the Event fires. + */ + run?: Function; + /** + * User-land callback which will be called when the Event loops. + */ + loop?: Function; + /** + * Tween configuration object which will be used to create a Tween when the Event fires if set. + */ + tween?: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenChainBuilderConfig | Phaser.Tweens.Tween | Phaser.Tweens.TweenChain; + /** + * Object containing properties to set on the `target` when the Event fires if set. + */ + set?: object; + /** + * Sound configuration object which will be used to create a Sound when the Event fires if set. + */ + sound?: string | object; + /** + * The scope (`this` object) with which to invoke the run `callback`. + */ + target?: any; + /** + * Optional event name to emit when the Event fires. + */ + event?: string; + }; + + type TimelineEventConfig = { + /** + * The time (in ms) at which the Event will fire. The Timeline starts at 0. + */ + at?: number; + /** + * If the Timeline is running, this is the time (in ms) at which the Event will fire based on its current elapsed value. If set it will override the `at` property. + */ + in?: number; + /** + * Fire this event 'from' milliseconds after the previous event in the Timeline. If set it will override the `at` and `in` properties. + */ + from?: number; + /** + * A function which will be called when the Event fires. + */ + run?: Function; + /** + * A function which will be called when the Event loops, this does not get called if the `repeat` method is not used or on first iteration. + */ + loop?: Function; + /** + * Optional string-based event name to emit when the Event fires. The event is emitted from the Timeline instance. + */ + event?: string; + /** + * The scope (`this` object) with which to invoke the run `callback`, if set. + */ + target?: any; + /** + * If set, the Event will be removed from the Timeline when it fires. + */ + once?: boolean; + /** + * If set, the Timeline will stop and enter a complete state when this Event fires, even if there are other events after it. + */ + stop?: boolean; + /** + * A Tween or TweenChain configuration object or instance. If set, the Event will create this Tween when it fires. + */ + tween?: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenChainBuilderConfig | Phaser.Tweens.Tween | Phaser.Tweens.TweenChain; + /** + * A key-value object of properties to set on the `target` when the Event fires. Ignored if no `target` is given. + */ + set?: object; + /** + * A key from the Sound Manager to play, or a config object for a sound to play when the Event fires. If a config object it must provide two properties: `key` and `config`. The `key` is the key of the sound to play, and the `config` is the config is a Phaser.Types.Sound.SoundConfig object. + */ + sound?: string | object; + }; + + type TimerEventConfig = { + /** + * The delay after which the Timer Event should fire, in milliseconds. + */ + delay?: number; + /** + * The total number of times the Timer Event will repeat before finishing. + */ + repeat?: number; + /** + * `true` if the Timer Event should repeat indefinitely. + */ + loop?: boolean; + /** + * The callback which will be called when the Timer Event fires. + */ + callback?: Function; + /** + * The scope (`this` object) with which to invoke the `callback`. The default is the Timer Event. + */ + callbackScope?: any; + /** + * Additional arguments to be passed to the `callback`. + */ + args?: any[]; + /** + * The scale of the elapsed time. + */ + timeScale?: number; + /** + * The initial elapsed time in milliseconds. Useful if you want a long duration with repeat, but for the first loop to fire quickly. + */ + startAt?: number; + /** + * `true` if the Timer Event should be paused. + */ + paused?: boolean; + }; + + } + + namespace Tweens { + type TweenConfigDefaults = { + /** + * The object, or an array of objects, to run the tween on. + */ + targets: object | object[]; + /** + * The number of milliseconds to delay before the tween will start. + */ + delay?: number; + /** + * The duration of the tween in milliseconds. + */ + duration?: number; + /** + * The easing equation to use for the tween. + */ + ease?: string; + /** + * Optional easing parameters. + */ + easeParams?: any[]; + /** + * The number of milliseconds to hold the tween for before yoyo'ing. + */ + hold?: number; + /** + * The number of times to repeat the tween. + */ + repeat?: number; + /** + * The number of milliseconds to pause before a tween will repeat. + */ + repeatDelay?: number; + /** + * Should the tween complete, then reverse the values incrementally to get back to the starting tween values? The reverse tweening will also take `duration` milliseconds to complete. + */ + yoyo?: boolean; + /** + * Horizontally flip the target of the Tween when it completes (before it yoyos, if set to do so). Only works for targets that support the `flipX` property. + */ + flipX?: boolean; + /** + * Vertically flip the target of the Tween when it completes (before it yoyos, if set to do so). Only works for targets that support the `flipY` property. + */ + flipY?: boolean; + /** + * Retain the tween within the Tween Manager, even after playback completes? + */ + persist?: boolean; + /** + * The interpolation function to use for array-based tween values. + */ + interpolation?: Function; + }; + + /** + * A Tween Event. + */ + type Event = string; + + type GetActiveCallback = (target: any, key: string, value: number, targetIndex: number, totalTargets: number, tween: Phaser.Tweens.Tween)=>number; + + type GetEndCallback = (target: any, key: string, value: number, targetIndex: number, totalTargets: number, tween: Phaser.Tweens.Tween)=>number; + + type GetStartCallback = (target: any, key: string, value: number, targetIndex: number, totalTargets: number, tween: Phaser.Tweens.Tween)=>number; + + type NumberTweenBuilderConfig = { + /** + * The start number. + */ + from?: number; + /** + * The end number. + */ + to?: number; + /** + * The number of milliseconds to delay before the counter will start. + */ + delay?: number; + /** + * The duration of the counter in milliseconds. + */ + duration?: number; + /** + * The easing equation to use for the counter. + */ + ease?: string | Function; + /** + * Optional easing parameters. + */ + easeParams?: any[]; + /** + * The number of milliseconds to hold the counter for before yoyo'ing. + */ + hold?: number; + /** + * The number of times to repeat the counter. + */ + repeat?: number; + /** + * The number of milliseconds to pause before the counter will repeat. + */ + repeatDelay?: number; + /** + * Should the counter play forward to the end value and then backwards to the start? The reverse playback will also take `duration` milliseconds to complete. + */ + yoyo?: boolean; + /** + * The time the counter will wait before the onComplete event is dispatched once it has completed, in ms. + */ + completeDelay?: string | number | Function | object | any[]; + /** + * The number of times the counter will repeat. (A value of 1 means the counter will play twice, as it repeated once.) + */ + loop?: string | number | Function | object | any[]; + /** + * The time the counter will pause before starting either a yoyo or returning to the start for a repeat. + */ + loopDelay?: string | number | Function | object | any[]; + /** + * Does the counter start in a paused state (true) or playing (false)? + */ + paused?: boolean; + /** + * Scope (this) for the callbacks. The default scope is the counter. + */ + callbackScope?: any; + /** + * A function to call when the counter completes. + */ + onComplete?: Phaser.Types.Tweens.TweenOnCompleteCallback; + /** + * Additional parameters to pass to `onComplete`. + */ + onCompleteParams?: any[]; + /** + * A function to call each time the counter loops. + */ + onLoop?: Phaser.Types.Tweens.TweenOnLoopCallback; + /** + * Additional parameters to pass to `onLoop`. + */ + onLoopParams?: any[]; + /** + * A function to call each time the counter repeats. + */ + onRepeat?: Phaser.Types.Tweens.TweenOnRepeatCallback; + /** + * Additional parameters to pass to `onRepeat`. + */ + onRepeatParams?: any[]; + /** + * A function to call when the counter starts. + */ + onStart?: Phaser.Types.Tweens.TweenOnStartCallback; + /** + * Additional parameters to pass to `onStart`. + */ + onStartParams?: any[]; + /** + * A function to call when the counter is stopped. + */ + onStop?: Phaser.Types.Tweens.TweenOnStopCallback; + /** + * Additional parameters to pass to `onStop`. + */ + onStopParams?: any[]; + /** + * A function to call each time the counter steps. + */ + onUpdate?: Phaser.Types.Tweens.TweenOnUpdateCallback; + /** + * Additional parameters to pass to `onUpdate`. + */ + onUpdateParams?: any[]; + /** + * A function to call each time the counter yoyos. + */ + onYoyo?: Phaser.Types.Tweens.TweenOnYoyoCallback; + /** + * Additional parameters to pass to `onYoyo`. + */ + onYoyoParams?: any[]; + /** + * A function to call when the counter is paused. + */ + onPause?: Phaser.Types.Tweens.TweenOnPauseCallback; + /** + * Additional parameters to pass to `onPause`. + */ + onPauseParams?: any[]; + /** + * A function to call when the counter is resumed after being paused. + */ + onResume?: Phaser.Types.Tweens.TweenOnResumeCallback; + /** + * Additional parameters to pass to `onResume`. + */ + onResumeParams?: any[]; + /** + * Will the counter be automatically destroyed on completion, or retained for future playback? + */ + persist?: boolean; + /** + * The interpolation function to use if the `value` given is an array of numbers. + */ + interpolation?: string | Function; + }; + + type StaggerConfig = { + /** + * The value to start the stagger from. Can be used as a way to offset the stagger while still using a range for the value. + */ + start?: number; + /** + * An ease to apply across the staggered values. Can either be a string, such as 'sine.inout', or a function. + */ + ease?: string | Function; + /** + * The index to start the stagger from. Can be the strings `first`, `last` or `center`, or an integer representing the stagger position. + */ + from?: string | number; + /** + * Set the stagger to run across a grid by providing an array where element 0 is the width of the grid and element 1 is the height. Combine with the 'from' property to control direction. + */ + grid?: number[]; + }; + + type TweenBuilderConfig = {[key: string]: any} & { + /** + * The object, or an array of objects, to run the tween on. + */ + targets: any; + /** + * The number of milliseconds to delay before the tween will start. + */ + delay?: number | Function; + /** + * The duration of the tween in milliseconds. + */ + duration?: number; + /** + * The easing equation to use for the tween. + */ + ease?: string | Function; + /** + * Optional easing parameters. + */ + easeParams?: any[]; + /** + * The number of milliseconds to hold the tween for before yoyo'ing. + */ + hold?: number; + /** + * The number of times each property tween repeats. + */ + repeat?: number; + /** + * The number of milliseconds to pause before a repeat. + */ + repeatDelay?: number; + /** + * Should the tween complete, then reverse the values incrementally to get back to the starting tween values? The reverse tweening will also take `duration` milliseconds to complete. + */ + yoyo?: boolean; + /** + * Horizontally flip the target of the Tween when it completes (before it yoyos, if set to do so). Only works for targets that support the `flipX` property. + */ + flipX?: boolean; + /** + * Vertically flip the target of the Tween when it completes (before it yoyos, if set to do so). Only works for targets that support the `flipY` property. + */ + flipY?: boolean; + /** + * The time the tween will wait before the onComplete event is dispatched once it has completed, in ms. + */ + completeDelay?: string | number | Function | object | any[]; + /** + * The number of times the tween will repeat. (A value of 1 means the tween will play twice, as it repeated once.) The first loop starts after every property in the tween has completed once. + */ + loop?: string | number | Function | object | any[]; + /** + * The time the tween will pause before starting either a yoyo or returning to the start for a repeat. + */ + loopDelay?: string | number | Function | object | any[]; + /** + * Does the tween start in a paused state (true) or playing (false)? + */ + paused?: boolean; + /** + * The properties to tween. + */ + props?: {[key: string]: (number|string|Phaser.Types.Tweens.GetEndCallback|Phaser.Types.Tweens.TweenPropConfig)}; + /** + * The scope (or context) for all of the callbacks. The default scope is the tween. + */ + callbackScope?: any; + /** + * A function to call when the tween completes. + */ + onComplete?: Phaser.Types.Tweens.TweenOnCompleteCallback; + /** + * Additional parameters to pass to `onComplete`. + */ + onCompleteParams?: any[]; + /** + * A function to call each time the tween loops. + */ + onLoop?: Phaser.Types.Tweens.TweenOnLoopCallback; + /** + * Additional parameters to pass to `onLoop`. + */ + onLoopParams?: any[]; + /** + * A function to call each time a property tween repeats. Called once per property per target. + */ + onRepeat?: Phaser.Types.Tweens.TweenOnRepeatCallback; + /** + * Additional parameters to pass to `onRepeat`. + */ + onRepeatParams?: any[]; + /** + * A function to call when the tween starts playback, after any delays have expired. + */ + onStart?: Phaser.Types.Tweens.TweenOnStartCallback; + /** + * Additional parameters to pass to `onStart`. + */ + onStartParams?: any[]; + /** + * A function to call when the tween is stopped. + */ + onStop?: Phaser.Types.Tweens.TweenOnStopCallback; + /** + * Additional parameters to pass to `onStop`. + */ + onStopParams?: any[]; + /** + * A function to call each time the tween steps. Called once per property per target. + */ + onUpdate?: Phaser.Types.Tweens.TweenOnUpdateCallback; + /** + * Additional parameters to pass to `onUpdate`. + */ + onUpdateParams?: any[]; + /** + * A function to call each time a property tween yoyos. Called once per property per target. + */ + onYoyo?: Phaser.Types.Tweens.TweenOnYoyoCallback; + /** + * Additional parameters to pass to `onYoyo`. + */ + onYoyoParams?: any[]; + /** + * A function to call when the tween becomes active within the Tween Manager. + */ + onActive?: Phaser.Types.Tweens.TweenOnActiveCallback; + /** + * Additional parameters to pass to `onActive`. + */ + onActiveParams?: any[]; + /** + * A function to call when the tween is paused. + */ + onPause?: Phaser.Types.Tweens.TweenOnPauseCallback; + /** + * Additional parameters to pass to `onPause`. + */ + onPauseParams?: any[]; + /** + * A function to call when the tween is resumed after being paused. + */ + onResume?: Phaser.Types.Tweens.TweenOnResumeCallback; + /** + * Additional parameters to pass to `onResume`. + */ + onResumeParams?: any[]; + /** + * Will the Tween be automatically destroyed on completion, or retained for future playback? + */ + persist?: boolean; + /** + * The interpolation function to use if the `value` given is an array of numbers. + */ + interpolation?: string | Function; + }; + + type TweenCallbacks = { + /** + * A function to call when the tween becomes active within the Tween Manager. + */ + onActive?: Phaser.Types.Tweens.TweenOnActiveCallback; + /** + * A function to call when the tween starts playback, after any delays have expired. + */ + onStart?: Phaser.Types.Tweens.TweenOnStartCallback; + /** + * A function to call when the tween completes. + */ + onComplete?: Phaser.Types.Tweens.TweenOnCompleteCallback; + /** + * A function to call each time the tween loops. + */ + onLoop?: Phaser.Types.Tweens.TweenOnLoopCallback; + /** + * A function to call each time the tween is paused. + */ + onPause?: Phaser.Types.Tweens.TweenOnPauseCallback; + /** + * A function to call each time the tween is resumed. + */ + onResume?: Phaser.Types.Tweens.TweenOnResumeCallback; + /** + * A function to call each time the tween repeats. Called once per property per target. + */ + onRepeat?: Phaser.Types.Tweens.TweenOnRepeatCallback; + /** + * A function to call when the tween is stopped. + */ + onStop?: Phaser.Types.Tweens.TweenOnStopCallback; + /** + * A function to call each time the tween steps. Called once per property per target. + */ + onUpdate?: Phaser.Types.Tweens.TweenOnUpdateCallback; + /** + * A function to call each time the tween yoyos. Called once per property per target. + */ + onYoyo?: Phaser.Types.Tweens.TweenOnYoyoCallback; + }; + + type TweenCallbackTypes = 'onActive' | 'onComplete' | 'onLoop' | 'onPause' | 'onRepeat' | 'onResume' | 'onStart' | 'onStop' | 'onUpdate' | 'onYoyo'; + + type TweenChainBuilderConfig = {[key: string]: any} & { + /** + * The object, or an array of objects, to run each tween on. + */ + targets: any; + /** + * The number of milliseconds to delay before the chain will start. + */ + delay?: number | Function; + /** + * The time the chain will wait before the onComplete event is dispatched once it has completed, in ms. + */ + completeDelay?: string | number | Function | object | any[]; + /** + * The number of times the chain will repeat. (A value of 1 means the chain will play twice, as it repeated once.) The first loop starts after every tween has completed once. + */ + loop?: string | number | Function | object | any[]; + /** + * The time the chain will pause before returning to the start for a repeat. + */ + loopDelay?: string | number | Function | object | any[]; + /** + * Does the chain start in a paused state (true) or playing (false)? + */ + paused?: boolean; + /** + * The tweens to chain together. + */ + tweens?: Phaser.Types.Tweens.TweenBuilderConfig[]; + /** + * The scope (or context) for all of the callbacks. The default scope is the chain. + */ + callbackScope?: any; + /** + * A function to call when the chain completes. + */ + onComplete?: Phaser.Types.Tweens.TweenOnCompleteCallback; + /** + * Additional parameters to pass to `onComplete`. + */ + onCompleteParams?: any[]; + /** + * A function to call each time the chain loops. + */ + onLoop?: Phaser.Types.Tweens.TweenOnLoopCallback; + /** + * Additional parameters to pass to `onLoop`. + */ + onLoopParams?: any[]; + /** + * A function to call when the chain starts playback, after any delays have expired. + */ + onStart?: Phaser.Types.Tweens.TweenOnStartCallback; + /** + * Additional parameters to pass to `onStart`. + */ + onStartParams?: any[]; + /** + * A function to call when the chain is stopped. + */ + onStop?: Phaser.Types.Tweens.TweenOnStopCallback; + /** + * Additional parameters to pass to `onStop`. + */ + onStopParams?: any[]; + /** + * A function to call when the chain becomes active within the Tween Manager. + */ + onActive?: Phaser.Types.Tweens.TweenOnActiveCallback; + /** + * Additional parameters to pass to `onActive`. + */ + onActiveParams?: any[]; + /** + * A function to call when the chain is paused. + */ + onPause?: Phaser.Types.Tweens.TweenOnPauseCallback; + /** + * Additional parameters to pass to `onPause`. + */ + onPauseParams?: any[]; + /** + * A function to call when the chain is resumed after being paused. + */ + onResume?: Phaser.Types.Tweens.TweenOnResumeCallback; + /** + * Additional parameters to pass to `onResume`. + */ + onResumeParams?: any[]; + /** + * Will the Tween be automatically destroyed on completion, or retained for future playback? + */ + persist?: boolean; + }; + + type TweenDataConfig = { + /** + * The target to tween. + */ + target: any; + /** + * The target index within the Tween targets array. + */ + index: number; + /** + * The property of the target being tweened. + */ + key: string; + /** + * If not null, is invoked _immediately_ as soon as the TweenData is running, and is set on the target property. + */ + getActiveValue: Phaser.Types.Tweens.GetActiveCallback | null; + /** + * The returned value sets what the property will be at the END of the Tween. + */ + getEndValue: Phaser.Types.Tweens.GetEndCallback; + /** + * The returned value sets what the property will be at the START of the Tween. + */ + getStartValue: Phaser.Types.Tweens.GetStartCallback; + /** + * The ease function this tween uses. + */ + ease: Function; + /** + * Duration of the tween in milliseconds, excludes time for yoyo or repeats. + */ + duration?: number; + /** + * The total calculated duration of this TweenData (based on duration, repeat, delay and yoyo) + */ + totalDuration?: number; + /** + * Time in milliseconds before tween will start. + */ + delay?: number; + /** + * Cause the tween to return back to its start value after hold has expired. + */ + yoyo?: boolean; + /** + * Time in milliseconds the tween will pause before running the yoyo or starting a repeat. + */ + hold?: number; + /** + * Number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + */ + repeat?: number; + /** + * Time in milliseconds before the repeat will start. + */ + repeatDelay?: number; + /** + * Automatically call toggleFlipX when the TweenData yoyos or repeats + */ + flipX?: boolean; + /** + * Automatically call toggleFlipY when the TweenData yoyos or repeats + */ + flipY?: boolean; + /** + * Between 0 and 1 showing completion of this TweenData. + */ + progress?: number; + /** + * Delta counter + */ + elapsed?: number; + /** + * How many repeats are left to run? + */ + repeatCounter?: number; + /** + * The property value at the start of the ease. + */ + start?: number; + /** + * The current propety value. + */ + current?: number; + /** + * The previous property value. + */ + previous?: number; + /** + * The property value at the end of the ease. + */ + end?: number; + /** + * LoadValue generation functions. + */ + gen?: Phaser.Types.Tweens.TweenDataGenConfig; + /** + * TWEEN_CONST.CREATED + */ + state?: Phaser.Tweens.StateType; + }; + + type TweenDataGenConfig = { + /** + * Time in milliseconds before tween will start. + */ + delay: Function; + /** + * Duration of the tween in milliseconds, excludes time for yoyo or repeats. + */ + duration: Function; + /** + * Time in milliseconds the tween will pause before running the yoyo or starting a repeat. + */ + hold: Function; + /** + * Number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + */ + repeat: Function; + /** + * Time in milliseconds before the repeat will start. + */ + repeatDelay: Function; + }; + + type TweenFrameDataConfig = { + /** + * The target to tween. + */ + target: any; + /** + * The target index within the Tween targets array. + */ + index: number; + /** + * The property of the target being tweened. + */ + key: string; + /** + * Duration of the tween in milliseconds, excludes time for yoyo or repeats. + */ + duration?: number; + /** + * The total calculated duration of this TweenData (based on duration, repeat, delay and yoyo) + */ + totalDuration?: number; + /** + * Time in milliseconds before tween will start. + */ + delay?: number; + /** + * Time in milliseconds the tween will pause before running the yoyo or starting a repeat. + */ + hold?: number; + /** + * Number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + */ + repeat?: number; + /** + * Time in milliseconds before the repeat will start. + */ + repeatDelay?: number; + /** + * Automatically call toggleFlipX when the TweenData yoyos or repeats + */ + flipX?: boolean; + /** + * Automatically call toggleFlipY when the TweenData yoyos or repeats + */ + flipY?: boolean; + /** + * Between 0 and 1 showing completion of this TweenData. + */ + progress?: number; + /** + * Delta counter + */ + elapsed?: number; + /** + * How many repeats are left to run? + */ + repeatCounter?: number; + /** + * LoadValue generation functions. + */ + gen?: Phaser.Types.Tweens.TweenDataGenConfig; + /** + * TWEEN_CONST.CREATED + */ + state?: Phaser.Tweens.StateType; + }; + + type TweenOnActiveCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnCompleteCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnLoopCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnPauseCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnRepeatCallback = (tween: Phaser.Tweens.Tween, target: any, key: string, current: number, previous: number, ...param: any[])=>void; + + type TweenOnResumeCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnStartCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnStopCallback = (tween: Phaser.Tweens.Tween, targets: any | any[], ...param: any[])=>void; + + type TweenOnUpdateCallback = (tween: Phaser.Tweens.Tween, target: any, key: string, current: number, previous: number, ...param: any[])=>void; + + type TweenOnYoyoCallback = (tween: Phaser.Tweens.Tween, target: any, key: string, current: number, previous: number, ...param: any[])=>void; + + type TweenPropConfig = { + /** + * What the property will be at the END of the Tween. + */ + value?: number | number[] | string | Phaser.Types.Tweens.GetEndCallback | Phaser.Types.Tweens.TweenPropConfig; + /** + * What the property will be set to immediately when this tween becomes active. + */ + getActive?: Phaser.Types.Tweens.GetActiveCallback; + /** + * What the property will be at the END of the Tween. + */ + getEnd?: Phaser.Types.Tweens.GetEndCallback; + /** + * What the property will be at the START of the Tween. + */ + getStart?: Phaser.Types.Tweens.GetStartCallback; + /** + * The ease function this tween uses. + */ + ease?: string | Function; + /** + * Time in milliseconds before tween will start. + */ + delay?: number; + /** + * Duration of the tween in milliseconds. + */ + duration?: number; + /** + * Determines whether the tween should return back to its start value after hold has expired. + */ + yoyo?: boolean; + /** + * Time in milliseconds the tween will pause before repeating or returning to its starting value if yoyo is set to true. + */ + hold?: number; + /** + * Number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + */ + repeat?: number; + /** + * Time in milliseconds before the repeat will start. + */ + repeatDelay?: number; + /** + * Should toggleFlipX be called when yoyo or repeat happens? + */ + flipX?: boolean; + /** + * Should toggleFlipY be called when yoyo or repeat happens? + */ + flipY?: boolean; + /** + * The interpolation function to use if the `value` given is an array of numbers. + */ + interpolation?: string | Function; + }; + + } + + } + + namespace Physics { + namespace Arcade { + /** + * An Arcade Physics Image is an Image with an Arcade Physics body and related components. + * The body can be dynamic or static. + * + * The main difference between an Arcade Image and an Arcade Sprite is that you cannot animate an Arcade Image. + */ + class Image extends Phaser.GameObjects.Image implements Phaser.Physics.Arcade.Components.Acceleration, Phaser.Physics.Arcade.Components.Angular, Phaser.Physics.Arcade.Components.Bounce, Phaser.Physics.Arcade.Components.Collision, Phaser.Physics.Arcade.Components.Debug, Phaser.Physics.Arcade.Components.Drag, Phaser.Physics.Arcade.Components.Enable, Phaser.Physics.Arcade.Components.Friction, Phaser.Physics.Arcade.Components.Gravity, Phaser.Physics.Arcade.Components.Immovable, Phaser.Physics.Arcade.Components.Mass, Phaser.Physics.Arcade.Components.Pushable, Phaser.Physics.Arcade.Components.Size, Phaser.Physics.Arcade.Components.Velocity, Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number); + + /** + * This Game Object's Physics Body. + */ + body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody | null; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * Sets the body's horizontal and vertical acceleration. If the vertical acceleration value is not provided, the vertical acceleration is set to the same value as the horizontal acceleration. + * @param x The horizontal acceleration + * @param y The vertical acceleration Default x. + */ + setAcceleration(x: number, y?: number): this; + + /** + * Sets the body's horizontal acceleration. + * @param value The horizontal acceleration + */ + setAccelerationX(value: number): this; + + /** + * Sets the body's vertical acceleration. + * @param value The vertical acceleration + */ + setAccelerationY(value: number): this; + + /** + * Sets the angular velocity of the body. + * + * In Arcade Physics, bodies cannot rotate. They are always axis-aligned. + * However, they can have angular motion, which is passed on to the Game Object bound to the body, + * causing them to visually rotate, even though the body remains axis-aligned. + * @param value The amount of angular velocity. + */ + setAngularVelocity(value: number): this; + + /** + * Sets the angular acceleration of the body. + * + * In Arcade Physics, bodies cannot rotate. They are always axis-aligned. + * However, they can have angular motion, which is passed on to the Game Object bound to the body, + * causing them to visually rotate, even though the body remains axis-aligned. + * @param value The amount of angular acceleration. + */ + setAngularAcceleration(value: number): this; + + /** + * Sets the angular drag of the body. Drag is applied to the current velocity, providing a form of deceleration. + * @param value The amount of drag. + */ + setAngularDrag(value: number): this; + + /** + * Sets the bounce values of this body. + * + * Bounce is the amount of restitution, or elasticity, the body has when it collides with another object. + * A value of 1 means that it will retain its full velocity after the rebound. A value of 0 means it will not rebound at all. + * @param x The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1. + * @param y The amount of vertical bounce to apply on collision. A float, typically between 0 and 1. Default x. + */ + setBounce(x: number, y?: number): this; + + /** + * Sets the horizontal bounce value for this body. + * @param value The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1. + */ + setBounceX(value: number): this; + + /** + * Sets the vertical bounce value for this body. + * @param value The amount of vertical bounce to apply on collision. A float, typically between 0 and 1. + */ + setBounceY(value: number): this; + + /** + * Sets whether this Body collides with the world boundary. + * + * Optionally also sets the World Bounce values. If the `Body.worldBounce` is null, it's set to a new Phaser.Math.Vector2 first. + * @param value `true` if this body should collide with the world bounds, otherwise `false`. Default true. + * @param bounceX If given this will be replace the `worldBounce.x` value. + * @param bounceY If given this will be replace the `worldBounce.y` value. + * @param onWorldBounds If given this replaces the Body's `onWorldBounds` value. + */ + setCollideWorldBounds(value?: boolean, bounceX?: number, bounceY?: number, onWorldBounds?: boolean): this; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + /** + * Sets the debug values of this body. + * + * Bodies will only draw their debug if debug has been enabled for Arcade Physics as a whole. + * Note that there is a performance cost in drawing debug displays. It should never be used in production. + * @param showBody Set to `true` to have this body render its outline to the debug display. + * @param showVelocity Set to `true` to have this body render a velocity marker to the debug display. + * @param bodyColor The color of the body outline when rendered to the debug display. + */ + setDebug(showBody: boolean, showVelocity: boolean, bodyColor: number): this; + + /** + * Sets the color of the body outline when it renders to the debug display. + * @param value The color of the body outline when rendered to the debug display. + */ + setDebugBodyColor(value: number): this; + + /** + * Set to `true` to have this body render its outline to the debug display. + */ + debugShowBody: boolean; + + /** + * Set to `true` to have this body render a velocity marker to the debug display. + */ + debugShowVelocity: boolean; + + /** + * The color of the body outline when it renders to the debug display. + */ + debugBodyColor: number; + + /** + * Sets the body's horizontal and vertical drag. If the vertical drag value is not provided, the vertical drag is set to the same value as the horizontal drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param x The amount of horizontal drag to apply. + * @param y The amount of vertical drag to apply. Default x. + */ + setDrag(x: number, y?: number): this; + + /** + * Sets the body's horizontal drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param value The amount of horizontal drag to apply. + */ + setDragX(value: number): this; + + /** + * Sets the body's vertical drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param value The amount of vertical drag to apply. + */ + setDragY(value: number): this; + + /** + * If this Body is using `drag` for deceleration this function controls how the drag is applied. + * If set to `true` drag will use a damping effect rather than a linear approach. If you are + * creating a game where the Body moves freely at any angle (i.e. like the way the ship moves in + * the game Asteroids) then you will get a far smoother and more visually correct deceleration + * by using damping, avoiding the axis-drift that is prone with linear deceleration. + * + * If you enable this property then you should use far smaller `drag` values than with linear, as + * they are used as a multiplier on the velocity. Values such as 0.95 will give a nice slow + * deceleration, where-as smaller values, such as 0.5 will stop an object almost immediately. + * @param value `true` to use damping for deceleration, or `false` to use linear deceleration. + */ + setDamping(value: boolean): this; + + /** + * Sets whether this Body should calculate its velocity based on its change in + * position every frame. The default, which is to not do this, means that you + * make this Body move by setting the velocity directly. However, if you are + * trying to move this Body via a Tween, or have it follow a Path, then you + * should enable this instead. This will allow it to still collide with other + * bodies, something that isn't possible if you're just changing its position directly. + * @param value `true` if the Body calculate velocity based on changes in position, otherwise `false`. Default true. + */ + setDirectControl(value?: boolean): this; + + /** + * Enables this Game Object's Body. + * If you reset the Body you must also pass `x` and `y`. + * @param reset Also reset the Body and place the Game Object at (x, y). + * @param x The horizontal position to place the Game Object, if `reset` is true. + * @param y The horizontal position to place the Game Object, if `reset` is true. + * @param enableGameObject Also set this Game Object's `active` to true. + * @param showGameObject Also set this Game Object's `visible` to true. + */ + enableBody(reset?: boolean, x?: number, y?: number, enableGameObject?: boolean, showGameObject?: boolean): this; + + /** + * Stops and disables this Game Object's Body. + * @param disableGameObject Also set this Game Object's `active` to false. Default false. + * @param hideGameObject Also set this Game Object's `visible` to false. Default false. + */ + disableBody(disableGameObject?: boolean, hideGameObject?: boolean): this; + + /** + * Syncs the Body's position and size with its parent Game Object. + * You don't need to call this for Dynamic Bodies, as it happens automatically. + * But for Static bodies it's a useful way of modifying the position of a Static Body + * in the Physics World, based on its Game Object. + */ + refreshBody(): this; + + /** + * Sets the friction of this game object's physics body. + * In Arcade Physics, friction is a special case of motion transfer from an "immovable" body to a riding body. + * @param x The amount of horizontal friction to apply, [0, 1]. + * @param y The amount of vertical friction to apply, [0, 1]. Default x. + */ + setFriction(x: number, y?: number): this; + + /** + * Sets the horizontal friction of this game object's physics body. + * This can move a riding body horizontally when it collides with this one on the vertical axis. + * @param x The amount of friction to apply, [0, 1]. + */ + setFrictionX(x: number): this; + + /** + * Sets the vertical friction of this game object's physics body. + * This can move a riding body vertically when it collides with this one on the horizontal axis. + * @param y The amount of friction to apply, [0, 1]. + */ + setFrictionY(y: number): this; + + /** + * Set the X and Y values of the gravitational pull to act upon this Arcade Physics Game Object. Values can be positive or negative. Larger values result in a stronger effect. + * + * If only one value is provided, this value will be used for both the X and Y axis. + * @param x The gravitational force to be applied to the X-axis. + * @param y The gravitational force to be applied to the Y-axis. If this is not specified, the X value will be used. Default x. + */ + setGravity(x: number, y?: number): this; + + /** + * Set the gravitational force to be applied to the X axis. Value can be positive or negative. Larger values result in a stronger effect. + * @param x The gravitational force to be applied to the X-axis. + */ + setGravityX(x: number): this; + + /** + * Set the gravitational force to be applied to the Y axis. Value can be positive or negative. Larger values result in a stronger effect. + * @param y The gravitational force to be applied to the Y-axis. + */ + setGravityY(y: number): this; + + /** + * Sets if this Body can be separated during collisions with other bodies. + * + * When a body is immovable it means it won't move at all, not even to separate it from collision + * overlap. If you just wish to prevent a body from being knocked around by other bodies, see + * the `setPushable` method instead. + * @param value Sets if this body will be separated during collisions with other bodies. Default true. + */ + setImmovable(value?: boolean): this; + + /** + * Sets the mass of the physics body + * @param value New value for the mass of the body. + */ + setMass(value: number): this; + + /** + * Sets if this Body can be pushed by another Body. + * + * A body that cannot be pushed will reflect back all of the velocity it is given to the + * colliding body. If that body is also not pushable, then the separation will be split + * between them evenly. + * + * If you want your body to never move or seperate at all, see the `setImmovable` method. + * @param value Sets if this body can be pushed by collisions with another Body. Default true. + */ + setPushable(value?: boolean): this; + + /** + * Sets the body offset. This allows you to adjust the difference between the center of the body + * and the x and y coordinates of the parent Game Object. + * @param x The amount to offset the body from the parent Game Object along the x-axis. + * @param y The amount to offset the body from the parent Game Object along the y-axis. Defaults to the value given for the x-axis. Default x. + */ + setOffset(x: number, y?: number): this; + + /** + * Sets the size of this physics body. Setting the size does not adjust the dimensions of the parent Game Object. + * @param width The new width of the physics body, in pixels. + * @param height The new height of the physics body, in pixels. + * @param center Should the body be re-positioned so its center aligns with the parent Game Object? Default true. + */ + setBodySize(width: number, height: number, center?: boolean): this; + + /** + * Sets this physics body to use a circle for collision instead of a rectangle. + * @param radius The radius of the physics body, in pixels. + * @param offsetX The amount to offset the body from the parent Game Object along the x-axis. + * @param offsetY The amount to offset the body from the parent Game Object along the y-axis. + */ + setCircle(radius: number, offsetX?: number, offsetY?: number): this; + + /** + * Sets the velocity of the Body. + * @param x The horizontal velocity of the body. Positive values move the body to the right, while negative values move it to the left. + * @param y The vertical velocity of the body. Positive values move the body down, while negative values move it up. Default x. + */ + setVelocity(x: number, y?: number): this; + + /** + * Sets the horizontal component of the body's velocity. + * + * Positive values move the body to the right, while negative values move it to the left. + * @param x The new horizontal velocity. + */ + setVelocityX(x: number): this; + + /** + * Sets the vertical component of the body's velocity. + * + * Positive values move the body down, while negative values move it up. + * @param y The new vertical velocity of the body. + */ + setVelocityY(y: number): this; + + /** + * Sets the maximum velocity of the body. + * @param x The new maximum horizontal velocity. + * @param y The new maximum vertical velocity. Default x. + */ + setMaxVelocity(x: number, y?: number): this; + + } + + /** + * The Arcade Physics Plugin belongs to a Scene and sets up and manages the Scene's physics simulation. + * It also holds some useful methods for moving and rotating Arcade Physics Bodies. + * + * You can access it from within a Scene using `this.physics`. + * + * Arcade Physics uses the Projection Method of collision resolution and separation. While it's fast and suitable + * for 'arcade' style games it lacks stability when multiple objects are in close proximity or resting upon each other. + * The separation that stops two objects penetrating may create a new penetration against a different object. If you + * require a high level of stability please consider using an alternative physics system, such as Matter.js. + */ + class ArcadePhysics { + /** + * + * @param scene The Scene that this Plugin belongs to. + */ + constructor(scene: Phaser.Scene); + + /** + * The Scene that this Plugin belongs to. + */ + scene: Phaser.Scene; + + /** + * The Scene's Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * A configuration object. Union of the `physics.arcade.*` properties of the GameConfig and SceneConfig objects. + */ + config: Phaser.Types.Physics.Arcade.ArcadeWorldConfig; + + /** + * The physics simulation. + */ + world: Phaser.Physics.Arcade.World; + + /** + * An object holding the Arcade Physics factory methods. + */ + add: Phaser.Physics.Arcade.Factory; + + /** + * Causes `World.update` to be automatically called each time the Scene + * emits and `UPDATE` event. This is the default setting, so only needs + * calling if you have specifically disabled it. + */ + enableUpdate(): void; + + /** + * Causes `World.update` to **not** be automatically called each time the Scene + * emits and `UPDATE` event. + * + * If you wish to run the World update at your own rate, or from your own + * component, then you should call this method to disable the built-in link, + * and then call `World.update(delta, time)` accordingly. + * + * Note that `World.postUpdate` is always automatically called when the Scene + * emits a `POST_UPDATE` event, regardless of this setting. + */ + disableUpdate(): void; + + /** + * Creates the physics configuration for the current Scene. + */ + getConfig(): Phaser.Types.Physics.Arcade.ArcadeWorldConfig; + + /** + * Returns the next available collision category. + * + * You can have a maximum of 32 categories. + * + * By default all bodies collide with all other bodies. + * + * Use the `Body.setCollisionCategory()` and + * `Body.setCollidesWith()` methods to change this. + */ + nextCategory(): number; + + /** + * Tests if Game Objects overlap. See {@link Phaser.Physics.Arcade.World#overlap} + * @param object1 The first object or array of objects to check. + * @param object2 The second object or array of objects to check, or `undefined`. + * @param overlapCallback An optional callback function that is called if the objects overlap. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they overlap. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + overlap(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2?: Phaser.Types.Physics.Arcade.ArcadeColliderType, overlapCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * Performs a collision check and separation between the two physics enabled objects given, which can be single + * Game Objects, arrays of Game Objects, Physics Groups, arrays of Physics Groups or normal Groups. + * + * If you don't require separation then use {@link #overlap} instead. + * + * If two Groups or arrays are passed, each member of one will be tested against each member of the other. + * + * If **only** one Group is passed (as `object1`), each member of the Group will be collided against the other members. + * + * If **only** one Array is passed, the array is iterated and every element in it is tested against the others. + * + * Two callbacks can be provided. The `collideCallback` is invoked if a collision occurs and the two colliding + * objects are passed to it. + * + * Arcade Physics uses the Projection Method of collision resolution and separation. While it's fast and suitable + * for 'arcade' style games it lacks stability when multiple objects are in close proximity or resting upon each other. + * The separation that stops two objects penetrating may create a new penetration against a different object. If you + * require a high level of stability please consider using an alternative physics system, such as Matter.js. + * @param object1 The first object or array of objects to check. + * @param object2 The second object or array of objects to check, or `undefined`. + * @param collideCallback An optional callback function that is called if the objects collide. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + collide(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2?: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * This advanced method is specifically for testing for collision between a single Sprite and an array of Tile objects. + * + * You should generally use the `collide` method instead, with a Sprite vs. a Tilemap Layer, as that will perform + * tile filtering and culling for you, as well as handle the interesting face collision automatically. + * + * This method is offered for those who would like to check for collision with specific Tiles in a layer, without + * having to set any collision attributes on the tiles in question. This allows you to perform quick dynamic collisions + * on small sets of Tiles. As such, no culling or checks are made to the array of Tiles given to this method, + * you should filter them before passing them to this method. + * + * Important: Use of this method skips the `interesting faces` system that Tilemap Layers use. This means if you have + * say a row or column of tiles, and you jump into, or walk over them, it's possible to get stuck on the edges of the + * tiles as the interesting face calculations are skipped. However, for quick-fire small collision set tests on + * dynamic maps, this method can prove very useful. + * @param sprite The first object to check for collision. + * @param tiles An array of Tiles to check for collision against. + * @param collideCallback An optional callback function that is called if the objects collide. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + collideTiles(sprite: Phaser.GameObjects.GameObject, tiles: Phaser.Tilemaps.Tile[], collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * This advanced method is specifically for testing for overlaps between a single Sprite and an array of Tile objects. + * + * You should generally use the `overlap` method instead, with a Sprite vs. a Tilemap Layer, as that will perform + * tile filtering and culling for you, as well as handle the interesting face collision automatically. + * + * This method is offered for those who would like to check for overlaps with specific Tiles in a layer, without + * having to set any collision attributes on the tiles in question. This allows you to perform quick dynamic overlap + * tests on small sets of Tiles. As such, no culling or checks are made to the array of Tiles given to this method, + * you should filter them before passing them to this method. + * @param sprite The first object to check for collision. + * @param tiles An array of Tiles to check for collision against. + * @param collideCallback An optional callback function that is called if the objects overlap. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + overlapTiles(sprite: Phaser.GameObjects.GameObject, tiles: Phaser.Tilemaps.Tile[], collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * Pauses the simulation. + */ + pause(): Phaser.Physics.Arcade.World; + + /** + * Resumes the simulation (if paused). + */ + resume(): Phaser.Physics.Arcade.World; + + /** + * Sets the acceleration.x/y property on the game object so it will move towards the x/y coordinates at the given rate (in pixels per second squared) + * + * You must give a maximum speed value, beyond which the game object won't go any faster. + * + * Note: The game object does not continuously track the target. If the target changes location during transit the game object will not modify its course. + * Note: The game object doesn't stop moving once it reaches the destination coordinates. + * @param gameObject Any Game Object with an Arcade Physics body. + * @param x The x coordinate to accelerate towards. + * @param y The y coordinate to accelerate towards. + * @param speed The acceleration (change in speed) in pixels per second squared. Default 60. + * @param xSpeedMax The maximum x velocity the game object can reach. Default 500. + * @param ySpeedMax The maximum y velocity the game object can reach. Default 500. + */ + accelerateTo(gameObject: Phaser.GameObjects.GameObject, x: number, y: number, speed?: number, xSpeedMax?: number, ySpeedMax?: number): number; + + /** + * Sets the acceleration.x/y property on the game object so it will move towards the x/y coordinates at the given rate (in pixels per second squared) + * + * You must give a maximum speed value, beyond which the game object won't go any faster. + * + * Note: The game object does not continuously track the target. If the target changes location during transit the game object will not modify its course. + * Note: The game object doesn't stop moving once it reaches the destination coordinates. + * @param gameObject Any Game Object with an Arcade Physics body. + * @param destination The Game Object to move towards. Can be any object but must have visible x/y properties. + * @param speed The acceleration (change in speed) in pixels per second squared. Default 60. + * @param xSpeedMax The maximum x velocity the game object can reach. Default 500. + * @param ySpeedMax The maximum y velocity the game object can reach. Default 500. + */ + accelerateToObject(gameObject: Phaser.GameObjects.GameObject, destination: Phaser.GameObjects.GameObject, speed?: number, xSpeedMax?: number, ySpeedMax?: number): number; + + /** + * Finds the Body or Game Object closest to a source point or object. + * + * If a `targets` argument is passed, this method finds the closest of those. + * The targets can be Arcade Physics Game Objects, Dynamic Bodies, or Static Bodies. + * + * If no `targets` argument is passed, this method finds the closest Dynamic Body. + * + * If two or more targets are the exact same distance from the source point, only the first target + * is returned. + * @param source Any object with public `x` and `y` properties, such as a Game Object or Geometry object. + * @param targets The targets. + */ + closest(source: Phaser.Types.Math.Vector2Like, targets?: Target[]): Target | null; + + /** + * Finds the Body or Game Object farthest from a source point or object. + * + * If a `targets` argument is passed, this method finds the farthest of those. + * The targets can be Arcade Physics Game Objects, Dynamic Bodies, or Static Bodies. + * + * If no `targets` argument is passed, this method finds the farthest Dynamic Body. + * + * If two or more targets are the exact same distance from the source point, only the first target + * is returned. + * @param source Any object with public `x` and `y` properties, such as a Game Object or Geometry object. + * @param targets The targets. + */ + furthest(source: any, targets?: Phaser.Physics.Arcade.Body[] | Phaser.Physics.Arcade.StaticBody[] | Phaser.GameObjects.GameObject[]): Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody | Phaser.GameObjects.GameObject | null; + + /** + * Move the given display object towards the x/y coordinates at a steady velocity. + * If you specify a maxTime then it will adjust the speed (over-writing what you set) so it arrives at the destination in that number of seconds. + * Timings are approximate due to the way browser timers work. Allow for a variance of +- 50ms. + * Note: The display object does not continuously track the target. If the target changes location during transit the display object will not modify its course. + * Note: The display object doesn't stop moving once it reaches the destination coordinates. + * Note: Doesn't take into account acceleration, maxVelocity or drag (if you've set drag or acceleration too high this object may not move at all) + * @param gameObject Any Game Object with an Arcade Physics body. + * @param x The x coordinate to move towards. + * @param y The y coordinate to move towards. + * @param speed The speed it will move, in pixels per second (default is 60 pixels/sec) Default 60. + * @param maxTime Time given in milliseconds (1000 = 1 sec). If set the speed is adjusted so the object will arrive at destination in the given number of ms. Default 0. + */ + moveTo(gameObject: Phaser.GameObjects.GameObject, x: number, y: number, speed?: number, maxTime?: number): number; + + /** + * Move the given display object towards the destination object at a steady velocity. + * If you specify a maxTime then it will adjust the speed (overwriting what you set) so it arrives at the destination in that number of seconds. + * Timings are approximate due to the way browser timers work. Allow for a variance of +- 50ms. + * Note: The display object does not continuously track the target. If the target changes location during transit the display object will not modify its course. + * Note: The display object doesn't stop moving once it reaches the destination coordinates. + * Note: Doesn't take into account acceleration, maxVelocity or drag (if you've set drag or acceleration too high this object may not move at all) + * @param gameObject Any Game Object with an Arcade Physics body. + * @param destination Any object with public `x` and `y` properties, such as a Game Object or Geometry object. + * @param speed The speed it will move, in pixels per second (default is 60 pixels/sec) Default 60. + * @param maxTime Time given in milliseconds (1000 = 1 sec). If set the speed is adjusted so the object will arrive at destination in the given number of ms. Default 0. + */ + moveToObject(gameObject: Phaser.GameObjects.GameObject, destination: object, speed?: number, maxTime?: number): number; + + /** + * Given the angle (in degrees) and speed calculate the velocity and return it as a vector, or set it to the given vector object. + * One way to use this is: velocityFromAngle(angle, 200, sprite.body.velocity) which will set the values directly to the sprite's velocity and not create a new vector object. + * @param angle The angle in degrees calculated in clockwise positive direction (down = 90 degrees positive, right = 0 degrees positive, up = 90 degrees negative) + * @param speed The speed it will move, in pixels per second squared. Default 60. + * @param vec2 The Vector2 in which the x and y properties will be set to the calculated velocity. + */ + velocityFromAngle(angle: number, speed?: number, vec2?: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * Given the rotation (in radians) and speed calculate the velocity and return it as a vector, or set it to the given vector object. + * One way to use this is: velocityFromRotation(rotation, 200, sprite.body.velocity) which will set the values directly to the sprite's velocity and not create a new vector object. + * @param rotation The angle in radians. + * @param speed The speed it will move, in pixels per second squared Default 60. + * @param vec2 The Vector2 in which the x and y properties will be set to the calculated velocity. + */ + velocityFromRotation(rotation: number, speed?: number, vec2?: Phaser.Math.Vector2): Phaser.Math.Vector2; + + /** + * This method will search the given rectangular area and return an array of all physics bodies that + * overlap with it. It can return either Dynamic, Static bodies or a mixture of both. + * + * A body only has to intersect with the search area to be considered, it doesn't have to be fully + * contained within it. + * + * If Arcade Physics is set to use the RTree (which it is by default) then the search for is extremely fast, + * otherwise the search is O(N) for Dynamic Bodies. + * @param x The top-left x coordinate of the area to search within. + * @param y The top-left y coordinate of the area to search within. + * @param width The width of the area to search within. + * @param height The height of the area to search within. + * @param includeDynamic Should the search include Dynamic Bodies? Default true. + * @param includeStatic Should the search include Static Bodies? Default false. + */ + overlapRect(x: number, y: number, width: number, height: number, includeDynamic?: boolean, includeStatic?: boolean): Phaser.Physics.Arcade.Body[] | Phaser.Physics.Arcade.StaticBody[]; + + /** + * This method will search the given circular area and return an array of all physics bodies that + * overlap with it. It can return either Dynamic, Static bodies or a mixture of both. + * + * A body only has to intersect with the search area to be considered, it doesn't have to be fully + * contained within it. + * + * If Arcade Physics is set to use the RTree (which it is by default) then the search is rather fast, + * otherwise the search is O(N) for Dynamic Bodies. + * @param x The x coordinate of the center of the area to search within. + * @param y The y coordinate of the center of the area to search within. + * @param radius The radius of the area to search within. + * @param includeDynamic Should the search include Dynamic Bodies? Default true. + * @param includeStatic Should the search include Static Bodies? Default false. + */ + overlapCirc(x: number, y: number, radius: number, includeDynamic?: boolean, includeStatic?: boolean): Phaser.Physics.Arcade.Body[] | Phaser.Physics.Arcade.StaticBody[]; + + /** + * The Scene that owns this plugin is shutting down. + * We need to kill and reset all internal properties as well as stop listening to Scene events. + */ + shutdown(): void; + + /** + * The Scene that owns this plugin is being destroyed. + * We need to shutdown and then kill off all external references. + */ + destroy(): void; + + } + + /** + * An Arcade Physics Sprite is a Sprite with an Arcade Physics body and related components. + * The body can be dynamic or static. + * + * The main difference between an Arcade Sprite and an Arcade Image is that you cannot animate an Arcade Image. + * If you do not require animation then you can safely use Arcade Images instead of Arcade Sprites. + */ + class Sprite extends Phaser.GameObjects.Sprite implements Phaser.Physics.Arcade.Components.Acceleration, Phaser.Physics.Arcade.Components.Angular, Phaser.Physics.Arcade.Components.Bounce, Phaser.Physics.Arcade.Components.Collision, Phaser.Physics.Arcade.Components.Debug, Phaser.Physics.Arcade.Components.Drag, Phaser.Physics.Arcade.Components.Enable, Phaser.Physics.Arcade.Components.Friction, Phaser.Physics.Arcade.Components.Gravity, Phaser.Physics.Arcade.Components.Immovable, Phaser.Physics.Arcade.Components.Mass, Phaser.Physics.Arcade.Components.Pushable, Phaser.Physics.Arcade.Components.Size, Phaser.Physics.Arcade.Components.Velocity, Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param scene The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + constructor(scene: Phaser.Scene, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number); + + /** + * This Game Object's Physics Body. + */ + body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody | null; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * Sets the body's horizontal and vertical acceleration. If the vertical acceleration value is not provided, the vertical acceleration is set to the same value as the horizontal acceleration. + * @param x The horizontal acceleration + * @param y The vertical acceleration Default x. + */ + setAcceleration(x: number, y?: number): this; + + /** + * Sets the body's horizontal acceleration. + * @param value The horizontal acceleration + */ + setAccelerationX(value: number): this; + + /** + * Sets the body's vertical acceleration. + * @param value The vertical acceleration + */ + setAccelerationY(value: number): this; + + /** + * Sets the angular velocity of the body. + * + * In Arcade Physics, bodies cannot rotate. They are always axis-aligned. + * However, they can have angular motion, which is passed on to the Game Object bound to the body, + * causing them to visually rotate, even though the body remains axis-aligned. + * @param value The amount of angular velocity. + */ + setAngularVelocity(value: number): this; + + /** + * Sets the angular acceleration of the body. + * + * In Arcade Physics, bodies cannot rotate. They are always axis-aligned. + * However, they can have angular motion, which is passed on to the Game Object bound to the body, + * causing them to visually rotate, even though the body remains axis-aligned. + * @param value The amount of angular acceleration. + */ + setAngularAcceleration(value: number): this; + + /** + * Sets the angular drag of the body. Drag is applied to the current velocity, providing a form of deceleration. + * @param value The amount of drag. + */ + setAngularDrag(value: number): this; + + /** + * Sets the bounce values of this body. + * + * Bounce is the amount of restitution, or elasticity, the body has when it collides with another object. + * A value of 1 means that it will retain its full velocity after the rebound. A value of 0 means it will not rebound at all. + * @param x The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1. + * @param y The amount of vertical bounce to apply on collision. A float, typically between 0 and 1. Default x. + */ + setBounce(x: number, y?: number): this; + + /** + * Sets the horizontal bounce value for this body. + * @param value The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1. + */ + setBounceX(value: number): this; + + /** + * Sets the vertical bounce value for this body. + * @param value The amount of vertical bounce to apply on collision. A float, typically between 0 and 1. + */ + setBounceY(value: number): this; + + /** + * Sets whether this Body collides with the world boundary. + * + * Optionally also sets the World Bounce values. If the `Body.worldBounce` is null, it's set to a new Phaser.Math.Vector2 first. + * @param value `true` if this body should collide with the world bounds, otherwise `false`. Default true. + * @param bounceX If given this will be replace the `worldBounce.x` value. + * @param bounceY If given this will be replace the `worldBounce.y` value. + * @param onWorldBounds If given this replaces the Body's `onWorldBounds` value. + */ + setCollideWorldBounds(value?: boolean, bounceX?: number, bounceY?: number, onWorldBounds?: boolean): this; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + /** + * Sets the debug values of this body. + * + * Bodies will only draw their debug if debug has been enabled for Arcade Physics as a whole. + * Note that there is a performance cost in drawing debug displays. It should never be used in production. + * @param showBody Set to `true` to have this body render its outline to the debug display. + * @param showVelocity Set to `true` to have this body render a velocity marker to the debug display. + * @param bodyColor The color of the body outline when rendered to the debug display. + */ + setDebug(showBody: boolean, showVelocity: boolean, bodyColor: number): this; + + /** + * Sets the color of the body outline when it renders to the debug display. + * @param value The color of the body outline when rendered to the debug display. + */ + setDebugBodyColor(value: number): this; + + /** + * Set to `true` to have this body render its outline to the debug display. + */ + debugShowBody: boolean; + + /** + * Set to `true` to have this body render a velocity marker to the debug display. + */ + debugShowVelocity: boolean; + + /** + * The color of the body outline when it renders to the debug display. + */ + debugBodyColor: number; + + /** + * Sets the body's horizontal and vertical drag. If the vertical drag value is not provided, the vertical drag is set to the same value as the horizontal drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param x The amount of horizontal drag to apply. + * @param y The amount of vertical drag to apply. Default x. + */ + setDrag(x: number, y?: number): this; + + /** + * Sets the body's horizontal drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param value The amount of horizontal drag to apply. + */ + setDragX(value: number): this; + + /** + * Sets the body's vertical drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param value The amount of vertical drag to apply. + */ + setDragY(value: number): this; + + /** + * If this Body is using `drag` for deceleration this function controls how the drag is applied. + * If set to `true` drag will use a damping effect rather than a linear approach. If you are + * creating a game where the Body moves freely at any angle (i.e. like the way the ship moves in + * the game Asteroids) then you will get a far smoother and more visually correct deceleration + * by using damping, avoiding the axis-drift that is prone with linear deceleration. + * + * If you enable this property then you should use far smaller `drag` values than with linear, as + * they are used as a multiplier on the velocity. Values such as 0.95 will give a nice slow + * deceleration, where-as smaller values, such as 0.5 will stop an object almost immediately. + * @param value `true` to use damping for deceleration, or `false` to use linear deceleration. + */ + setDamping(value: boolean): this; + + /** + * Sets whether this Body should calculate its velocity based on its change in + * position every frame. The default, which is to not do this, means that you + * make this Body move by setting the velocity directly. However, if you are + * trying to move this Body via a Tween, or have it follow a Path, then you + * should enable this instead. This will allow it to still collide with other + * bodies, something that isn't possible if you're just changing its position directly. + * @param value `true` if the Body calculate velocity based on changes in position, otherwise `false`. Default true. + */ + setDirectControl(value?: boolean): this; + + /** + * Enables this Game Object's Body. + * If you reset the Body you must also pass `x` and `y`. + * @param reset Also reset the Body and place the Game Object at (x, y). + * @param x The horizontal position to place the Game Object, if `reset` is true. + * @param y The horizontal position to place the Game Object, if `reset` is true. + * @param enableGameObject Also set this Game Object's `active` to true. + * @param showGameObject Also set this Game Object's `visible` to true. + */ + enableBody(reset?: boolean, x?: number, y?: number, enableGameObject?: boolean, showGameObject?: boolean): this; + + /** + * Stops and disables this Game Object's Body. + * @param disableGameObject Also set this Game Object's `active` to false. Default false. + * @param hideGameObject Also set this Game Object's `visible` to false. Default false. + */ + disableBody(disableGameObject?: boolean, hideGameObject?: boolean): this; + + /** + * Syncs the Body's position and size with its parent Game Object. + * You don't need to call this for Dynamic Bodies, as it happens automatically. + * But for Static bodies it's a useful way of modifying the position of a Static Body + * in the Physics World, based on its Game Object. + */ + refreshBody(): this; + + /** + * Sets the friction of this game object's physics body. + * In Arcade Physics, friction is a special case of motion transfer from an "immovable" body to a riding body. + * @param x The amount of horizontal friction to apply, [0, 1]. + * @param y The amount of vertical friction to apply, [0, 1]. Default x. + */ + setFriction(x: number, y?: number): this; + + /** + * Sets the horizontal friction of this game object's physics body. + * This can move a riding body horizontally when it collides with this one on the vertical axis. + * @param x The amount of friction to apply, [0, 1]. + */ + setFrictionX(x: number): this; + + /** + * Sets the vertical friction of this game object's physics body. + * This can move a riding body vertically when it collides with this one on the horizontal axis. + * @param y The amount of friction to apply, [0, 1]. + */ + setFrictionY(y: number): this; + + /** + * Set the X and Y values of the gravitational pull to act upon this Arcade Physics Game Object. Values can be positive or negative. Larger values result in a stronger effect. + * + * If only one value is provided, this value will be used for both the X and Y axis. + * @param x The gravitational force to be applied to the X-axis. + * @param y The gravitational force to be applied to the Y-axis. If this is not specified, the X value will be used. Default x. + */ + setGravity(x: number, y?: number): this; + + /** + * Set the gravitational force to be applied to the X axis. Value can be positive or negative. Larger values result in a stronger effect. + * @param x The gravitational force to be applied to the X-axis. + */ + setGravityX(x: number): this; + + /** + * Set the gravitational force to be applied to the Y axis. Value can be positive or negative. Larger values result in a stronger effect. + * @param y The gravitational force to be applied to the Y-axis. + */ + setGravityY(y: number): this; + + /** + * Sets if this Body can be separated during collisions with other bodies. + * + * When a body is immovable it means it won't move at all, not even to separate it from collision + * overlap. If you just wish to prevent a body from being knocked around by other bodies, see + * the `setPushable` method instead. + * @param value Sets if this body will be separated during collisions with other bodies. Default true. + */ + setImmovable(value?: boolean): this; + + /** + * Sets the mass of the physics body + * @param value New value for the mass of the body. + */ + setMass(value: number): this; + + /** + * Sets if this Body can be pushed by another Body. + * + * A body that cannot be pushed will reflect back all of the velocity it is given to the + * colliding body. If that body is also not pushable, then the separation will be split + * between them evenly. + * + * If you want your body to never move or seperate at all, see the `setImmovable` method. + * @param value Sets if this body can be pushed by collisions with another Body. Default true. + */ + setPushable(value?: boolean): this; + + /** + * Sets the body offset. This allows you to adjust the difference between the center of the body + * and the x and y coordinates of the parent Game Object. + * @param x The amount to offset the body from the parent Game Object along the x-axis. + * @param y The amount to offset the body from the parent Game Object along the y-axis. Defaults to the value given for the x-axis. Default x. + */ + setOffset(x: number, y?: number): this; + + /** + * Sets the size of this physics body. Setting the size does not adjust the dimensions of the parent Game Object. + * @param width The new width of the physics body, in pixels. + * @param height The new height of the physics body, in pixels. + * @param center Should the body be re-positioned so its center aligns with the parent Game Object? Default true. + */ + setBodySize(width: number, height: number, center?: boolean): this; + + /** + * Sets this physics body to use a circle for collision instead of a rectangle. + * @param radius The radius of the physics body, in pixels. + * @param offsetX The amount to offset the body from the parent Game Object along the x-axis. + * @param offsetY The amount to offset the body from the parent Game Object along the y-axis. + */ + setCircle(radius: number, offsetX?: number, offsetY?: number): this; + + /** + * Sets the velocity of the Body. + * @param x The horizontal velocity of the body. Positive values move the body to the right, while negative values move it to the left. + * @param y The vertical velocity of the body. Positive values move the body down, while negative values move it up. Default x. + */ + setVelocity(x: number, y?: number): this; + + /** + * Sets the horizontal component of the body's velocity. + * + * Positive values move the body to the right, while negative values move it to the left. + * @param x The new horizontal velocity. + */ + setVelocityX(x: number): this; + + /** + * Sets the vertical component of the body's velocity. + * + * Positive values move the body down, while negative values move it up. + * @param y The new vertical velocity of the body. + */ + setVelocityY(y: number): this; + + /** + * Sets the maximum velocity of the body. + * @param x The new maximum horizontal velocity. + * @param y The new maximum vertical velocity. Default x. + */ + setMaxVelocity(x: number, y?: number): this; + + } + + /** + * A Dynamic Arcade Body. + * + * Its static counterpart is {@link Phaser.Physics.Arcade.StaticBody}. + */ + class Body implements Phaser.Physics.Arcade.Components.Collision { + /** + * + * @param world The Arcade Physics simulation this Body belongs to. + * @param gameObject The Game Object this Body belongs to. As of Phaser 3.60 this is now optional. + */ + constructor(world: Phaser.Physics.Arcade.World, gameObject?: Phaser.GameObjects.GameObject); + + /** + * The Arcade Physics simulation this Body belongs to. + */ + world: Phaser.Physics.Arcade.World; + + /** + * The Game Object this Body belongs to. + * + * As of Phaser 3.60 this is now optional and can be undefined. + */ + gameObject: Phaser.GameObjects.GameObject; + + /** + * A quick-test flag that signifies this is a Body, used in the World collision handler. + */ + readonly isBody: boolean; + + /** + * Transformations applied to this Body. + */ + transform: object; + + /** + * Whether the Body is drawn to the debug display. + */ + debugShowBody: boolean; + + /** + * Whether the Body's velocity is drawn to the debug display. + */ + debugShowVelocity: boolean; + + /** + * The color of this Body on the debug display. + */ + debugBodyColor: number; + + /** + * Whether this Body is updated by the physics simulation. + */ + enable: boolean; + + /** + * Whether this Body is circular (true) or rectangular (false). + */ + isCircle: boolean; + + /** + * If this Body is circular, this is the unscaled radius of the Body, as set by setCircle(), in source pixels. + * The true radius is equal to `halfWidth`. + */ + radius: number; + + /** + * The offset of this Body's position from its Game Object's position, in source pixels. + */ + offset: Phaser.Math.Vector2; + + /** + * The position of this Body within the simulation. + */ + position: Phaser.Math.Vector2; + + /** + * The position of this Body during the previous step. + */ + prev: Phaser.Math.Vector2; + + /** + * The position of this Body during the previous frame. + */ + prevFrame: Phaser.Math.Vector2; + + /** + * Whether this Body's `rotation` is affected by its angular acceleration and angular velocity. + */ + allowRotation: boolean; + + /** + * This body's rotation, in degrees, based on its angular acceleration and angular velocity. + * The Body's rotation controls the `angle` of its Game Object. + * It doesn't rotate the Body's own geometry, which is always an axis-aligned rectangle or a circle. + */ + rotation: number; + + /** + * The Body rotation, in degrees, during the previous step. + */ + preRotation: number; + + /** + * The width of the Body, in pixels. + * If the Body is circular, this is also the diameter. + * If you wish to change the width use the `Body.setSize` method. + */ + readonly width: number; + + /** + * The height of the Body, in pixels. + * If the Body is circular, this is also the diameter. + * If you wish to change the height use the `Body.setSize` method. + */ + readonly height: number; + + /** + * The unscaled width of the Body, in source pixels, as set by setSize(). + * The default is the width of the Body's Game Object's texture frame. + */ + sourceWidth: number; + + /** + * The unscaled height of the Body, in source pixels, as set by setSize(). + * The default is the height of the Body's Game Object's texture frame. + */ + sourceHeight: number; + + /** + * Half the Body's width, in pixels. + */ + halfWidth: number; + + /** + * Half the Body's height, in pixels. + */ + halfHeight: number; + + /** + * The center of the Body. + * The midpoint of its `position` (top-left corner) and its bottom-right corner. + */ + center: Phaser.Math.Vector2; + + /** + * The Body's velocity, in pixels per second. + */ + velocity: Phaser.Math.Vector2; + + /** + * The Body's change in position (due to velocity) at the last step, in pixels. + * + * The size of this value depends on the simulation's step rate. + */ + readonly newVelocity: Phaser.Math.Vector2; + + /** + * The Body's absolute maximum change in position, in pixels per step. + */ + deltaMax: Phaser.Math.Vector2; + + /** + * The Body's change in velocity, in pixels per second squared. + */ + acceleration: Phaser.Math.Vector2; + + /** + * Whether this Body's velocity is affected by its `drag`. + */ + allowDrag: boolean; + + /** + * When `useDamping` is false (the default), this is absolute loss of velocity due to movement, in pixels per second squared. + * + * When `useDamping` is true, this is a damping multiplier between 0 and 1. + * A value of 0 means the Body stops instantly. + * A value of 0.01 mean the Body keeps 1% of its velocity per second, losing 99%. + * A value of 0.1 means the Body keeps 10% of its velocity per second, losing 90%. + * A value of 1 means the Body loses no velocity. + * You can use very small values (e.g., 0.001) to stop the Body quickly. + * + * The x and y components are applied separately. + * + * Drag is applied only when `acceleration` is zero. + */ + drag: Phaser.Math.Vector2; + + /** + * Whether this Body's position is affected by gravity (local or world). + */ + allowGravity: boolean; + + /** + * Acceleration due to gravity (specific to this Body), in pixels per second squared. + * Total gravity is the sum of this vector and the simulation's `gravity`. + */ + gravity: Phaser.Math.Vector2; + + /** + * Rebound following a collision, relative to 1. + */ + bounce: Phaser.Math.Vector2; + + /** + * Rebound following a collision with the world boundary, relative to 1. + * If null, `bounce` is used instead. + */ + worldBounce: Phaser.Math.Vector2 | null; + + /** + * The rectangle used for world boundary collisions. + * + * By default it is set to the world boundary rectangle. Or, if this Body was + * created by a Physics Group, then whatever rectangle that Group defined. + * + * You can also change it by using the `Body.setBoundsRectangle` method. + */ + customBoundsRectangle: Phaser.Geom.Rectangle; + + /** + * Whether the simulation emits a `worldbounds` event when this Body collides with the world boundary + * (and `collideWorldBounds` is also true). + */ + onWorldBounds: boolean; + + /** + * Whether the simulation emits a `collide` event when this Body collides with another. + */ + onCollide: boolean; + + /** + * Whether the simulation emits an `overlap` event when this Body overlaps with another. + */ + onOverlap: boolean; + + /** + * The absolute maximum velocity of this body, in pixels per second. + * The horizontal and vertical components are applied separately. + */ + maxVelocity: Phaser.Math.Vector2; + + /** + * The maximum speed this Body is allowed to reach, in pixels per second. + * + * If not negative it limits the scalar value of speed. + * + * Any negative value means no maximum is being applied (the default). + */ + maxSpeed: number; + + /** + * If this Body is `immovable` and in motion, `friction` is the proportion of this Body's motion received by the riding Body on each axis, relative to 1. + * The horizontal component (x) is applied only when two colliding Bodies are separated vertically. + * The vertical component (y) is applied only when two colliding Bodies are separated horizontally. + * The default value (1, 0) moves the riding Body horizontally in equal proportion to this Body and vertically not at all. + */ + friction: Phaser.Math.Vector2; + + /** + * If this Body is using `drag` for deceleration this property controls how the drag is applied. + * If set to `true` drag will use a damping effect rather than a linear approach. If you are + * creating a game where the Body moves freely at any angle (i.e. like the way the ship moves in + * the game Asteroids) then you will get a far smoother and more visually correct deceleration + * by using damping, avoiding the axis-drift that is prone with linear deceleration. + * + * If you enable this property then you should use far smaller `drag` values than with linear, as + * they are used as a multiplier on the velocity. Values such as 0.05 will give a nice slow + * deceleration. + */ + useDamping: boolean; + + /** + * The rate of change of this Body's `rotation`, in degrees per second. + */ + angularVelocity: number; + + /** + * The Body's angular acceleration (change in angular velocity), in degrees per second squared. + */ + angularAcceleration: number; + + /** + * Loss of angular velocity due to angular movement, in degrees per second. + * + * Angular drag is applied only when angular acceleration is zero. + */ + angularDrag: number; + + /** + * The Body's maximum angular velocity, in degrees per second. + */ + maxAngular: number; + + /** + * The Body's inertia, relative to a default unit (1). + * With `bounce`, this affects the exchange of momentum (velocities) during collisions. + */ + mass: number; + + /** + * The calculated angle of this Body's velocity vector, in radians, during the last step. + */ + angle: number; + + /** + * The calculated magnitude of the Body's velocity, in pixels per second, during the last step. + */ + speed: number; + + /** + * The direction of the Body's velocity, as calculated during the last step. + * This is a numeric constant value (FACING_UP, FACING_DOWN, FACING_LEFT, FACING_RIGHT). + * If the Body is moving on both axes, this describes motion on the vertical axis only. + */ + facing: number; + + /** + * Whether this Body can be moved by collisions with another Body. + */ + immovable: boolean; + + /** + * Sets if this Body can be pushed by another Body. + * + * A body that cannot be pushed will reflect back all of the velocity it is given to the + * colliding body. If that body is also not pushable, then the separation will be split + * between them evenly. + * + * If you want your body to never move or seperate at all, see the `setImmovable` method. + * + * By default, Dynamic Bodies are always pushable. + */ + pushable: boolean; + + /** + * The Slide Factor of this Body. + * + * The Slide Factor controls how much velocity is preserved when + * this Body is pushed by another Body. + * + * The default value is 1, which means that it will take on all + * velocity given in the push. You can adjust this value to control + * how much velocity is retained by this Body when the push ends. + * + * A value of 0, for example, will allow this Body to be pushed + * but then remain completely still after the push ends, such as + * you see in a game like Sokoban. + * + * Or you can set a mid-point, such as 0.25 which will allow it + * to keep 25% of the original velocity when the push ends. You + * can combine this with the `setDrag()` method to create deceleration. + */ + slideFactor: Phaser.Math.Vector2; + + /** + * Whether the Body's position and rotation are affected by its velocity, acceleration, drag, and gravity. + */ + moves: boolean; + + /** + * A flag disabling the default horizontal separation of colliding bodies. + * Pass your own `collideCallback` to the collider. + */ + customSeparateX: boolean; + + /** + * A flag disabling the default vertical separation of colliding bodies. + * Pass your own `collideCallback` to the collider. + */ + customSeparateY: boolean; + + /** + * The amount of horizontal overlap (before separation), if this Body is colliding with another. + */ + overlapX: number; + + /** + * The amount of vertical overlap (before separation), if this Body is colliding with another. + */ + overlapY: number; + + /** + * The amount of overlap (before separation), if this Body is circular and colliding with another circular body. + */ + overlapR: number; + + /** + * Whether this Body is overlapped with another and both are not moving, on at least one axis. + */ + embedded: boolean; + + /** + * Whether this Body interacts with the world boundary. + */ + collideWorldBounds: boolean; + + /** + * Whether this Body is checked for collisions and for which directions. + * You can set `checkCollision.none = true` to disable collision checks. + */ + checkCollision: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * Whether this Body is colliding with a Body or Static Body and in which direction. + * In a collision where both bodies have zero velocity, `embedded` will be set instead. + */ + touching: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * This Body's `touching` value during the previous step. + */ + wasTouching: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * Whether this Body is colliding with a Static Body, a tile, or the world boundary. + * In a collision with a Static Body, if this Body has zero velocity then `embedded` will be set instead. + */ + blocked: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * Whether to automatically synchronize this Body's dimensions to the dimensions of its Game Object's visual bounds. + */ + syncBounds: boolean; + + /** + * The Body's physics type (dynamic or static). + */ + readonly physicsType: number; + + /** + * The Arcade Physics Body Collision Category. + * + * This can be set to any valid collision bitfield value. + * + * See the `setCollisionCategory` method for more details. + */ + collisionCategory: number; + + /** + * The Arcade Physics Body Collision Mask. + * + * See the `setCollidesWith` method for more details. + */ + collisionMask: number; + + /** + * Is this Body under direct control, outside of the physics engine? For example, + * are you trying to move it via a Tween? Or have it follow a path? If so then + * you can enable this boolean so that the Body will calculate its velocity based + * purely on its change in position each frame. This allows you to then tween + * the position and still have it collide with other objects. However, setting + * the velocity will have no impact on this Body while this is set. + */ + directControl: boolean; + + /** + * Updates the Body's `transform`, `width`, `height`, and `center` from its Game Object. + * The Body's `position` isn't changed. + */ + updateBounds(): void; + + /** + * Updates the Body's `center` from its `position`, `width`, and `height`. + */ + updateCenter(): void; + + /** + * Updates the Body's `position`, `width`, `height`, and `center` from its Game Object and `offset`. + * + * You don't need to call this for Dynamic Bodies, as it happens automatically during the physics step. + * But you could use it if you have modified the Body offset or Game Object transform and need to immediately + * read the Body's new `position` or `center`. + * + * To resynchronize the Body with its Game Object, use `reset()` instead. + */ + updateFromGameObject(): void; + + /** + * Prepares the Body for a physics step by resetting the `wasTouching`, `touching` and `blocked` states. + * + * This method is only called if the physics world is going to run a step this frame. + * @param clear Set the `wasTouching` values to their defaults. Default false. + */ + resetFlags(clear?: boolean): void; + + /** + * Syncs the position body position with the parent Game Object. + * + * This method is called every game frame, regardless if the world steps or not. + * @param willStep Will this Body run an update as well? + * @param delta The delta time, in seconds, elapsed since the last frame. + */ + preUpdate(willStep: boolean, delta: number): void; + + /** + * Performs a single physics step and updates the body velocity, angle, speed and other properties. + * + * This method can be called multiple times per game frame, depending on the physics step rate. + * + * The results are synced back to the Game Object in `postUpdate`. + * @param delta The delta time, in seconds, elapsed since the last frame. + */ + update(delta: number): void; + + /** + * Feeds the Body results back into the parent Game Object. + * + * This method is called every game frame, regardless if the world steps or not. + */ + postUpdate(): void; + + /** + * Sets a custom collision boundary rectangle. Use if you want to have a custom + * boundary instead of the world boundaries. + * @param bounds The new boundary rectangle. Pass `null` to use the World bounds. + */ + setBoundsRectangle(bounds?: Phaser.Geom.Rectangle | undefined): this; + + /** + * Checks for collisions between this Body and the world boundary and separates them. + */ + checkWorldBounds(): boolean; + + /** + * Sets the offset of the Body's position from its Game Object's position. + * The Body's `position` isn't changed until the next `preUpdate`. + * @param x The horizontal offset, in source pixels. + * @param y The vertical offset, in source pixels. Default x. + */ + setOffset(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Assign this Body to a new Game Object. + * + * Removes this body from the Physics World, assigns to the new Game Object, calls `setSize` and then + * adds this body back into the World again, setting it enabled, unless the `enable` argument is set to `false`. + * + * If this body already has a Game Object, then it will remove itself from that Game Object first. + * + * Only if the given `gameObject` has a `body` property will this Body be assigned to it. + * @param gameObject The Game Object this Body belongs to. + * @param enable Automatically enable this Body for physics. Default true. + */ + setGameObject(gameObject: Phaser.GameObjects.GameObject, enable?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sizes and positions this Body, as a rectangle. + * Modifies the Body `offset` if `center` is true (the default). + * Resets the width and height to match current frame, if no width and height provided and a frame is found. + * @param width The width of the Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame width. + * @param height The height of the Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame height. + * @param center Modify the Body's `offset`, placing the Body's center on its Game Object's center. Only works if the Game Object has the `getCenter` method. Default true. + */ + setSize(width?: number, height?: number, center?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sizes and positions this Body, as a circle. + * @param radius The radius of the Body, in source pixels. + * @param offsetX The horizontal offset of the Body from its Game Object, in source pixels. + * @param offsetY The vertical offset of the Body from its Game Object, in source pixels. + */ + setCircle(radius: number, offsetX?: number, offsetY?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets this Body's parent Game Object to the given coordinates and resets this Body at the new coordinates. + * If the Body had any velocity or acceleration it is lost as a result of calling this. + * @param x The horizontal position to place the Game Object. + * @param y The vertical position to place the Game Object. + */ + reset(x: number, y: number): void; + + /** + * Sets acceleration, velocity, and speed to zero. + */ + stop(): Phaser.Physics.Arcade.Body; + + /** + * Copies the coordinates of this Body's edges into an object. + * @param obj An object to copy the values into. + */ + getBounds(obj: Phaser.Types.Physics.Arcade.ArcadeBodyBounds): Phaser.Types.Physics.Arcade.ArcadeBodyBounds; + + /** + * Tests if the coordinates are within this Body. + * @param x The horizontal coordinate. + * @param y The vertical coordinate. + */ + hitTest(x: number, y: number): boolean; + + /** + * Whether this Body is touching a tile or the world boundary while moving down. + */ + onFloor(): boolean; + + /** + * Whether this Body is touching a tile or the world boundary while moving up. + */ + onCeiling(): boolean; + + /** + * Whether this Body is touching a tile or the world boundary while moving left or right. + */ + onWall(): boolean; + + /** + * The absolute (non-negative) change in this Body's horizontal position from the previous step. + */ + deltaAbsX(): number; + + /** + * The absolute (non-negative) change in this Body's vertical position from the previous step. + */ + deltaAbsY(): number; + + /** + * The change in this Body's horizontal position from the previous step. + * This value is set during the Body's update phase. + * + * As a Body can update multiple times per step this may not hold the final + * delta value for the Body. In this case, please see the `deltaXFinal` method. + */ + deltaX(): number; + + /** + * The change in this Body's vertical position from the previous step. + * This value is set during the Body's update phase. + * + * As a Body can update multiple times per step this may not hold the final + * delta value for the Body. In this case, please see the `deltaYFinal` method. + */ + deltaY(): number; + + /** + * The change in this Body's horizontal position from the previous game update. + * + * This value is set during the `postUpdate` phase and takes into account the + * `deltaMax` and final position of the Body. + * + * Because this value is not calculated until `postUpdate`, you must listen for it + * during a Scene `POST_UPDATE` or `RENDER` event, and not in `update`, as it will + * not be calculated by that point. If you _do_ use these values in `update` they + * will represent the delta from the _previous_ game frame. + */ + deltaXFinal(): number; + + /** + * The change in this Body's vertical position from the previous game update. + * + * This value is set during the `postUpdate` phase and takes into account the + * `deltaMax` and final position of the Body. + * + * Because this value is not calculated until `postUpdate`, you must listen for it + * during a Scene `POST_UPDATE` or `RENDER` event, and not in `update`, as it will + * not be calculated by that point. If you _do_ use these values in `update` they + * will represent the delta from the _previous_ game frame. + */ + deltaYFinal(): number; + + /** + * The change in this Body's rotation from the previous step, in degrees. + */ + deltaZ(): number; + + /** + * Disables this Body and marks it for deletion by the simulation. + */ + destroy(): void; + + /** + * Draws this Body and its velocity, if enabled. + * @param graphic The Graphics object to draw on. + */ + drawDebug(graphic: Phaser.GameObjects.Graphics): void; + + /** + * Whether this Body will be drawn to the debug display. + */ + willDrawDebug(): boolean; + + /** + * Sets whether this Body should calculate its velocity based on its change in + * position every frame. The default, which is to not do this, means that you + * make this Body move by setting the velocity directly. However, if you are + * trying to move this Body via a Tween, or have it follow a Path, then you + * should enable this instead. This will allow it to still collide with other + * bodies, something that isn't possible if you're just changing its position directly. + * @param value `true` if the Body calculate velocity based on changes in position, otherwise `false`. Default true. + */ + setDirectControl(value?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sets whether this Body collides with the world boundary. + * + * Optionally also sets the World Bounce and `onWorldBounds` values. + * @param value `true` if the Body should collide with the world bounds, otherwise `false`. Default true. + * @param bounceX If given this replaces the Body's `worldBounce.x` value. + * @param bounceY If given this replaces the Body's `worldBounce.y` value. + * @param onWorldBounds If given this replaces the Body's `onWorldBounds` value. + */ + setCollideWorldBounds(value?: boolean, bounceX?: number, bounceY?: number, onWorldBounds?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's velocity. + * @param x The horizontal velocity, in pixels per second. + * @param y The vertical velocity, in pixels per second. Default x. + */ + setVelocity(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's horizontal velocity. + * @param value The velocity, in pixels per second. + */ + setVelocityX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's vertical velocity. + * @param value The velocity, in pixels per second. + */ + setVelocityY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's maximum velocity. + * @param x The horizontal velocity, in pixels per second. + * @param y The vertical velocity, in pixels per second. Default x. + */ + setMaxVelocity(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's maximum horizontal velocity. + * @param value The maximum horizontal velocity, in pixels per second. + */ + setMaxVelocityX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's maximum vertical velocity. + * @param value The maximum vertical velocity, in pixels per second. + */ + setMaxVelocityY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the maximum speed the Body can move. + * @param value The maximum speed value, in pixels per second. Set to a negative value to disable. + */ + setMaxSpeed(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Slide Factor of this Body. + * + * The Slide Factor controls how much velocity is preserved when + * this Body is pushed by another Body. + * + * The default value is 1, which means that it will take on all + * velocity given in the push. You can adjust this value to control + * how much velocity is retained by this Body when the push ends. + * + * A value of 0, for example, will allow this Body to be pushed + * but then remain completely still after the push ends, such as + * you see in a game like Sokoban. + * + * Or you can set a mid-point, such as 0.25 which will allow it + * to keep 25% of the original velocity when the push ends. You + * can combine this with the `setDrag()` method to create deceleration. + * @param x The horizontal slide factor. A value between 0 and 1. + * @param y The vertical slide factor. A value between 0 and 1. Default x. + */ + setSlideFactor(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's bounce. + * @param x The horizontal bounce, relative to 1. + * @param y The vertical bounce, relative to 1. Default x. + */ + setBounce(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's horizontal bounce. + * @param value The bounce, relative to 1. + */ + setBounceX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's vertical bounce. + * @param value The bounce, relative to 1. + */ + setBounceY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's acceleration. + * @param x The horizontal component, in pixels per second squared. + * @param y The vertical component, in pixels per second squared. Default x. + */ + setAcceleration(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's horizontal acceleration. + * @param value The acceleration, in pixels per second squared. + */ + setAccelerationX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's vertical acceleration. + * @param value The acceleration, in pixels per second squared. + */ + setAccelerationY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Enables or disables drag. + * @param value `true` to allow drag on this body, or `false` to disable it. Default true. + */ + setAllowDrag(value?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Enables or disables gravity's effect on this Body. + * @param value `true` to allow gravity on this body, or `false` to disable it. Default true. + */ + setAllowGravity(value?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Enables or disables rotation. + * @param value `true` to allow rotation on this body, or `false` to disable it. Default true. + */ + setAllowRotation(value?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's drag. + * @param x The horizontal component, in pixels per second squared. + * @param y The vertical component, in pixels per second squared. Default x. + */ + setDrag(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * If this Body is using `drag` for deceleration this property controls how the drag is applied. + * If set to `true` drag will use a damping effect rather than a linear approach. If you are + * creating a game where the Body moves freely at any angle (i.e. like the way the ship moves in + * the game Asteroids) then you will get a far smoother and more visually correct deceleration + * by using damping, avoiding the axis-drift that is prone with linear deceleration. + * + * If you enable this property then you should use far smaller `drag` values than with linear, as + * they are used as a multiplier on the velocity. Values such as 0.95 will give a nice slow + * deceleration, where-as smaller values, such as 0.5 will stop an object almost immediately. + * @param value `true` to use damping, or `false` to use drag. + */ + setDamping(value: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's horizontal drag. + * @param value The drag, in pixels per second squared. + */ + setDragX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's vertical drag. + * @param value The drag, in pixels per second squared. + */ + setDragY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's gravity. + * @param x The horizontal component, in pixels per second squared. + * @param y The vertical component, in pixels per second squared. Default x. + */ + setGravity(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's horizontal gravity. + * @param value The gravity, in pixels per second squared. + */ + setGravityX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's vertical gravity. + * @param value The gravity, in pixels per second squared. + */ + setGravityY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's friction. + * @param x The horizontal component, relative to 1. + * @param y The vertical component, relative to 1. Default x. + */ + setFriction(x: number, y?: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's horizontal friction. + * @param value The friction value, relative to 1. + */ + setFrictionX(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's vertical friction. + * @param value The friction value, relative to 1. + */ + setFrictionY(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's angular velocity. + * @param value The velocity, in degrees per second. + */ + setAngularVelocity(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's angular acceleration. + * @param value The acceleration, in degrees per second squared. + */ + setAngularAcceleration(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's angular drag. + * @param value The drag, in degrees per second squared. + */ + setAngularDrag(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's mass. + * @param value The mass value, relative to 1. + */ + setMass(value: number): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's `immovable` property. + * @param value The value to assign to `immovable`. Default true. + */ + setImmovable(value?: boolean): Phaser.Physics.Arcade.Body; + + /** + * Sets the Body's `enable` property. + * @param value The value to assign to `enable`. Default true. + */ + setEnable(value?: boolean): Phaser.Physics.Arcade.Body; + + /** + * This is an internal handler, called by the `ProcessX` function as part + * of the collision step. You should almost never call this directly. + * @param x The amount to add to the Body position. + * @param vx The amount to add to the Body velocity. + * @param left Set the blocked.left value? + * @param right Set the blocked.right value? + */ + processX(x: number, vx?: number, left?: boolean, right?: boolean): void; + + /** + * This is an internal handler, called by the `ProcessY` function as part + * of the collision step. You should almost never call this directly. + * @param y The amount to add to the Body position. + * @param vy The amount to add to the Body velocity. + * @param up Set the blocked.up value? + * @param down Set the blocked.down value? + */ + processY(y: number, vy?: number, up?: boolean, down?: boolean): void; + + /** + * The Bodys horizontal position (left edge). + */ + x: number; + + /** + * The Bodys vertical position (top edge). + */ + y: number; + + /** + * The left edge of the Body. Identical to x. + */ + readonly left: number; + + /** + * The right edge of the Body. + */ + readonly right: number; + + /** + * The top edge of the Body. Identical to y. + */ + readonly top: number; + + /** + * The bottom edge of this Body. + */ + readonly bottom: number; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + } + + /** + * An Arcade Physics Collider will automatically check for collision, or overlaps, between two objects + * every step. If a collision, or overlap, occurs it will invoke the given callbacks. + * + * Note, if setting `overlapOnly` to `true`, and one of the objects is a `TilemapLayer`, every tile in the layer, regardless of tile ID, will be checked for collision. + * Even if the layer has had only a subset of tile IDs enabled for collision, all tiles will still be checked for overlap. + */ + class Collider { + /** + * + * @param world The Arcade physics World that will manage the collisions. + * @param overlapOnly Whether to check for collisions or overlaps. + * @param object1 The first object to check for collision. + * @param object2 The second object to check for collision. + * @param collideCallback The callback to invoke when the two objects collide. + * @param processCallback The callback to invoke when the two objects collide. Must return a boolean. + * @param callbackContext The scope in which to call the callbacks. + */ + constructor(world: Phaser.Physics.Arcade.World, overlapOnly: boolean, object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext: any); + + /** + * The world in which the bodies will collide. + */ + world: Phaser.Physics.Arcade.World; + + /** + * The name of the collider (unused by Phaser). + */ + name: string; + + /** + * Whether the collider is active. + */ + active: boolean; + + /** + * Whether to check for collisions or overlaps. + */ + overlapOnly: boolean; + + /** + * The first object to check for collision. + */ + object1: Phaser.Types.Physics.Arcade.ArcadeColliderType; + + /** + * The second object to check for collision. + */ + object2: Phaser.Types.Physics.Arcade.ArcadeColliderType; + + /** + * The callback to invoke when the two objects collide. + */ + collideCallback: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback; + + /** + * If a processCallback exists it must return true or collision checking will be skipped. + */ + processCallback: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback; + + /** + * The context the collideCallback and processCallback will run in. + */ + callbackContext: object; + + /** + * A name for the Collider. + * + * Phaser does not use this value, it's for your own reference. + * @param name The name to assign to the Collider. + */ + setName(name: string): Phaser.Physics.Arcade.Collider; + + /** + * Called by World as part of its step processing, initial operation of collision checking. + */ + update(): void; + + /** + * Removes Collider from World and disposes of its resources. + */ + destroy(): void; + + } + + namespace Components { + /** + * Provides methods used for setting the acceleration properties of an Arcade Physics Body. + */ + interface Acceleration { + /** + * Sets the body's horizontal and vertical acceleration. If the vertical acceleration value is not provided, the vertical acceleration is set to the same value as the horizontal acceleration. + * @param x The horizontal acceleration + * @param y The vertical acceleration Default x. + */ + setAcceleration(x: number, y?: number): this; + /** + * Sets the body's horizontal acceleration. + * @param value The horizontal acceleration + */ + setAccelerationX(value: number): this; + /** + * Sets the body's vertical acceleration. + * @param value The vertical acceleration + */ + setAccelerationY(value: number): this; + } + + /** + * Provides methods used for setting the angular acceleration properties of an Arcade Physics Body. + */ + interface Angular { + /** + * Sets the angular velocity of the body. + * + * In Arcade Physics, bodies cannot rotate. They are always axis-aligned. + * However, they can have angular motion, which is passed on to the Game Object bound to the body, + * causing them to visually rotate, even though the body remains axis-aligned. + * @param value The amount of angular velocity. + */ + setAngularVelocity(value: number): this; + /** + * Sets the angular acceleration of the body. + * + * In Arcade Physics, bodies cannot rotate. They are always axis-aligned. + * However, they can have angular motion, which is passed on to the Game Object bound to the body, + * causing them to visually rotate, even though the body remains axis-aligned. + * @param value The amount of angular acceleration. + */ + setAngularAcceleration(value: number): this; + /** + * Sets the angular drag of the body. Drag is applied to the current velocity, providing a form of deceleration. + * @param value The amount of drag. + */ + setAngularDrag(value: number): this; + } + + /** + * Provides methods used for setting the bounce properties of an Arcade Physics Body. + */ + interface Bounce { + /** + * Sets the bounce values of this body. + * + * Bounce is the amount of restitution, or elasticity, the body has when it collides with another object. + * A value of 1 means that it will retain its full velocity after the rebound. A value of 0 means it will not rebound at all. + * @param x The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1. + * @param y The amount of vertical bounce to apply on collision. A float, typically between 0 and 1. Default x. + */ + setBounce(x: number, y?: number): this; + /** + * Sets the horizontal bounce value for this body. + * @param value The amount of horizontal bounce to apply on collision. A float, typically between 0 and 1. + */ + setBounceX(value: number): this; + /** + * Sets the vertical bounce value for this body. + * @param value The amount of vertical bounce to apply on collision. A float, typically between 0 and 1. + */ + setBounceY(value: number): this; + /** + * Sets whether this Body collides with the world boundary. + * + * Optionally also sets the World Bounce values. If the `Body.worldBounce` is null, it's set to a new Phaser.Math.Vector2 first. + * @param value `true` if this body should collide with the world bounds, otherwise `false`. Default true. + * @param bounceX If given this will be replace the `worldBounce.x` value. + * @param bounceY If given this will be replace the `worldBounce.y` value. + * @param onWorldBounds If given this replaces the Body's `onWorldBounds` value. + */ + setCollideWorldBounds(value?: boolean, bounceX?: number, bounceY?: number, onWorldBounds?: boolean): this; + } + + /** + * Provides methods used for setting the collision category and mask of an Arcade Physics Body. + */ + interface Collision { + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + } + + /** + * Provides methods used for setting the debug properties of an Arcade Physics Body. + */ + interface Debug { + /** + * Sets the debug values of this body. + * + * Bodies will only draw their debug if debug has been enabled for Arcade Physics as a whole. + * Note that there is a performance cost in drawing debug displays. It should never be used in production. + * @param showBody Set to `true` to have this body render its outline to the debug display. + * @param showVelocity Set to `true` to have this body render a velocity marker to the debug display. + * @param bodyColor The color of the body outline when rendered to the debug display. + */ + setDebug(showBody: boolean, showVelocity: boolean, bodyColor: number): this; + /** + * Sets the color of the body outline when it renders to the debug display. + * @param value The color of the body outline when rendered to the debug display. + */ + setDebugBodyColor(value: number): this; + /** + * Set to `true` to have this body render its outline to the debug display. + */ + debugShowBody: boolean; + /** + * Set to `true` to have this body render a velocity marker to the debug display. + */ + debugShowVelocity: boolean; + /** + * The color of the body outline when it renders to the debug display. + */ + debugBodyColor: number; + } + + /** + * Provides methods used for setting the drag properties of an Arcade Physics Body. + */ + interface Drag { + /** + * Sets the body's horizontal and vertical drag. If the vertical drag value is not provided, the vertical drag is set to the same value as the horizontal drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param x The amount of horizontal drag to apply. + * @param y The amount of vertical drag to apply. Default x. + */ + setDrag(x: number, y?: number): this; + /** + * Sets the body's horizontal drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param value The amount of horizontal drag to apply. + */ + setDragX(value: number): this; + /** + * Sets the body's vertical drag. + * + * Drag can be considered as a form of deceleration that will return the velocity of a body back to zero over time. + * It is the absolute loss of velocity due to movement, in pixels per second squared. + * The x and y components are applied separately. + * + * When `useDamping` is true, this is 1 minus the damping factor. + * A value of 1 means the Body loses no velocity. + * A value of 0.95 means the Body loses 5% of its velocity per step. + * A value of 0.5 means the Body loses 50% of its velocity per step. + * + * Drag is applied only when `acceleration` is zero. + * @param value The amount of vertical drag to apply. + */ + setDragY(value: number): this; + /** + * If this Body is using `drag` for deceleration this function controls how the drag is applied. + * If set to `true` drag will use a damping effect rather than a linear approach. If you are + * creating a game where the Body moves freely at any angle (i.e. like the way the ship moves in + * the game Asteroids) then you will get a far smoother and more visually correct deceleration + * by using damping, avoiding the axis-drift that is prone with linear deceleration. + * + * If you enable this property then you should use far smaller `drag` values than with linear, as + * they are used as a multiplier on the velocity. Values such as 0.95 will give a nice slow + * deceleration, where-as smaller values, such as 0.5 will stop an object almost immediately. + * @param value `true` to use damping for deceleration, or `false` to use linear deceleration. + */ + setDamping(value: boolean): this; + } + + /** + * Provides methods used for setting the enable properties of an Arcade Physics Body. + */ + interface Enable { + /** + * Sets whether this Body should calculate its velocity based on its change in + * position every frame. The default, which is to not do this, means that you + * make this Body move by setting the velocity directly. However, if you are + * trying to move this Body via a Tween, or have it follow a Path, then you + * should enable this instead. This will allow it to still collide with other + * bodies, something that isn't possible if you're just changing its position directly. + * @param value `true` if the Body calculate velocity based on changes in position, otherwise `false`. Default true. + */ + setDirectControl(value?: boolean): this; + /** + * Enables this Game Object's Body. + * If you reset the Body you must also pass `x` and `y`. + * @param reset Also reset the Body and place the Game Object at (x, y). + * @param x The horizontal position to place the Game Object, if `reset` is true. + * @param y The horizontal position to place the Game Object, if `reset` is true. + * @param enableGameObject Also set this Game Object's `active` to true. + * @param showGameObject Also set this Game Object's `visible` to true. + */ + enableBody(reset?: boolean, x?: number, y?: number, enableGameObject?: boolean, showGameObject?: boolean): this; + /** + * Stops and disables this Game Object's Body. + * @param disableGameObject Also set this Game Object's `active` to false. Default false. + * @param hideGameObject Also set this Game Object's `visible` to false. Default false. + */ + disableBody(disableGameObject?: boolean, hideGameObject?: boolean): this; + /** + * Syncs the Body's position and size with its parent Game Object. + * You don't need to call this for Dynamic Bodies, as it happens automatically. + * But for Static bodies it's a useful way of modifying the position of a Static Body + * in the Physics World, based on its Game Object. + */ + refreshBody(): this; + } + + /** + * Methods for setting the friction of an Arcade Physics Body. + * + * In Arcade Physics, friction is a special case of motion transfer from an "immovable" body to a riding body. + */ + interface Friction { + /** + * Sets the friction of this game object's physics body. + * In Arcade Physics, friction is a special case of motion transfer from an "immovable" body to a riding body. + * @param x The amount of horizontal friction to apply, [0, 1]. + * @param y The amount of vertical friction to apply, [0, 1]. Default x. + */ + setFriction(x: number, y?: number): this; + /** + * Sets the horizontal friction of this game object's physics body. + * This can move a riding body horizontally when it collides with this one on the vertical axis. + * @param x The amount of friction to apply, [0, 1]. + */ + setFrictionX(x: number): this; + /** + * Sets the vertical friction of this game object's physics body. + * This can move a riding body vertically when it collides with this one on the horizontal axis. + * @param y The amount of friction to apply, [0, 1]. + */ + setFrictionY(y: number): this; + } + + /** + * Provides methods for setting the gravity properties of an Arcade Physics Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Gravity { + /** + * Set the X and Y values of the gravitational pull to act upon this Arcade Physics Game Object. Values can be positive or negative. Larger values result in a stronger effect. + * + * If only one value is provided, this value will be used for both the X and Y axis. + * @param x The gravitational force to be applied to the X-axis. + * @param y The gravitational force to be applied to the Y-axis. If this is not specified, the X value will be used. Default x. + */ + setGravity(x: number, y?: number): this; + /** + * Set the gravitational force to be applied to the X axis. Value can be positive or negative. Larger values result in a stronger effect. + * @param x The gravitational force to be applied to the X-axis. + */ + setGravityX(x: number): this; + /** + * Set the gravitational force to be applied to the Y axis. Value can be positive or negative. Larger values result in a stronger effect. + * @param y The gravitational force to be applied to the Y-axis. + */ + setGravityY(y: number): this; + } + + /** + * Provides methods used for setting the immovable properties of an Arcade Physics Body. + */ + interface Immovable { + /** + * Sets if this Body can be separated during collisions with other bodies. + * + * When a body is immovable it means it won't move at all, not even to separate it from collision + * overlap. If you just wish to prevent a body from being knocked around by other bodies, see + * the `setPushable` method instead. + * @param value Sets if this body will be separated during collisions with other bodies. Default true. + */ + setImmovable(value?: boolean): this; + } + + /** + * Provides methods used for setting the mass properties of an Arcade Physics Body. + */ + interface Mass { + /** + * Sets the mass of the physics body + * @param value New value for the mass of the body. + */ + setMass(value: number): this; + } + + /** + * This method will search the given circular area and return an array of all physics bodies that + * overlap with it. It can return either Dynamic, Static bodies or a mixture of both. + * + * A body only has to intersect with the search area to be considered, it doesn't have to be fully + * contained within it. + * + * If Arcade Physics is set to use the RTree (which it is by default) then the search is rather fast, + * otherwise the search is O(N) for Dynamic Bodies. + */ + interface OverlapCirc { + } + + /** + * This method will search the given rectangular area and return an array of all physics bodies that + * overlap with it. It can return either Dynamic, Static bodies or a mixture of both. + * + * A body only has to intersect with the search area to be considered, it doesn't have to be fully + * contained within it. + * + * If Arcade Physics is set to use the RTree (which it is by default) then the search for is extremely fast, + * otherwise the search is O(N) for Dynamic Bodies. + */ + interface OverlapRect { + } + + /** + * Provides methods used for setting the pushable property of an Arcade Physics Body. + */ + interface Pushable { + /** + * Sets if this Body can be pushed by another Body. + * + * A body that cannot be pushed will reflect back all of the velocity it is given to the + * colliding body. If that body is also not pushable, then the separation will be split + * between them evenly. + * + * If you want your body to never move or seperate at all, see the `setImmovable` method. + * @param value Sets if this body can be pushed by collisions with another Body. Default true. + */ + setPushable(value?: boolean): this; + } + + /** + * Provides methods for setting the size of an Arcade Physics Game Object. + * Should be applied as a mixin and not used directly. + */ + interface Size { + /** + * Sets the body offset. This allows you to adjust the difference between the center of the body + * and the x and y coordinates of the parent Game Object. + * @param x The amount to offset the body from the parent Game Object along the x-axis. + * @param y The amount to offset the body from the parent Game Object along the y-axis. Defaults to the value given for the x-axis. Default x. + */ + setOffset(x: number, y?: number): this; + /** + * **DEPRECATED**: Please use `setBodySize` instead. + * + * Sets the size of this physics body. Setting the size does not adjust the dimensions of the parent Game Object. + * @param width The new width of the physics body, in pixels. + * @param height The new height of the physics body, in pixels. + * @param center Should the body be re-positioned so its center aligns with the parent Game Object? Default true. + */ + setSize(width: number, height: number, center?: boolean): this; + /** + * Sets the size of this physics body. Setting the size does not adjust the dimensions of the parent Game Object. + * @param width The new width of the physics body, in pixels. + * @param height The new height of the physics body, in pixels. + * @param center Should the body be re-positioned so its center aligns with the parent Game Object? Default true. + */ + setBodySize(width: number, height: number, center?: boolean): this; + /** + * Sets this physics body to use a circle for collision instead of a rectangle. + * @param radius The radius of the physics body, in pixels. + * @param offsetX The amount to offset the body from the parent Game Object along the x-axis. + * @param offsetY The amount to offset the body from the parent Game Object along the y-axis. + */ + setCircle(radius: number, offsetX?: number, offsetY?: number): this; + } + + /** + * Provides methods for modifying the velocity of an Arcade Physics body. + * + * Should be applied as a mixin and not used directly. + */ + interface Velocity { + /** + * Sets the velocity of the Body. + * @param x The horizontal velocity of the body. Positive values move the body to the right, while negative values move it to the left. + * @param y The vertical velocity of the body. Positive values move the body down, while negative values move it up. Default x. + */ + setVelocity(x: number, y?: number): this; + /** + * Sets the horizontal component of the body's velocity. + * + * Positive values move the body to the right, while negative values move it to the left. + * @param x The new horizontal velocity. + */ + setVelocityX(x: number): this; + /** + * Sets the vertical component of the body's velocity. + * + * Positive values move the body down, while negative values move it up. + * @param y The new vertical velocity of the body. + */ + setVelocityY(y: number): this; + /** + * Sets the maximum velocity of the body. + * @param x The new maximum horizontal velocity. + * @param y The new maximum vertical velocity. Default x. + */ + setMaxVelocity(x: number, y?: number): this; + } + + } + + /** + * Dynamic Body. + */ + var DYNAMIC_BODY: number; + + /** + * Static Body. + */ + var STATIC_BODY: number; + + /** + * Arcade Physics Group containing Dynamic Bodies. + */ + var GROUP: number; + + /** + * A Tilemap Layer. + */ + var TILEMAPLAYER: number; + + /** + * Facing no direction (initial value). + */ + var FACING_NONE: number; + + /** + * Facing up. + */ + var FACING_UP: number; + + /** + * Facing down. + */ + var FACING_DOWN: number; + + /** + * Facing left. + */ + var FACING_LEFT: number; + + /** + * Facing right. + */ + var FACING_RIGHT: number; + + namespace Events { + /** + * The Arcade Physics World Collide Event. + * + * This event is dispatched by an Arcade Physics World instance if two bodies collide _and_ at least + * one of them has their [onCollide]{@link Phaser.Physics.Arcade.Body#onCollide} property set to `true`. + * + * It provides an alternative means to handling collide events rather than using the callback approach. + * + * Listen to it from a Scene using: `this.physics.world.on('collide', listener)`. + * + * Please note that 'collide' and 'overlap' are two different things in Arcade Physics. + */ + const COLLIDE: string; + + /** + * The Arcade Physics World Overlap Event. + * + * This event is dispatched by an Arcade Physics World instance if two bodies overlap _and_ at least + * one of them has their [onOverlap]{@link Phaser.Physics.Arcade.Body#onOverlap} property set to `true`. + * + * It provides an alternative means to handling overlap events rather than using the callback approach. + * + * Listen to it from a Scene using: `this.physics.world.on('overlap', listener)`. + * + * Please note that 'collide' and 'overlap' are two different things in Arcade Physics. + */ + const OVERLAP: string; + + /** + * The Arcade Physics World Pause Event. + * + * This event is dispatched by an Arcade Physics World instance when it is paused. + * + * Listen to it from a Scene using: `this.physics.world.on('pause', listener)`. + */ + const PAUSE: string; + + /** + * The Arcade Physics World Resume Event. + * + * This event is dispatched by an Arcade Physics World instance when it resumes from a paused state. + * + * Listen to it from a Scene using: `this.physics.world.on('resume', listener)`. + */ + const RESUME: string; + + /** + * The Arcade Physics Tile Collide Event. + * + * This event is dispatched by an Arcade Physics World instance if a body collides with a Tile _and_ + * has its [onCollide]{@link Phaser.Physics.Arcade.Body#onCollide} property set to `true`. + * + * It provides an alternative means to handling collide events rather than using the callback approach. + * + * Listen to it from a Scene using: `this.physics.world.on('tilecollide', listener)`. + * + * Please note that 'collide' and 'overlap' are two different things in Arcade Physics. + */ + const TILE_COLLIDE: string; + + /** + * The Arcade Physics Tile Overlap Event. + * + * This event is dispatched by an Arcade Physics World instance if a body overlaps with a Tile _and_ + * has its [onOverlap]{@link Phaser.Physics.Arcade.Body#onOverlap} property set to `true`. + * + * It provides an alternative means to handling overlap events rather than using the callback approach. + * + * Listen to it from a Scene using: `this.physics.world.on('tileoverlap', listener)`. + * + * Please note that 'collide' and 'overlap' are two different things in Arcade Physics. + */ + const TILE_OVERLAP: string; + + /** + * The Arcade Physics World Bounds Event. + * + * This event is dispatched by an Arcade Physics World instance if a body makes contact with the world bounds _and_ + * it has its [onWorldBounds]{@link Phaser.Physics.Arcade.Body#onWorldBounds} property set to `true`. + * + * It provides an alternative means to handling collide events rather than using the callback approach. + * + * Listen to it from a Scene using: `this.physics.world.on('worldbounds', listener)`. + */ + const WORLD_BOUNDS: string; + + /** + * The Arcade Physics World Step Event. + * + * This event is dispatched by an Arcade Physics World instance whenever a physics step is run. + * It is emitted _after_ the bodies and colliders have been updated. + * + * In high framerate settings this can be multiple times per game frame. + * + * Listen to it from a Scene using: `this.physics.world.on('worldstep', listener)`. + */ + const WORLD_STEP: string; + + } + + /** + * The Arcade Physics Factory allows you to easily create Arcade Physics enabled Game Objects. + * Objects that are created by this Factory are automatically added to the physics world. + */ + class Factory { + /** + * + * @param world The Arcade Physics World instance. + */ + constructor(world: Phaser.Physics.Arcade.World); + + /** + * A reference to the Arcade Physics World. + */ + world: Phaser.Physics.Arcade.World; + + /** + * A reference to the Scene this Arcade Physics instance belongs to. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene.Systems this Arcade Physics instance belongs to. + */ + sys: Phaser.Scenes.Systems; + + /** + * Creates a new Arcade Physics Collider object. + * @param object1 The first object to check for collision. + * @param object2 The second object to check for collision. + * @param collideCallback The callback to invoke when the two objects collide. + * @param processCallback The callback to invoke when the two objects collide. Must return a boolean. + * @param callbackContext The scope in which to call the callbacks. + */ + collider(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): Phaser.Physics.Arcade.Collider; + + /** + * Creates a new Arcade Physics Collider Overlap object. + * @param object1 The first object to check for overlap. + * @param object2 The second object to check for overlap. + * @param collideCallback The callback to invoke when the two objects collide. + * @param processCallback The callback to invoke when the two objects collide. Must return a boolean. + * @param callbackContext The scope in which to call the callbacks. + */ + overlap(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): Phaser.Physics.Arcade.Collider; + + /** + * Adds an Arcade Physics Body to the given Game Object. + * @param gameObject A Game Object. + * @param isStatic Create a Static body (true) or Dynamic body (false). Default false. + */ + existing(gameObject: G, isStatic?: boolean): G; + + /** + * Creates a new Arcade Image object with a Static body. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + staticImage(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.Types.Physics.Arcade.ImageWithStaticBody; + + /** + * Creates a new Arcade Image object with a Dynamic body. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + image(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.Types.Physics.Arcade.ImageWithDynamicBody; + + /** + * Creates a new Arcade Sprite object with a Static body. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + staticSprite(x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number): Phaser.Types.Physics.Arcade.SpriteWithStaticBody; + + /** + * Creates a new Arcade Sprite object with a Dynamic body. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param key The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + */ + sprite(x: number, y: number, key: string, frame?: string | number): Phaser.Types.Physics.Arcade.SpriteWithDynamicBody; + + /** + * Creates a Static Physics Group object. + * All Game Objects created by this Group will automatically be static Arcade Physics objects. + * @param children Game Objects to add to this group; or the `config` argument. + * @param config Settings for this group. + */ + staticGroup(children?: Phaser.GameObjects.GameObject[] | Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig, config?: Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig): Phaser.Physics.Arcade.StaticGroup; + + /** + * Creates a Physics Group object. + * All Game Objects created by this Group will automatically be dynamic Arcade Physics objects. + * @param children Game Objects to add to this group; or the `config` argument. + * @param config Settings for this group. + */ + group(children?: Phaser.GameObjects.GameObject[] | Phaser.Types.Physics.Arcade.PhysicsGroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig, config?: Phaser.Types.Physics.Arcade.PhysicsGroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig): Phaser.Physics.Arcade.Group; + + /** + * Creates a new physics Body with the given position and size. + * + * This Body is not associated with any Game Object, but still exists within the world + * and can be tested for collision, have velocity, etc. + * @param x The horizontal position of this Body in the physics world. + * @param y The vertical position of this Body in the physics world. + * @param width The width of the Body in pixels. Cannot be negative or zero. Default 64. + * @param height The height of the Body in pixels. Cannot be negative or zero. Default 64. + */ + body(x: number, y: number, width?: number, height?: number): Phaser.Physics.Arcade.Body; + + /** + * Creates a new static physics Body with the given position and size. + * + * This Body is not associated with any Game Object, but still exists within the world + * and can be tested for collision, etc. + * @param x The horizontal position of this Body in the physics world. + * @param y The vertical position of this Body in the physics world. + * @param width The width of the Body in pixels. Cannot be negative or zero. Default 64. + * @param height The height of the Body in pixels. Cannot be negative or zero. Default 64. + */ + staticBody(x: number, y: number, width?: number, height?: number): Phaser.Physics.Arcade.StaticBody; + + /** + * Destroys this Factory. + */ + destroy(): void; + + } + + /** + * Calculates and returns the bitmask needed to determine if the given + * categories will collide with each other or not. + * @param categories A unique category bitfield, or an array of them. + */ + function GetCollidesWith(categories: number | number[]): number; + + /** + * Calculates and returns the horizontal overlap between two arcade physics bodies and sets their properties + * accordingly, including: `touching.left`, `touching.right`, `touching.none` and `overlapX'. + * @param body1 The first Body to separate. + * @param body2 The second Body to separate. + * @param overlapOnly Is this an overlap only check, or part of separation? + * @param bias A value added to the delta values during collision checks. Increase it to prevent sprite tunneling(sprites passing through another instead of colliding). + */ + function GetOverlapX(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body, overlapOnly: boolean, bias: number): number; + + /** + * Calculates and returns the vertical overlap between two arcade physics bodies and sets their properties + * accordingly, including: `touching.up`, `touching.down`, `touching.none` and `overlapY'. + * @param body1 The first Body to separate. + * @param body2 The second Body to separate. + * @param overlapOnly Is this an overlap only check, or part of separation? + * @param bias A value added to the delta values during collision checks. Increase it to prevent sprite tunneling(sprites passing through another instead of colliding). + */ + function GetOverlapY(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body, overlapOnly: boolean, bias: number): number; + + /** + * An Arcade Physics Group object. + * + * The primary use of a Physics Group is a way to collect together physics enable objects + * that share the same intrinsic structure into a single pool. They can they be easily + * compared against other Groups, or Game Objects. + * + * All Game Objects created by, or added to this Group will automatically be given **dynamic** + * Arcade Physics bodies (if they have no body already) and the bodies will receive the + * Groups {@link Phaser.Physics.Arcade.Group#defaults default values}. + * + * You should not pass objects into this Group that should not receive a body. For example, + * do not add basic Geometry or Tilemap Layers into a Group, as they will not behave in the + * way you may expect. Groups should all ideally have objects of the same type in them. + * + * If you wish to create a Group filled with Static Bodies, please see {@link Phaser.Physics.Arcade.StaticGroup}. + */ + class Group extends Phaser.GameObjects.Group implements Phaser.Physics.Arcade.Components.Collision { + /** + * + * @param world The physics simulation. + * @param scene The scene this group belongs to. + * @param children Game Objects to add to this group; or the `config` argument. + * @param config Settings for this group. + */ + constructor(world: Phaser.Physics.Arcade.World, scene: Phaser.Scene, children?: Phaser.GameObjects.GameObject[] | Phaser.Types.Physics.Arcade.PhysicsGroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig, config?: Phaser.Types.Physics.Arcade.PhysicsGroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig); + + /** + * The physics simulation. + */ + world: Phaser.Physics.Arcade.World; + + /** + * The class to create new Group members from. + * + * This should be either `Phaser.Physics.Arcade.Image`, `Phaser.Physics.Arcade.Sprite`, or a class extending one of those. + */ + classType: Function; + + /** + * The physics type of the Group's members. + */ + physicsType: number; + + /** + * The Arcade Physics Group Collision Category. + * + * This can be set to any valid collision bitfield value. + * + * See the `setCollisionCategory` method for more details. + */ + collisionCategory: number; + + /** + * The Arcade Physics Group Collision Mask. + * + * See the `setCollidesWith` method for more details. + */ + collisionMask: number; + + /** + * Default physics properties applied to Game Objects added to the Group or created by the Group. Derived from the `config` argument. + * + * You can remove the default values by setting this property to `{}`. + */ + defaults: Phaser.Types.Physics.Arcade.PhysicsGroupDefaults; + + /** + * A textual representation of this Game Object. + * Used internally by Phaser but is available for your own custom classes to populate. + */ + type: string; + + /** + * Enables a Game Object's Body and assigns `defaults`. Called when a Group member is added or created. + * @param child The Game Object being added. + */ + createCallbackHandler(child: Phaser.GameObjects.GameObject): void; + + /** + * Disables a Game Object's Body. Called when a Group member is removed. + * @param child The Game Object being removed. + */ + removeCallbackHandler(child: Phaser.GameObjects.GameObject): void; + + /** + * Sets the velocity of each Group member. + * @param x The horizontal velocity. + * @param y The vertical velocity. + * @param step The velocity increment. When set, the first member receives velocity (x, y), the second (x + step, y + step), and so on. Default 0. + */ + setVelocity(x: number, y: number, step?: number): Phaser.Physics.Arcade.Group; + + /** + * Sets the horizontal velocity of each Group member. + * @param value The velocity value. + * @param step The velocity increment. When set, the first member receives velocity (x), the second (x + step), and so on. Default 0. + */ + setVelocityX(value: number, step?: number): Phaser.Physics.Arcade.Group; + + /** + * Sets the vertical velocity of each Group member. + * @param value The velocity value. + * @param step The velocity increment. When set, the first member receives velocity (y), the second (y + step), and so on. Default 0. + */ + setVelocityY(value: number, step?: number): Phaser.Physics.Arcade.Group; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + } + + /** + * Separates two overlapping bodies on the X-axis (horizontally). + * + * Separation involves moving two overlapping bodies so they don't overlap anymore and adjusting their velocities based on their mass. This is a core part of collision detection. + * + * The bodies won't be separated if there is no horizontal overlap between them, if they are static, or if either one uses custom logic for its separation. + * @param body1 The first Body to separate. + * @param body2 The second Body to separate. + * @param overlapOnly If `true`, the bodies will only have their overlap data set and no separation will take place. + * @param bias A value to add to the delta value during overlap checking. Used to prevent sprite tunneling. + * @param overlap If given then this value will be used as the overlap and no check will be run. + */ + function SeparateX(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body, overlapOnly: boolean, bias: number, overlap?: number): boolean; + + /** + * Separates two overlapping bodies on the Y-axis (vertically). + * + * Separation involves moving two overlapping bodies so they don't overlap anymore and adjusting their velocities based on their mass. This is a core part of collision detection. + * + * The bodies won't be separated if there is no vertical overlap between them, if they are static, or if either one uses custom logic for its separation. + * @param body1 The first Body to separate. + * @param body2 The second Body to separate. + * @param overlapOnly If `true`, the bodies will only have their overlap data set and no separation will take place. + * @param bias A value to add to the delta value during overlap checking. Used to prevent sprite tunneling. + * @param overlap If given then this value will be used as the overlap and no check will be run. + */ + function SeparateY(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body, overlapOnly: boolean, bias: number, overlap?: number): boolean; + + /** + * Either sets or creates the Arcade Body Collision object. + * + * Mostly only used internally. + * @param noneFlip Is `none` true or false? + * @param data The collision data object to populate, or create if not given. + */ + function SetCollisionObject(noneFlip: boolean, data?: Phaser.Types.Physics.Arcade.ArcadeBodyCollision): Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * A Static Arcade Physics Body. + * + * A Static Body never moves, and isn't automatically synchronized with its parent Game Object. + * That means if you make any change to the parent's origin, position, or scale after creating or adding the body, you'll need to update the Static Body manually. + * + * A Static Body can collide with other Bodies, but is never moved by collisions. + * + * Its dynamic counterpart is {@link Phaser.Physics.Arcade.Body}. + */ + class StaticBody implements Phaser.Physics.Arcade.Components.Collision { + /** + * + * @param world The Arcade Physics simulation this Static Body belongs to. + * @param gameObject The Game Object this Body belongs to. As of Phaser 3.60 this is now optional. + */ + constructor(world: Phaser.Physics.Arcade.World, gameObject?: Phaser.GameObjects.GameObject); + + /** + * The Arcade Physics simulation this Static Body belongs to. + */ + world: Phaser.Physics.Arcade.World; + + /** + * The Game Object this Static Body belongs to. + * + * As of Phaser 3.60 this is now optional and can be undefined. + */ + gameObject: Phaser.GameObjects.GameObject; + + /** + * A quick-test flag that signifies this is a Body, used in the World collision handler. + */ + readonly isBody: boolean; + + /** + * Whether the Static Body's boundary is drawn to the debug display. + */ + debugShowBody: boolean; + + /** + * The color of this Static Body on the debug display. + */ + debugBodyColor: number; + + /** + * Whether this Static Body is updated by the physics simulation. + */ + enable: boolean; + + /** + * Whether this Static Body's boundary is circular (`true`) or rectangular (`false`). + */ + isCircle: boolean; + + /** + * If this Static Body is circular, this is the radius of the boundary, as set by {@link Phaser.Physics.Arcade.StaticBody#setCircle}, in pixels. + * Equal to `halfWidth`. + */ + radius: number; + + /** + * The offset set by {@link Phaser.Physics.Arcade.StaticBody#setCircle} or {@link Phaser.Physics.Arcade.StaticBody#setSize}. + * + * This doesn't affect the Static Body's position, because a Static Body does not follow its Game Object. + */ + readonly offset: Phaser.Math.Vector2; + + /** + * The position of this Static Body within the simulation. + */ + position: Phaser.Math.Vector2; + + /** + * The width of the Static Body's boundary, in pixels. + * If the Static Body is circular, this is also the Static Body's diameter. + */ + width: number; + + /** + * The height of the Static Body's boundary, in pixels. + * If the Static Body is circular, this is also the Static Body's diameter. + */ + height: number; + + /** + * Half the Static Body's width, in pixels. + * If the Static Body is circular, this is also the Static Body's radius. + */ + halfWidth: number; + + /** + * Half the Static Body's height, in pixels. + * If the Static Body is circular, this is also the Static Body's radius. + */ + halfHeight: number; + + /** + * The center of the Static Body's boundary. + * This is the midpoint of its `position` (top-left corner) and its bottom-right corner. + */ + center: Phaser.Math.Vector2; + + /** + * A constant zero velocity used by the Arcade Physics simulation for calculations. + */ + readonly velocity: Phaser.Math.Vector2; + + /** + * A constant `false` value expected by the Arcade Physics simulation. + */ + readonly allowGravity: boolean; + + /** + * Gravitational force applied specifically to this Body. Values are in pixels per second squared. Always zero for a Static Body. + */ + readonly gravity: Phaser.Math.Vector2; + + /** + * Rebound, or restitution, following a collision, relative to 1. Always zero for a Static Body. + */ + readonly bounce: Phaser.Math.Vector2; + + /** + * Whether the simulation emits a `worldbounds` event when this StaticBody collides with the world boundary. + * Always false for a Static Body. (Static Bodies never collide with the world boundary and never trigger a `worldbounds` event.) + */ + readonly onWorldBounds: boolean; + + /** + * Whether the simulation emits a `collide` event when this StaticBody collides with another. + */ + onCollide: boolean; + + /** + * Whether the simulation emits an `overlap` event when this StaticBody overlaps with another. + */ + onOverlap: boolean; + + /** + * The StaticBody's inertia, relative to a default unit (1). With `bounce`, this affects the exchange of momentum (velocities) during collisions. + */ + mass: number; + + /** + * Whether this object can be moved by collisions with another body. + */ + immovable: boolean; + + /** + * Sets if this Body can be pushed by another Body. + * + * A body that cannot be pushed will reflect back all of the velocity it is given to the + * colliding body. If that body is also not pushable, then the separation will be split + * between them evenly. + * + * If you want your body to never move or seperate at all, see the `setImmovable` method. + * + * By default, Static Bodies are not pushable. + */ + pushable: boolean; + + /** + * A flag disabling the default horizontal separation of colliding bodies. Pass your own `collideHandler` to the collider. + */ + customSeparateX: boolean; + + /** + * A flag disabling the default vertical separation of colliding bodies. Pass your own `collideHandler` to the collider. + */ + customSeparateY: boolean; + + /** + * The amount of horizontal overlap (before separation), if this Body is colliding with another. + */ + overlapX: number; + + /** + * The amount of vertical overlap (before separation), if this Body is colliding with another. + */ + overlapY: number; + + /** + * The amount of overlap (before separation), if this StaticBody is circular and colliding with another circular body. + */ + overlapR: number; + + /** + * Whether this StaticBody has ever overlapped with another while both were not moving. + */ + embedded: boolean; + + /** + * Whether this StaticBody interacts with the world boundary. + * Always false for a Static Body. (Static Bodies never collide with the world boundary.) + */ + readonly collideWorldBounds: boolean; + + /** + * Whether this StaticBody is checked for collisions and for which directions. You can set `checkCollision.none = false` to disable collision checks. + */ + checkCollision: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * This property is kept for compatibility with Dynamic Bodies. + * Avoid using it. + */ + touching: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * This property is kept for compatibility with Dynamic Bodies. + * Avoid using it. + * The values are always false for a Static Body. + */ + wasTouching: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * This property is kept for compatibility with Dynamic Bodies. + * Avoid using it. + */ + blocked: Phaser.Types.Physics.Arcade.ArcadeBodyCollision; + + /** + * The StaticBody's physics type (static by default). + */ + physicsType: number; + + /** + * The Arcade Physics Body Collision Category. + * + * This can be set to any valid collision bitfield value. + * + * See the `setCollisionCategory` method for more details. + */ + collisionCategory: number; + + /** + * The Arcade Physics Body Collision Mask. + * + * See the `setCollidesWith` method for more details. + */ + collisionMask: number; + + /** + * Changes the Game Object this Body is bound to. + * First it removes its reference from the old Game Object, then sets the new one. + * You can optionally update the position and dimensions of this Body to reflect that of the new Game Object. + * @param gameObject The new Game Object that will own this Body. + * @param update Reposition and resize this Body to match the new Game Object? Default true. + */ + setGameObject(gameObject: Phaser.GameObjects.GameObject, update?: boolean): Phaser.Physics.Arcade.StaticBody; + + /** + * Syncs the Static Body's position and size with its parent Game Object. + */ + updateFromGameObject(): Phaser.Physics.Arcade.StaticBody; + + /** + * Positions the Static Body at an offset from its Game Object. + * @param x The horizontal offset of the Static Body from the Game Object's `x`. + * @param y The vertical offset of the Static Body from the Game Object's `y`. + */ + setOffset(x: number, y: number): Phaser.Physics.Arcade.StaticBody; + + /** + * Sets the size of the Static Body. + * When `center` is true, also repositions it. + * Resets the width and height to match current frame, if no width and height provided and a frame is found. + * @param width The width of the Static Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame width. + * @param height The height of the Static Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame height. + * @param center Place the Static Body's center on its Game Object's center. Only works if the Game Object has the `getCenter` method. Default true. + */ + setSize(width?: number, height?: number, center?: boolean): Phaser.Physics.Arcade.StaticBody; + + /** + * Sets this Static Body to have a circular body and sets its size and position. + * @param radius The radius of the StaticBody, in pixels. + * @param offsetX The horizontal offset of the StaticBody from its Game Object, in pixels. + * @param offsetY The vertical offset of the StaticBody from its Game Object, in pixels. + */ + setCircle(radius: number, offsetX?: number, offsetY?: number): Phaser.Physics.Arcade.StaticBody; + + /** + * Updates the StaticBody's `center` from its `position` and dimensions. + */ + updateCenter(): void; + + /** + * Resets this Static Body to its parent Game Object's position. + * + * If `x` and `y` are given, the parent Game Object is placed there and this Static Body is centered on it. + * Otherwise this Static Body is centered on the Game Object's current position. + * @param x The x coordinate to reset the body to. If not given will use the parent Game Object's coordinate. + * @param y The y coordinate to reset the body to. If not given will use the parent Game Object's coordinate. + */ + reset(x?: number, y?: number): void; + + /** + * NOOP function. A Static Body cannot be stopped. + */ + stop(): Phaser.Physics.Arcade.StaticBody; + + /** + * Returns the x and y coordinates of the top left and bottom right points of the StaticBody. + * @param obj The object which will hold the coordinates of the bounds. + */ + getBounds(obj: Phaser.Types.Physics.Arcade.ArcadeBodyBounds): Phaser.Types.Physics.Arcade.ArcadeBodyBounds; + + /** + * Checks to see if a given x,y coordinate is colliding with this Static Body. + * @param x The x coordinate to check against this body. + * @param y The y coordinate to check against this body. + */ + hitTest(x: number, y: number): boolean; + + /** + * NOOP + */ + postUpdate(): void; + + /** + * The absolute (non-negative) change in this StaticBody's horizontal position from the previous step. Always zero. + */ + deltaAbsX(): number; + + /** + * The absolute (non-negative) change in this StaticBody's vertical position from the previous step. Always zero. + */ + deltaAbsY(): number; + + /** + * The change in this StaticBody's horizontal position from the previous step. Always zero. + */ + deltaX(): number; + + /** + * The change in this StaticBody's vertical position from the previous step. Always zero. + */ + deltaY(): number; + + /** + * The change in this StaticBody's rotation from the previous step. Always zero. + */ + deltaZ(): number; + + /** + * Disables this Body and marks it for destruction during the next step. + */ + destroy(): void; + + /** + * Draws a graphical representation of the StaticBody for visual debugging purposes. + * @param graphic The Graphics object to use for the debug drawing of the StaticBody. + */ + drawDebug(graphic: Phaser.GameObjects.Graphics): void; + + /** + * Indicates whether the StaticBody is going to be showing a debug visualization during postUpdate. + */ + willDrawDebug(): boolean; + + /** + * Sets the Mass of the StaticBody. Will set the Mass to 0.1 if the value passed is less than or equal to zero. + * @param value The value to set the Mass to. Values of zero or less are changed to 0.1. + */ + setMass(value: number): Phaser.Physics.Arcade.StaticBody; + + /** + * The x coordinate of the StaticBody. + */ + x: number; + + /** + * The y coordinate of the StaticBody. + */ + y: number; + + /** + * Returns the left-most x coordinate of the area of the StaticBody. + */ + readonly left: number; + + /** + * The right-most x coordinate of the area of the StaticBody. + */ + readonly right: number; + + /** + * The highest y coordinate of the area of the StaticBody. + */ + readonly top: number; + + /** + * The lowest y coordinate of the area of the StaticBody. (y + height) + */ + readonly bottom: number; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + } + + /** + * An Arcade Physics Static Group object. + * + * All Game Objects created by or added to this Group will automatically be given static Arcade Physics bodies, if they have no body. + * + * Its dynamic counterpart is {@link Phaser.Physics.Arcade.Group}. + */ + class StaticGroup extends Phaser.GameObjects.Group implements Phaser.Physics.Arcade.Components.Collision { + /** + * + * @param world The physics simulation. + * @param scene The scene this group belongs to. + * @param children Game Objects to add to this group; or the `config` argument. + * @param config Settings for this group. + */ + constructor(world: Phaser.Physics.Arcade.World, scene: Phaser.Scene, children?: Phaser.GameObjects.GameObject[] | Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig, config?: Phaser.Types.GameObjects.Group.GroupConfig | Phaser.Types.GameObjects.Group.GroupCreateConfig); + + /** + * The physics simulation. + */ + world: Phaser.Physics.Arcade.World; + + /** + * The scene this group belongs to. + */ + physicsType: number; + + /** + * The Arcade Physics Static Group Collision Category. + * + * This can be set to any valid collision bitfield value. + * + * See the `setCollisionCategory` method for more details. + */ + collisionCategory: number; + + /** + * The Arcade Physics Static Group Collision Mask. + * + * See the `setCollidesWith` method for more details. + */ + collisionMask: number; + + /** + * A textual representation of this Game Object. + * Used internally by Phaser but is available for your own custom classes to populate. + */ + type: string; + + /** + * Adds a static physics body to the new group member (if it lacks one) and adds it to the simulation. + * @param child The new group member. + */ + createCallbackHandler(child: Phaser.GameObjects.GameObject): void; + + /** + * Disables the group member's physics body, removing it from the simulation. + * @param child The group member being removed. + */ + removeCallbackHandler(child: Phaser.GameObjects.GameObject): void; + + /** + * Refreshes the group. + * @param entries The newly created group members. + */ + createMultipleCallbackHandler(entries: Phaser.GameObjects.GameObject[]): void; + + /** + * Resets each Body to the position of its parent Game Object. + * Body sizes aren't changed (use {@link Phaser.Physics.Arcade.Components.Enable#refreshBody} for that). + */ + refresh(): Phaser.Physics.Arcade.StaticGroup; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + } + + namespace Tilemap { + /** + * A function to process the collision callbacks between a single tile and an Arcade Physics enabled Game Object. + * @param tile The Tile to process. + * @param sprite The Game Object to process with the Tile. + */ + function ProcessTileCallbacks(tile: Phaser.Tilemaps.Tile, sprite: Phaser.GameObjects.Sprite): boolean; + + /** + * Internal function to process the separation of a physics body from a tile. + * @param body The Body object to separate. + * @param x The x separation amount. + */ + function ProcessTileSeparationX(body: Phaser.Physics.Arcade.Body, x: number): void; + + /** + * Internal function to process the separation of a physics body from a tile. + * @param body The Body object to separate. + * @param y The y separation amount. + */ + function ProcessTileSeparationY(body: Phaser.Physics.Arcade.Body, y: number): void; + + /** + * The core separation function to separate a physics body and a tile. + * @param i The index of the tile within the map data. + * @param body The Body object to separate. + * @param tile The tile to collide against. + * @param tileWorldRect A rectangle-like object defining the dimensions of the tile. + * @param tilemapLayer The tilemapLayer to collide against. + * @param tileBias The tile bias value. Populated by the `World.TILE_BIAS` constant. + * @param isLayer Is this check coming from a TilemapLayer or an array of tiles? + */ + function SeparateTile(i: number, body: Phaser.Physics.Arcade.Body, tile: Phaser.Tilemaps.Tile, tileWorldRect: Phaser.Geom.Rectangle, tilemapLayer: Phaser.Tilemaps.TilemapLayer, tileBias: number, isLayer: boolean): boolean; + + /** + * Check the body against the given tile on the X axis. + * Used internally by the SeparateTile function. + * @param body The Body object to separate. + * @param tile The tile to check. + * @param tileLeft The left position of the tile within the tile world. + * @param tileRight The right position of the tile within the tile world. + * @param tileBias The tile bias value. Populated by the `World.TILE_BIAS` constant. + * @param isLayer Is this check coming from a TilemapLayer or an array of tiles? + */ + function TileCheckX(body: Phaser.Physics.Arcade.Body, tile: Phaser.Tilemaps.Tile, tileLeft: number, tileRight: number, tileBias: number, isLayer: boolean): number; + + /** + * Check the body against the given tile on the Y axis. + * Used internally by the SeparateTile function. + * @param body The Body object to separate. + * @param tile The tile to check. + * @param tileTop The top position of the tile within the tile world. + * @param tileBottom The bottom position of the tile within the tile world. + * @param tileBias The tile bias value. Populated by the `World.TILE_BIAS` constant. + * @param isLayer Is this check coming from a TilemapLayer or an array of tiles? + */ + function TileCheckY(body: Phaser.Physics.Arcade.Body, tile: Phaser.Tilemaps.Tile, tileTop: number, tileBottom: number, tileBias: number, isLayer: boolean): number; + + /** + * Checks for intersection between the given tile rectangle-like object and an Arcade Physics body. + * @param tileWorldRect A rectangle object that defines the tile placement in the world. + * @param body The body to check for intersection against. + */ + function TileIntersectsBody(tileWorldRect: Object, body: Phaser.Physics.Arcade.Body): boolean; + + } + + /** + * The Arcade Physics World. + * + * The World is responsible for creating, managing, colliding and updating all of the bodies within it. + * + * An instance of the World belongs to a Phaser.Scene and is accessed via the property `physics.world`. + */ + class World extends Phaser.Events.EventEmitter { + /** + * + * @param scene The Scene to which this World instance belongs. + * @param config An Arcade Physics Configuration object. + */ + constructor(scene: Phaser.Scene, config: Phaser.Types.Physics.Arcade.ArcadeWorldConfig); + + /** + * The Scene this simulation belongs to. + */ + scene: Phaser.Scene; + + /** + * Dynamic Bodies in this simulation. + */ + bodies: Phaser.Structs.Set; + + /** + * Static Bodies in this simulation. + */ + staticBodies: Phaser.Structs.Set; + + /** + * Static Bodies marked for deletion. + */ + pendingDestroy: Phaser.Structs.Set<(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)>; + + /** + * This simulation's collision processors. + */ + colliders: Phaser.Structs.ProcessQueue; + + /** + * Acceleration of Bodies due to gravity, in pixels per second. + */ + gravity: Phaser.Math.Vector2; + + /** + * A boundary constraining Bodies. + */ + bounds: Phaser.Geom.Rectangle; + + /** + * The boundary edges that Bodies can collide with. + */ + checkCollision: Phaser.Types.Physics.Arcade.CheckCollisionObject; + + /** + * The number of physics steps to be taken per second. + * + * This property is read-only. Use the `setFPS` method to modify it at run-time. + */ + readonly fps: number; + + /** + * Should Physics use a fixed update time-step (true) or sync to the render fps (false)?. + * False value of this property disables fps and timeScale properties. + */ + fixedStep: boolean; + + /** + * The number of steps that took place in the last frame. + */ + readonly stepsLastFrame: number; + + /** + * Scaling factor applied to the frame rate. + * + * - 1.0 = normal speed + * - 2.0 = half speed + * - 0.5 = double speed + */ + timeScale: number; + + /** + * The maximum absolute difference of a Body's per-step velocity and its overlap with another Body that will result in separation on *each axis*. + * Larger values favor separation. + * Smaller values favor no separation. + */ + OVERLAP_BIAS: number; + + /** + * The maximum absolute value of a Body's overlap with a tile that will result in separation on *each axis*. + * Larger values favor separation. + * Smaller values favor no separation. + * The optimum value may be similar to the tile size. + */ + TILE_BIAS: number; + + /** + * Always separate overlapping Bodies horizontally before vertically. + * False (the default) means Bodies are first separated on the axis of greater gravity, or the vertical axis if neither is greater. + */ + forceX: boolean; + + /** + * Whether the simulation advances with the game loop. + */ + isPaused: boolean; + + /** + * Enables the debug display. + */ + drawDebug: boolean; + + /** + * The graphics object drawing the debug display. + */ + debugGraphic: Phaser.GameObjects.Graphics; + + /** + * Default debug display settings for new Bodies. + */ + defaults: Phaser.Types.Physics.Arcade.ArcadeWorldDefaults; + + /** + * The maximum number of items per node on the RTree. + * + * This is ignored if `useTree` is `false`. If you have a large number of bodies in + * your world then you may find search performance improves by increasing this value, + * to allow more items per node and less node division. + */ + maxEntries: number; + + /** + * Should this Arcade Physics World use an RTree for Dynamic bodies? + * + * An RTree is a fast way of spatially sorting of all the bodies in the world. + * However, at certain limits, the cost of clearing and inserting the bodies into the + * tree every frame becomes more expensive than the search speed gains it provides. + * + * If you have a large number of dynamic bodies in your world then it may be best to + * disable the use of the RTree by setting this property to `false` in the physics config. + * + * The number it can cope with depends on browser and device, but a conservative estimate + * of around 5,000 bodies should be considered the max before disabling it. + * + * This only applies to dynamic bodies. Static bodies are always kept in an RTree, + * because they don't have to be cleared every frame, so you benefit from the + * massive search speeds all the time. + */ + useTree: boolean; + + /** + * The spatial index of Dynamic Bodies. + */ + tree: Phaser.Structs.RTree; + + /** + * The spatial index of Static Bodies. + */ + staticTree: Phaser.Structs.RTree; + + /** + * Recycled input for tree searches. + */ + treeMinMax: Phaser.Types.Physics.Arcade.ArcadeWorldTreeMinMax; + + /** + * The Filtering Options passed to `GetTilesWithinWorldXY` as part of the `collideSpriteVsTilemapLayer` check. + */ + tileFilterOptions: Phaser.Types.Tilemaps.FilteringOptions; + + /** + * Adds an Arcade Physics Body to a Game Object, an array of Game Objects, or the children of a Group. + * + * The difference between this and the `enableBody` method is that you can pass arrays or Groups + * to this method. + * + * You can specify if the bodies are to be Dynamic or Static. A dynamic body can move via velocity and + * acceleration. A static body remains fixed in place and as such is able to use an optimized search + * tree, making it ideal for static elements such as level objects. You can still collide and overlap + * with static bodies. + * + * Normally, rather than calling this method directly, you'd use the helper methods available in the + * Arcade Physics Factory, such as: + * + * ```javascript + * this.physics.add.image(x, y, textureKey); + * this.physics.add.sprite(x, y, textureKey); + * ``` + * + * Calling factory methods encapsulates the creation of a Game Object and the creation of its + * body at the same time. If you are creating custom classes then you can pass them to this + * method to have their bodies created. + * @param object The object, or objects, on which to create the bodies. + * @param bodyType The type of Body to create. Either `DYNAMIC_BODY` or `STATIC_BODY`. + */ + enable(object: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[] | Phaser.GameObjects.Group | Phaser.GameObjects.Group[], bodyType?: number): void; + + /** + * Creates an Arcade Physics Body on a single Game Object. + * + * If the Game Object already has a body, this method will simply add it back into the simulation. + * + * You can specify if the body is Dynamic or Static. A dynamic body can move via velocity and + * acceleration. A static body remains fixed in place and as such is able to use an optimized search + * tree, making it ideal for static elements such as level objects. You can still collide and overlap + * with static bodies. + * + * Normally, rather than calling this method directly, you'd use the helper methods available in the + * Arcade Physics Factory, such as: + * + * ```javascript + * this.physics.add.image(x, y, textureKey); + * this.physics.add.sprite(x, y, textureKey); + * ``` + * + * Calling factory methods encapsulates the creation of a Game Object and the creation of its + * body at the same time. If you are creating custom classes then you can pass them to this + * method to have their bodies created. + * @param object The Game Object on which to create the body. + * @param bodyType The type of Body to create. Either `DYNAMIC_BODY` or `STATIC_BODY`. + */ + enableBody(object: Phaser.GameObjects.GameObject, bodyType?: number): Phaser.GameObjects.GameObject; + + /** + * Adds an existing Arcade Physics Body or StaticBody to the simulation. + * + * The body is enabled and added to the local search trees. + * @param body The Body to be added to the simulation. + */ + add(body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody): Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody; + + /** + * Disables the Arcade Physics Body of a Game Object, an array of Game Objects, or the children of a Group. + * + * The difference between this and the `disableBody` method is that you can pass arrays or Groups + * to this method. + * + * The body itself is not deleted, it just has its `enable` property set to false, which + * means you can re-enable it again at any point by passing it to enable `World.enable` or `World.add`. + * @param object The object, or objects, on which to disable the bodies. + */ + disable(object: Phaser.GameObjects.GameObject | Phaser.GameObjects.GameObject[] | Phaser.GameObjects.Group | Phaser.GameObjects.Group[]): void; + + /** + * Disables an existing Arcade Physics Body or StaticBody and removes it from the simulation. + * + * The body is disabled and removed from the local search trees. + * + * The body itself is not deleted, it just has its `enable` property set to false, which + * means you can re-enable it again at any point by passing it to enable `World.enable` or `World.add`. + * @param body The Body to be disabled. + */ + disableBody(body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody): void; + + /** + * Removes an existing Arcade Physics Body or StaticBody from the simulation. + * + * The body is disabled and removed from the local search trees. + * + * The body itself is not deleted, it just has its `enabled` property set to false, which + * means you can re-enable it again at any point by passing it to enable `enable` or `add`. + * @param body The body to be removed from the simulation. + */ + remove(body: Phaser.Physics.Arcade.Body | Phaser.Physics.Arcade.StaticBody): void; + + /** + * Creates a Graphics Game Object that the world will use to render the debug display to. + * + * This is called automatically when the World is instantiated if the `debug` config property + * was set to `true`. However, you can call it at any point should you need to display the + * debug Graphic from a fixed point. + * + * You can control which objects are drawn to the Graphics object, and the colors they use, + * by setting the debug properties in the physics config. + * + * You should not typically use this in a production game. Use it to aid during debugging. + */ + createDebugGraphic(): Phaser.GameObjects.Graphics; + + /** + * Sets the position, size and properties of the World boundary. + * + * The World boundary is an invisible rectangle that defines the edges of the World. + * If a Body is set to collide with the world bounds then it will automatically stop + * when it reaches any of the edges. You can optionally set which edges of the boundary + * should be checked against. + * @param x The top-left x coordinate of the boundary. + * @param y The top-left y coordinate of the boundary. + * @param width The width of the boundary. + * @param height The height of the boundary. + * @param checkLeft Should bodies check against the left edge of the boundary? + * @param checkRight Should bodies check against the right edge of the boundary? + * @param checkUp Should bodies check against the top edge of the boundary? + * @param checkDown Should bodies check against the bottom edge of the boundary? + */ + setBounds(x: number, y: number, width: number, height: number, checkLeft?: boolean, checkRight?: boolean, checkUp?: boolean, checkDown?: boolean): Phaser.Physics.Arcade.World; + + /** + * Enables or disables collisions on each edge of the World boundary. + * @param left Should bodies check against the left edge of the boundary? Default true. + * @param right Should bodies check against the right edge of the boundary? Default true. + * @param up Should bodies check against the top edge of the boundary? Default true. + * @param down Should bodies check against the bottom edge of the boundary? Default true. + */ + setBoundsCollision(left?: boolean, right?: boolean, up?: boolean, down?: boolean): Phaser.Physics.Arcade.World; + + /** + * Pauses the simulation. + * + * A paused simulation does not update any existing bodies, or run any Colliders. + * + * However, you can still enable and disable bodies within it, or manually run collide or overlap + * checks. + */ + pause(): Phaser.Physics.Arcade.World; + + /** + * Resumes the simulation, if paused. + */ + resume(): Phaser.Physics.Arcade.World; + + /** + * Creates a new Collider object and adds it to the simulation. + * + * A Collider is a way to automatically perform collision checks between two objects, + * calling the collide and process callbacks if they occur. + * + * Colliders are run as part of the World update, after all of the Bodies have updated. + * + * By creating a Collider you don't need then call `World.collide` in your `update` loop, + * as it will be handled for you automatically. + * @param object1 The first object to check for collision. + * @param object2 The second object to check for collision. + * @param collideCallback The callback to invoke when the two objects collide. + * @param processCallback The callback to invoke when the two objects collide. Must return a boolean. + * @param callbackContext The scope in which to call the callbacks. + */ + addCollider(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): Phaser.Physics.Arcade.Collider; + + /** + * Creates a new Overlap Collider object and adds it to the simulation. + * + * A Collider is a way to automatically perform overlap checks between two objects, + * calling the collide and process callbacks if they occur. + * + * Colliders are run as part of the World update, after all of the Bodies have updated. + * + * By creating a Collider you don't need then call `World.overlap` in your `update` loop, + * as it will be handled for you automatically. + * @param object1 The first object to check for overlap. + * @param object2 The second object to check for overlap. + * @param collideCallback The callback to invoke when the two objects overlap. + * @param processCallback The callback to invoke when the two objects overlap. Must return a boolean. + * @param callbackContext The scope in which to call the callbacks. + */ + addOverlap(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): Phaser.Physics.Arcade.Collider; + + /** + * Removes a Collider from the simulation so it is no longer processed. + * + * This method does not destroy the Collider. If you wish to add it back at a later stage you can call + * `World.colliders.add(Collider)`. + * + * If you no longer need the Collider you can call the `Collider.destroy` method instead, which will + * automatically clear all of its references and then remove it from the World. If you call destroy on + * a Collider you _don't_ need to pass it to this method too. + * @param collider The Collider to remove from the simulation. + */ + removeCollider(collider: Phaser.Physics.Arcade.Collider): Phaser.Physics.Arcade.World; + + /** + * Sets the frame rate to run the simulation at. + * + * The frame rate value is used to simulate a fixed update time step. This fixed + * time step allows for a straightforward implementation of a deterministic game state. + * + * This frame rate is independent of the frequency at which the game is rendering. The + * higher you set the fps, the more physics simulation steps will occur per game step. + * Conversely, the lower you set it, the less will take place. + * + * You can optionally advance the simulation directly yourself by calling the `step` method. + * @param framerate The frame rate to advance the simulation at. + */ + setFPS(framerate: number): this; + + /** + * Advances the simulation based on the elapsed time and fps rate. + * + * This is called automatically by your Scene and does not need to be invoked directly. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time, in ms, elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Advances the simulation by a time increment. + * @param delta The delta time amount, in seconds, by which to advance the simulation. + */ + step(delta: number): void; + + /** + * Advances the simulation by a single step. + */ + singleStep(): void; + + /** + * Updates bodies, draws the debug display, and handles pending queue operations. + */ + postUpdate(): void; + + /** + * Calculates a Body's velocity and updates its position. + * @param body The Body to be updated. + * @param delta The delta value to be used in the motion calculations, in seconds. + */ + updateMotion(body: Phaser.Physics.Arcade.Body, delta: number): void; + + /** + * Calculates a Body's angular velocity. + * @param body The Body to compute the velocity for. + * @param delta The delta value to be used in the calculation, in seconds. + */ + computeAngularVelocity(body: Phaser.Physics.Arcade.Body, delta: number): void; + + /** + * Calculates a Body's per-axis velocity. + * @param body The Body to compute the velocity for. + * @param delta The delta value to be used in the calculation, in seconds. + */ + computeVelocity(body: Phaser.Physics.Arcade.Body, delta: number): void; + + /** + * Separates two Bodies. + * @param body1 The first Body to be separated. + * @param body2 The second Body to be separated. + * @param processCallback The process callback. + * @param callbackContext The context in which to invoke the callback. + * @param overlapOnly If this a collide or overlap check? + */ + separate(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any, overlapOnly?: boolean): boolean; + + /** + * Separates two Bodies, when both are circular. + * @param body1 The first Body to be separated. + * @param body2 The second Body to be separated. + * @param overlapOnly If this a collide or overlap check? + */ + separateCircle(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body, overlapOnly?: boolean): boolean; + + /** + * Checks to see if two Bodies intersect at all. + * @param body1 The first body to check. + * @param body2 The second body to check. + */ + intersects(body1: Phaser.Physics.Arcade.Body, body2: Phaser.Physics.Arcade.Body): boolean; + + /** + * Tests if a circular Body intersects with another Body. + * @param circle The circular body to test. + * @param body The rectangular body to test. + */ + circleBodyIntersects(circle: Phaser.Physics.Arcade.Body, body: Phaser.Physics.Arcade.Body): boolean; + + /** + * Tests if Game Objects overlap. + * + * See details in {@link Phaser.Physics.Arcade.World#collide}. + * @param object1 The first object or array of objects to check. + * @param object2 The second object or array of objects to check, or `undefined`. + * @param overlapCallback An optional callback function that is called if the objects overlap. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they overlap. If this is set then `overlapCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + overlap(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2?: Phaser.Types.Physics.Arcade.ArcadeColliderType, overlapCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * Performs a collision check and separation between the two physics enabled objects given, which can be single + * Game Objects, arrays of Game Objects, Physics Groups, arrays of Physics Groups or normal Groups. + * + * If you don't require separation then use {@link Phaser.Physics.Arcade.World#overlap} instead. + * + * If two Groups or arrays are passed, each member of one will be tested against each member of the other. + * + * If **only** one Group is passed (as `object1`), each member of the Group will be collided against the other members. + * + * If **only** one Array is passed, the array is iterated and every element in it is tested against the others. + * + * Two callbacks can be provided; they receive the colliding game objects as arguments. + * If an overlap is detected, the `processCallback` is called first. It can cancel the collision by returning false. + * Next the objects are separated and `collideCallback` is invoked. + * + * Arcade Physics uses the Projection Method of collision resolution and separation. While it's fast and suitable + * for 'arcade' style games it lacks stability when multiple objects are in close proximity or resting upon each other. + * The separation that stops two objects penetrating may create a new penetration against a different object. If you + * require a high level of stability please consider using an alternative physics system, such as Matter.js. + * @param object1 The first object or array of objects to check. + * @param object2 The second object or array of objects to check, or `undefined`. + * @param collideCallback An optional callback function that is called if the objects collide. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + collide(object1: Phaser.Types.Physics.Arcade.ArcadeColliderType, object2?: Phaser.Types.Physics.Arcade.ArcadeColliderType, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * Checks if the two given Arcade Physics bodies will collide, or not, + * based on their collision mask and collision categories. + * @param body1 The first body to check. + * @param body2 The second body to check. + */ + canCollide(body1: Phaser.Types.Physics.Arcade.ArcadeCollider, body2: Phaser.Types.Physics.Arcade.ArcadeCollider): boolean; + + /** + * This advanced method is specifically for testing for collision between a single Sprite and an array of Tile objects. + * + * You should generally use the `collide` method instead, with a Sprite vs. a Tilemap Layer, as that will perform + * tile filtering and culling for you, as well as handle the interesting face collision automatically. + * + * This method is offered for those who would like to check for collision with specific Tiles in a layer, without + * having to set any collision attributes on the tiles in question. This allows you to perform quick dynamic collisions + * on small sets of Tiles. As such, no culling or checks are made to the array of Tiles given to this method, + * you should filter them before passing them to this method. + * + * Important: Use of this method skips the `interesting faces` system that Tilemap Layers use. This means if you have + * say a row or column of tiles, and you jump into, or walk over them, it's possible to get stuck on the edges of the + * tiles as the interesting face calculations are skipped. However, for quick-fire small collision set tests on + * dynamic maps, this method can prove very useful. + * + * This method does not factor in the Collision Mask or Category. + * @param sprite The first object to check for collision. + * @param tiles An array of Tiles to check for collision against. + * @param collideCallback An optional callback function that is called if the objects collide. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + collideTiles(sprite: Phaser.GameObjects.GameObject, tiles: Phaser.Tilemaps.Tile[], collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * This advanced method is specifically for testing for overlaps between a single Sprite and an array of Tile objects. + * + * You should generally use the `overlap` method instead, with a Sprite vs. a Tilemap Layer, as that will perform + * tile filtering and culling for you, as well as handle the interesting face collision automatically. + * + * This method is offered for those who would like to check for overlaps with specific Tiles in a layer, without + * having to set any collision attributes on the tiles in question. This allows you to perform quick dynamic overlap + * tests on small sets of Tiles. As such, no culling or checks are made to the array of Tiles given to this method, + * you should filter them before passing them to this method. + * + * This method does not factor in the Collision Mask or Category. + * @param sprite The first object to check for collision. + * @param tiles An array of Tiles to check for collision against. + * @param collideCallback An optional callback function that is called if the objects overlap. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + */ + overlapTiles(sprite: Phaser.GameObjects.GameObject, tiles: Phaser.Tilemaps.Tile[], collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * Internal handler for Sprite vs. Tilemap collisions. + * Please use Phaser.Physics.Arcade.World#collide instead. + * @param sprite The first object to check for collision. + * @param tilemapLayer The second object to check for collision. + * @param collideCallback An optional callback function that is called if the objects collide. + * @param processCallback An optional callback function that lets you perform additional checks against the two objects if they collide. If this is set then `collideCallback` will only be called if this callback returns `true`. + * @param callbackContext The context in which to run the callbacks. + * @param overlapOnly Whether this is a collision or overlap check. + */ + collideSpriteVsTilemapLayer(sprite: Phaser.GameObjects.GameObject, tilemapLayer: Phaser.Tilemaps.TilemapLayer, collideCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any, overlapOnly?: boolean): boolean; + + /** + * Wrap an object's coordinates (or several objects' coordinates) within {@link Phaser.Physics.Arcade.World#bounds}. + * + * If the object is outside any boundary edge (left, top, right, bottom), it will be moved to the same offset from the opposite edge (the interior). + * @param object A Game Object, a Group, an object with `x` and `y` coordinates, or an array of such objects. + * @param padding An amount added to each boundary edge during the operation. Default 0. + */ + wrap(object: any, padding?: number): void; + + /** + * Wrap each object's coordinates within {@link Phaser.Physics.Arcade.World#bounds}. + * @param objects An array of objects to be wrapped. + * @param padding An amount added to the boundary. Default 0. + */ + wrapArray(objects: any[], padding?: number): void; + + /** + * Wrap an object's coordinates within {@link Phaser.Physics.Arcade.World#bounds}. + * @param object A Game Object, a Physics Body, or any object with `x` and `y` coordinates + * @param padding An amount added to the boundary. Default 0. + */ + wrapObject(object: any, padding?: number): void; + + /** + * Shuts down the simulation, clearing physics data and removing listeners. + */ + shutdown(): void; + + /** + * Shuts down the simulation and disconnects it from the current scene. + */ + destroy(): void; + + } + + } + + namespace Matter { + /** + * The Body Bounds class contains methods to help you extract the world coordinates from various points around + * the bounds of a Matter Body. Because Matter bodies are positioned based on their center of mass, and not a + * dimension based center, you often need to get the bounds coordinates in order to properly align them in the world. + * + * You can access this class via the MatterPhysics class from a Scene, i.e.: + * + * ```javascript + * this.matter.bodyBounds.getTopLeft(body); + * ``` + * + * See also the `MatterPhysics.alignBody` method. + */ + class BodyBounds { + /** + * A Vector2 that stores the temporary bounds center value during calculations by methods in this class. + */ + boundsCenter: Phaser.Math.Vector2; + + /** + * A Vector2 that stores the temporary center diff values during calculations by methods in this class. + */ + centerDiff: Phaser.Math.Vector2; + + /** + * Parses the given body to get the bounds diff values from it. + * + * They're stored in this class in the temporary properties `boundsCenter` and `centerDiff`. + * + * This method is called automatically by all other methods in this class. + * @param body The Body to get the bounds position from. + */ + parseBody(body: Phaser.Types.Physics.Matter.MatterBody): boolean; + + /** + * Takes a Body and returns the world coordinates of the top-left of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getTopLeft(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the top-center of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getTopCenter(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the top-right of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getTopRight(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the left-center of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getLeftCenter(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the center of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getCenter(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the right-center of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getRightCenter(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the bottom-left of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getBottomLeft(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the bottom-center of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getBottomCenter(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + /** + * Takes a Body and returns the world coordinates of the bottom-right of its _bounds_. + * + * Body bounds are updated by Matter each step and factor in scale and rotation. + * This will return the world coordinate based on the bodies _current_ position and bounds. + * @param body The Body to get the position from. + * @param x Optional horizontal offset to add to the returned coordinates. Default 0. + * @param y Optional vertical offset to add to the returned coordinates. Default 0. + */ + getBottomRight(body: Phaser.Types.Physics.Matter.MatterBody, x?: number, y?: number): Phaser.Math.Vector2 | false; + + } + + namespace Components { + /** + * A component to set restitution on objects. + */ + interface Bounce { + /** + * Sets the restitution on the physics object. + * @param value A Number that defines the restitution (elasticity) of the body. The value is always positive and is in the range (0, 1). A value of 0 means collisions may be perfectly inelastic and no bouncing may occur. A value of 0.8 means the body may bounce back with approximately 80% of its kinetic energy. Note that collision response is based on pairs of bodies, and that restitution values are combined with the following formula: `Math.max(bodyA.restitution, bodyB.restitution)` + */ + setBounce(value: number): this; + } + + /** + * Contains methods for changing the collision filter of a Matter Body. Should be used as a mixin and not called directly. + */ + interface Collision { + /** + * Sets the collision category of this Game Object's Matter Body. This number must be a power of two between 2^0 (= 1) and 2^31. + * Two bodies with different collision groups (see {@link #setCollisionGroup}) will only collide if their collision + * categories are included in their collision masks (see {@link #setCollidesWith}). + * @param value Unique category bitfield. + */ + setCollisionCategory(value: number): this; + /** + * Sets the collision group of this Game Object's Matter Body. If this is zero or two Matter Bodies have different values, + * they will collide according to the usual rules (see {@link #setCollisionCategory} and {@link #setCollisionGroup}). + * If two Matter Bodies have the same positive value, they will always collide; if they have the same negative value, + * they will never collide. + * @param value Unique group index. + */ + setCollisionGroup(value: number): this; + /** + * Sets the collision mask for this Game Object's Matter Body. Two Matter Bodies with different collision groups will only + * collide if each one includes the other's category in its mask based on a bitwise AND, i.e. `(categoryA & maskB) !== 0` + * and `(categoryB & maskA) !== 0` are both true. + * @param categories A unique category bitfield, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body starts colliding with another. + */ + setOnCollide(callback: Function): this; + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body stops colliding with another. + */ + setOnCollideEnd(callback: Function): this; + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke for the duration of this body colliding with another. + */ + setOnCollideActive(callback: Function): this; + /** + * The callback is sent a reference to the other body, along with a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param body The body, or an array of bodies, to test for collisions with. + * @param callback The callback to invoke when this body collides with the given body or bodies. + */ + setOnCollideWith(body: MatterJS.Body | MatterJS.Body[], callback: Function): this; + } + + /** + * A component to apply force to Matter.js bodies. + */ + interface Force { + /** + * Applies a force to a body. + * @param force A Vector that specifies the force to apply. + */ + applyForce(force: Phaser.Math.Vector2): this; + /** + * Applies a force to a body from a given position. + * @param position The position in which the force comes from. + * @param force A Vector that specifies the force to apply. + */ + applyForceFrom(position: Phaser.Math.Vector2, force: Phaser.Math.Vector2): this; + /** + * Apply thrust to the forward position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrust(speed: number): this; + /** + * Apply thrust to the left position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustLeft(speed: number): this; + /** + * Apply thrust to the right position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustRight(speed: number): this; + /** + * Apply thrust to the back position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustBack(speed: number): this; + } + + /** + * Contains methods for changing the friction of a Game Object's Matter Body. Should be used a mixin, not called directly. + */ + interface Friction { + /** + * Sets new friction values for this Game Object's Matter Body. + * @param value The new friction of the body, between 0 and 1, where 0 allows the Body to slide indefinitely, while 1 allows it to stop almost immediately after a force is applied. + * @param air If provided, the new air resistance of the Body. The higher the value, the faster the Body will slow as it moves through space. 0 means the body has no air resistance. + * @param fstatic If provided, the new static friction of the Body. The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. 0 means the body will never "stick" when it is nearly stationary. + */ + setFriction(value: number, air?: number, fstatic?: number): this; + /** + * Sets a new air resistance for this Game Object's Matter Body. + * A value of 0 means the Body will never slow as it moves through space. + * The higher the value, the faster a Body slows when moving through space. + * @param value The new air resistance for the Body. + */ + setFrictionAir(value: number): this; + /** + * Sets a new static friction for this Game Object's Matter Body. + * A value of 0 means the Body will never "stick" when it is nearly stationary. + * The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. + * @param value The new static friction for the Body. + */ + setFrictionStatic(value: number): this; + } + + /** + * A component to manipulate world gravity for Matter.js bodies. + */ + interface Gravity { + /** + * A togglable function for ignoring world gravity in real-time on the current body. + * @param value Set to true to ignore the effect of world gravity, or false to not ignore it. + */ + setIgnoreGravity(value: boolean): this; + } + + /** + * Allows accessing the mass, density, and center of mass of a Matter-enabled Game Object. Should be used as a mixin and not directly. + */ + interface Mass { + /** + * Sets the mass of the Game Object's Matter Body. + * @param value The new mass of the body. + */ + setMass(value: number): this; + /** + * Sets density of the body. + * @param value The new density of the body. + */ + setDensity(value: number): this; + /** + * The body's center of mass. + * + * Calling this creates a new `Vector2 each time to avoid mutation. + * + * If you only need to read the value and won't change it, you can get it from `GameObject.body.centerOfMass`. + */ + readonly centerOfMass: Phaser.Math.Vector2; + } + + /** + * Enables a Matter-enabled Game Object to be a sensor. Should be used as a mixin and not directly. + */ + interface Sensor { + /** + * Set the body belonging to this Game Object to be a sensor. + * Sensors trigger collision events, but don't react with colliding body physically. + * @param value `true` to set the body as a sensor, or `false` to disable it. + */ + setSensor(value: boolean): this; + /** + * Is the body belonging to this Game Object a sensor or not? + */ + isSensor(): boolean; + } + + /** + * Enables a Matter-enabled Game Object to set its Body. Should be used as a mixin and not directly. + */ + interface SetBody { + /** + * Set this Game Objects Matter physics body to be a rectangle shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param width Width of the rectangle. + * @param height Height of the rectangle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setRectangle(width: number, height: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + /** + * Set this Game Objects Matter physics body to be a circle shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param radius The radius of the circle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setCircle(radius: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + /** + * Set this Game Objects Matter physics body to be a polygon shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param radius The "radius" of the polygon, i.e. the distance from its center to any vertex. This is also the radius of its circumcircle. + * @param sides The number of sides the polygon will have. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setPolygon(radius: number, sides: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + /** + * Set this Game Objects Matter physics body to be a trapezoid shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param width The width of the trapezoid Body. + * @param height The height of the trapezoid Body. + * @param slope The slope of the trapezoid. 0 creates a rectangle, while 1 creates a triangle. Positive values make the top side shorter, while negative values make the bottom side shorter. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setTrapezoid(width: number, height: number, slope: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + /** + * Set this Game Object to use the given existing Matter Body. + * + * The body is first removed from the world before being added to this Game Object. + * @param body The Body this Game Object should use. + * @param addToWorld Should the body be immediately added to the World? Default true. + */ + setExistingBody(body: MatterJS.BodyType, addToWorld?: boolean): this; + /** + * Set this Game Object to create and use a new Body based on the configuration object given. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param config Either a string, such as `circle`, or a Matter Set Body Configuration object. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setBody(config: string | Phaser.Types.Physics.Matter.MatterSetBodyConfig, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + } + + /** + * Enables a Matter-enabled Game Object to be able to go to sleep. Should be used as a mixin and not directly. + */ + interface Sleep { + /** + * Sets this Body to sleep. + */ + setToSleep(): this; + /** + * Wakes this Body if asleep. + */ + setAwake(): this; + /** + * Sets the number of updates in which this body must have near-zero velocity before it is set as sleeping (if sleeping is enabled by the engine). + * @param value A `Number` that defines the number of updates in which this body must have near-zero velocity before it is set as sleeping. Default 60. + */ + setSleepThreshold(value?: number): this; + /** + * Enable sleep and wake events for this body. + * + * By default when a body goes to sleep, or wakes up, it will not emit any events. + * + * The events are emitted by the Matter World instance and can be listened to via + * the `SLEEP_START` and `SLEEP_END` events. + * @param start `true` if you want the sleep start event to be emitted for this body. + * @param end `true` if you want the sleep end event to be emitted for this body. + */ + setSleepEvents(start: boolean, end: boolean): this; + /** + * Enables or disables the Sleep Start event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepStartEvent(value: boolean): this; + /** + * Enables or disables the Sleep End event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepEndEvent(value: boolean): this; + } + + /** + * Provides methods used for getting and setting the static state of a physics body. + */ + interface Static { + /** + * Changes the physics body to be either static `true` or dynamic `false`. + * @param value `true` to set the body as being static, or `false` to make it dynamic. + */ + setStatic(value: boolean): this; + /** + * Returns `true` if the body is static, otherwise `false` for a dynamic body. + */ + isStatic(): boolean; + } + + /** + * Provides methods used for getting and setting the position, scale and rotation of a Game Object. + */ + interface Transform { + /** + * The x position of this Game Object. + */ + x: number; + /** + * The y position of this Game Object. + */ + y: number; + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + /** + * Use `angle` to set or get rotation of the physics body associated to this GameObject. + * Unlike rotation, when using set the value can be in degrees, which will be converted to radians internally. + */ + angle: number; + /** + * Use `rotation` to set or get the rotation of the physics body associated with this GameObject. + * The value when set must be in radians. + */ + rotation: number; + /** + * Sets the position of the physics body along x and y axes. + * Both the parameters to this function are optional and if not passed any they default to 0. + * Velocity, angle, force etc. are unchanged. + * @param x The horizontal position of the body. Default 0. + * @param y The vertical position of the body. Default x. + */ + setPosition(x?: number, y?: number): this; + /** + * Immediately sets the angle of the Body. + * Angular velocity, position, force etc. are unchanged. + * @param radians The angle of the body, in radians. Default 0. + */ + setRotation(radians?: number): this; + /** + * Setting fixed rotation sets the Body inertia to Infinity, which stops it + * from being able to rotate when forces are applied to it. + */ + setFixedRotation(): this; + /** + * Immediately sets the angle of the Body. + * Angular velocity, position, force etc. are unchanged. + * @param degrees The angle to set, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the x value. Default x. + * @param point The point (Vector2) from which scaling will occur. + */ + setScale(x?: number, y?: number, point?: Phaser.Math.Vector2): this; + } + + /** + * Contains methods for changing the velocity of a Matter Body. Should be used as a mixin and not called directly. + */ + interface Velocity { + /** + * Sets the horizontal velocity of the physics body. + * @param x The horizontal velocity value. + */ + setVelocityX(x: number): this; + /** + * Sets vertical velocity of the physics body. + * @param y The vertical velocity value. + */ + setVelocityY(y: number): this; + /** + * Sets both the horizontal and vertical velocity of the physics body. + * @param x The horizontal velocity value. + * @param y The vertical velocity value, it can be either positive or negative. If not given, it will be the same as the `x` value. Default x. + */ + setVelocity(x: number, y?: number): this; + /** + * Gets the current linear velocity of the physics body. + */ + getVelocity(): Phaser.Types.Math.Vector2Like; + /** + * Sets the angular velocity of the body instantly. + * Position, angle, force etc. are unchanged. + * @param velocity The angular velocity. + */ + setAngularVelocity(velocity: number): this; + /** + * Gets the current rotational velocity of the body. + */ + getAngularVelocity(): number; + /** + * Sets the current rotational speed of the body. + * Direction is maintained. Affects body angular velocity. + * @param speed The angular speed. + */ + setAngularSpeed(speed: number): this; + /** + * Gets the current rotational speed of the body. + * Equivalent to the magnitude of its angular velocity. + */ + getAngularSpeed(): number; + } + + } + + namespace Matter { + } + + namespace Events { + type AfterAddEvent = { + /** + * An array of the object(s) that have been added. May be a single body, constraint, composite or a mixture of these. + */ + object: any[]; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics After Add Event. + * + * This event is dispatched by a Matter Physics World instance at the end of the process when a new Body + * or Constraint has just been added to the world. + * + * Listen to it from a Scene using: `this.matter.world.on('afteradd', listener)`. + */ + const AFTER_ADD: string; + + type AfterRemoveEvent = { + /** + * An array of the object(s) that were removed. May be a single body, constraint, composite or a mixture of these. + */ + object: any[]; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics After Remove Event. + * + * This event is dispatched by a Matter Physics World instance at the end of the process when a + * Body or Constraint was removed from the world. + * + * Listen to it from a Scene using: `this.matter.world.on('afterremove', listener)`. + */ + const AFTER_REMOVE: string; + + type AfterUpdateEvent = { + /** + * The Matter Engine `timing.timestamp` value for the event. + */ + timestamp: number; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics After Update Event. + * + * This event is dispatched by a Matter Physics World instance after the engine has updated and all collision events have resolved. + * + * Listen to it from a Scene using: `this.matter.world.on('afterupdate', listener)`. + */ + const AFTER_UPDATE: string; + + type BeforeAddEvent = { + /** + * An array of the object(s) to be added. May be a single body, constraint, composite or a mixture of these. + */ + object: any[]; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Before Add Event. + * + * This event is dispatched by a Matter Physics World instance at the start of the process when a new Body + * or Constraint is being added to the world. + * + * Listen to it from a Scene using: `this.matter.world.on('beforeadd', listener)`. + */ + const BEFORE_ADD: string; + + type BeforeRemoveEvent = { + /** + * An array of the object(s) to be removed. May be a single body, constraint, composite or a mixture of these. + */ + object: any[]; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Before Remove Event. + * + * This event is dispatched by a Matter Physics World instance at the start of the process when a + * Body or Constraint is being removed from the world. + * + * Listen to it from a Scene using: `this.matter.world.on('beforeremove', listener)`. + */ + const BEFORE_REMOVE: string; + + type BeforeUpdateEvent = { + /** + * The Matter Engine `timing.timestamp` value for the event. + */ + timestamp: number; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Before Update Event. + * + * This event is dispatched by a Matter Physics World instance right before all the collision processing takes place. + * + * Listen to it from a Scene using: `this.matter.world.on('beforeupdate', listener)`. + */ + const BEFORE_UPDATE: string; + + type CollisionActiveEvent = { + /** + * A list of all affected pairs in the collision. + */ + pairs: Phaser.Types.Physics.Matter.MatterCollisionData[]; + /** + * The Matter Engine `timing.timestamp` value for the event. + */ + timestamp: number; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Collision Active Event. + * + * This event is dispatched by a Matter Physics World instance after the engine has updated. + * It provides a list of all pairs that are colliding in the current tick (if any). + * + * Listen to it from a Scene using: `this.matter.world.on('collisionactive', listener)`. + */ + const COLLISION_ACTIVE: string; + + type CollisionEndEvent = { + /** + * A list of all affected pairs in the collision. + */ + pairs: Phaser.Types.Physics.Matter.MatterCollisionData[]; + /** + * The Matter Engine `timing.timestamp` value for the event. + */ + timestamp: number; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Collision End Event. + * + * This event is dispatched by a Matter Physics World instance after the engine has updated. + * It provides a list of all pairs that have finished colliding in the current tick (if any). + * + * Listen to it from a Scene using: `this.matter.world.on('collisionend', listener)`. + */ + const COLLISION_END: string; + + type CollisionStartEvent = { + /** + * A list of all affected pairs in the collision. + */ + pairs: Phaser.Types.Physics.Matter.MatterCollisionData[]; + /** + * The Matter Engine `timing.timestamp` value for the event. + */ + timestamp: number; + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Collision Start Event. + * + * This event is dispatched by a Matter Physics World instance after the engine has updated. + * It provides a list of all pairs that have started to collide in the current tick (if any). + * + * Listen to it from a Scene using: `this.matter.world.on('collisionstart', listener)`. + */ + const COLLISION_START: string; + + /** + * The Matter Physics Drag End Event. + * + * This event is dispatched by a Matter Physics World instance when a Pointer Constraint + * stops dragging a body. + * + * Listen to it from a Scene using: `this.matter.world.on('dragend', listener)`. + */ + const DRAG_END: string; + + /** + * The Matter Physics Drag Event. + * + * This event is dispatched by a Matter Physics World instance when a Pointer Constraint + * is actively dragging a body. It is emitted each time the pointer moves. + * + * Listen to it from a Scene using: `this.matter.world.on('drag', listener)`. + */ + const DRAG: string; + + /** + * The Matter Physics Drag Start Event. + * + * This event is dispatched by a Matter Physics World instance when a Pointer Constraint + * starts dragging a body. + * + * Listen to it from a Scene using: `this.matter.world.on('dragstart', listener)`. + */ + const DRAG_START: string; + + /** + * The Matter Physics World Pause Event. + * + * This event is dispatched by an Matter Physics World instance when it is paused. + * + * Listen to it from a Scene using: `this.matter.world.on('pause', listener)`. + */ + const PAUSE: string; + + /** + * The Matter Physics World Resume Event. + * + * This event is dispatched by an Matter Physics World instance when it resumes from a paused state. + * + * Listen to it from a Scene using: `this.matter.world.on('resume', listener)`. + */ + const RESUME: string; + + type SleepEndEvent = { + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Sleep End Event. + * + * This event is dispatched by a Matter Physics World instance when a Body stop sleeping. + * + * Listen to it from a Scene using: `this.matter.world.on('sleepend', listener)`. + */ + const SLEEP_END: string; + + type SleepStartEvent = { + /** + * The source object of the event. + */ + source: any; + /** + * The name of the event. + */ + name: string; + }; + + /** + * The Matter Physics Sleep Start Event. + * + * This event is dispatched by a Matter Physics World instance when a Body goes to sleep. + * + * Listen to it from a Scene using: `this.matter.world.on('sleepstart', listener)`. + */ + const SLEEP_START: string; + + } + + /** + * The Matter Factory is responsible for quickly creating a variety of different types of + * bodies, constraints and Game Objects and adding them into the physics world. + * + * You access the factory from within a Scene using `add`: + * + * ```javascript + * this.matter.add.rectangle(x, y, width, height); + * ``` + * + * Use of the Factory is optional. All of the objects it creates can also be created + * directly via your own code or constructors. It is provided as a means to keep your + * code concise. + */ + class Factory { + /** + * + * @param world The Matter World which this Factory adds to. + */ + constructor(world: Phaser.Physics.Matter.World); + + /** + * The Matter World which this Factory adds to. + */ + world: Phaser.Physics.Matter.World; + + /** + * The Scene which this Factory's Matter World belongs to. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene.Systems this Matter Physics instance belongs to. + */ + sys: Phaser.Scenes.Systems; + + /** + * Creates a new rigid rectangular Body and adds it to the World. + * @param x The X coordinate of the center of the Body. + * @param y The Y coordinate of the center of the Body. + * @param width The width of the Body. + * @param height The height of the Body. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + rectangle(x: number, y: number, width: number, height: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.BodyType; + + /** + * Creates a new rigid trapezoidal Body and adds it to the World. + * @param x The X coordinate of the center of the Body. + * @param y The Y coordinate of the center of the Body. + * @param width The width of the trapezoid Body. + * @param height The height of the trapezoid Body. + * @param slope The slope of the trapezoid. 0 creates a rectangle, while 1 creates a triangle. Positive values make the top side shorter, while negative values make the bottom side shorter. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + trapezoid(x: number, y: number, width: number, height: number, slope: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.BodyType; + + /** + * Creates a new rigid circular Body and adds it to the World. + * @param x The X coordinate of the center of the Body. + * @param y The Y coordinate of the center of the Body. + * @param radius The radius of the circle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + * @param maxSides The maximum amount of sides to use for the polygon which will approximate this circle. + */ + circle(x: number, y: number, radius: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig, maxSides?: number): MatterJS.BodyType; + + /** + * Creates a new rigid polygonal Body and adds it to the World. + * @param x The X coordinate of the center of the Body. + * @param y The Y coordinate of the center of the Body. + * @param sides The number of sides the polygon will have. + * @param radius The "radius" of the polygon, i.e. the distance from its center to any vertex. This is also the radius of its circumcircle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + polygon(x: number, y: number, sides: number, radius: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.BodyType; + + /** + * Creates a body using the supplied vertices (or an array containing multiple sets of vertices) and adds it to the World. + * If the vertices are convex, they will pass through as supplied. Otherwise, if the vertices are concave, they will be decomposed. Note that this process is not guaranteed to support complex sets of vertices, e.g. ones with holes. + * @param x The X coordinate of the center of the Body. + * @param y The Y coordinate of the center of the Body. + * @param vertexSets The vertices data. Either a path string or an array of vertices. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + * @param flagInternal Flag internal edges (coincident part edges) Default false. + * @param removeCollinear Whether Matter.js will discard collinear edges (to improve performance). Default 0.01. + * @param minimumArea During decomposition discard parts that have an area less than this. Default 10. + */ + fromVertices(x: number, y: number, vertexSets: string | any[], options?: Phaser.Types.Physics.Matter.MatterBodyConfig, flagInternal?: boolean, removeCollinear?: number, minimumArea?: number): MatterJS.BodyType; + + /** + * Creates a body using data exported from the application PhysicsEditor (https://www.codeandweb.com/physicseditor) + * + * The PhysicsEditor file should be loaded as JSON: + * + * ```javascript + * preload () + * { + * this.load.json('vehicles', 'assets/vehicles.json); + * } + * + * create () + * { + * const vehicleShapes = this.cache.json.get('vehicles'); + * this.matter.add.fromPhysicsEditor(400, 300, vehicleShapes.truck); + * } + * ``` + * + * Do not pass the entire JSON file to this method, but instead pass one of the shapes contained within it. + * + * If you pas in an `options` object, any settings in there will override those in the PhysicsEditor config object. + * @param x The horizontal world location of the body. + * @param y The vertical world location of the body. + * @param config The JSON data exported from PhysicsEditor. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + * @param addToWorld Should the newly created body be immediately added to the World? Default true. + */ + fromPhysicsEditor(x: number, y: number, config: any, options?: Phaser.Types.Physics.Matter.MatterBodyConfig, addToWorld?: boolean): MatterJS.BodyType; + + /** + * Creates a body using the path data from an SVG file. + * + * SVG Parsing requires the pathseg polyfill from https://github.com/progers/pathseg + * + * The SVG file should be loaded as XML, as this method requires the ability to extract + * the path data from it. I.e.: + * + * ```javascript + * preload () + * { + * this.load.xml('face', 'assets/face.svg); + * } + * + * create () + * { + * this.matter.add.fromSVG(400, 300, this.cache.xml.get('face')); + * } + * ``` + * @param x The X coordinate of the body. + * @param y The Y coordinate of the body. + * @param xml The SVG Path data. + * @param scale Scale the vertices by this amount after creation. Default 1. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + * @param addToWorld Should the newly created body be immediately added to the World? Default true. + */ + fromSVG(x: number, y: number, xml: object, scale?: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig, addToWorld?: boolean): MatterJS.BodyType; + + /** + * Creates a body using the supplied physics data, as provided by a JSON file. + * + * The data file should be loaded as JSON: + * + * ```javascript + * preload () + * { + * this.load.json('ninjas', 'assets/ninjas.json); + * } + * + * create () + * { + * const ninjaShapes = this.cache.json.get('ninjas'); + * + * this.matter.add.fromJSON(400, 300, ninjaShapes.shinobi); + * } + * ``` + * + * Do not pass the entire JSON file to this method, but instead pass one of the shapes contained within it. + * + * If you pas in an `options` object, any settings in there will override those in the config object. + * + * The structure of the JSON file is as follows: + * + * ```text + * { + * 'generator_info': // The name of the application that created the JSON data + * 'shapeName': { + * 'type': // The type of body + * 'label': // Optional body label + * 'vertices': // An array, or an array of arrays, containing the vertex data in x/y object pairs + * } + * } + * ``` + * + * At the time of writing, only the Phaser Physics Tracer App exports in this format. + * @param x The X coordinate of the body. + * @param y The Y coordinate of the body. + * @param config The JSON physics data. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + * @param addToWorld Should the newly created body be immediately added to the World? Default true. + */ + fromJSON(x: number, y: number, config: any, options?: Phaser.Types.Physics.Matter.MatterBodyConfig, addToWorld?: boolean): MatterJS.BodyType; + + /** + * Create a new composite containing Matter Image objects created in a grid arrangement. + * This function uses the body bounds to prevent overlaps. + * @param key The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. Set to `null` to skip this value. + * @param x The horizontal position of this composite in the world. + * @param y The vertical position of this composite in the world. + * @param columns The number of columns in the grid. + * @param rows The number of rows in the grid. + * @param columnGap The distance between each column. Default 0. + * @param rowGap The distance between each row. Default 0. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + imageStack(key: string, frame: string | number, x: number, y: number, columns: number, rows: number, columnGap?: number, rowGap?: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.CompositeType; + + /** + * Create a new composite containing bodies created in the callback in a grid arrangement. + * + * This function uses the body bounds to prevent overlaps. + * @param x The horizontal position of this composite in the world. + * @param y The vertical position of this composite in the world. + * @param columns The number of columns in the grid. + * @param rows The number of rows in the grid. + * @param columnGap The distance between each column. + * @param rowGap The distance between each row. + * @param callback The callback that creates the stack. + */ + stack(x: number, y: number, columns: number, rows: number, columnGap: number, rowGap: number, callback: Function): MatterJS.CompositeType; + + /** + * Create a new composite containing bodies created in the callback in a pyramid arrangement. + * This function uses the body bounds to prevent overlaps. + * @param x The horizontal position of this composite in the world. + * @param y The vertical position of this composite in the world. + * @param columns The number of columns in the pyramid. + * @param rows The number of rows in the pyramid. + * @param columnGap The distance between each column. + * @param rowGap The distance between each row. + * @param callback The callback function to be invoked. + */ + pyramid(x: number, y: number, columns: number, rows: number, columnGap: number, rowGap: number, callback: Function): MatterJS.CompositeType; + + /** + * Chains all bodies in the given composite together using constraints. + * @param composite The composite in which all bodies will be chained together sequentially. + * @param xOffsetA The horizontal offset of the BodyA constraint. This is a percentage based on the body size, not a world position. + * @param yOffsetA The vertical offset of the BodyA constraint. This is a percentage based on the body size, not a world position. + * @param xOffsetB The horizontal offset of the BodyB constraint. This is a percentage based on the body size, not a world position. + * @param yOffsetB The vertical offset of the BodyB constraint. This is a percentage based on the body size, not a world position. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + chain(composite: MatterJS.CompositeType, xOffsetA: number, yOffsetA: number, xOffsetB: number, yOffsetB: number, options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.CompositeType; + + /** + * Connects bodies in the composite with constraints in a grid pattern, with optional cross braces. + * @param composite The composite in which all bodies will be chained together. + * @param columns The number of columns in the mesh. + * @param rows The number of rows in the mesh. + * @param crossBrace Create cross braces for the mesh as well? + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + mesh(composite: MatterJS.CompositeType, columns: number, rows: number, crossBrace: boolean, options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.CompositeType; + + /** + * Creates a composite with a Newton's Cradle setup of bodies and constraints. + * @param x The horizontal position of the start of the cradle. + * @param y The vertical position of the start of the cradle. + * @param number The number of balls in the cradle. + * @param size The radius of each ball in the cradle. + * @param length The length of the 'string' the balls hang from. + */ + newtonsCradle(x: number, y: number, number: number, size: number, length: number): MatterJS.CompositeType; + + /** + * Creates a composite with simple car setup of bodies and constraints. + * @param x The horizontal position of the car in the world. + * @param y The vertical position of the car in the world. + * @param width The width of the car chasis. + * @param height The height of the car chasis. + * @param wheelSize The radius of the car wheels. + */ + car(x: number, y: number, width: number, height: number, wheelSize: number): MatterJS.CompositeType; + + /** + * Creates a simple soft body like object. + * @param x The horizontal position of this composite in the world. + * @param y The vertical position of this composite in the world. + * @param columns The number of columns in the Composite. + * @param rows The number of rows in the Composite. + * @param columnGap The distance between each column. + * @param rowGap The distance between each row. + * @param crossBrace `true` to create cross braces between the bodies, or `false` to create just straight braces. + * @param particleRadius The radius of this circlular composite. + * @param particleOptions An optional Body configuration object that is used to set initial Body properties on creation. + * @param constraintOptions An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + softBody(x: number, y: number, columns: number, rows: number, columnGap: number, rowGap: number, crossBrace: boolean, particleRadius: number, particleOptions?: Phaser.Types.Physics.Matter.MatterBodyConfig, constraintOptions?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.CompositeType; + + /** + * This method is an alias for `Factory.constraint`. + * + * Constraints (or joints) are used for specifying that a fixed distance must be maintained + * between two bodies, or a body and a fixed world-space position. + * + * The stiffness of constraints can be modified to create springs or elastic. + * + * To simulate a revolute constraint (or pin joint) set `length: 0` and a high `stiffness` + * value (e.g. `0.7` or above). + * + * If the constraint is unstable, try lowering the `stiffness` value and / or increasing + * `constraintIterations` within the Matter Config. + * + * For compound bodies, constraints must be applied to the parent body and not one of its parts. + * @param bodyA The first possible `Body` that this constraint is attached to. + * @param bodyB The second possible `Body` that this constraint is attached to. + * @param length A Number that specifies the target resting length of the constraint. If not given it is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`. + * @param stiffness A Number that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`. A value of `1` means the constraint should be very stiff. A value of `0.2` means the constraint acts as a soft spring. Default 1. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + joint(bodyA: MatterJS.BodyType, bodyB: MatterJS.BodyType, length?: number, stiffness?: number, options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.ConstraintType; + + /** + * This method is an alias for `Factory.constraint`. + * + * Constraints (or joints) are used for specifying that a fixed distance must be maintained + * between two bodies, or a body and a fixed world-space position. + * + * The stiffness of constraints can be modified to create springs or elastic. + * + * To simulate a revolute constraint (or pin joint) set `length: 0` and a high `stiffness` + * value (e.g. `0.7` or above). + * + * If the constraint is unstable, try lowering the `stiffness` value and / or increasing + * `constraintIterations` within the Matter Config. + * + * For compound bodies, constraints must be applied to the parent body and not one of its parts. + * @param bodyA The first possible `Body` that this constraint is attached to. + * @param bodyB The second possible `Body` that this constraint is attached to. + * @param length A Number that specifies the target resting length of the constraint. If not given it is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`. + * @param stiffness A Number that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`. A value of `1` means the constraint should be very stiff. A value of `0.2` means the constraint acts as a soft spring. Default 1. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + spring(bodyA: MatterJS.BodyType, bodyB: MatterJS.BodyType, length?: number, stiffness?: number, options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.ConstraintType; + + /** + * Constraints (or joints) are used for specifying that a fixed distance must be maintained + * between two bodies, or a body and a fixed world-space position. + * + * The stiffness of constraints can be modified to create springs or elastic. + * + * To simulate a revolute constraint (or pin joint) set `length: 0` and a high `stiffness` + * value (e.g. `0.7` or above). + * + * If the constraint is unstable, try lowering the `stiffness` value and / or increasing + * `constraintIterations` within the Matter Config. + * + * For compound bodies, constraints must be applied to the parent body and not one of its parts. + * @param bodyA The first possible `Body` that this constraint is attached to. + * @param bodyB The second possible `Body` that this constraint is attached to. + * @param length A Number that specifies the target resting length of the constraint. If not given it is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`. + * @param stiffness A Number that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`. A value of `1` means the constraint should be very stiff. A value of `0.2` means the constraint acts as a soft spring. Default 1. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + constraint(bodyA: MatterJS.BodyType, bodyB: MatterJS.BodyType, length?: number, stiffness?: number, options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.ConstraintType; + + /** + * Constraints (or joints) are used for specifying that a fixed distance must be maintained + * between two bodies, or a body and a fixed world-space position. + * + * A world constraint has only one body, you should specify a `pointA` position in + * the constraint options parameter to attach the constraint to the world. + * + * The stiffness of constraints can be modified to create springs or elastic. + * + * To simulate a revolute constraint (or pin joint) set `length: 0` and a high `stiffness` + * value (e.g. `0.7` or above). + * + * If the constraint is unstable, try lowering the `stiffness` value and / or increasing + * `constraintIterations` within the Matter Config. + * + * For compound bodies, constraints must be applied to the parent body and not one of its parts. + * @param body The Matter `Body` that this constraint is attached to. + * @param length A number that specifies the target resting length of the constraint. If not given it is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`. + * @param stiffness A Number that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`. A value of `1` means the constraint should be very stiff. A value of `0.2` means the constraint acts as a soft spring. Default 1. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + worldConstraint(body: MatterJS.BodyType, length?: number, stiffness?: number, options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.ConstraintType; + + /** + * This method is an alias for `Factory.pointerConstraint`. + * + * A Pointer Constraint is a special type of constraint that allows you to click + * and drag bodies in a Matter World. It monitors the active Pointers in a Scene, + * and when one is pressed down it checks to see if that hit any part of any active + * body in the world. If it did, and the body has input enabled, it will begin to + * drag it until either released, or you stop it via the `stopDrag` method. + * + * You can adjust the stiffness, length and other properties of the constraint via + * the `options` object on creation. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + mouseSpring(options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.ConstraintType; + + /** + * A Pointer Constraint is a special type of constraint that allows you to click + * and drag bodies in a Matter World. It monitors the active Pointers in a Scene, + * and when one is pressed down it checks to see if that hit any part of any active + * body in the world. If it did, and the body has input enabled, it will begin to + * drag it until either released, or you stop it via the `stopDrag` method. + * + * You can adjust the stiffness, length and other properties of the constraint via + * the `options` object on creation. + * @param options An optional Constraint configuration object that is used to set initial Constraint properties on creation. + */ + pointerConstraint(options?: Phaser.Types.Physics.Matter.MatterConstraintConfig): MatterJS.ConstraintType; + + /** + * Creates a Matter Physics Image Game Object. + * + * An Image is a light-weight Game Object useful for the display of static images in your game, + * such as logos, backgrounds, scenery or other non-animated elements. Images can have input + * events and physics bodies, or be tweened, tinted or scrolled. The main difference between an + * Image and a Sprite is that you cannot animate an Image as they do not have the Animation component. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param key The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. Set to `null` to skip this value. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + image(x: number, y: number, key: string, frame?: string | number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): Phaser.Physics.Matter.Image; + + /** + * Creates a wrapper around a Tile that provides access to a corresponding Matter body. A tile can only + * have one Matter body associated with it. You can either pass in an existing Matter body for + * the tile or allow the constructor to create the corresponding body for you. If the Tile has a + * collision group (defined in Tiled), those shapes will be used to create the body. If not, the + * tile's rectangle bounding box will be used. + * + * The corresponding body will be accessible on the Tile itself via Tile.physics.matterBody. + * + * Note: not all Tiled collision shapes are supported. See + * Phaser.Physics.Matter.TileBody#setFromTileCollision for more information. + * @param tile The target tile that should have a Matter body. + * @param options Options to be used when creating the Matter body. + */ + tileBody(tile: Phaser.Tilemaps.Tile, options?: Phaser.Types.Physics.Matter.MatterTileOptions): Phaser.Physics.Matter.TileBody; + + /** + * Creates a Matter Physics Sprite Game Object. + * + * A Sprite Game Object is used for the display of both static and animated images in your game. + * Sprites can have input events and physics bodies. They can also be tweened, tinted, scrolled + * and animated. + * + * The main difference between a Sprite and an Image Game Object is that you cannot animate Images. + * As such, Sprites take a fraction longer to process and have a larger API footprint due to the Animation + * Component. If you do not require animation then you can safely use Images to replace Sprites in all cases. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param key The key of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. Set to `null` to skip this value. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + sprite(x: number, y: number, key: string, frame?: string | number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): Phaser.Physics.Matter.Sprite; + + /** + * Takes an existing Game Object and injects all of the Matter Components into it. + * + * This enables you to use component methods such as `setVelocity` or `isSensor` directly from + * this Game Object. + * + * You can also pass in either a Matter Body Configuration object, or a Matter Body instance + * to link with this Game Object. + * @param gameObject The Game Object to inject the Matter Components in to. + * @param options A Matter Body configuration object, or an instance of a Matter Body. + * @param addToWorld Add this Matter Body to the World? Default true. + */ + gameObject(gameObject: Phaser.GameObjects.GameObject, options?: Phaser.Types.Physics.Matter.MatterBodyConfig | MatterJS.Body, addToWorld?: boolean): Phaser.Physics.Matter.Image | Phaser.Physics.Matter.Sprite | Phaser.GameObjects.GameObject; + + /** + * Destroys this Factory. + */ + destroy(): void; + + } + + /** + * A Matter Game Object is a generic object that allows you to combine any Phaser Game Object, + * including those you have extended or created yourself, with all of the Matter Components. + * + * This enables you to use component methods such as `setVelocity` or `isSensor` directly from + * this Game Object. + * @param world The Matter world to add the body to. + * @param gameObject The Game Object that will have the Matter body applied to it. + * @param options A Matter Body configuration object, or an instance of a Matter Body. + * @param addToWorld Should the newly created body be immediately added to the World? Default true. + */ + function MatterGameObject(world: Phaser.Physics.Matter.World, gameObject: Phaser.GameObjects.GameObject, options?: Phaser.Types.Physics.Matter.MatterBodyConfig | MatterJS.Body, addToWorld?: boolean): Phaser.GameObjects.GameObject; + + /** + * A Matter Physics Image Game Object. + * + * An Image is a light-weight Game Object useful for the display of static images in your game, + * such as logos, backgrounds, scenery or other non-animated elements. Images can have input + * events and physics bodies, or be tweened, tinted or scrolled. The main difference between an + * Image and a Sprite is that you cannot animate an Image as they do not have the Animation component. + */ + class Image extends Phaser.GameObjects.Image implements Phaser.Physics.Matter.Components.Bounce, Phaser.Physics.Matter.Components.Collision, Phaser.Physics.Matter.Components.Force, Phaser.Physics.Matter.Components.Friction, Phaser.Physics.Matter.Components.Gravity, Phaser.Physics.Matter.Components.Mass, Phaser.Physics.Matter.Components.Sensor, Phaser.Physics.Matter.Components.SetBody, Phaser.Physics.Matter.Components.Sleep, Phaser.Physics.Matter.Components.Static, Phaser.Physics.Matter.Components.Transform, Phaser.Physics.Matter.Components.Velocity, Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param world A reference to the Matter.World instance that this body belongs to. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + constructor(world: Phaser.Physics.Matter.World, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig); + + /** + * A reference to the Matter.World instance that this body belongs to. + */ + world: Phaser.Physics.Matter.World; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * Sets the restitution on the physics object. + * @param value A Number that defines the restitution (elasticity) of the body. The value is always positive and is in the range (0, 1). A value of 0 means collisions may be perfectly inelastic and no bouncing may occur. A value of 0.8 means the body may bounce back with approximately 80% of its kinetic energy. Note that collision response is based on pairs of bodies, and that restitution values are combined with the following formula: `Math.max(bodyA.restitution, bodyB.restitution)` + */ + setBounce(value: number): this; + + /** + * Sets the collision category of this Game Object's Matter Body. This number must be a power of two between 2^0 (= 1) and 2^31. + * Two bodies with different collision groups (see {@link #setCollisionGroup}) will only collide if their collision + * categories are included in their collision masks (see {@link #setCollidesWith}). + * @param value Unique category bitfield. + */ + setCollisionCategory(value: number): this; + + /** + * Sets the collision group of this Game Object's Matter Body. If this is zero or two Matter Bodies have different values, + * they will collide according to the usual rules (see {@link #setCollisionCategory} and {@link #setCollisionGroup}). + * If two Matter Bodies have the same positive value, they will always collide; if they have the same negative value, + * they will never collide. + * @param value Unique group index. + */ + setCollisionGroup(value: number): this; + + /** + * Sets the collision mask for this Game Object's Matter Body. Two Matter Bodies with different collision groups will only + * collide if each one includes the other's category in its mask based on a bitwise AND, i.e. `(categoryA & maskB) !== 0` + * and `(categoryB & maskA) !== 0` are both true. + * @param categories A unique category bitfield, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body starts colliding with another. + */ + setOnCollide(callback: Function): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body stops colliding with another. + */ + setOnCollideEnd(callback: Function): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke for the duration of this body colliding with another. + */ + setOnCollideActive(callback: Function): this; + + /** + * The callback is sent a reference to the other body, along with a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param body The body, or an array of bodies, to test for collisions with. + * @param callback The callback to invoke when this body collides with the given body or bodies. + */ + setOnCollideWith(body: MatterJS.Body | MatterJS.Body[], callback: Function): this; + + /** + * Applies a force to a body. + * @param force A Vector that specifies the force to apply. + */ + applyForce(force: Phaser.Math.Vector2): this; + + /** + * Applies a force to a body from a given position. + * @param position The position in which the force comes from. + * @param force A Vector that specifies the force to apply. + */ + applyForceFrom(position: Phaser.Math.Vector2, force: Phaser.Math.Vector2): this; + + /** + * Apply thrust to the forward position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrust(speed: number): this; + + /** + * Apply thrust to the left position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustLeft(speed: number): this; + + /** + * Apply thrust to the right position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustRight(speed: number): this; + + /** + * Apply thrust to the back position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustBack(speed: number): this; + + /** + * Sets new friction values for this Game Object's Matter Body. + * @param value The new friction of the body, between 0 and 1, where 0 allows the Body to slide indefinitely, while 1 allows it to stop almost immediately after a force is applied. + * @param air If provided, the new air resistance of the Body. The higher the value, the faster the Body will slow as it moves through space. 0 means the body has no air resistance. + * @param fstatic If provided, the new static friction of the Body. The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. 0 means the body will never "stick" when it is nearly stationary. + */ + setFriction(value: number, air?: number, fstatic?: number): this; + + /** + * Sets a new air resistance for this Game Object's Matter Body. + * A value of 0 means the Body will never slow as it moves through space. + * The higher the value, the faster a Body slows when moving through space. + * @param value The new air resistance for the Body. + */ + setFrictionAir(value: number): this; + + /** + * Sets a new static friction for this Game Object's Matter Body. + * A value of 0 means the Body will never "stick" when it is nearly stationary. + * The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. + * @param value The new static friction for the Body. + */ + setFrictionStatic(value: number): this; + + /** + * A togglable function for ignoring world gravity in real-time on the current body. + * @param value Set to true to ignore the effect of world gravity, or false to not ignore it. + */ + setIgnoreGravity(value: boolean): this; + + /** + * Sets the mass of the Game Object's Matter Body. + * @param value The new mass of the body. + */ + setMass(value: number): this; + + /** + * Sets density of the body. + * @param value The new density of the body. + */ + setDensity(value: number): this; + + /** + * The body's center of mass. + * + * Calling this creates a new `Vector2 each time to avoid mutation. + * + * If you only need to read the value and won't change it, you can get it from `GameObject.body.centerOfMass`. + */ + readonly centerOfMass: Phaser.Math.Vector2; + + /** + * Set the body belonging to this Game Object to be a sensor. + * Sensors trigger collision events, but don't react with colliding body physically. + * @param value `true` to set the body as a sensor, or `false` to disable it. + */ + setSensor(value: boolean): this; + + /** + * Is the body belonging to this Game Object a sensor or not? + */ + isSensor(): boolean; + + /** + * Set this Game Objects Matter physics body to be a rectangle shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param width Width of the rectangle. + * @param height Height of the rectangle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setRectangle(width: number, height: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Objects Matter physics body to be a circle shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param radius The radius of the circle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setCircle(radius: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Objects Matter physics body to be a polygon shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param radius The "radius" of the polygon, i.e. the distance from its center to any vertex. This is also the radius of its circumcircle. + * @param sides The number of sides the polygon will have. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setPolygon(radius: number, sides: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Objects Matter physics body to be a trapezoid shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param width The width of the trapezoid Body. + * @param height The height of the trapezoid Body. + * @param slope The slope of the trapezoid. 0 creates a rectangle, while 1 creates a triangle. Positive values make the top side shorter, while negative values make the bottom side shorter. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setTrapezoid(width: number, height: number, slope: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Object to use the given existing Matter Body. + * + * The body is first removed from the world before being added to this Game Object. + * @param body The Body this Game Object should use. + * @param addToWorld Should the body be immediately added to the World? Default true. + */ + setExistingBody(body: MatterJS.BodyType, addToWorld?: boolean): this; + + /** + * Set this Game Object to create and use a new Body based on the configuration object given. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param config Either a string, such as `circle`, or a Matter Set Body Configuration object. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setBody(config: string | Phaser.Types.Physics.Matter.MatterSetBodyConfig, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Sets this Body to sleep. + */ + setToSleep(): this; + + /** + * Wakes this Body if asleep. + */ + setAwake(): this; + + /** + * Sets the number of updates in which this body must have near-zero velocity before it is set as sleeping (if sleeping is enabled by the engine). + * @param value A `Number` that defines the number of updates in which this body must have near-zero velocity before it is set as sleeping. Default 60. + */ + setSleepThreshold(value?: number): this; + + /** + * Enable sleep and wake events for this body. + * + * By default when a body goes to sleep, or wakes up, it will not emit any events. + * + * The events are emitted by the Matter World instance and can be listened to via + * the `SLEEP_START` and `SLEEP_END` events. + * @param start `true` if you want the sleep start event to be emitted for this body. + * @param end `true` if you want the sleep end event to be emitted for this body. + */ + setSleepEvents(start: boolean, end: boolean): this; + + /** + * Enables or disables the Sleep Start event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepStartEvent(value: boolean): this; + + /** + * Enables or disables the Sleep End event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepEndEvent(value: boolean): this; + + /** + * Changes the physics body to be either static `true` or dynamic `false`. + * @param value `true` to set the body as being static, or `false` to make it dynamic. + */ + setStatic(value: boolean): this; + + /** + * Returns `true` if the body is static, otherwise `false` for a dynamic body. + */ + isStatic(): boolean; + + /** + * Setting fixed rotation sets the Body inertia to Infinity, which stops it + * from being able to rotate when forces are applied to it. + */ + setFixedRotation(): this; + + /** + * Sets the horizontal velocity of the physics body. + * @param x The horizontal velocity value. + */ + setVelocityX(x: number): this; + + /** + * Sets vertical velocity of the physics body. + * @param y The vertical velocity value. + */ + setVelocityY(y: number): this; + + /** + * Sets both the horizontal and vertical velocity of the physics body. + * @param x The horizontal velocity value. + * @param y The vertical velocity value, it can be either positive or negative. If not given, it will be the same as the `x` value. Default x. + */ + setVelocity(x: number, y?: number): this; + + /** + * Gets the current linear velocity of the physics body. + */ + getVelocity(): Phaser.Types.Math.Vector2Like; + + /** + * Sets the angular velocity of the body instantly. + * Position, angle, force etc. are unchanged. + * @param velocity The angular velocity. + */ + setAngularVelocity(velocity: number): this; + + /** + * Gets the current rotational velocity of the body. + */ + getAngularVelocity(): number; + + /** + * Sets the current rotational speed of the body. + * Direction is maintained. Affects body angular velocity. + * @param speed The angular speed. + */ + setAngularSpeed(speed: number): this; + + /** + * Gets the current rotational speed of the body. + * Equivalent to the magnitude of its angular velocity. + */ + getAngularSpeed(): number; + + } + + /** + * The Phaser Matter plugin provides the ability to use the Matter JS Physics Engine within your Phaser games. + * + * Unlike Arcade Physics, the other physics system provided with Phaser, Matter JS is a full-body physics system. + * It features: + * + * * Rigid bodies + * * Compound bodies + * * Composite bodies + * * Concave and convex hulls + * * Physical properties (mass, area, density etc.) + * * Restitution (elastic and inelastic collisions) + * * Collisions (broad-phase, mid-phase and narrow-phase) + * * Stable stacking and resting + * * Conservation of momentum + * * Friction and resistance + * * Constraints + * * Gravity + * * Sleeping and static bodies + * * Rounded corners (chamfering) + * * Views (translate, zoom) + * * Collision queries (raycasting, region tests) + * * Time scaling (slow-mo, speed-up) + * + * Configuration of Matter is handled via the Matter World Config object, which can be passed in either the + * Phaser Game Config, or Phaser Scene Config. Here is a basic example: + * + * ```js + * physics: { + * default: 'matter', + * matter: { + * enableSleeping: true, + * gravity: { + * y: 0 + * }, + * debug: { + * showBody: true, + * showStaticBody: true + * } + * } + * } + * ``` + * + * This class acts as an interface between a Phaser Scene and a single instance of the Matter Engine. + * + * Use it to access the most common Matter features and helper functions. + * + * You can find details, documentation and examples on the Matter JS website: https://brm.io/matter-js/ + */ + class MatterPhysics { + /** + * + * @param scene The Phaser Scene that owns this Matter Physics instance. + */ + constructor(scene: Phaser.Scene); + + /** + * The Phaser Scene that owns this Matter Physics instance + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene Systems that belong to the Scene owning this Matter Physics instance. + */ + systems: Phaser.Scenes.Systems; + + /** + * The parsed Matter Configuration object. + */ + config: Phaser.Types.Physics.Matter.MatterWorldConfig; + + /** + * An instance of the Matter World class. This class is responsible for the updating of the + * Matter Physics world, as well as handling debug drawing functions. + */ + world: Phaser.Physics.Matter.World; + + /** + * An instance of the Matter Factory. This class provides lots of functions for creating a + * wide variety of physics objects and adds them automatically to the Matter World. + * + * You can use this class to cut-down on the amount of code required in your game, however, + * use of the Factory is entirely optional and should be seen as a development aid. It's + * perfectly possible to create and add components to the Matter world without using it. + */ + add: Phaser.Physics.Matter.Factory; + + /** + * An instance of the Body Bounds class. This class contains functions used for getting the + * world position from various points around the bounds of a physics body. + */ + bodyBounds: Phaser.Physics.Matter.BodyBounds; + + /** + * A reference to the `Matter.Body` module. + * + * The `Matter.Body` module contains methods for creating and manipulating body models. + * A `Matter.Body` is a rigid body that can be simulated by a `Matter.Engine`. + * Factories for commonly used body configurations (such as rectangles, circles and other polygons) can be found in the `Bodies` module. + */ + body: MatterJS.BodyFactory; + + /** + * A reference to the `Matter.Composite` module. + * + * The `Matter.Composite` module contains methods for creating and manipulating composite bodies. + * A composite body is a collection of `Matter.Body`, `Matter.Constraint` and other `Matter.Composite`, therefore composites form a tree structure. + * It is important to use the functions in this module to modify composites, rather than directly modifying their properties. + * Note that the `Matter.World` object is also a type of `Matter.Composite` and as such all composite methods here can also operate on a `Matter.World`. + */ + composite: MatterJS.CompositeFactory; + + /** + * A reference to the `Matter.Collision` module. + * + * The `Matter.Collision` module contains methods for detecting collisions between a given pair of bodies. + * + * For efficient detection between a list of bodies, see `Matter.Detector` and `Matter.Query`. + */ + collision: MatterJS.Collision; + + /** + * A reference to the `Matter.Detector` module. + * + * The `Matter.Detector` module contains methods for detecting collisions given a set of pairs. + */ + detector: MatterJS.DetectorFactory; + + /** + * A reference to the `Matter.Pair` module. + * + * The `Matter.Pair` module contains methods for creating and manipulating collision pairs. + */ + pair: MatterJS.PairFactory; + + /** + * A reference to the `Matter.Pairs` module. + * + * The `Matter.Pairs` module contains methods for creating and manipulating collision pair sets. + */ + pairs: MatterJS.PairsFactory; + + /** + * A reference to the `Matter.Query` module. + * + * The `Matter.Query` module contains methods for performing collision queries. + */ + query: MatterJS.QueryFactory; + + /** + * A reference to the `Matter.Resolver` module. + * + * The `Matter.Resolver` module contains methods for resolving collision pairs. + */ + resolver: MatterJS.ResolverFactory; + + /** + * A reference to the `Matter.Constraint` module. + * + * The `Matter.Constraint` module contains methods for creating and manipulating constraints. + * Constraints are used for specifying that a fixed distance must be maintained between two bodies (or a body and a fixed world-space position). + * The stiffness of constraints can be modified to create springs or elastic. + */ + constraint: MatterJS.ConstraintFactory; + + /** + * A reference to the `Matter.Bodies` module. + * + * The `Matter.Bodies` module contains factory methods for creating rigid bodies + * with commonly used body configurations (such as rectangles, circles and other polygons). + */ + bodies: MatterJS.BodiesFactory; + + /** + * A reference to the `Matter.Composites` module. + * + * The `Matter.Composites` module contains factory methods for creating composite bodies + * with commonly used configurations (such as stacks and chains). + */ + composites: MatterJS.CompositesFactory; + + /** + * A reference to the `Matter.Axes` module. + * + * The `Matter.Axes` module contains methods for creating and manipulating sets of axes. + */ + axes: MatterJS.AxesFactory; + + /** + * A reference to the `Matter.Bounds` module. + * + * The `Matter.Bounds` module contains methods for creating and manipulating axis-aligned bounding boxes (AABB). + */ + bounds: MatterJS.BoundsFactory; + + /** + * A reference to the `Matter.Svg` module. + * + * The `Matter.Svg` module contains methods for converting SVG images into an array of vector points. + * + * To use this module you also need the SVGPathSeg polyfill: https://github.com/progers/pathseg + */ + svg: MatterJS.SvgFactory; + + /** + * A reference to the `Matter.Vector` module. + * + * The `Matter.Vector` module contains methods for creating and manipulating vectors. + * Vectors are the basis of all the geometry related operations in the engine. + * A `Matter.Vector` object is of the form `{ x: 0, y: 0 }`. + */ + vector: MatterJS.VectorFactory; + + /** + * A reference to the `Matter.Vertices` module. + * + * The `Matter.Vertices` module contains methods for creating and manipulating sets of vertices. + * A set of vertices is an array of `Matter.Vector` with additional indexing properties inserted by `Vertices.create`. + * A `Matter.Body` maintains a set of vertices to represent the shape of the object (its convex hull). + */ + vertices: MatterJS.VerticesFactory; + + /** + * A reference to the `Matter.Vertices` module. + * + * The `Matter.Vertices` module contains methods for creating and manipulating sets of vertices. + * A set of vertices is an array of `Matter.Vector` with additional indexing properties inserted by `Vertices.create`. + * A `Matter.Body` maintains a set of vertices to represent the shape of the object (its convex hull). + */ + verts: MatterJS.VerticesFactory; + + /** + * This internal method is called when this class starts and retrieves the final Matter World Config. + */ + getConfig(): Phaser.Types.Physics.Matter.MatterWorldConfig; + + /** + * Enables the Matter Attractors Plugin. + * + * The attractors plugin that makes it easy to apply continual forces on bodies. + * It's possible to simulate effects such as wind, gravity and magnetism. + * + * https://github.com/liabru/matter-attractors + * + * This method is called automatically if `plugins.attractors` is set in the Matter World Config. + * However, you can also call it directly from within your game. + */ + enableAttractorPlugin(): this; + + /** + * Enables the Matter Wrap Plugin. + * + * The coordinate wrapping plugin that automatically wraps the position of bodies such that they always stay + * within the given bounds. Upon crossing a boundary the body will appear on the opposite side of the bounds, + * while maintaining its velocity. + * + * https://github.com/liabru/matter-wrap + * + * This method is called automatically if `plugins.wrap` is set in the Matter World Config. + * However, you can also call it directly from within your game. + */ + enableWrapPlugin(): this; + + /** + * Enables the Matter Collision Events Plugin. + * + * Note that this plugin is enabled by default. So you should only ever need to call this + * method if you have specifically disabled the plugin in your Matter World Config. + * You can disable it by setting `plugins.collisionevents: false` in your Matter World Config. + * + * This plugin triggers three new events on Matter.Body: + * + * 1. `onCollide` + * 2. `onCollideEnd` + * 3. `onCollideActive` + * + * These events correspond to the Matter.js events `collisionStart`, `collisionActive` and `collisionEnd`, respectively. + * You can listen to these events via Matter.Events or they will also be emitted from the Matter World. + * + * This plugin also extends Matter.Body with three convenience functions: + * + * `Matter.Body.setOnCollide(callback)` + * `Matter.Body.setOnCollideEnd(callback)` + * `Matter.Body.setOnCollideActive(callback)` + * + * You can register event callbacks by providing a function of type (pair: Matter.Pair) => void + * + * https://github.com/dxu/matter-collision-events + */ + enableCollisionEventsPlugin(): this; + + /** + * Pauses the Matter World instance and sets `enabled` to `false`. + * + * A paused world will not run any simulations for the duration it is paused. + */ + pause(): Phaser.Physics.Matter.World; + + /** + * Resumes this Matter World instance from a paused state and sets `enabled` to `true`. + */ + resume(): Phaser.Physics.Matter.World; + + /** + * Sets the Matter Engine to run at fixed timestep of 60Hz and enables `autoUpdate`. + * If you have set a custom `getDelta` function then this will override it. + */ + set60Hz(): this; + + /** + * Sets the Matter Engine to run at fixed timestep of 30Hz and enables `autoUpdate`. + * If you have set a custom `getDelta` function then this will override it. + */ + set30Hz(): this; + + /** + * Manually advances the physics simulation by one iteration. + * + * You can optionally pass in the `delta` and `correction` values to be used by Engine.update. + * If undefined they use the Matter defaults of 60Hz and no correction. + * + * Calling `step` directly bypasses any checks of `enabled` or `autoUpdate`. + * + * It also ignores any custom `getDelta` functions, as you should be passing the delta + * value in to this call. + * + * You can adjust the number of iterations that Engine.update performs internally. + * Use the Scene Matter Physics config object to set the following properties: + * + * positionIterations (defaults to 6) + * velocityIterations (defaults to 4) + * constraintIterations (defaults to 2) + * + * Adjusting these values can help performance in certain situations, depending on the physics requirements + * of your game. + * @param delta The delta value. Default 16.666. + * @param correction Optional delta correction value. Default 1. + */ + step(delta?: number, correction?: number): void; + + /** + * Checks if the vertices of the given body, or an array of bodies, contains the given point, or not. + * + * You can pass in either a single body, or an array of bodies to be checked. This method will + * return `true` if _any_ of the bodies in the array contain the point. See the `intersectPoint` method if you need + * to get a list of intersecting bodies. + * + * The point should be transformed into the Matter World coordinate system in advance. This happens by + * default with Input Pointers, but if you wish to use points from another system you may need to + * transform them before passing them. + * @param body The body, or an array of bodies, to check against the point. + * @param x The horizontal coordinate of the point. + * @param y The vertical coordinate of the point. + */ + containsPoint(body: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], x: number, y: number): boolean; + + /** + * Checks the given coordinates to see if any vertices of the given bodies contain it. + * + * If no bodies are provided it will search all bodies in the Matter World, including within Composites. + * + * The coordinates should be transformed into the Matter World coordinate system in advance. This happens by + * default with Input Pointers, but if you wish to use coordinates from another system you may need to + * transform them before passing them. + * @param x The horizontal coordinate of the point. + * @param y The vertical coordinate of the point. + * @param bodies An array of bodies to check. If not provided it will search all bodies in the world. + */ + intersectPoint(x: number, y: number, bodies?: Phaser.Types.Physics.Matter.MatterBody[]): Phaser.Types.Physics.Matter.MatterBody[]; + + /** + * Checks the given rectangular area to see if any vertices of the given bodies intersect with it. + * Or, if the `outside` parameter is set to `true`, it checks to see which bodies do not + * intersect with it. + * + * If no bodies are provided it will search all bodies in the Matter World, including within Composites. + * @param x The horizontal coordinate of the top-left of the area. + * @param y The vertical coordinate of the top-left of the area. + * @param width The width of the area. + * @param height The height of the area. + * @param outside If `false` it checks for vertices inside the area, if `true` it checks for vertices outside the area. Default false. + * @param bodies An array of bodies to check. If not provided it will search all bodies in the world. + */ + intersectRect(x: number, y: number, width: number, height: number, outside?: boolean, bodies?: Phaser.Types.Physics.Matter.MatterBody[]): Phaser.Types.Physics.Matter.MatterBody[]; + + /** + * Checks the given ray segment to see if any vertices of the given bodies intersect with it. + * + * If no bodies are provided it will search all bodies in the Matter World. + * + * The width of the ray can be specified via the `rayWidth` parameter. + * @param x1 The horizontal coordinate of the start of the ray segment. + * @param y1 The vertical coordinate of the start of the ray segment. + * @param x2 The horizontal coordinate of the end of the ray segment. + * @param y2 The vertical coordinate of the end of the ray segment. + * @param rayWidth The width of the ray segment. Default 1. + * @param bodies An array of bodies to check. If not provided it will search all bodies in the world. + */ + intersectRay(x1: number, y1: number, x2: number, y2: number, rayWidth?: number, bodies?: Phaser.Types.Physics.Matter.MatterBody[]): Phaser.Types.Physics.Matter.MatterBody[]; + + /** + * Checks the given Matter Body to see if it intersects with any of the given bodies. + * + * If no bodies are provided it will check against all bodies in the Matter World. + * @param body The target body. + * @param bodies An array of bodies to check the target body against. If not provided it will search all bodies in the world. + */ + intersectBody(body: Phaser.Types.Physics.Matter.MatterBody, bodies?: Phaser.Types.Physics.Matter.MatterBody[]): Phaser.Types.Physics.Matter.MatterBody[]; + + /** + * Checks to see if the target body, or an array of target bodies, intersects with any of the given bodies. + * + * If intersection occurs this method will return `true` and, if provided, invoke the callbacks. + * + * If no bodies are provided for the second parameter the target will check against all bodies in the Matter World. + * + * **Note that bodies can only overlap if they are in non-colliding collision groups or categories.** + * + * If you provide a `processCallback` then the two bodies that overlap are sent to it. This callback + * must return a boolean and is used to allow you to perform additional processing tests before a final + * outcome is decided. If it returns `true` then the bodies are finally passed to the `overlapCallback`, if set. + * + * If you provide an `overlapCallback` then the matching pairs of overlapping bodies will be sent to it. + * + * Both callbacks have the following signature: `function (bodyA, bodyB, collisionInfo)` where `bodyA` is always + * the target body. The `collisionInfo` object contains additional data, such as the angle and depth of penetration. + * @param target The target body, or array of target bodies, to check. + * @param bodies The second body, or array of bodies, to check. If falsey it will check against all bodies in the world. + * @param overlapCallback An optional callback function that is called if the bodies overlap. + * @param processCallback An optional callback function that lets you perform additional checks against the two bodies if they overlap. If this is set then `overlapCallback` will only be invoked if this callback returns `true`. + * @param callbackContext The context, or scope, in which to run the callbacks. + */ + overlap(target: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], bodies?: Phaser.Types.Physics.Matter.MatterBody[], overlapCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, processCallback?: Phaser.Types.Physics.Arcade.ArcadePhysicsCallback, callbackContext?: any): boolean; + + /** + * Sets the collision filter category of all given Matter Bodies to the given value. + * + * This number must be a power of two between 2^0 (= 1) and 2^31. + * + * Bodies with different collision groups (see {@link #setCollisionGroup}) will only collide if their collision + * categories are included in their collision masks (see {@link #setCollidesWith}). + * @param bodies An array of bodies to update. If falsey it will use all bodies in the world. + * @param value Unique category bitfield. + */ + setCollisionCategory(bodies: Phaser.Types.Physics.Matter.MatterBody[], value: number): this; + + /** + * Sets the collision filter group of all given Matter Bodies to the given value. + * + * If the group value is zero, or if two Matter Bodies have different group values, + * they will collide according to the usual collision filter rules (see {@link #setCollisionCategory} and {@link #setCollisionGroup}). + * + * If two Matter Bodies have the same positive group value, they will always collide; + * if they have the same negative group value they will never collide. + * @param bodies An array of bodies to update. If falsey it will use all bodies in the world. + * @param value Unique group index. + */ + setCollisionGroup(bodies: Phaser.Types.Physics.Matter.MatterBody[], value: number): this; + + /** + * Sets the collision filter mask of all given Matter Bodies to the given value. + * + * Two Matter Bodies with different collision groups will only collide if each one includes the others + * category in its mask based on a bitwise AND operation: `(categoryA & maskB) !== 0` and + * `(categoryB & maskA) !== 0` are both true. + * @param bodies An array of bodies to update. If falsey it will use all bodies in the world. + * @param categories A unique category bitfield, or an array of them. + */ + setCollidesWith(bodies: Phaser.Types.Physics.Matter.MatterBody[], categories: number | number[]): this; + + /** + * Takes an array and returns a new array made from all of the Matter Bodies found in the original array. + * + * For example, passing in Matter Game Objects, such as a bunch of Matter Sprites, to this method, would + * return an array containing all of their native Matter Body objects. + * + * If the `bodies` argument is falsey, it will return all bodies in the world. + * @param bodies An array of objects to extract the bodies from. If falsey, it will return all bodies in the world. + */ + getMatterBodies(bodies?: any[]): MatterJS.BodyType[]; + + /** + * Sets both the horizontal and vertical linear velocity of the physics bodies. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param x The horizontal linear velocity value. + * @param y The vertical linear velocity value. + */ + setVelocity(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], x: number, y: number): this; + + /** + * Sets just the horizontal linear velocity of the physics bodies. + * The vertical velocity of the body is unchanged. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param x The horizontal linear velocity value. + */ + setVelocityX(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], x: number): this; + + /** + * Sets just the vertical linear velocity of the physics bodies. + * The horizontal velocity of the body is unchanged. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param y The vertical linear velocity value. + */ + setVelocityY(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], y: number): this; + + /** + * Sets the angular velocity of the bodies instantly. + * Position, angle, force etc. are unchanged. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param value The angular velocity. + */ + setAngularVelocity(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], value: number): this; + + /** + * Applies a force to a body, at the bodies current position, including resulting torque. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param force A Vector that specifies the force to apply. + */ + applyForce(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], force: Phaser.Types.Math.Vector2Like): this; + + /** + * Applies a force to a body, from the given world position, including resulting torque. + * If no angle is given, the current body angle is used. + * + * Use very small speed values, such as 0.1, depending on the mass and required velocity. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param position A Vector that specifies the world-space position to apply the force at. + * @param speed A speed value to be applied to a directional force. + * @param angle The angle, in radians, to apply the force from. Leave undefined to use the current body angle. + */ + applyForceFromPosition(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], position: Phaser.Types.Math.Vector2Like, speed: number, angle?: number): this; + + /** + * Apply a force to a body based on the given angle and speed. + * If no angle is given, the current body angle is used. + * + * Use very small speed values, such as 0.1, depending on the mass and required velocity. + * @param bodies Either a single Body, or an array of bodies to update. If falsey it will use all bodies in the world. + * @param speed A speed value to be applied to a directional force. + * @param angle The angle, in radians, to apply the force from. Leave undefined to use the current body angle. + */ + applyForceFromAngle(bodies: Phaser.Types.Physics.Matter.MatterBody | Phaser.Types.Physics.Matter.MatterBody[], speed: number, angle?: number): this; + + /** + * Returns the length of the given constraint, which is the distance between the two points. + * @param constraint The constraint to get the length from. + */ + getConstraintLength(constraint: MatterJS.ConstraintType): number; + + /** + * Aligns a Body, or Matter Game Object, against the given coordinates. + * + * The alignment takes place using the body bounds, which take into consideration things + * like body scale and rotation. + * + * Although a Body has a `position` property, it is based on the center of mass for the body, + * not a dimension based center. This makes aligning bodies difficult, especially if they have + * rotated or scaled. This method will derive the correct position based on the body bounds and + * its center of mass offset, in order to align the body with the given coordinate. + * + * For example, if you wanted to align a body so it sat in the bottom-center of the + * Scene, and the world was 800 x 600 in size: + * + * ```javascript + * this.matter.alignBody(body, 400, 600, Phaser.Display.Align.BOTTOM_CENTER); + * ``` + * + * You pass in 400 for the x coordinate, because that is the center of the world, and 600 for + * the y coordinate, as that is the base of the world. + * @param body The Body to align. + * @param x The horizontal position to align the body to. + * @param y The vertical position to align the body to. + * @param align One of the `Phaser.Display.Align` constants, such as `Phaser.Display.Align.TOP_LEFT`. + */ + alignBody(body: Phaser.Types.Physics.Matter.MatterBody, x: number, y: number, align: number): this; + + } + + /** + * A Matter Physics Sprite Game Object. + * + * A Sprite Game Object is used for the display of both static and animated images in your game. + * Sprites can have input events and physics bodies. They can also be tweened, tinted, scrolled + * and animated. + * + * The main difference between a Sprite and an Image Game Object is that you cannot animate Images. + * As such, Sprites take a fraction longer to process and have a larger API footprint due to the Animation + * Component. If you do not require animation then you can safely use Images to replace Sprites in all cases. + */ + class Sprite extends Phaser.GameObjects.Sprite implements Phaser.Physics.Matter.Components.Bounce, Phaser.Physics.Matter.Components.Collision, Phaser.Physics.Matter.Components.Force, Phaser.Physics.Matter.Components.Friction, Phaser.Physics.Matter.Components.Gravity, Phaser.Physics.Matter.Components.Mass, Phaser.Physics.Matter.Components.Sensor, Phaser.Physics.Matter.Components.SetBody, Phaser.Physics.Matter.Components.Sleep, Phaser.Physics.Matter.Components.Static, Phaser.Physics.Matter.Components.Transform, Phaser.Physics.Matter.Components.Velocity, Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Size, Phaser.GameObjects.Components.Texture, Phaser.GameObjects.Components.Tint, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible { + /** + * + * @param world A reference to the Matter.World instance that this body belongs to. + * @param x The horizontal position of this Game Object in the world. + * @param y The vertical position of this Game Object in the world. + * @param texture The key, or instance of the Texture this Game Object will use to render with, as stored in the Texture Manager. + * @param frame An optional frame from the Texture this Game Object is rendering with. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + constructor(world: Phaser.Physics.Matter.World, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig); + + /** + * A reference to the Matter.World instance that this body belongs to. + */ + world: Phaser.Physics.Matter.World; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * The horizontal origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the left of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originX: number; + + /** + * The vertical origin of this Game Object. + * The origin maps the relationship between the size and position of the Game Object. + * The default value is 0.5, meaning all Game Objects are positioned based on their center. + * Setting the value to 0 means the position now relates to the top of the Game Object. + * Set this value with `setOrigin()`. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginX: number; + + /** + * The vertical display origin of this Game Object. + * The origin is a normalized value between 0 and 1. + * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin. + */ + displayOriginY: number; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the size of this Game Object to be that of the given Frame. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param frame The frame to base the size of this Game Object on. + */ + setSizeToFrame(frame?: Phaser.Textures.Frame | boolean): this; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The Texture this Game Object is using to render with. + */ + texture: Phaser.Textures.Texture | Phaser.Textures.CanvasTexture; + + /** + * The Texture Frame this Game Object is using to render with. + */ + frame: Phaser.Textures.Frame; + + /** + * A boolean flag indicating if this Game Object is being cropped or not. + * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off. + * Equally, calling `setCrop` with no arguments will reset the crop and disable it. + */ + isCropped: boolean; + + /** + * Applies a crop to a texture based Game Object, such as a Sprite or Image. + * + * The crop is a rectangle that limits the area of the texture frame that is visible during rendering. + * + * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just + * changes what is shown when rendered. + * + * The crop size as well as coordinates can not exceed the the size of the texture frame. + * + * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left. + * + * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left + * half of it, you could call `setCrop(0, 0, 400, 600)`. + * + * It is also scaled to match the Game Object scale automatically. Therefore a crop rectangle of 100x50 would crop + * an area of 200x100 when applied to a Game Object that had a scale factor of 2. + * + * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument. + * + * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`. + * + * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow + * the renderer to skip several internal calculations. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. Or a Phaser.Geom.Rectangle object, in which case the rest of the arguments are ignored. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle in pixels. Cannot exceed the Frame width. + * @param height The height of the crop rectangle in pixels. Cannot exceed the Frame height. + */ + setCrop(x?: number | Phaser.Geom.Rectangle, y?: number, width?: number, height?: number): this; + + /** + * Sets the texture and frame this Game Object will use to render with. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + */ + setTexture(key: string, frame?: string | number): this; + + /** + * Sets the frame this Game Object will use to render with. + * + * If you pass a string or index then the Frame has to belong to the current Texture being used + * by this Game Object. + * + * If you pass a Frame instance, then the Texture being used by this Game Object will also be updated. + * + * Calling `setFrame` will modify the `width` and `height` properties of your Game Object. + * + * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer. + * @param frame The name or index of the frame within the Texture, or a Frame instance. + * @param updateSize Should this call adjust the size of the Game Object? Default true. + * @param updateOrigin Should this call adjust the origin of the Game Object? Default true. + */ + setFrame(frame: string | number | Phaser.Textures.Frame, updateSize?: boolean, updateOrigin?: boolean): this; + + /** + * The tint value being applied to the top-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopLeft: number; + + /** + * The tint value being applied to the top-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintTopRight: number; + + /** + * The tint value being applied to the bottom-left vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomLeft: number; + + /** + * The tint value being applied to the bottom-right vertice of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + * The value should be set as a hex number, i.e. 0xff0000 for red, or 0xff00ff for purple. + */ + tintBottomRight: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * Clears all tint values associated with this Game Object. + * + * Immediately sets the color values back to 0xffffff and the tint type to 'additive', + * which results in no visible change to the texture. + */ + clearTint(): this; + + /** + * Sets an additive tint on this Game Object. + * + * The tint works by taking the pixel color values from the Game Objects texture, and then + * multiplying it by the color value of the tint. You can provide either one color value, + * in which case the whole Game Object will be tinted in that color. Or you can provide a color + * per corner. The colors are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`. + * @param topLeft The tint being applied to the top-left of the Game Object. If no other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTint(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * Sets a fill-based tint on this Game Object. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. You can use this for effects such as making a player flash 'white' + * if hit by something. You can provide either one color value, in which case the whole + * Game Object will be rendered in that color. Or you can provide a color per corner. The colors + * are blended together across the extent of the Game Object. + * + * To modify the tint color once set, either call this method again with new values or use the + * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight, + * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently. + * + * To remove a tint call `clearTint`. + * + * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`. + * @param topLeft The tint being applied to the top-left of the Game Object. If not other values are given this value is applied evenly, tinting the whole Game Object. Default 0xffffff. + * @param topRight The tint being applied to the top-right of the Game Object. + * @param bottomLeft The tint being applied to the bottom-left of the Game Object. + * @param bottomRight The tint being applied to the bottom-right of the Game Object. + */ + setTintFill(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The tint value being applied to the whole of the Game Object. + * Return `tintTopLeft` when read this tint property. + */ + tint: number; + + /** + * Does this Game Object have a tint applied? + * + * It checks to see if the 4 tint properties are set to the value 0xffffff + * and that the `tintFill` property is `false`. This indicates that a Game Object isn't tinted. + */ + readonly isTinted: boolean; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * Sets the restitution on the physics object. + * @param value A Number that defines the restitution (elasticity) of the body. The value is always positive and is in the range (0, 1). A value of 0 means collisions may be perfectly inelastic and no bouncing may occur. A value of 0.8 means the body may bounce back with approximately 80% of its kinetic energy. Note that collision response is based on pairs of bodies, and that restitution values are combined with the following formula: `Math.max(bodyA.restitution, bodyB.restitution)` + */ + setBounce(value: number): this; + + /** + * Sets the collision category of this Game Object's Matter Body. This number must be a power of two between 2^0 (= 1) and 2^31. + * Two bodies with different collision groups (see {@link #setCollisionGroup}) will only collide if their collision + * categories are included in their collision masks (see {@link #setCollidesWith}). + * @param value Unique category bitfield. + */ + setCollisionCategory(value: number): this; + + /** + * Sets the collision group of this Game Object's Matter Body. If this is zero or two Matter Bodies have different values, + * they will collide according to the usual rules (see {@link #setCollisionCategory} and {@link #setCollisionGroup}). + * If two Matter Bodies have the same positive value, they will always collide; if they have the same negative value, + * they will never collide. + * @param value Unique group index. + */ + setCollisionGroup(value: number): this; + + /** + * Sets the collision mask for this Game Object's Matter Body. Two Matter Bodies with different collision groups will only + * collide if each one includes the other's category in its mask based on a bitwise AND, i.e. `(categoryA & maskB) !== 0` + * and `(categoryB & maskA) !== 0` are both true. + * @param categories A unique category bitfield, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body starts colliding with another. + */ + setOnCollide(callback: Function): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body stops colliding with another. + */ + setOnCollideEnd(callback: Function): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke for the duration of this body colliding with another. + */ + setOnCollideActive(callback: Function): this; + + /** + * The callback is sent a reference to the other body, along with a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param body The body, or an array of bodies, to test for collisions with. + * @param callback The callback to invoke when this body collides with the given body or bodies. + */ + setOnCollideWith(body: MatterJS.Body | MatterJS.Body[], callback: Function): this; + + /** + * Applies a force to a body. + * @param force A Vector that specifies the force to apply. + */ + applyForce(force: Phaser.Math.Vector2): this; + + /** + * Applies a force to a body from a given position. + * @param position The position in which the force comes from. + * @param force A Vector that specifies the force to apply. + */ + applyForceFrom(position: Phaser.Math.Vector2, force: Phaser.Math.Vector2): this; + + /** + * Apply thrust to the forward position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrust(speed: number): this; + + /** + * Apply thrust to the left position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustLeft(speed: number): this; + + /** + * Apply thrust to the right position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustRight(speed: number): this; + + /** + * Apply thrust to the back position of the body. + * + * Use very small values, such as 0.1, depending on the mass and required speed. + * @param speed A speed value to be applied to a directional force. + */ + thrustBack(speed: number): this; + + /** + * Sets new friction values for this Game Object's Matter Body. + * @param value The new friction of the body, between 0 and 1, where 0 allows the Body to slide indefinitely, while 1 allows it to stop almost immediately after a force is applied. + * @param air If provided, the new air resistance of the Body. The higher the value, the faster the Body will slow as it moves through space. 0 means the body has no air resistance. + * @param fstatic If provided, the new static friction of the Body. The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. 0 means the body will never "stick" when it is nearly stationary. + */ + setFriction(value: number, air?: number, fstatic?: number): this; + + /** + * Sets a new air resistance for this Game Object's Matter Body. + * A value of 0 means the Body will never slow as it moves through space. + * The higher the value, the faster a Body slows when moving through space. + * @param value The new air resistance for the Body. + */ + setFrictionAir(value: number): this; + + /** + * Sets a new static friction for this Game Object's Matter Body. + * A value of 0 means the Body will never "stick" when it is nearly stationary. + * The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. + * @param value The new static friction for the Body. + */ + setFrictionStatic(value: number): this; + + /** + * A togglable function for ignoring world gravity in real-time on the current body. + * @param value Set to true to ignore the effect of world gravity, or false to not ignore it. + */ + setIgnoreGravity(value: boolean): this; + + /** + * Sets the mass of the Game Object's Matter Body. + * @param value The new mass of the body. + */ + setMass(value: number): this; + + /** + * Sets density of the body. + * @param value The new density of the body. + */ + setDensity(value: number): this; + + /** + * The body's center of mass. + * + * Calling this creates a new `Vector2 each time to avoid mutation. + * + * If you only need to read the value and won't change it, you can get it from `GameObject.body.centerOfMass`. + */ + readonly centerOfMass: Phaser.Math.Vector2; + + /** + * Set the body belonging to this Game Object to be a sensor. + * Sensors trigger collision events, but don't react with colliding body physically. + * @param value `true` to set the body as a sensor, or `false` to disable it. + */ + setSensor(value: boolean): this; + + /** + * Is the body belonging to this Game Object a sensor or not? + */ + isSensor(): boolean; + + /** + * Set this Game Objects Matter physics body to be a rectangle shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param width Width of the rectangle. + * @param height Height of the rectangle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setRectangle(width: number, height: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Objects Matter physics body to be a circle shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param radius The radius of the circle. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setCircle(radius: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Objects Matter physics body to be a polygon shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param radius The "radius" of the polygon, i.e. the distance from its center to any vertex. This is also the radius of its circumcircle. + * @param sides The number of sides the polygon will have. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setPolygon(radius: number, sides: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Objects Matter physics body to be a trapezoid shape. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param width The width of the trapezoid Body. + * @param height The height of the trapezoid Body. + * @param slope The slope of the trapezoid. 0 creates a rectangle, while 1 creates a triangle. Positive values make the top side shorter, while negative values make the bottom side shorter. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setTrapezoid(width: number, height: number, slope: number, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Set this Game Object to use the given existing Matter Body. + * + * The body is first removed from the world before being added to this Game Object. + * @param body The Body this Game Object should use. + * @param addToWorld Should the body be immediately added to the World? Default true. + */ + setExistingBody(body: MatterJS.BodyType, addToWorld?: boolean): this; + + /** + * Set this Game Object to create and use a new Body based on the configuration object given. + * + * Calling this methods resets all previous properties you may have set on the body, including + * plugins, mass, friction, collision categories, etc. So be sure to re-apply these as needed. + * @param config Either a string, such as `circle`, or a Matter Set Body Configuration object. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + setBody(config: string | Phaser.Types.Physics.Matter.MatterSetBodyConfig, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): this; + + /** + * Sets this Body to sleep. + */ + setToSleep(): this; + + /** + * Wakes this Body if asleep. + */ + setAwake(): this; + + /** + * Sets the number of updates in which this body must have near-zero velocity before it is set as sleeping (if sleeping is enabled by the engine). + * @param value A `Number` that defines the number of updates in which this body must have near-zero velocity before it is set as sleeping. Default 60. + */ + setSleepThreshold(value?: number): this; + + /** + * Enable sleep and wake events for this body. + * + * By default when a body goes to sleep, or wakes up, it will not emit any events. + * + * The events are emitted by the Matter World instance and can be listened to via + * the `SLEEP_START` and `SLEEP_END` events. + * @param start `true` if you want the sleep start event to be emitted for this body. + * @param end `true` if you want the sleep end event to be emitted for this body. + */ + setSleepEvents(start: boolean, end: boolean): this; + + /** + * Enables or disables the Sleep Start event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepStartEvent(value: boolean): this; + + /** + * Enables or disables the Sleep End event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepEndEvent(value: boolean): this; + + /** + * Changes the physics body to be either static `true` or dynamic `false`. + * @param value `true` to set the body as being static, or `false` to make it dynamic. + */ + setStatic(value: boolean): this; + + /** + * Returns `true` if the body is static, otherwise `false` for a dynamic body. + */ + isStatic(): boolean; + + /** + * Setting fixed rotation sets the Body inertia to Infinity, which stops it + * from being able to rotate when forces are applied to it. + */ + setFixedRotation(): this; + + /** + * Sets the horizontal velocity of the physics body. + * @param x The horizontal velocity value. + */ + setVelocityX(x: number): this; + + /** + * Sets vertical velocity of the physics body. + * @param y The vertical velocity value. + */ + setVelocityY(y: number): this; + + /** + * Sets both the horizontal and vertical velocity of the physics body. + * @param x The horizontal velocity value. + * @param y The vertical velocity value, it can be either positive or negative. If not given, it will be the same as the `x` value. Default x. + */ + setVelocity(x: number, y?: number): this; + + /** + * Gets the current linear velocity of the physics body. + */ + getVelocity(): Phaser.Types.Math.Vector2Like; + + /** + * Sets the angular velocity of the body instantly. + * Position, angle, force etc. are unchanged. + * @param velocity The angular velocity. + */ + setAngularVelocity(velocity: number): this; + + /** + * Gets the current rotational velocity of the body. + */ + getAngularVelocity(): number; + + /** + * Sets the current rotational speed of the body. + * Direction is maintained. Affects body angular velocity. + * @param speed The angular speed. + */ + setAngularSpeed(speed: number): this; + + /** + * Gets the current rotational speed of the body. + * Equivalent to the magnitude of its angular velocity. + */ + getAngularSpeed(): number; + + } + + /** + * A wrapper around a Tile that provides access to a corresponding Matter body. A tile can only + * have one Matter body associated with it. You can either pass in an existing Matter body for + * the tile or allow the constructor to create the corresponding body for you. If the Tile has a + * collision group (defined in Tiled), those shapes will be used to create the body. If not, the + * tile's rectangle bounding box will be used. + * + * The corresponding body will be accessible on the Tile itself via Tile.physics.matterBody. + * + * Note: not all Tiled collision shapes are supported. See + * Phaser.Physics.Matter.TileBody#setFromTileCollision for more information. + */ + class TileBody extends Phaser.Events.EventEmitter implements Phaser.Physics.Matter.Components.Bounce, Phaser.Physics.Matter.Components.Collision, Phaser.Physics.Matter.Components.Friction, Phaser.Physics.Matter.Components.Gravity, Phaser.Physics.Matter.Components.Mass, Phaser.Physics.Matter.Components.Sensor, Phaser.Physics.Matter.Components.Sleep, Phaser.Physics.Matter.Components.Static { + /** + * + * @param world The Matter world instance this body belongs to. + * @param tile The target tile that should have a Matter body. + * @param options Options to be used when creating the Matter body. + */ + constructor(world: Phaser.Physics.Matter.World, tile: Phaser.Tilemaps.Tile, options?: Phaser.Types.Physics.Matter.MatterTileOptions); + + /** + * The tile object the body is associated with. + */ + tile: Phaser.Tilemaps.Tile; + + /** + * The Matter world the body exists within. + */ + world: Phaser.Physics.Matter.World; + + /** + * Sets the current body to a rectangle that matches the bounds of the tile. + * @param options Options to be used when creating the Matter body. See MatterJS.Body for a list of what Matter accepts. + */ + setFromTileRectangle(options?: Phaser.Types.Physics.Matter.MatterBodyTileOptions): Phaser.Physics.Matter.TileBody; + + /** + * Sets the current body from the collision group associated with the Tile. This is typically + * set up in Tiled's collision editor. + * + * Note: Matter doesn't support all shapes from Tiled. Rectangles and polygons are directly + * supported. Ellipses are converted into circle bodies. Polylines are treated as if they are + * closed polygons. If a tile has multiple shapes, a multi-part body will be created. Concave + * shapes are supported if poly-decomp library is included. Decomposition is not guaranteed to + * work for complex shapes (e.g. holes), so it's often best to manually decompose a concave + * polygon into multiple convex polygons yourself. + * @param options Options to be used when creating the Matter body. See MatterJS.Body for a list of what Matter accepts. + */ + setFromTileCollision(options?: Phaser.Types.Physics.Matter.MatterBodyTileOptions): Phaser.Physics.Matter.TileBody; + + /** + * Sets the current body to the given body. This will remove the previous body, if one already + * exists. + * @param body The new Matter body to use. + * @param addToWorld Whether or not to add the body to the Matter world. Default true. + */ + setBody(body: MatterJS.BodyType, addToWorld?: boolean): Phaser.Physics.Matter.TileBody; + + /** + * Removes the current body from the TileBody and from the Matter world + */ + removeBody(): Phaser.Physics.Matter.TileBody; + + /** + * Removes the current body from the tile and the world. + */ + destroy(): Phaser.Physics.Matter.TileBody; + + /** + * Sets the restitution on the physics object. + * @param value A Number that defines the restitution (elasticity) of the body. The value is always positive and is in the range (0, 1). A value of 0 means collisions may be perfectly inelastic and no bouncing may occur. A value of 0.8 means the body may bounce back with approximately 80% of its kinetic energy. Note that collision response is based on pairs of bodies, and that restitution values are combined with the following formula: `Math.max(bodyA.restitution, bodyB.restitution)` + */ + setBounce(value: number): this; + + /** + * Sets the collision category of this Game Object's Matter Body. This number must be a power of two between 2^0 (= 1) and 2^31. + * Two bodies with different collision groups (see {@link #setCollisionGroup}) will only collide if their collision + * categories are included in their collision masks (see {@link #setCollidesWith}). + * @param value Unique category bitfield. + */ + setCollisionCategory(value: number): this; + + /** + * Sets the collision group of this Game Object's Matter Body. If this is zero or two Matter Bodies have different values, + * they will collide according to the usual rules (see {@link #setCollisionCategory} and {@link #setCollisionGroup}). + * If two Matter Bodies have the same positive value, they will always collide; if they have the same negative value, + * they will never collide. + * @param value Unique group index. + */ + setCollisionGroup(value: number): this; + + /** + * Sets the collision mask for this Game Object's Matter Body. Two Matter Bodies with different collision groups will only + * collide if each one includes the other's category in its mask based on a bitwise AND, i.e. `(categoryA & maskB) !== 0` + * and `(categoryB & maskA) !== 0` are both true. + * @param categories A unique category bitfield, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body starts colliding with another. + */ + setOnCollide(callback: Function): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke when this body stops colliding with another. + */ + setOnCollideEnd(callback: Function): this; + + /** + * The callback is sent a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param callback The callback to invoke for the duration of this body colliding with another. + */ + setOnCollideActive(callback: Function): this; + + /** + * The callback is sent a reference to the other body, along with a `Phaser.Types.Physics.Matter.MatterCollisionData` object. + * + * This does not change the bodies collision category, group or filter. Those must be set in addition + * to the callback. + * @param body The body, or an array of bodies, to test for collisions with. + * @param callback The callback to invoke when this body collides with the given body or bodies. + */ + setOnCollideWith(body: MatterJS.Body | MatterJS.Body[], callback: Function): this; + + /** + * Sets new friction values for this Game Object's Matter Body. + * @param value The new friction of the body, between 0 and 1, where 0 allows the Body to slide indefinitely, while 1 allows it to stop almost immediately after a force is applied. + * @param air If provided, the new air resistance of the Body. The higher the value, the faster the Body will slow as it moves through space. 0 means the body has no air resistance. + * @param fstatic If provided, the new static friction of the Body. The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. 0 means the body will never "stick" when it is nearly stationary. + */ + setFriction(value: number, air?: number, fstatic?: number): this; + + /** + * Sets a new air resistance for this Game Object's Matter Body. + * A value of 0 means the Body will never slow as it moves through space. + * The higher the value, the faster a Body slows when moving through space. + * @param value The new air resistance for the Body. + */ + setFrictionAir(value: number): this; + + /** + * Sets a new static friction for this Game Object's Matter Body. + * A value of 0 means the Body will never "stick" when it is nearly stationary. + * The higher the value (e.g. 10), the more force it will take to initially get the Body moving when it is nearly stationary. + * @param value The new static friction for the Body. + */ + setFrictionStatic(value: number): this; + + /** + * A togglable function for ignoring world gravity in real-time on the current body. + * @param value Set to true to ignore the effect of world gravity, or false to not ignore it. + */ + setIgnoreGravity(value: boolean): this; + + /** + * Sets the mass of the Game Object's Matter Body. + * @param value The new mass of the body. + */ + setMass(value: number): this; + + /** + * Sets density of the body. + * @param value The new density of the body. + */ + setDensity(value: number): this; + + /** + * The body's center of mass. + * + * Calling this creates a new `Vector2 each time to avoid mutation. + * + * If you only need to read the value and won't change it, you can get it from `GameObject.body.centerOfMass`. + */ + readonly centerOfMass: Phaser.Math.Vector2; + + /** + * Set the body belonging to this Game Object to be a sensor. + * Sensors trigger collision events, but don't react with colliding body physically. + * @param value `true` to set the body as a sensor, or `false` to disable it. + */ + setSensor(value: boolean): this; + + /** + * Is the body belonging to this Game Object a sensor or not? + */ + isSensor(): boolean; + + /** + * Sets this Body to sleep. + */ + setToSleep(): this; + + /** + * Wakes this Body if asleep. + */ + setAwake(): this; + + /** + * Sets the number of updates in which this body must have near-zero velocity before it is set as sleeping (if sleeping is enabled by the engine). + * @param value A `Number` that defines the number of updates in which this body must have near-zero velocity before it is set as sleeping. Default 60. + */ + setSleepThreshold(value?: number): this; + + /** + * Enable sleep and wake events for this body. + * + * By default when a body goes to sleep, or wakes up, it will not emit any events. + * + * The events are emitted by the Matter World instance and can be listened to via + * the `SLEEP_START` and `SLEEP_END` events. + * @param start `true` if you want the sleep start event to be emitted for this body. + * @param end `true` if you want the sleep end event to be emitted for this body. + */ + setSleepEvents(start: boolean, end: boolean): this; + + /** + * Enables or disables the Sleep Start event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepStartEvent(value: boolean): this; + + /** + * Enables or disables the Sleep End event for this body. + * @param value `true` to enable the sleep event, or `false` to disable it. + */ + setSleepEndEvent(value: boolean): this; + + /** + * Changes the physics body to be either static `true` or dynamic `false`. + * @param value `true` to set the body as being static, or `false` to make it dynamic. + */ + setStatic(value: boolean): this; + + /** + * Returns `true` if the body is static, otherwise `false` for a dynamic body. + */ + isStatic(): boolean; + + } + + /** + * Use PhysicsEditorParser.parseBody() to build a Matter body object, based on a physics data file + * created and exported with PhysicsEditor (https://www.codeandweb.com/physicseditor). + */ + namespace PhysicsEditorParser { + /** + * Parses a body element exported by PhysicsEditor. + * @param x The horizontal world location of the body. + * @param y The vertical world location of the body. + * @param config The body configuration and fixture (child body) definitions, as exported by PhysicsEditor. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + function parseBody(x: number, y: number, config: object, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.BodyType; + + /** + * Parses an element of the "fixtures" list exported by PhysicsEditor + * @param fixtureConfig The fixture object to parse. + */ + function parseFixture(fixtureConfig: object): MatterJS.BodyType[]; + + /** + * Parses the "vertices" lists exported by PhysicsEditor. + * @param vertexSets The vertex lists to parse. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + function parseVertices(vertexSets: any[], options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.BodyType[]; + + } + + /** + * Creates a body using the supplied physics data, as provided by a JSON file. + * + * The data file should be loaded as JSON: + * + * ```javascript + * preload () + * { + * this.load.json('ninjas', 'assets/ninjas.json); + * } + * + * create () + * { + * const ninjaShapes = this.cache.json.get('ninjas'); + * + * this.matter.add.fromJSON(400, 300, ninjaShapes.shinobi); + * } + * ``` + * + * Do not pass the entire JSON file to this method, but instead pass one of the shapes contained within it. + * + * If you pas in an `options` object, any settings in there will override those in the config object. + * + * The structure of the JSON file is as follows: + * + * ```text + * { + * 'generator_info': // The name of the application that created the JSON data + * 'shapeName': { + * 'type': // The type of body + * 'label': // Optional body label + * 'vertices': // An array, or an array of arrays, containing the vertex data in x/y object pairs + * } + * } + * ``` + * + * At the time of writing, only the Phaser Physics Tracer App exports in this format. + */ + namespace PhysicsJSONParser { + /** + * Parses a body element from the given JSON data. + * @param x The horizontal world location of the body. + * @param y The vertical world location of the body. + * @param config The body configuration data. + * @param options An optional Body configuration object that is used to set initial Body properties on creation. + */ + function parseBody(x: number, y: number, config: object, options?: Phaser.Types.Physics.Matter.MatterBodyConfig): MatterJS.BodyType; + + } + + /** + * A Pointer Constraint is a special type of constraint that allows you to click + * and drag bodies in a Matter World. It monitors the active Pointers in a Scene, + * and when one is pressed down it checks to see if that hit any part of any active + * body in the world. If it did, and the body has input enabled, it will begin to + * drag it until either released, or you stop it via the `stopDrag` method. + * + * You can adjust the stiffness, length and other properties of the constraint via + * the `options` object on creation. + */ + class PointerConstraint { + /** + * + * @param scene A reference to the Scene to which this Pointer Constraint belongs. + * @param world A reference to the Matter World instance to which this Constraint belongs. + * @param options A Constraint configuration object. + */ + constructor(scene: Phaser.Scene, world: Phaser.Physics.Matter.World, options?: object); + + /** + * A reference to the Scene to which this Pointer Constraint belongs. + * This is the same Scene as the Matter World instance. + */ + scene: Phaser.Scene; + + /** + * A reference to the Matter World instance to which this Constraint belongs. + */ + world: Phaser.Physics.Matter.World; + + /** + * The Camera the Pointer was interacting with when the input + * down event was processed. + */ + camera: Phaser.Cameras.Scene2D.Camera; + + /** + * A reference to the Input Pointer that activated this Constraint. + * This is set in the `onDown` handler. + */ + pointer: Phaser.Input.Pointer; + + /** + * Is this Constraint active or not? + * + * An active constraint will be processed each update. An inactive one will be skipped. + * Use this to toggle a Pointer Constraint on and off. + */ + active: boolean; + + /** + * The internal transformed position. + */ + position: Phaser.Math.Vector2; + + /** + * The body that is currently being dragged, if any. + */ + body: MatterJS.BodyType | null; + + /** + * The part of the body that was clicked on to start the drag. + */ + part: MatterJS.BodyType | null; + + /** + * The native Matter Constraint that is used to attach to bodies. + */ + constraint: MatterJS.ConstraintType; + + /** + * A Pointer has been pressed down onto the Scene. + * + * If this Constraint doesn't have an active Pointer then a hit test is set to + * run against all active bodies in the world during the _next_ call to `update`. + * If a body is found, it is bound to this constraint and the drag begins. + * @param pointer A reference to the Pointer that was pressed. + */ + onDown(pointer: Phaser.Input.Pointer): void; + + /** + * A Pointer has been released from the Scene. If it was the one this constraint was using, it's cleared. + * @param pointer A reference to the Pointer that was pressed. + */ + onUp(pointer: Phaser.Input.Pointer): void; + + /** + * Scans all active bodies in the current Matter World to see if any of them + * are hit by the Pointer. The _first one_ found to hit is set as the active contraint + * body. + */ + getBody(): boolean; + + /** + * Scans the current body to determine if a part of it was clicked on. + * If a part is found the body is set as the `constraint.bodyB` property, + * as well as the `body` property of this class. The part is also set. + * @param body The Matter Body to check. + * @param position A translated hit test position. + */ + hitTestBody(body: MatterJS.BodyType, position: Phaser.Math.Vector2): boolean; + + /** + * Internal update handler. Called in the Matter BEFORE_UPDATE step. + */ + update(): void; + + /** + * Stops the Pointer Constraint from dragging the body any further. + * + * This is called automatically if the Pointer is released while actively + * dragging a body. Or, you can call it manually to release a body from a + * constraint without having to first release the pointer. + */ + stopDrag(): void; + + /** + * Destroys this Pointer Constraint instance and all of its references. + */ + destroy(): void; + + } + + /** + * The Matter World class is responsible for managing one single instance of a Matter Physics World for Phaser. + * + * Access this via `this.matter.world` from within a Scene. + * + * This class creates a Matter JS World Composite along with the Matter JS Engine during instantiation. It also + * handles delta timing, bounds, body and constraint creation and debug drawing. + * + * If you wish to access the Matter JS World object directly, see the `localWorld` property. + * If you wish to access the Matter Engine directly, see the `engine` property. + * + * This class is an Event Emitter and will proxy _all_ Matter JS events, as they are received. + */ + class World extends Phaser.Events.EventEmitter { + /** + * + * @param scene The Scene to which this Matter World instance belongs. + * @param config The Matter World configuration object. + */ + constructor(scene: Phaser.Scene, config: Phaser.Types.Physics.Matter.MatterWorldConfig); + + /** + * The Scene to which this Matter World instance belongs. + */ + scene: Phaser.Scene; + + /** + * An instance of the MatterJS Engine. + */ + engine: MatterJS.Engine; + + /** + * A `World` composite object that will contain all simulated bodies and constraints. + */ + localWorld: MatterJS.World; + + /** + * An object containing the 4 wall bodies that bound the physics world. + */ + walls: Phaser.Types.Physics.Matter.MatterWalls; + + /** + * A flag that toggles if the world is enabled or not. + */ + enabled: boolean; + + /** + * This function is called every time the core game loop steps, which is bound to the + * Request Animation Frame frequency unless otherwise modified. + * + * The function is passed two values: `time` and `delta`, both of which come from the game step values. + * + * It must return a number. This number is used as the delta value passed to Matter.Engine.update. + * + * You can override this function with your own to define your own timestep. + * + * If you need to update the Engine multiple times in a single game step then call + * `World.update` as many times as required. Each call will trigger the `getDelta` function. + * If you wish to have full control over when the Engine updates then see the property `autoUpdate`. + * + * You can also adjust the number of iterations that Engine.update performs. + * Use the Scene Matter Physics config object to set the following properties: + * + * positionIterations (defaults to 6) + * velocityIterations (defaults to 4) + * constraintIterations (defaults to 2) + * + * Adjusting these values can help performance in certain situations, depending on the physics requirements + * of your game. + */ + getDelta: Function; + + /** + * The Matter JS Runner Configuration object. + * + * This object is populated via the Matter Configuration object's `runner` property and is + * updated constantly during the game step. + */ + runner: Phaser.Types.Physics.Matter.MatterRunnerConfig; + + /** + * Automatically call Engine.update every time the game steps. + * If you disable this then you are responsible for calling `World.step` directly from your game. + * If you call `set60Hz` or `set30Hz` then `autoUpdate` is reset to `true`. + */ + autoUpdate: boolean; + + /** + * A flag that controls if the debug graphics will be drawn to or not. + */ + drawDebug: boolean; + + /** + * An instance of the Graphics object the debug bodies are drawn to, if enabled. + */ + debugGraphic: Phaser.GameObjects.Graphics; + + /** + * The debug configuration object. + * + * The values stored in this object are read from the Matter World Config `debug` property. + * + * When a new Body or Constraint is _added to the World_, they are given the values stored in this object, + * unless they have their own `render` object set that will override them. + * + * Note that while you can modify the values of properties in this object at run-time, it will not change + * any of the Matter objects _already added_. It will only impact objects newly added to the world, or one + * that is removed and then re-added at a later time. + */ + debugConfig: Phaser.Types.Physics.Matter.MatterDebugConfig; + + /** + * Sets the debug render style for the children of the given Matter Composite. + * + * Composites themselves do not render, but they can contain bodies, constraints and other composites that may do. + * So the children of this composite are passed to the `setBodyRenderStyle`, `setCompositeRenderStyle` and + * `setConstraintRenderStyle` methods accordingly. + * @param composite The Matter Composite to set the render style on. + */ + setCompositeRenderStyle(composite: MatterJS.CompositeType): this; + + /** + * Sets the debug render style for the given Matter Body. + * + * If you are using this on a Phaser Game Object, such as a Matter Sprite, then pass in the body property + * to this method, not the Game Object itself. + * + * If you wish to skip a parameter, so it retains its current value, pass `false` for it. + * + * If you wish to reset the Body render colors to the defaults found in the World Debug Config, then call + * this method with just the `body` parameter provided and no others. + * @param body The Matter Body to set the render style on. + * @param lineColor The line color. If `null` it will use the World Debug Config value. + * @param lineOpacity The line opacity, between 0 and 1. If `null` it will use the World Debug Config value. + * @param lineThickness The line thickness. If `null` it will use the World Debug Config value. + * @param fillColor The fill color. If `null` it will use the World Debug Config value. + * @param fillOpacity The fill opacity, between 0 and 1. If `null` it will use the World Debug Config value. + */ + setBodyRenderStyle(body: MatterJS.BodyType, lineColor?: number, lineOpacity?: number, lineThickness?: number, fillColor?: number, fillOpacity?: number): this; + + /** + * Sets the debug render style for the given Matter Constraint. + * + * If you are using this on a Phaser Game Object, then pass in the body property + * to this method, not the Game Object itself. + * + * If you wish to skip a parameter, so it retains its current value, pass `false` for it. + * + * If you wish to reset the Constraint render colors to the defaults found in the World Debug Config, then call + * this method with just the `constraint` parameter provided and no others. + * @param constraint The Matter Constraint to set the render style on. + * @param lineColor The line color. If `null` it will use the World Debug Config value. + * @param lineOpacity The line opacity, between 0 and 1. If `null` it will use the World Debug Config value. + * @param lineThickness The line thickness. If `null` it will use the World Debug Config value. + * @param pinSize If this constraint is a pin, this sets the size of the pin circle. If `null` it will use the World Debug Config value. + * @param anchorColor The color used when rendering this constraints anchors. If `null` it will use the World Debug Config value. + * @param anchorSize The size of the anchor circle, if this constraint has anchors. If `null` it will use the World Debug Config value. + */ + setConstraintRenderStyle(constraint: MatterJS.ConstraintType, lineColor?: number, lineOpacity?: number, lineThickness?: number, pinSize?: number, anchorColor?: number, anchorSize?: number): this; + + /** + * This internal method acts as a proxy between all of the Matter JS events and then re-emits them + * via this class. + */ + setEventsProxy(): void; + + /** + * Sets the bounds of the Physics world to match the given world pixel dimensions. + * + * You can optionally set which 'walls' to create: left, right, top or bottom. + * If none of the walls are given it will default to use the walls settings it had previously. + * I.e. if you previously told it to not have the left or right walls, and you then adjust the world size + * the newly created bounds will also not have the left and right walls. + * Explicitly state them in the parameters to override this. + * @param x The x coordinate of the top-left corner of the bounds. Default 0. + * @param y The y coordinate of the top-left corner of the bounds. Default 0. + * @param width The width of the bounds. + * @param height The height of the bounds. + * @param thickness The thickness of each wall, in pixels. Default 64. + * @param left If true will create the left bounds wall. Default true. + * @param right If true will create the right bounds wall. Default true. + * @param top If true will create the top bounds wall. Default true. + * @param bottom If true will create the bottom bounds wall. Default true. + */ + setBounds(x?: number, y?: number, width?: number, height?: number, thickness?: number, left?: boolean, right?: boolean, top?: boolean, bottom?: boolean): Phaser.Physics.Matter.World; + + /** + * Updates the 4 rectangle bodies that were created, if `setBounds` was set in the Matter config, to use + * the new positions and sizes. This method is usually only called internally via the `setBounds` method. + * @param add `true` if the walls are being added or updated, `false` to remove them from the world. + * @param position Either `left`, `right`, `top` or `bottom`. Only optional if `add` is `false`. + * @param x The horizontal position to place the walls at. Only optional if `add` is `false`. + * @param y The vertical position to place the walls at. Only optional if `add` is `false`. + * @param width The width of the walls, in pixels. Only optional if `add` is `false`. + * @param height The height of the walls, in pixels. Only optional if `add` is `false`. + */ + updateWall(add: boolean, position?: string, x?: number, y?: number, width?: number, height?: number): void; + + /** + * Creates a Phaser.GameObjects.Graphics object that is used to render all of the debug bodies and joints to. + * + * This method is called automatically by the constructor, if debugging has been enabled. + * + * The created Graphics object is automatically added to the Scene at 0x0 and given a depth of `Number.MAX_VALUE`, + * so it renders above all else in the Scene. + * + * The Graphics object is assigned to the `debugGraphic` property of this class and `drawDebug` is enabled. + */ + createDebugGraphic(): Phaser.GameObjects.Graphics; + + /** + * Sets the world gravity and gravity scale to 0. + */ + disableGravity(): this; + + /** + * Sets the worlds gravity to the values given. + * + * Gravity effects all bodies in the world, unless they have the `ignoreGravity` flag set. + * @param x The world gravity x component. Default 0. + * @param y The world gravity y component. Default 1. + * @param scale The gravity scale factor. Default 0.001. + */ + setGravity(x?: number, y?: number, scale?: number): this; + + /** + * Creates a rectangle Matter body and adds it to the world. + * @param x The horizontal position of the body in the world. + * @param y The vertical position of the body in the world. + * @param width The width of the body. + * @param height The height of the body. + * @param options Optional Matter configuration object. + */ + create(x: number, y: number, width: number, height: number, options: object): MatterJS.BodyType; + + /** + * Adds a Matter JS object, or array of objects, to the world. + * + * The objects should be valid Matter JS entities, such as a Body, Composite or Constraint. + * + * Triggers `beforeAdd` and `afterAdd` events. + * @param object Can be single object, or an array, and can be a body, composite or constraint. + */ + add(object: object | object[]): this; + + /** + * Removes a Matter JS object, or array of objects, from the world. + * + * The objects should be valid Matter JS entities, such as a Body, Composite or Constraint. + * + * Triggers `beforeRemove` and `afterRemove` events. + * @param object Can be single object, or an array, and can be a body, composite or constraint. + * @param deep Optionally search the objects children and recursively remove those as well. Default false. + */ + remove(object: object | object[], deep?: boolean): this; + + /** + * Removes a Matter JS constraint, or array of constraints, from the world. + * + * Triggers `beforeRemove` and `afterRemove` events. + * @param constraint A Matter JS Constraint, or an array of constraints, to be removed. + * @param deep Optionally search the objects children and recursively remove those as well. Default false. + */ + removeConstraint(constraint: MatterJS.ConstraintType | MatterJS.ConstraintType[], deep?: boolean): this; + + /** + * Adds `MatterTileBody` instances for all the colliding tiles within the given tilemap layer. + * + * Set the appropriate tiles in your layer to collide before calling this method! + * + * If you modify the map after calling this method, i.e. via a function like `putTileAt` then + * you should call the `Phaser.Physics.Matter.World.convertTiles` function directly, passing + * it an array of the tiles you've added to your map. + * @param tilemapLayer An array of tiles. + * @param options Options to be passed to the MatterTileBody constructor. {@see Phaser.Physics.Matter.TileBody} + */ + convertTilemapLayer(tilemapLayer: Phaser.Tilemaps.TilemapLayer, options?: object): this; + + /** + * Creates `MatterTileBody` instances for all of the given tiles. This creates bodies regardless of whether the + * tiles are set to collide or not, or if they have a body already, or not. + * + * If you wish to pass an array of tiles that may already have bodies, you should filter the array before hand. + * @param tiles An array of tiles. + * @param options Options to be passed to the MatterTileBody constructor. {@see Phaser.Physics.Matter.TileBody} + */ + convertTiles(tiles: Phaser.Tilemaps.Tile[], options?: object): this; + + /** + * Returns the next unique group index for which bodies will collide. + * If `isNonColliding` is `true`, returns the next unique group index for which bodies will not collide. + * @param isNonColliding If `true`, returns the next unique group index for which bodies will _not_ collide. Default false. + */ + nextGroup(isNonColliding?: boolean): number; + + /** + * Returns the next unique category bitfield (starting after the initial default category 0x0001). + * There are 32 available. + */ + nextCategory(): number; + + /** + * Pauses this Matter World instance and sets `enabled` to `false`. + * + * A paused world will not run any simulations for the duration it is paused. + */ + pause(): this; + + /** + * Resumes this Matter World instance from a paused state and sets `enabled` to `true`. + */ + resume(): this; + + /** + * The internal update method. This is called automatically by the parent Scene. + * + * Moves the simulation forward in time by delta ms. Uses `World.correction` value as an optional number that + * specifies the time correction factor to apply to the update. This can help improve the accuracy of the + * simulation in cases where delta is changing between updates. The value of correction is defined as `delta / lastDelta`, + * i.e. the percentage change of delta over the last step. Therefore the value is always 1 (no correction) when + * delta is constant (or when no correction is desired, which is the default). + * See the paper on Time Corrected Verlet for more information. + * + * Triggers `beforeUpdate` and `afterUpdate` events. Triggers `collisionStart`, `collisionActive` and `collisionEnd` events. + * + * If the World is paused, `update` is still run, but exits early and does not update the Matter Engine. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(time: number, delta: number): void; + + /** + * Manually advances the physics simulation by one iteration. + * + * You can optionally pass in the `delta` and `correction` values to be used by Engine.update. + * If undefined they use the Matter defaults of 60Hz and no correction. + * + * Calling `step` directly bypasses any checks of `enabled` or `autoUpdate`. + * + * It also ignores any custom `getDelta` functions, as you should be passing the delta + * value in to this call. + * + * You can adjust the number of iterations that Engine.update performs internally. + * Use the Scene Matter Physics config object to set the following properties: + * + * positionIterations (defaults to 6) + * velocityIterations (defaults to 4) + * constraintIterations (defaults to 2) + * + * Adjusting these values can help performance in certain situations, depending on the physics requirements + * of your game. + * @param delta The delta value. Default 16.666. + */ + step(delta?: number): void; + + /** + * Runs the Matter Engine.update at a fixed timestep of 60Hz. + */ + update60Hz(): number; + + /** + * Runs the Matter Engine.update at a fixed timestep of 30Hz. + */ + update30Hz(): number; + + /** + * Returns `true` if the given body can be found within the World. + * @param body The Matter Body, or Game Object, to search for within the world. + */ + has(body: MatterJS.Body | Phaser.GameObjects.GameObject): MatterJS.BodyType[]; + + /** + * Returns all the bodies in the Matter World, including all bodies in children, recursively. + */ + getAllBodies(): MatterJS.BodyType[]; + + /** + * Returns all the constraints in the Matter World, including all constraints in children, recursively. + */ + getAllConstraints(): MatterJS.ConstraintType[]; + + /** + * Returns all the composites in the Matter World, including all composites in children, recursively. + */ + getAllComposites(): MatterJS.CompositeType[]; + + /** + * Renders the Engine Broadphase Controller Grid to the given Graphics instance. + * + * The debug renderer calls this method if the `showBroadphase` config value is set. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render the Grid to your own Graphics instance. + * @param grid The Matter Grid to be rendered. + * @param graphics The Graphics object to render to. + * @param lineColor The line color. + * @param lineOpacity The line opacity, between 0 and 1. + */ + renderGrid(grid: MatterJS.Grid, graphics: Phaser.GameObjects.Graphics, lineColor: number, lineOpacity: number): this; + + /** + * Renders the list of Pair separations to the given Graphics instance. + * + * The debug renderer calls this method if the `showSeparations` config value is set. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render the Grid to your own Graphics instance. + * @param pairs An array of Matter Pairs to be rendered. + * @param graphics The Graphics object to render to. + * @param lineColor The line color. + */ + renderSeparations(pairs: MatterJS.Pair[], graphics: Phaser.GameObjects.Graphics, lineColor: number): this; + + /** + * Renders the list of collision points and normals to the given Graphics instance. + * + * The debug renderer calls this method if the `showCollisions` config value is set. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render the Grid to your own Graphics instance. + * @param pairs An array of Matter Pairs to be rendered. + * @param graphics The Graphics object to render to. + * @param lineColor The line color. + */ + renderCollisions(pairs: MatterJS.Pair[], graphics: Phaser.GameObjects.Graphics, lineColor: number): this; + + /** + * Renders the bounds of an array of Bodies to the given Graphics instance. + * + * If the body is a compound body, it will render the bounds for the parent compound. + * + * The debug renderer calls this method if the `showBounds` config value is set. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render bounds to your own Graphics instance. + * @param bodies An array of bodies from the localWorld. + * @param graphics The Graphics object to render to. + * @param lineColor The line color. + * @param lineOpacity The line opacity, between 0 and 1. + */ + renderBodyBounds(bodies: any[], graphics: Phaser.GameObjects.Graphics, lineColor: number, lineOpacity: number): void; + + /** + * Renders either all axes, or a single axis indicator, for an array of Bodies, to the given Graphics instance. + * + * The debug renderer calls this method if the `showAxes` or `showAngleIndicator` config values are set. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render bounds to your own Graphics instance. + * @param bodies An array of bodies from the localWorld. + * @param graphics The Graphics object to render to. + * @param showAxes If `true` it will render all body axes. If `false` it will render a single axis indicator. + * @param lineColor The line color. + * @param lineOpacity The line opacity, between 0 and 1. + */ + renderBodyAxes(bodies: any[], graphics: Phaser.GameObjects.Graphics, showAxes: boolean, lineColor: number, lineOpacity: number): void; + + /** + * Renders a velocity indicator for an array of Bodies, to the given Graphics instance. + * + * The debug renderer calls this method if the `showVelocity` config value is set. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render bounds to your own Graphics instance. + * @param bodies An array of bodies from the localWorld. + * @param graphics The Graphics object to render to. + * @param lineColor The line color. + * @param lineOpacity The line opacity, between 0 and 1. + * @param lineThickness The line thickness. + */ + renderBodyVelocity(bodies: any[], graphics: Phaser.GameObjects.Graphics, lineColor: number, lineOpacity: number, lineThickness: number): void; + + /** + * Renders a single Matter Body to the given Phaser Graphics Game Object. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render a Body to your own Graphics instance. + * + * If you don't wish to render a line around the body, set the `lineColor` parameter to `null`. + * Equally, if you don't wish to render a fill, set the `fillColor` parameter to `null`. + * @param body The Matter Body to be rendered. + * @param graphics The Graphics object to render to. + * @param showInternalEdges Render internal edges of the polygon? + * @param lineColor The line color. + * @param lineOpacity The line opacity, between 0 and 1. + * @param lineThickness The line thickness. Default 1. + * @param fillColor The fill color. + * @param fillOpacity The fill opacity, between 0 and 1. + */ + renderBody(body: MatterJS.BodyType, graphics: Phaser.GameObjects.Graphics, showInternalEdges: boolean, lineColor?: number, lineOpacity?: number, lineThickness?: number, fillColor?: number, fillOpacity?: number): this; + + /** + * Renders the Convex Hull for a single Matter Body to the given Phaser Graphics Game Object. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render a Body hull to your own Graphics instance. + * @param body The Matter Body to be rendered. + * @param graphics The Graphics object to render to. + * @param hullColor The color used to render the hull. + * @param lineThickness The hull line thickness. Default 1. + */ + renderConvexHull(body: MatterJS.BodyType, graphics: Phaser.GameObjects.Graphics, hullColor: number, lineThickness?: number): this; + + /** + * Renders a single Matter Constraint, such as a Pin or a Spring, to the given Phaser Graphics Game Object. + * + * This method is used internally by the Matter Debug Renderer, but is also exposed publically should + * you wish to render a Constraint to your own Graphics instance. + * @param constraint The Matter Constraint to render. + * @param graphics The Graphics object to render to. + * @param lineColor The line color. + * @param lineOpacity The line opacity, between 0 and 1. + * @param lineThickness The line thickness. + * @param pinSize If this constraint is a pin, this sets the size of the pin circle. + * @param anchorColor The color used when rendering this constraints anchors. Set to `null` to not render anchors. + * @param anchorSize The size of the anchor circle, if this constraint has anchors and is rendering them. + */ + renderConstraint(constraint: MatterJS.ConstraintType, graphics: Phaser.GameObjects.Graphics, lineColor: number, lineOpacity: number, lineThickness: number, pinSize: number, anchorColor: number, anchorSize: number): this; + + /** + * Resets the internal collision IDs that Matter.JS uses for Body collision groups. + * + * You should call this before destroying your game if you need to restart the game + * again on the same page, without first reloading the page. Or, if you wish to + * consistently destroy a Scene that contains Matter.js and then run it again + * later in the same game. + */ + resetCollisionIDs(): void; + + /** + * Will remove all Matter physics event listeners and clear the matter physics world, + * engine and any debug graphics, if any. + */ + shutdown(): void; + + /** + * Will remove all Matter physics event listeners and clear the matter physics world, + * engine and any debug graphics, if any. + * + * After destroying the world it cannot be re-used again. + */ + destroy(): void; + + } + + } + + } + + namespace Plugins { + /** + * A Global Plugin is installed just once into the Game owned Plugin Manager. + * It can listen for Game events and respond to them. + */ + class BasePlugin { + /** + * + * @param pluginManager A reference to the Plugin Manager. + */ + constructor(pluginManager: Phaser.Plugins.PluginManager); + + /** + * A handy reference to the Plugin Manager that is responsible for this plugin. + * Can be used as a route to gain access to game systems and events. + */ + protected pluginManager: Phaser.Plugins.PluginManager; + + /** + * A reference to the Game instance this plugin is running under. + */ + protected game: Phaser.Game; + + /** + * The PluginManager calls this method on a Global Plugin when the plugin is first instantiated. + * It will never be called again on this instance. + * In here you can set-up whatever you need for this plugin to run. + * If a plugin is set to automatically start then `BasePlugin.start` will be called immediately after this. + * On a Scene Plugin, this method is never called. Use {@link Phaser.Plugins.ScenePlugin#boot} instead. + * @param data A value specified by the user, if any, from the `data` property of the plugin's configuration object (if started at game boot) or passed in the PluginManager's `install` method (if started manually). + */ + init(data?: any | undefined): void; + + /** + * The PluginManager calls this method on a Global Plugin when the plugin is started. + * If a plugin is stopped, and then started again, this will get called again. + * Typically called immediately after `BasePlugin.init`. + * On a Scene Plugin, this method is never called. + */ + start(): void; + + /** + * The PluginManager calls this method on a Global Plugin when the plugin is stopped. + * The game code has requested that your plugin stop doing whatever it does. + * It is now considered as 'inactive' by the PluginManager. + * Handle that process here (i.e. stop listening for events, etc) + * If the plugin is started again then `BasePlugin.start` will be called again. + * On a Scene Plugin, this method is never called. + */ + stop(): void; + + /** + * Game instance has been destroyed. + * You must release everything in here, all references, all objects, free it all up. + */ + destroy(): void; + + } + + /** + * The Default Plugins. + */ + namespace DefaultPlugins { + /** + * These are the Global Managers that are created by the Phaser.Game instance. + * They are referenced from Scene.Systems so that plugins can use them. + */ + var Global: any[]; + + /** + * These are the core plugins that are installed into every Scene.Systems instance, no matter what. + * They are optionally exposed in the Scene as well (see the InjectionMap for details) + * + * They are created in the order in which they appear in this array and EventEmitter is always first. + */ + var CoreScene: any[]; + + /** + * These plugins are created in Scene.Systems in addition to the CoreScenePlugins. + * + * You can elect not to have these plugins by either creating a DefaultPlugins object as part + * of the Game Config, by creating a Plugins object as part of a Scene Config, or by modifying this array + * and building your own bundle. + * + * They are optionally exposed in the Scene as well (see the InjectionMap for details) + * + * They are always created in the order in which they appear in the array. + */ + var DefaultScene: any[]; + + } + + namespace PluginCache { + /** + * Static method called directly by the Core internal Plugins. + * Key is a reference used to get the plugin from the plugins object (i.e. InputPlugin) + * Plugin is the object to instantiate to create the plugin + * Mapping is what the plugin is injected into the Scene.Systems as (i.e. input) + * @param key A reference used to get this plugin from the plugin cache. + * @param plugin The plugin to be stored. Should be the core object, not instantiated. + * @param mapping If this plugin is to be injected into the Scene Systems, this is the property key map used. + * @param custom Core Scene plugin or a Custom Scene plugin? Default false. + */ + function register(key: string, plugin: Function, mapping: string, custom?: boolean): void; + + /** + * Stores a custom plugin in the global plugin cache. + * The key must be unique, within the scope of the cache. + * @param key A reference used to get this plugin from the plugin cache. + * @param plugin The plugin to be stored. Should be the core object, not instantiated. + * @param mapping If this plugin is to be injected into the Scene Systems, this is the property key map used. + * @param data A value to be passed to the plugin's `init` method. + */ + function registerCustom(key: string, plugin: Function, mapping: string, data: any | undefined): void; + + /** + * Checks if the given key is already being used in the core plugin cache. + * @param key The key to check for. + */ + function hasCore(key: string): boolean; + + /** + * Checks if the given key is already being used in the custom plugin cache. + * @param key The key to check for. + */ + function hasCustom(key: string): boolean; + + /** + * Returns the core plugin object from the cache based on the given key. + * @param key The key of the core plugin to get. + */ + function getCore(key: string): Phaser.Types.Plugins.CorePluginContainer; + + /** + * Returns the custom plugin object from the cache based on the given key. + * @param key The key of the custom plugin to get. + */ + function getCustom(key: string): Phaser.Types.Plugins.CustomPluginContainer; + + /** + * Returns an object from the custom cache based on the given key that can be instantiated. + * @param key The key of the custom plugin to get. + */ + function getCustomClass(key: string): Function; + + /** + * Removes a core plugin based on the given key. + * @param key The key of the core plugin to remove. + */ + function remove(key: string): void; + + /** + * Removes a custom plugin based on the given key. + * @param key The key of the custom plugin to remove. + */ + function removeCustom(key: string): void; + + /** + * Removes all Core Plugins. + * + * This includes all of the internal system plugins that Phaser needs, like the Input Plugin and Loader Plugin. + * So be sure you only call this if you do not wish to run Phaser again. + */ + function destroyCorePlugins(): void; + + /** + * Removes all Custom Plugins. + */ + function destroyCustomPlugins(): void; + + } + + /** + * The PluginManager is responsible for installing and adding plugins to Phaser. + * + * It is a global system and therefore belongs to the Game instance, not a specific Scene. + * + * It works in conjunction with the PluginCache. Core internal plugins automatically register themselves + * with the Cache, but it's the Plugin Manager that is responsible for injecting them into the Scenes. + * + * There are two types of plugin: + * + * 1. A Global Plugin + * 2. A Scene Plugin + * + * A Global Plugin is a plugin that lives within the Plugin Manager rather than a Scene. You can get + * access to it by calling `PluginManager.get` and providing a key. Any Scene that requests a plugin in + * this way will all get access to the same plugin instance, allowing you to use a single plugin across + * multiple Scenes. + * + * A Scene Plugin is a plugin dedicated to running within a Scene. These are different to Global Plugins + * in that their instances do not live within the Plugin Manager, but within the Scene Systems class instead. + * And that every Scene created is given its own unique instance of a Scene Plugin. Examples of core Scene + * Plugins include the Input Plugin, the Tween Plugin and the physics Plugins. + * + * You can add a plugin to Phaser in three different ways: + * + * 1. Preload it + * 2. Include it in your source code and install it via the Game Config + * 3. Include it in your source code and install it within a Scene + * + * For examples of all of these approaches please see the Phaser 3 Examples Repo `plugins` folder. + * + * For information on creating your own plugin please see the Phaser 3 Plugin Template. + */ + class PluginManager { + /** + * + * @param game The game instance that owns this Plugin Manager. + */ + constructor(game: Phaser.Game); + + /** + * The game instance that owns this Plugin Manager. + */ + game: Phaser.Game; + + /** + * The global plugins currently running and managed by this Plugin Manager. + * A plugin must have been started at least once in order to appear in this list. + */ + plugins: Phaser.Types.Plugins.GlobalPlugin[]; + + /** + * A list of plugin keys that should be installed into Scenes as well as the Core Plugins. + */ + scenePlugins: string[]; + + /** + * Run once the game has booted and installs all of the plugins configured in the Game Config. + */ + protected boot(): void; + + /** + * Called by the Scene Systems class. Tells the plugin manager to install all Scene plugins into it. + * + * First it will install global references, i.e. references from the Game systems into the Scene Systems (and Scene if mapped.) + * Then it will install Core Scene Plugins followed by Scene Plugins registered with the PluginManager. + * Finally it will install any references to Global Plugins that have a Scene mapping property into the Scene itself. + * @param sys The Scene Systems class to install all the plugins in to. + * @param globalPlugins An array of global plugins to install. + * @param scenePlugins An array of scene plugins to install. + */ + protected addToScene(sys: Phaser.Scenes.Systems, globalPlugins: any[], scenePlugins: any[]): void; + + /** + * Called by the Scene Systems class. Returns a list of plugins to be installed. + */ + protected getDefaultScenePlugins(): string[]; + + /** + * Installs a new Scene Plugin into the Plugin Manager and optionally adds it + * to the given Scene as well. A Scene Plugin added to the manager in this way + * will be automatically installed into all new Scenes using the key and mapping given. + * + * The `key` property is what the plugin is injected into Scene.Systems as. + * The `mapping` property is optional, and if specified is what the plugin is installed into + * the Scene as. For example: + * + * ```javascript + * this.plugins.installScenePlugin('powerupsPlugin', pluginCode, 'powerups'); + * + * // and from within the scene: + * this.sys.powerupsPlugin; // key value + * this.powerups; // mapping value + * ``` + * + * This method is called automatically by Phaser if you install your plugins using either the + * Game Configuration object, or by preloading them via the Loader. + * @param key The property key that will be used to add this plugin to Scene.Systems. + * @param plugin The plugin code. This should be the non-instantiated version. + * @param mapping If this plugin is injected into the Phaser.Scene class, this is the property key to use. + * @param addToScene Optionally automatically add this plugin to the given Scene. + * @param fromLoader Is this being called by the Loader? Default false. + */ + installScenePlugin(key: string, plugin: Function, mapping?: string, addToScene?: Phaser.Scene, fromLoader?: boolean): void; + + /** + * Installs a new Global Plugin into the Plugin Manager and optionally starts it running. + * A global plugin belongs to the Plugin Manager, rather than a specific Scene, and can be accessed + * and used by all Scenes in your game. + * + * The `key` property is what you use to access this plugin from the Plugin Manager. + * + * ```javascript + * this.plugins.install('powerupsPlugin', pluginCode); + * + * // and from within the scene: + * this.plugins.get('powerupsPlugin'); + * ``` + * + * This method is called automatically by Phaser if you install your plugins using either the + * Game Configuration object, or by preloading them via the Loader. + * + * The same plugin can be installed multiple times into the Plugin Manager by simply giving each + * instance its own unique key. + * @param key The unique handle given to this plugin within the Plugin Manager. + * @param plugin The plugin code. This should be the non-instantiated version. + * @param start Automatically start the plugin running? This is always `true` if you provide a mapping value. Default false. + * @param mapping If this plugin is injected into the Phaser.Scene class, this is the property key to use. + * @param data A value passed to the plugin's `init` method. + */ + install(key: string, plugin: Function, start?: boolean, mapping?: string, data?: any): Phaser.Plugins.BasePlugin | null; + + /** + * Gets an index of a global plugin based on the given key. + * @param key The unique plugin key. + */ + protected getIndex(key: string): number; + + /** + * Gets a global plugin based on the given key. + * @param key The unique plugin key. + */ + protected getEntry(key: string): Phaser.Types.Plugins.GlobalPlugin; + + /** + * Checks if the given global plugin, based on its key, is active or not. + * @param key The unique plugin key. + */ + isActive(key: string): boolean; + + /** + * Starts a global plugin running. + * + * If the plugin was previously active then calling `start` will reset it to an active state and then + * call its `start` method. + * + * If the plugin has never been run before a new instance of it will be created within the Plugin Manager, + * its active state set and then both of its `init` and `start` methods called, in that order. + * + * If the plugin is already running under the given key then nothing happens. + * @param key The key of the plugin to start. + * @param runAs Run the plugin under a new key. This allows you to run one plugin multiple times. + */ + start(key: string, runAs?: string): Phaser.Plugins.BasePlugin | null; + + /** + * Stops a global plugin from running. + * + * If the plugin is active then its active state will be set to false and the plugins `stop` method + * will be called. + * + * If the plugin is not already running, nothing will happen. + * @param key The key of the plugin to stop. + */ + stop(key: string): this; + + /** + * Gets a global plugin from the Plugin Manager based on the given key and returns it. + * + * If it cannot find an active plugin based on the key, but there is one in the Plugin Cache with the same key, + * then it will create a new instance of the cached plugin and return that. + * @param key The key of the plugin to get. + * @param autoStart Automatically start a new instance of the plugin if found in the cache, but not actively running. Default true. + */ + get(key: string, autoStart?: boolean): Phaser.Plugins.BasePlugin | Function | null; + + /** + * Returns the plugin class from the cache. + * Used internally by the Plugin Manager. + * @param key The key of the plugin to get. + */ + getClass(key: string): Phaser.Plugins.BasePlugin; + + /** + * Removes a global plugin from the Plugin Manager and Plugin Cache. + * + * It is up to you to remove all references to this plugin that you may hold within your game code. + * @param key The key of the plugin to remove. + */ + removeGlobalPlugin(key: string): void; + + /** + * Removes a scene plugin from the Plugin Manager and Plugin Cache. + * + * This will not remove the plugin from any active Scenes that are already using it. + * + * It is up to you to remove all references to this plugin that you may hold within your game code. + * @param key The key of the plugin to remove. + */ + removeScenePlugin(key: string): void; + + /** + * Registers a new type of Game Object with the global Game Object Factory and / or Creator. + * This is usually called from within your Plugin code and is a helpful short-cut for creating + * new Game Objects. + * + * The key is the property that will be injected into the factories and used to create the + * Game Object. For example: + * + * ```javascript + * this.plugins.registerGameObject('clown', clownFactoryCallback, clownCreatorCallback); + * // later in your game code: + * this.add.clown(); + * this.make.clown(); + * ``` + * + * The callbacks are what are called when the factories try to create a Game Object + * matching the given key. It's important to understand that the callbacks are invoked within + * the context of the GameObjectFactory. In this context there are several properties available + * to use: + * + * this.scene - A reference to the Scene that owns the GameObjectFactory. + * this.displayList - A reference to the Display List the Scene owns. + * this.updateList - A reference to the Update List the Scene owns. + * + * See the GameObjectFactory and GameObjectCreator classes for more details. + * Any public property or method listed is available from your callbacks under `this`. + * @param key The key of the Game Object that the given callbacks will create, i.e. `image`, `sprite`. + * @param factoryCallback The callback to invoke when the Game Object Factory is called. + * @param creatorCallback The callback to invoke when the Game Object Creator is called. + */ + registerGameObject(key: string, factoryCallback?: Function, creatorCallback?: Function): void; + + /** + * Removes a previously registered Game Object from the global Game Object Factory and / or Creator. + * This is usually called from within your Plugin destruction code to help clean-up after your plugin has been removed. + * @param key The key of the Game Object to be removed from the factories. + * @param removeFromFactory Should the Game Object be removed from the Game Object Factory? Default true. + * @param removeFromCreator Should the Game Object be removed from the Game Object Creator? Default true. + */ + removeGameObject(key: string, removeFromFactory?: boolean, removeFromCreator?: boolean): void; + + /** + * Registers a new file type with the global File Types Manager, making it available to all Loader + * Plugins created after this. + * + * This is usually called from within your Plugin code and is a helpful short-cut for creating + * new loader file types. + * + * The key is the property that will be injected into the Loader Plugin and used to load the + * files. For example: + * + * ```javascript + * this.plugins.registerFileType('wad', doomWadLoaderCallback); + * // later in your preload code: + * this.load.wad(); + * ``` + * + * The callback is what is called when the loader tries to load a file matching the given key. + * It's important to understand that the callback is invoked within + * the context of the LoaderPlugin. In this context there are several properties / methods available + * to use: + * + * this.addFile - A method to add the new file to the load queue. + * this.scene - The Scene that owns the Loader Plugin instance. + * + * See the LoaderPlugin class for more details. Any public property or method listed is available from + * your callback under `this`. + * @param key The key of the Game Object that the given callbacks will create, i.e. `image`, `sprite`. + * @param callback The callback to invoke when the Game Object Factory is called. + * @param addToScene Optionally add this file type into the Loader Plugin owned by the given Scene. + */ + registerFileType(key: string, callback: Function, addToScene?: Phaser.Scene): void; + + /** + * Destroys this Plugin Manager and all associated plugins. + * It will iterate all plugins found and call their `destroy` methods. + * + * The PluginCache will remove all custom plugins. + */ + destroy(): void; + + } + + /** + * A Scene Level Plugin is installed into every Scene and belongs to that Scene. + * It can listen for Scene events and respond to them. + * It can map itself to a Scene property, or into the Scene Systems, or both. + */ + class ScenePlugin extends Phaser.Plugins.BasePlugin { + /** + * + * @param scene A reference to the Scene that has installed this plugin. + * @param pluginManager A reference to the Plugin Manager. + * @param pluginKey The key under which this plugin has been installed into the Scene Systems. + */ + constructor(scene: Phaser.Scene, pluginManager: Phaser.Plugins.PluginManager, pluginKey: string); + + /** + * A reference to the Scene that has installed this plugin. + * Only set if it's a Scene Plugin, otherwise `null`. + * This property is only set when the plugin is instantiated and added to the Scene, not before. + * You can use it during the `boot` method. + */ + protected scene: Phaser.Scene | null; + + /** + * A reference to the Scene Systems of the Scene that has installed this plugin. + * Only set if it's a Scene Plugin, otherwise `null`. + * This property is only set when the plugin is instantiated and added to the Scene, not before. + * You can use it during the `boot` method. + */ + protected systems: Phaser.Scenes.Systems | null; + + /** + * The key under which this plugin was installed into the Scene Systems. + * + * This property is only set when the plugin is instantiated and added to the Scene, not before. + * You can use it during the `boot` method. + */ + readonly pluginKey: string; + + /** + * This method is called when the Scene boots. It is only ever called once. + * + * By this point the plugin properties `scene` and `systems` will have already been set. + * + * In here you can listen for {@link Phaser.Scenes.Events Scene events} and set-up whatever you need for this plugin to run. + * Here are the Scene events you can listen to: + * + * - start + * - ready + * - preupdate + * - update + * - postupdate + * - resize + * - pause + * - resume + * - sleep + * - wake + * - transitioninit + * - transitionstart + * - transitioncomplete + * - transitionout + * - shutdown + * - destroy + * + * At the very least you should offer a destroy handler for when the Scene closes down, i.e: + * + * ```javascript + * var eventEmitter = this.systems.events; + * eventEmitter.once('destroy', this.sceneDestroy, this); + * ``` + */ + boot(): void; + + /** + * Game instance has been destroyed. + * + * You must release everything in here, all references, all objects, free it all up. + */ + destroy(): void; + + } + + } + + /** + * Phaser Blend Modes. + */ + enum BlendModes { + /** + * Skips the Blend Mode check in the renderer. + */ + SKIP_CHECK, + /** + * Normal blend mode. For Canvas and WebGL. + * This is the default setting and draws new shapes on top of the existing canvas content. + */ + NORMAL, + /** + * Add blend mode. For Canvas and WebGL. + * Where both shapes overlap the color is determined by adding color values. + */ + ADD, + /** + * Multiply blend mode. For Canvas and WebGL. + * The pixels are of the top layer are multiplied with the corresponding pixel of the bottom layer. A darker picture is the result. + */ + MULTIPLY, + /** + * Screen blend mode. For Canvas and WebGL. + * The pixels are inverted, multiplied, and inverted again. A lighter picture is the result (opposite of multiply) + */ + SCREEN, + /** + * Overlay blend mode. For Canvas only. + * A combination of multiply and screen. Dark parts on the base layer become darker, and light parts become lighter. + */ + OVERLAY, + /** + * Darken blend mode. For Canvas only. + * Retains the darkest pixels of both layers. + */ + DARKEN, + /** + * Lighten blend mode. For Canvas only. + * Retains the lightest pixels of both layers. + */ + LIGHTEN, + /** + * Color Dodge blend mode. For Canvas only. + * Divides the bottom layer by the inverted top layer. + */ + COLOR_DODGE, + /** + * Color Burn blend mode. For Canvas only. + * Divides the inverted bottom layer by the top layer, and then inverts the result. + */ + COLOR_BURN, + /** + * Hard Light blend mode. For Canvas only. + * A combination of multiply and screen like overlay, but with top and bottom layer swapped. + */ + HARD_LIGHT, + /** + * Soft Light blend mode. For Canvas only. + * A softer version of hard-light. Pure black or white does not result in pure black or white. + */ + SOFT_LIGHT, + /** + * Difference blend mode. For Canvas only. + * Subtracts the bottom layer from the top layer or the other way round to always get a positive value. + */ + DIFFERENCE, + /** + * Exclusion blend mode. For Canvas only. + * Like difference, but with lower contrast. + */ + EXCLUSION, + /** + * Hue blend mode. For Canvas only. + * Preserves the luma and chroma of the bottom layer, while adopting the hue of the top layer. + */ + HUE, + /** + * Saturation blend mode. For Canvas only. + * Preserves the luma and hue of the bottom layer, while adopting the chroma of the top layer. + */ + SATURATION, + /** + * Color blend mode. For Canvas only. + * Preserves the luma of the bottom layer, while adopting the hue and chroma of the top layer. + */ + COLOR, + /** + * Luminosity blend mode. For Canvas only. + * Preserves the hue and chroma of the bottom layer, while adopting the luma of the top layer. + */ + LUMINOSITY, + /** + * Alpha erase blend mode. For Canvas and WebGL. + */ + ERASE, + /** + * Source-in blend mode. For Canvas only. + * The new shape is drawn only where both the new shape and the destination canvas overlap. Everything else is made transparent. + */ + SOURCE_IN, + /** + * Source-out blend mode. For Canvas only. + * The new shape is drawn where it doesn't overlap the existing canvas content. + */ + SOURCE_OUT, + /** + * Source-out blend mode. For Canvas only. + * The new shape is only drawn where it overlaps the existing canvas content. + */ + SOURCE_ATOP, + /** + * Destination-over blend mode. For Canvas only. + * New shapes are drawn behind the existing canvas content. + */ + DESTINATION_OVER, + /** + * Destination-in blend mode. For Canvas only. + * The existing canvas content is kept where both the new shape and existing canvas content overlap. Everything else is made transparent. + */ + DESTINATION_IN, + /** + * Destination-out blend mode. For Canvas only. + * The existing content is kept where it doesn't overlap the new shape. + */ + DESTINATION_OUT, + /** + * Destination-out blend mode. For Canvas only. + * The existing canvas is only kept where it overlaps the new shape. The new shape is drawn behind the canvas content. + */ + DESTINATION_ATOP, + /** + * Lighten blend mode. For Canvas only. + * Where both shapes overlap the color is determined by adding color values. + */ + LIGHTER, + /** + * Copy blend mode. For Canvas only. + * Only the new shape is shown. + */ + COPY, + /** + * Xor blend mode. For Canvas only. + * Shapes are made transparent where both overlap and drawn normal everywhere else. + */ + XOR, + } + + namespace Renderer { + namespace Canvas { + /** + * The Canvas Renderer is responsible for managing 2D canvas rendering contexts, + * including the one used by the Games canvas. It tracks the internal state of a + * given context and can renderer textured Game Objects to it, taking into + * account alpha, blending, and scaling. + */ + class CanvasRenderer extends Phaser.Events.EventEmitter { + /** + * + * @param game The Phaser Game instance that owns this renderer. + */ + constructor(game: Phaser.Game); + + /** + * The local configuration settings of the CanvasRenderer. + */ + config: object; + + /** + * The Phaser Game instance that owns this renderer. + */ + game: Phaser.Game; + + /** + * A constant which allows the renderer to be easily identified as a Canvas Renderer. + */ + type: number; + + /** + * The total number of Game Objects which were rendered in a frame. + */ + drawCount: number; + + /** + * The width of the canvas being rendered to. + */ + width: number; + + /** + * The height of the canvas being rendered to. + */ + height: number; + + /** + * The canvas element which the Game uses. + */ + gameCanvas: HTMLCanvasElement; + + /** + * The canvas context used to render all Cameras in all Scenes during the game loop. + */ + gameContext: CanvasRenderingContext2D; + + /** + * The canvas context currently used by the CanvasRenderer for all rendering operations. + */ + currentContext: CanvasRenderingContext2D; + + /** + * Should the Canvas use Image Smoothing or not when drawing Sprites? + */ + antialias: boolean; + + /** + * The blend modes supported by the Canvas Renderer. + * + * This object maps the {@link Phaser.BlendModes} to canvas compositing operations. + */ + blendModes: any[]; + + /** + * Details about the currently scheduled snapshot. + * + * If a non-null `callback` is set in this object, a snapshot of the canvas will be taken after the current frame is fully rendered. + */ + snapshotState: Phaser.Types.Renderer.Snapshot.SnapshotState; + + /** + * Has this renderer fully booted yet? + */ + isBooted: boolean; + + /** + * Prepares the game canvas for rendering. + */ + init(): void; + + /** + * The event handler that manages the `resize` event dispatched by the Scale Manager. + * @param gameSize The default Game Size object. This is the un-modified game dimensions. + * @param baseSize The base Size object. The game dimensions multiplied by the resolution. The canvas width / height values match this. + */ + onResize(gameSize: Phaser.Structs.Size, baseSize: Phaser.Structs.Size): void; + + /** + * Resize the main game canvas. + * @param width The new width of the renderer. + * @param height The new height of the renderer. + */ + resize(width?: number, height?: number): void; + + /** + * Resets the transformation matrix of the current context to the identity matrix, thus resetting any transformation. + */ + resetTransform(): void; + + /** + * Sets the blend mode (compositing operation) of the current context. + * @param blendMode The new blend mode which should be used. + */ + setBlendMode(blendMode: string): this; + + /** + * Changes the Canvas Rendering Context that all draw operations are performed against. + * @param ctx The new Canvas Rendering Context to draw everything to. Leave empty to reset to the Game Canvas. + */ + setContext(ctx?: CanvasRenderingContext2D | undefined): this; + + /** + * Sets the global alpha of the current context. + * @param alpha The new alpha to use, where 0 is fully transparent and 1 is fully opaque. + */ + setAlpha(alpha: number): this; + + /** + * Called at the start of the render loop. + */ + preRender(): void; + + /** + * The core render step for a Scene Camera. + * + * Iterates through the given array of Game Objects and renders them with the given Camera. + * + * This is called by the `CameraManager.render` method. The Camera Manager instance belongs to a Scene, and is invoked + * by the Scene Systems.render method. + * + * This method is not called if `Camera.visible` is `false`, or `Camera.alpha` is zero. + * @param scene The Scene to render. + * @param children An array of filtered Game Objects that can be rendered by the given Camera. + * @param camera The Scene Camera to render with. + */ + render(scene: Phaser.Scene, children: Phaser.GameObjects.GameObject[], camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Restores the game context's global settings and takes a snapshot if one is scheduled. + * + * The post-render step happens after all Cameras in all Scenes have been rendered. + */ + postRender(): void; + + /** + * Takes a snapshot of the given area of the given canvas. + * + * Unlike the other snapshot methods, this one is processed immediately and doesn't wait for the next render. + * + * Snapshots work by creating an Image object from the canvas data, this is a blocking process, which gets + * more expensive the larger the canvas size gets, so please be careful how you employ this in your game. + * @param canvas The canvas to grab from. + * @param callback The Function to invoke after the snapshot image is created. + * @param getPixel Grab a single pixel as a Color object, or an area as an Image object? Default false. + * @param x The x coordinate to grab from. Default 0. + * @param y The y coordinate to grab from. Default 0. + * @param width The width of the area to grab. Default canvas.width. + * @param height The height of the area to grab. Default canvas.height. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshotCanvas(canvas: HTMLCanvasElement, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, getPixel?: boolean, x?: number, y?: number, width?: number, height?: number, type?: string, encoderOptions?: number): this; + + /** + * Schedules a snapshot of the entire game viewport to be taken after the current frame is rendered. + * + * To capture a specific area see the `snapshotArea` method. To capture a specific pixel, see `snapshotPixel`. + * + * Only one snapshot can be active _per frame_. If you have already called `snapshotPixel`, for example, then + * calling this method will override it. + * + * Snapshots work by creating an Image object from the canvas data, this is a blocking process, which gets + * more expensive the larger the canvas size gets, so please be careful how you employ this in your game. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshot(callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Schedules a snapshot of the given area of the game viewport to be taken after the current frame is rendered. + * + * To capture the whole game viewport see the `snapshot` method. To capture a specific pixel, see `snapshotPixel`. + * + * Only one snapshot can be active _per frame_. If you have already called `snapshotPixel`, for example, then + * calling this method will override it. + * + * Snapshots work by creating an Image object from the canvas data, this is a blocking process, which gets + * more expensive the larger the canvas size gets, so please be careful how you employ this in your game. + * @param x The x coordinate to grab from. + * @param y The y coordinate to grab from. + * @param width The width of the area to grab. + * @param height The height of the area to grab. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshotArea(x: number, y: number, width: number, height: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Schedules a snapshot of the given pixel from the game viewport to be taken after the current frame is rendered. + * + * To capture the whole game viewport see the `snapshot` method. To capture a specific area, see `snapshotArea`. + * + * Only one snapshot can be active _per frame_. If you have already called `snapshotArea`, for example, then + * calling this method will override it. + * + * Unlike the other two snapshot methods, this one will return a `Color` object containing the color data for + * the requested pixel. It doesn't need to create an internal Canvas or Image object, so is a lot faster to execute, + * using less memory. + * @param x The x coordinate of the pixel to get. + * @param y The y coordinate of the pixel to get. + * @param callback The Function to invoke after the snapshot pixel data is extracted. + */ + snapshotPixel(x: number, y: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback): this; + + /** + * Takes a Sprite Game Object, or any object that extends it, and draws it to the current context. + * @param sprite The texture based Game Object to draw. + * @param frame The frame to draw, doesn't have to be that owned by the Game Object. + * @param camera The Camera to use for the rendering transform. + * @param parentTransformMatrix The transform matrix of the parent container, if set. + */ + batchSprite(sprite: Phaser.GameObjects.GameObject, frame: Phaser.Textures.Frame, camera: Phaser.Cameras.Scene2D.Camera, parentTransformMatrix?: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Destroys all object references in the Canvas Renderer. + */ + destroy(): void; + + } + + /** + * Returns an array which maps the default blend modes to supported Canvas blend modes. + * + * If the browser doesn't support a blend mode, it will default to the normal `source-over` blend mode. + */ + function GetBlendModes(): any[]; + + /** + * Takes a reference to the Canvas Renderer, a Canvas Rendering Context, a Game Object, a Camera and a parent matrix + * and then performs the following steps: + * + * 1. Checks the alpha of the source combined with the Camera alpha. If 0 or less it aborts. + * 2. Takes the Camera and Game Object matrix and multiplies them, combined with the parent matrix if given. + * 3. Sets the blend mode of the context to be that used by the Game Object. + * 4. Sets the alpha value of the context to be that used by the Game Object combined with the Camera. + * 5. Saves the context state. + * 6. Sets the final matrix values into the context via setTransform. + * 7. If the Game Object has a texture frame, imageSmoothingEnabled is set based on frame.source.scaleMode. + * 8. If the Game Object does not have a texture frame, imageSmoothingEnabled is set based on Renderer.antialias. + * + * This function is only meant to be used internally. Most of the Canvas Renderer classes use it. + * @param renderer A reference to the current active Canvas renderer. + * @param ctx The canvas context to set the transform on. + * @param src The Game Object being rendered. Can be any type that extends the base class. + * @param camera The Camera that is rendering the Game Object. + * @param parentMatrix A parent transform matrix to apply to the Game Object before rendering. + */ + function SetTransform(renderer: Phaser.Renderer.Canvas.CanvasRenderer, ctx: CanvasRenderingContext2D, src: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): boolean; + + } + + namespace Events { + /** + * The Lose WebGL Event. + * + * This event is dispatched by the WebGLRenderer when the WebGL context + * is lost. + * + * Context can be lost for a variety of reasons, like leaving the browser tab. + * The game canvas DOM object will dispatch `webglcontextlost`. + * All WebGL resources get wiped, and the context is reset. + * + * While WebGL is lost, the game will continue to run, but all WebGL resources + * are lost, and new ones cannot be created. + * + * Once the context is restored and the renderer has automatically restored + * the state, the renderer will emit a `RESTORE_WEBGL` event. At that point, + * it is safe to continue. + */ + const LOSE_WEBGL: string; + + /** + * The Post-Render Event. + * + * This event is dispatched by the Renderer when all rendering, for all cameras in all Scenes, + * has completed, but before any pending snap shots have been taken. + */ + const POST_RENDER: string; + + /** + * The Pre-Render Event. + * + * This event is dispatched by the Phaser Renderer. This happens right at the start of the render + * process, after the context has been cleared, the scissors enabled (WebGL only) and everything has been + * reset ready for the render. + */ + const PRE_RENDER: string; + + /** + * The Render Event. + * + * This event is dispatched by the Phaser Renderer for every camera in every Scene. + * + * It is dispatched before any of the children in the Scene have been rendered. + */ + const RENDER: string; + + /** + * The Renderer Resize Event. + * + * This event is dispatched by the Phaser Renderer when it is resized, usually as a result + * of the Scale Manager resizing. + */ + const RESIZE: string; + + /** + * The Restore WebGL Event. + * + * This event is dispatched by the WebGLRenderer when the WebGL context + * is restored. + * + * It is dispatched after all WebGL resources have been recreated. + * Most resources should come back automatically, but you will need to redraw + * dynamic textures that were GPU bound. + * Listen to this event to know when you can safely do that. + * + * Context can be lost for a variety of reasons, like leaving the browser tab. + * The game canvas DOM object will dispatch `webglcontextlost`. + * All WebGL resources get wiped, and the context is reset. + * + * Once the context is restored, the canvas will dispatch + * `webglcontextrestored`. Phaser uses this to re-create necessary resources. + * Please wait for Phaser to dispatch the `RESTORE_WEBGL` event before + * re-creating any resources of your own. + */ + const RESTORE_WEBGL: string; + + } + + namespace Snapshot { + /** + * Takes a snapshot of an area from the current frame displayed by a canvas. + * + * This is then copied to an Image object. When this loads, the results are sent + * to the callback provided in the Snapshot Configuration object. + * @param sourceCanvas The canvas to take a snapshot of. + * @param config The snapshot configuration object. + */ + function Canvas(sourceCanvas: HTMLCanvasElement, config: Phaser.Types.Renderer.Snapshot.SnapshotState): void; + + /** + * Takes a snapshot of an area from the current frame displayed by a WebGL canvas. + * + * This is then copied to an Image object. When this loads, the results are sent + * to the callback provided in the Snapshot Configuration object. + * @param sourceContext The WebGL context to take a snapshot of. + * @param config The snapshot configuration object. + */ + function WebGL(sourceContext: WebGLRenderingContext, config: Phaser.Types.Renderer.Snapshot.SnapshotState): void; + + } + + namespace WebGL { + /** + * 8-bit twos complement signed integer. + */ + var BYTE: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * 8-bit twos complement unsigned integer. + */ + var UNSIGNED_BYTE: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * 16-bit twos complement signed integer. + */ + var SHORT: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * 16-bit twos complement unsigned integer. + */ + var UNSIGNED_SHORT: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * 32-bit twos complement signed integer. + */ + var INT: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * 32-bit twos complement unsigned integer. + */ + var UNSIGNED_INT: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * 32-bit IEEE floating point number. + */ + var FLOAT: Phaser.Types.Renderer.WebGL.WebGLConst; + + /** + * The Pipeline Manager is responsible for the creation, activation, running and destruction + * of WebGL Pipelines and Post FX Pipelines in Phaser 3. + * + * The `WebGLRenderer` owns a single instance of the Pipeline Manager, which you can access + * via the `WebGLRenderer.pipelines` property. + * + * By default, there are 9 pipelines installed into the Pipeline Manager when Phaser boots: + * + * 1. The Multi Pipeline. Responsible for all multi-texture rendering, i.e. Sprites and Tilemaps. + * 2. The Rope Pipeline. Responsible for rendering the Rope Game Object. + * 3. The Light Pipeline. Responsible for rendering the Light Game Object. + * 4. The Point Light Pipeline. Responsible for rendering the Point Light Game Object. + * 5. The Single Pipeline. Responsible for rendering Game Objects that explicitly require one bound texture. + * 6. The Bitmap Mask Pipeline. Responsible for Bitmap Mask rendering. + * 7. The Utility Pipeline. Responsible for providing lots of handy texture manipulation functions. + * 8. The Mobile Pipeline. Responsible for rendering on mobile with single-bound textures. + * 9. The FX Pipeline. Responsible for rendering Game Objects with special FX applied to them. + * + * You can add your own custom pipeline via the `PipelineManager.add` method. Pipelines are + * identified by unique string-based keys. + */ + class PipelineManager { + /** + * + * @param renderer A reference to the WebGL Renderer that owns this Pipeline Manager. + */ + constructor(renderer: Phaser.Renderer.WebGL.WebGLRenderer); + + /** + * A reference to the Game instance. + */ + game: Phaser.Game; + + /** + * A reference to the WebGL Renderer instance. + */ + renderer: Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * This map stores all pipeline classes available in this manager. + * + * The Utility Class must always come first. + */ + classes: Phaser.Structs.Map; + + /** + * This map stores all Post FX Pipeline classes available in this manager. + * + * As of v3.60 this is now populated by default with the following + * Post FX Pipelines: + * + * * Barrel + * * Bloom + * * Blur + * * Bokeh / TiltShift + * * Circle + * * ColorMatrix + * * Displacement + * * Glow + * * Gradient + * * Pixelate + * * Shadow + * * Shine + * * Vignette + * * Wipe + * + * These are added as part of the boot process. + * + * If you do not wish to add them, specify `disableFX: true` in your game config. + * + * See the FX Controller class for more details about each FX. + */ + postPipelineClasses: Phaser.Structs.Map; + + /** + * This map stores all pipeline instances in this manager. + * + * This is populated with the default pipelines in the `boot` method. + */ + pipelines: Phaser.Structs.Map; + + /** + * An array of all post-pipelines that are created by this manager. + */ + postPipelineInstances: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * The default Game Object pipeline. + */ + default: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * Current pipeline in use by the WebGLRenderer. + */ + current: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The previous WebGLPipeline that was in use. + * + * This is set when `clearPipeline` is called and restored in `rebindPipeline` if none is given. + */ + previous: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * A constant-style reference to the Multi Pipeline Instance. + * + * This is the default Phaser 3 pipeline and is used by the WebGL Renderer to manage + * camera effects and more. This property is set during the `boot` method. + */ + MULTI_PIPELINE: Phaser.Renderer.WebGL.Pipelines.MultiPipeline; + + /** + * A constant-style reference to the Bitmap Mask Pipeline Instance. + * + * This is the default Phaser 3 mask pipeline and is used Game Objects using + * a Bitmap Mask. This property is set during the `boot` method. + */ + BITMAPMASK_PIPELINE: Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline; + + /** + * A constant-style reference to the Utility Pipeline Instance. + */ + UTILITY_PIPELINE: Phaser.Renderer.WebGL.Pipelines.UtilityPipeline; + + /** + * A constant-style reference to the Mobile Pipeline Instance. + * + * This is the default Phaser 3 mobile pipeline and is used by the WebGL Renderer to manage + * camera effects and more on mobile devices. This property is set during the `boot` method. + */ + MOBILE_PIPELINE: Phaser.Renderer.WebGL.Pipelines.MobilePipeline; + + /** + * A constant-style reference to the FX Pipeline Instance. + * + * This is the default Phaser 3 FX pipeline and is used by the WebGL Renderer to manage + * Game Objects with special effects enabled. This property is set during the `boot` method. + */ + FX_PIPELINE: Phaser.Renderer.WebGL.Pipelines.FXPipeline; + + /** + * A reference to the Full Frame 1 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is the full size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + fullFrame1: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Full Frame 2 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is the full size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + fullFrame2: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Half Frame 1 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is half the size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + halfFrame1: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Half Frame 2 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is half the size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + halfFrame2: Phaser.Renderer.WebGL.RenderTarget; + + /** + * An array of RenderTarget instances that belong to this pipeline. + */ + renderTargets: Phaser.Renderer.WebGL.RenderTarget[]; + + /** + * The largest render target dimension before we just use a full-screen target. + */ + maxDimension: number; + + /** + * The amount in which each target frame will increase. + * + * Defaults to 32px but can be overridden in the config. + */ + frameInc: number; + + /** + * The Render Target index. Used internally by the methods + * in this class. Do not modify directly. + */ + targetIndex: number; + + /** + * Internal boot handler, called by the WebGLRenderer durings its boot process. + * + * Adds all of the default pipelines, based on the game config, and then calls + * the `boot` method on each one of them. + * + * Finally, the default pipeline is set. + * @param pipelineConfig The pipeline configuration object as set in the Game Config. + * @param defaultPipeline The name of the default Game Object pipeline, as set in the Game Config + * @param autoMobilePipeline Automatically set the default pipeline to mobile if non-desktop detected? + */ + boot(pipelineConfig: Phaser.Types.Core.PipelineConfig, defaultPipeline: string, autoMobilePipeline: boolean): void; + + /** + * Sets the default pipeline being used by Game Objects. + * + * If no instance, or matching name, exists in this manager, it returns `undefined`. + * + * You can use this to override the default pipeline, for example by forcing + * the Mobile or Multi Tint Pipelines, which is especially useful for development + * testing. + * + * Make sure you call this method _before_ creating any Game Objects, as it will + * only impact Game Objects created after you call it. + * @param pipeline Either the string-based name of the pipeline to get, or a pipeline instance to look-up. + */ + setDefaultPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline): Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * Adds a pipeline instance to this Pipeline Manager. + * + * The name of the instance must be unique within this manager. + * + * Make sure to pass an instance to this method, not a base class. + * + * For example, you should pass it like this: + * + * ```javascript + * this.add('yourName', new CustomPipeline(game));` + * ``` + * + * and **not** like this: + * + * ```javascript + * this.add('yourName', CustomPipeline);` + * ``` + * + * To add a **Post Pipeline**, see `addPostPipeline` instead. + * @param name A unique string-based key for the pipeline within the manager. + * @param pipeline A pipeline _instance_ which must extend `WebGLPipeline`. + */ + add(name: string, pipeline: Phaser.Renderer.WebGL.WebGLPipeline): Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * Adds a Post Pipeline to this Pipeline Manager. + * + * Make sure to pass a base class to this method, not an instance. + * + * For example, you should pass it like this: + * + * ```javascript + * this.addPostPipeline('yourName', CustomPipeline);` + * ``` + * + * and **not** like this: + * + * ```javascript + * this.addPostPipeline('yourName', new CustomPipeline());` + * ``` + * + * To add a regular pipeline, see the `add` method instead. + * @param name A unique string-based key for the pipeline within the manager. + * @param pipeline A pipeline class which must extend `PostFXPipeline`. + */ + addPostPipeline(name: string, pipeline: Function): this; + + /** + * Flushes the current pipeline, if one is bound. + */ + flush(): void; + + /** + * Checks if a pipeline is present in this Pipeline Manager. + * @param pipeline Either the string-based name of the pipeline to get, or a pipeline instance to look-up. + */ + has(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Returns the pipeline instance based on the given name, or instance. + * + * If no instance, or matching name, exists in this manager, it returns `undefined`. + * @param pipeline Either the string-based name of the pipeline to get, or a pipeline instance to look-up. + */ + get(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline): Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * Returns a _new instance_ of the post pipeline based on the given name, or class. + * + * If no instance, or matching name, exists in this manager, it returns `undefined`. + * @param pipeline Either the string-based name of the pipeline to get, or a pipeline instance, or class to look-up. + * @param gameObject If this post pipeline is being installed into a Game Object or Camera, this is a reference to it. + * @param config Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline, gameObject?: Phaser.GameObjects.GameObject, config?: object): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline; + + /** + * Removes a PostFXPipeline instance from this Pipeline Manager. + * + * Note that the pipeline will not be flushed or destroyed, it's simply removed from + * this manager. + * @param pipeline The pipeline instance to be removed. + */ + removePostPipeline(pipeline: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): void; + + /** + * Removes a pipeline instance based on the given name. + * + * If no pipeline matches the name, this method does nothing. + * + * Note that the pipeline will not be flushed or destroyed, it's simply removed from + * this manager. + * @param name The name of the pipeline to be removed. + * @param removeClass Remove the pipeline class as well as the instance? Default true. + * @param removePostPipelineClass Remove the post pipeline class as well as the instance? Default true. + */ + remove(name: string, removeClass?: boolean, removePostPipelineClass?: boolean): void; + + /** + * Sets the current pipeline to be used by the `WebGLRenderer`. + * + * This method accepts a pipeline instance as its parameter, not the name. + * + * If the pipeline isn't already the current one it will call `WebGLPipeline.bind` and then `onBind`. + * + * You cannot set Post FX Pipelines using this method. To use a Post FX Pipeline, you should + * apply it to either a Camera, Container or other supporting Game Object. + * @param pipeline The pipeline instance to be set as current. + * @param gameObject The Game Object that invoked this pipeline, if any. + * @param currentShader The shader to set as being current. + */ + set(pipeline: Phaser.Renderer.WebGL.WebGLPipeline, gameObject?: Phaser.GameObjects.GameObject, currentShader?: Phaser.Renderer.WebGL.WebGLShader): Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * This method is called by the `WebGLPipeline.batchQuad` method, right before a quad + * belonging to a Game Object is about to be added to the batch. + * + * It is also called directly bu custom Game Objects, such as Nine Slice or Mesh, + * from their render methods. + * + * It causes a batch flush, then calls the `preBatch` method on the Post FX Pipelines + * belonging to the Game Object. + * + * It should be followed by a call to `postBatch` to complete the process. + * @param gameObject The Game Object about to be batched. + */ + preBatch(gameObject: Phaser.GameObjects.GameObject): void; + + /** + * This method is called by the `WebGLPipeline.batchQuad` method, right after a quad + * belonging to a Game Object has been added to the batch. + * + * It is also called directly bu custom Game Objects, such as Nine Slice or Mesh, + * from their render methods. + * + * It causes a batch flush, then calls the `postBatch` method on the Post FX Pipelines + * belonging to the Game Object. + * + * It should be preceeded by a call to `preBatch` to start the process. + * @param gameObject The Game Object that was just added to the batch. + */ + postBatch(gameObject: Phaser.GameObjects.GameObject): void; + + /** + * Called at the start of the `WebGLRenderer.preRenderCamera` method. + * + * If the Camera has post pipelines set, it will flush the batch and then call the + * `preBatch` method on the post-fx pipelines belonging to the Camera. + * @param camera The Camera about to be rendered. + */ + preBatchCamera(camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Called at the end of the `WebGLRenderer.postRenderCamera` method. + * + * If the Camera has post pipelines set, it will flush the batch and then call the + * `postBatch` method on the post-fx pipelines belonging to the Camera. + * @param camera The Camera that was just rendered. + */ + postBatchCamera(camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Checks to see if the given pipeline is already the active pipeline, both within this + * Pipeline Manager and also has the same shader set in the Renderer. + * @param pipeline The pipeline instance to be checked. + * @param currentShader The shader to set as being current. + */ + isCurrent(pipeline: Phaser.Renderer.WebGL.WebGLPipeline, currentShader?: Phaser.Renderer.WebGL.WebGLShader): boolean; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * You can optionally set the brightness factor of the copy. + * + * The difference between this method and `drawFrame` is that this method + * uses a faster copy shader, where only the brightness can be modified. + * If you need color level manipulation, see `drawFrame` instead. + * + * The copy itself is handled by the Utility Pipeline. + * @param source The source Render Target. + * @param target The target Render Target. + * @param brightness The brightness value applied to the frame copy. Default 1. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + copyFrame(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, brightness?: number, clear?: boolean, clearAlpha?: boolean): this; + + /** + * Pops the framebuffer from the renderers FBO stack and sets that as the active target, + * then draws the `source` Render Target to it. It then resets the renderer textures. + * + * This should be done when you need to draw the _final_ results of a pipeline to the game + * canvas, or the next framebuffer in line on the FBO stack. You should only call this once + * in the `onDraw` handler and it should be the final thing called. Be careful not to call + * this if you need to actually use the pipeline shader, instead of the copy shader. In + * those cases, use the `bindAndDraw` method. + * @param source The Render Target to draw from. + */ + copyToGame(source: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Copy the `source` Render Target to the `target` Render Target, using the + * given Color Matrix. + * + * The difference between this method and `copyFrame` is that this method + * uses a color matrix shader, where you have full control over the luminance + * values used during the copy. If you don't need this, you can use the faster + * `copyFrame` method instead. + * + * The copy itself is handled by the Utility Pipeline. + * @param source The source Render Target. + * @param target The target Render Target. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param colorMatrix The Color Matrix to use when performing the draw. + */ + drawFrame(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, clearAlpha?: boolean, colorMatrix?: Phaser.Display.ColorMatrix): this; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using a linear blend effect, which is controlled by the `strength` parameter. + * + * The draw itself is handled by the Utility Pipeline. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFrames(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): this; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using an additive blend effect, which is controlled by the `strength` parameter. + * + * The draw itself is handled by the Utility Pipeline. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFramesAdditive(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): this; + + /** + * Clears the given Render Target. + * @param target The Render Target to clear. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + clearFrame(target: Phaser.Renderer.WebGL.RenderTarget, clearAlpha?: boolean): this; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * The difference with this copy is that no resizing takes place. If the `source` + * Render Target is larger than the `target` then only a portion the same size as + * the `target` dimensions is copied across. + * + * You can optionally set the brightness factor of the copy. + * @param source The source Render Target. + * @param target The target Render Target. + * @param brightness The brightness value applied to the frame copy. Default 1. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param eraseMode Erase source from target using ERASE Blend Mode? Default false. + */ + blitFrame(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, brightness?: number, clear?: boolean, clearAlpha?: boolean, eraseMode?: boolean): this; + + /** + * Binds the `source` Render Target and then copies a section of it to the `target` Render Target. + * + * This method is extremely fast because it uses `gl.copyTexSubImage2D` and doesn't + * require the use of any shaders. Remember the coordinates are given in standard WebGL format, + * where x and y specify the lower-left corner of the section, not the top-left. Also, the + * copy entirely replaces the contents of the target texture, no 'merging' or 'blending' takes + * place. + * @param source The source Render Target. + * @param target The target Render Target. + * @param x The x coordinate of the lower left corner where to start copying. + * @param y The y coordinate of the lower left corner where to start copying. + * @param width The width of the texture. + * @param height The height of the texture. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + copyFrameRect(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, x: number, y: number, width: number, height: number, clear?: boolean, clearAlpha?: boolean): this; + + /** + * Returns `true` if the current pipeline is forced to use texture unit zero. + */ + forceZero(): boolean; + + /** + * Sets the Multi Pipeline to be the currently bound pipeline. + * + * This is the default Phaser 3 rendering pipeline. + */ + setMulti(): Phaser.Renderer.WebGL.Pipelines.MultiPipeline; + + /** + * Sets the Utility Pipeline to be the currently bound pipeline. + * @param currentShader The shader to set as being current. + */ + setUtility(currentShader?: Phaser.Renderer.WebGL.WebGLShader): Phaser.Renderer.WebGL.Pipelines.UtilityPipeline; + + /** + * Sets the FX Pipeline to be the currently bound pipeline. + */ + setFX(): Phaser.Renderer.WebGL.Pipelines.FXPipeline; + + /** + * Restore WebGL resources after context was lost. + * + * Calls `rebind` on this Pipeline Manager. + * Then calls `restoreContext` on each pipeline in turn. + */ + restoreContext(): void; + + /** + * Use this to reset the gl context to the state that Phaser requires to continue rendering. + * + * Calling this will: + * + * * Disable `DEPTH_TEST`, `CULL_FACE` and `STENCIL_TEST`. + * * Clear the depth buffer and stencil buffers. + * * Reset the viewport size. + * * Reset the blend mode. + * * Bind a blank texture as the active texture on texture unit zero. + * * Rebinds the given pipeline instance. + * + * You should call this if you have previously called `clear`, and then wish to return + * rendering control to Phaser again. + * @param pipeline The pipeline instance to be rebound. If not given, the previous pipeline will be bound. + */ + rebind(pipeline?: Phaser.Renderer.WebGL.WebGLPipeline): void; + + /** + * Flushes the current pipeline being used and then clears it, along with the + * the current shader program and vertex buffer from the `WebGLRenderer`. + * + * Then resets the blend mode to NORMAL. + * + * Call this before jumping to your own gl context handler, and then call `rebind` when + * you wish to return control to Phaser again. + */ + clear(): void; + + /** + * Gets a Render Target the right size to render the Sprite on. + * + * If the Sprite exceeds the size of the renderer, the Render Target will only ever be the maximum + * size of the renderer. + * @param size The maximum dimension required. + */ + getRenderTarget(size: number): Phaser.Renderer.WebGL.RenderTarget; + + /** + * Gets a matching Render Target, the same size as the one the Sprite was drawn to, + * useful for double-buffer style effects such as blurs. + */ + getSwapRenderTarget(): Phaser.Renderer.WebGL.RenderTarget; + + /** + * Gets a matching Render Target, the same size as the one the Sprite was drawn to, + * useful for double-buffer style effects such as blurs. + */ + getAltSwapRenderTarget(): Phaser.Renderer.WebGL.RenderTarget; + + /** + * Destroy the Pipeline Manager, cleaning up all related resources and references. + */ + destroy(): void; + + } + + namespace Pipelines { + /** + * The Bitmap Mask Pipeline handles all of the bitmap mask rendering in WebGL for applying + * alpha masks to Game Objects. It works by sampling two texture on the fragment shader and + * using the fragments alpha to clip the region. + * + * The fragment shader it uses can be found in `shaders/src/BitmapMask.frag`. + * The vertex shader it uses can be found in `shaders/src/BitmapMask.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * + * The default shader uniforms for this pipeline are: + * + * `uResolution` (vec2) + * `uMainSampler` (sampler2D) + * `uMaskSampler` (sampler2D) + * `uInvertMaskAlpha` (bool) + */ + class BitmapMaskPipeline extends Phaser.Renderer.WebGL.WebGLPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * Binds necessary resources and renders the mask to a separated framebuffer. + * The framebuffer for the masked object is also bound for further use. + * @param mask The BitmapMask instance that called beginMask. + * @param maskedObject GameObject masked by the mask GameObject. + * @param camera The camera rendering the current mask. + */ + beginMask(mask: Phaser.Display.Masks.BitmapMask, maskedObject: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * The masked game objects framebuffer is unbound and its texture + * is bound together with the mask texture and the mask shader and + * a draw call with a single quad is processed. Here is where the + * masking effect is applied. + * @param mask The BitmapMask instance that called endMask. + * @param camera The Camera to render to. + * @param renderTarget Optional WebGL RenderTarget. + */ + endMask(mask: Phaser.Display.Masks.BitmapMask, camera: Phaser.Cameras.Scene2D.Camera, renderTarget?: Phaser.Renderer.WebGL.RenderTarget): void; + + } + + /** + * The Bitmap Mask Pipeline. + */ + const BITMAPMASK_PIPELINE: string; + + /** + * The Light 2D Pipeline. + */ + const LIGHT_PIPELINE: string; + + /** + * The Point Light Pipeline. + */ + const POINTLIGHT_PIPELINE: string; + + /** + * The Single Texture Pipeline. + */ + const SINGLE_PIPELINE: string; + + /** + * The Multi Texture Pipeline. + */ + const MULTI_PIPELINE: string; + + /** + * The Rope Pipeline. + */ + const ROPE_PIPELINE: string; + + /** + * The Graphics and Shapes Pipeline. + */ + const GRAPHICS_PIPELINE: string; + + /** + * The Post FX Pipeline. + */ + const POSTFX_PIPELINE: string; + + /** + * The Utility Pipeline. + */ + const UTILITY_PIPELINE: string; + + /** + * The Mobile Texture Pipeline. + */ + const MOBILE_PIPELINE: string; + + /** + * The Special FX Pipeline. + */ + const FX_PIPELINE: string; + + namespace Events { + /** + * The WebGLPipeline After Flush Event. + * + * This event is dispatched by a WebGLPipeline right after it has issued a drawArrays command + * and cleared its vertex count. + */ + const AFTER_FLUSH: any; + + /** + * The WebGLPipeline Before Flush Event. + * + * This event is dispatched by a WebGLPipeline right before it is about to + * flush and issue a bufferData and drawArrays command. + */ + const BEFORE_FLUSH: any; + + /** + * The WebGLPipeline Bind Event. + * + * This event is dispatched by a WebGLPipeline when it is bound by the Pipeline Manager. + */ + const BIND: any; + + /** + * The WebGLPipeline Boot Event. + * + * This event is dispatched by a WebGLPipeline when it has completed its `boot` phase. + */ + const BOOT: any; + + /** + * The WebGLPipeline Destroy Event. + * + * This event is dispatched by a WebGLPipeline when it is starting its destroy process. + */ + const DESTROY: any; + + /** + * The WebGLPipeline ReBind Event. + * + * This event is dispatched by a WebGLPipeline when it is re-bound by the Pipeline Manager. + */ + const REBIND: any; + + /** + * The WebGLPipeline Resize Event. + * + * This event is dispatched by a WebGLPipeline when it is resized, usually as a result + * of the Renderer resizing. + */ + const RESIZE: any; + + } + + namespace FX { + /** + * The Barrel FX Pipeline. + * + * A barrel effect allows you to apply either a 'pinch' or 'expand' distortion to + * a Game Object. The amount of the effect can be modified in real-time. + * + * A Barrel effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addBarrel(); + * ``` + */ + class BarrelFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The amount of distortion applied to the barrel effect. + * + * Typically keep this within the range 1 (no distortion) to +- 1. + */ + amount: number; + + } + + /** + * The Bloom FX Pipeline. + * + * Bloom is an effect used to reproduce an imaging artifact of real-world cameras. + * The effect produces fringes of light extending from the borders of bright areas in an image, + * contributing to the illusion of an extremely bright light overwhelming the + * camera or eye capturing the scene. + * + * A Bloom effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addBloom(); + * ``` + */ + class BloomFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The number of steps to run the Bloom effect for. + * + * This value should always be an integer. + * + * It defaults to 4. The higher the value, the smoother the Bloom, + * but at the cost of exponentially more gl operations. + * + * Keep this to the lowest possible number you can have it, while + * still looking correct for your game. + */ + steps: number; + + /** + * The horizontal offset of the bloom effect. + */ + offsetX: number; + + /** + * The vertical offset of the bloom effect. + */ + offsetY: number; + + /** + * The strength of the blur process of the bloom effect. + */ + blurStrength: number; + + /** + * The strength of the blend process of the bloom effect. + */ + strength: number; + + /** + * The internal gl color array. + */ + glcolor: number[]; + + } + + /** + * The Blur FX Pipeline. + * + * A Gaussian blur is the result of blurring an image by a Gaussian function. It is a widely used effect, + * typically to reduce image noise and reduce detail. The visual effect of this blurring technique is a + * smooth blur resembling that of viewing the image through a translucent screen, distinctly different + * from the bokeh effect produced by an out-of-focus lens or the shadow of an object under usual illumination. + * + * A Blur effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addBlur(); + * ``` + */ + class BlurFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The horizontal offset of the blur effect. + */ + x: number; + + /** + * The vertical offset of the blur effect. + */ + y: number; + + /** + * The number of steps to run the Blur effect for. + * + * This value should always be an integer. + * + * It defaults to 4. The higher the value, the smoother the blur, + * but at the cost of exponentially more gl operations. + * + * Keep this to the lowest possible number you can have it, while + * still looking correct for your game. + */ + steps: number; + + /** + * The strength of the blur effect. + */ + strength: number; + + /** + * The internal gl color array. + */ + glcolor: number[]; + + /** + * Sets the quality of the blur effect to low. + */ + setQualityLow(): this; + + /** + * Sets the quality of the blur effect to medium. + */ + setQualityMedium(): this; + + /** + * Sets the quality of the blur effect to high. + */ + setQualityHigh(): this; + + } + + /** + * The Bokeh FX Pipeline. + * + * Bokeh refers to a visual effect that mimics the photographic technique of creating a shallow depth of field. + * This effect is used to emphasize the game's main subject or action, by blurring the background or foreground + * elements, resulting in a more immersive and visually appealing experience. It is achieved through rendering + * techniques that simulate the out-of-focus areas, giving a sense of depth and realism to the game's graphics. + * + * This effect can also be used to generate a Tilt Shift effect, which is a technique used to create a miniature + * effect by blurring everything except a small area of the image. This effect is achieved by blurring the + * top and bottom elements, while keeping the center area in focus. + * + * A Bokeh effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addBokeh(); + * ``` + */ + class BokehFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * Is this a Tilt Shift effect or a standard bokeh effect? + */ + isTiltShift: boolean; + + /** + * If a Tilt Shift effect this controls the strength of the blur. + * + * Setting this value on a non-Tilt Shift effect will have no effect. + */ + strength: number; + + /** + * If a Tilt Shift effect this controls the amount of horizontal blur. + * + * Setting this value on a non-Tilt Shift effect will have no effect. + */ + blurX: number; + + /** + * If a Tilt Shift effect this controls the amount of vertical blur. + * + * Setting this value on a non-Tilt Shift effect will have no effect. + */ + blurY: number; + + /** + * The radius of the bokeh effect. + * + * This is a float value, where a radius of 0 will result in no effect being applied, + * and a radius of 1 will result in a strong bokeh. However, you can exceed this value + * for even stronger effects. + */ + radius: number; + + /** + * The amount, or strength, of the bokeh effect. Defaults to 1. + */ + amount: number; + + /** + * The color contrast, or brightness, of the bokeh effect. Defaults to 0.2. + */ + contrast: number; + + } + + /** + * The Circle FX Pipeline. + * + * This effect will draw a circle around the texture of the Game Object, effectively masking off + * any area outside of the circle without the need for an actual mask. You can control the thickness + * of the circle, the color of the circle and the color of the background, should the texture be + * transparent. You can also control the feathering applied to the circle, allowing for a harsh or soft edge. + * + * Please note that adding this effect to a Game Object will not change the input area or physics body of + * the Game Object, should it have one. + * + * A Circle effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addCircle(); + * ``` + */ + class CircleFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The scale of the circle. The default scale is 1, which is a circle + * the full size of the underlying texture. Reduce this value to create + * a smaller circle, or increase it to create a circle that extends off + * the edges of the texture. + */ + scale: number; + + /** + * The amount of feathering to apply to the circle from the ring, + * extending into the middle of the circle. The default is 0.005, + * which is a very low amount of feathering just making sure the ring + * has a smooth edge. Increase this amount to a value such as 0.5 + * or 0.025 for larger amounts of feathering. + */ + feather: number; + + /** + * The width of the circle around the texture, in pixels. This value + * doesn't factor in the feather, which can extend the thickness + * internally depending on its value. + */ + thickness: number; + + /** + * The internal gl color array for the ring color. + */ + glcolor: number[]; + + /** + * The internal gl color array for the background color. + */ + glcolor2: number[]; + + } + + /** + * The ColorMatrix FX Pipeline. + * + * The color matrix effect is a visual technique that involves manipulating the colors of an image + * or scene using a mathematical matrix. This process can adjust hue, saturation, brightness, and contrast, + * allowing developers to create various stylistic appearances or mood settings within the game. + * Common applications include simulating different lighting conditions, applying color filters, + * or achieving a specific visual style. + * + * A ColorMatrix effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addColorMatrix(); + * ``` + */ + class ColorMatrixFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + } + + /** + * The Displacement FX Pipeline. + * + * The displacement effect is a visual technique that alters the position of pixels in an image + * or texture based on the values of a displacement map. This effect is used to create the illusion + * of depth, surface irregularities, or distortion in otherwise flat elements. It can be applied to + * characters, objects, or backgrounds to enhance realism, convey movement, or achieve various + * stylistic appearances. + * + * A Displacement effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addDisplacement(); + * ``` + */ + class DisplacementFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The amount of horizontal displacement to apply. + */ + x: number; + + /** + * The amount of vertical displacement to apply. + */ + y: number; + + /** + * The underlying texture used for displacement. + */ + glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + } + + /** + * The Glow FX Pipeline. + * + * The glow effect is a visual technique that creates a soft, luminous halo around game objects, + * characters, or UI elements. This effect is used to emphasize importance, enhance visual appeal, + * or convey a sense of energy, magic, or otherworldly presence. The effect can also be set on + * the inside of the Game Object. The color and strength of the glow can be modified. + * + * A Glow effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addGlow(); + * ``` + */ + class GlowFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + * @param config The configuration options for this pipeline. + */ + constructor(game: Phaser.Game, config: object); + + /** + * The strength of the glow outward from the edge of the Sprite. + */ + outerStrength: number; + + /** + * The strength of the glow inward from the edge of the Sprite. + */ + innerStrength: number; + + /** + * If `true` only the glow is drawn, not the texture itself. + */ + knockout: number; + + /** + * A 4 element array of gl color values. + */ + glcolor: number[]; + + } + + /** + * The Gradient FX Pipeline. + * + * The gradient overlay effect is a visual technique where a smooth color transition is applied over Game Objects, + * such as sprites or UI components. This effect is used to enhance visual appeal, emphasize depth, or create + * stylistic and atmospheric variations. It can also be utilized to convey information, such as representing + * progress or health status through color changes. + * + * A Gradient effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addGradient(); + * ``` + */ + class GradientFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The alpha value of the gradient effect. + */ + alpha: number; + + /** + * Sets how many 'chunks' the gradient is divided in to, as spread over the + * entire height of the texture. Leave this at zero for a smooth gradient, + * or set to a higher number to split the gradient into that many sections, giving + * a more banded 'retro' effect. + */ + size: number; + + /** + * The horizontal position the gradient will start from. This value is normalized, between 0 and 1 and is not in pixels. + */ + fromX: number; + + /** + * The vertical position the gradient will start from. This value is normalized, between 0 and 1 and is not in pixels. + */ + fromY: number; + + /** + * The horizontal position the gradient will end. This value is normalized, between 0 and 1 and is not in pixels. + */ + toX: number; + + /** + * The vertical position the gradient will end. This value is normalized, between 0 and 1 and is not in pixels. + */ + toY: number; + + /** + * The internal gl color array for the starting color. + */ + glcolor1: number[]; + + /** + * The internal gl color array for the ending color. + */ + glcolor2: number[]; + + } + + /** + * The Pixelate FX Pipeline. + * + * The pixelate effect is a visual technique that deliberately reduces the resolution or detail of an image, + * creating a blocky or mosaic appearance composed of large, visible pixels. This effect can be used for stylistic + * purposes, as a homage to retro gaming, or as a means to obscure certain elements within the game, such as + * during a transition or to censor specific content. + * + * A Pixelate effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addPixelate(); + * ``` + */ + class PixelateFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The amount of pixelation to apply. + */ + amount: number; + + } + + /** + * The Shadow FX Pipeline. + * + * The shadow effect is a visual technique used to create the illusion of depth and realism by adding darker, + * offset silhouettes or shapes beneath game objects, characters, or environments. These simulated shadows + * help to enhance the visual appeal and immersion, making the 2D game world appear more dynamic and three-dimensional. + * + * A Shadow effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addShadow(); + * ``` + */ + class ShadowFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The horizontal offset of the shadow effect. + */ + x: number; + + /** + * The vertical offset of the shadow effect. + */ + y: number; + + /** + * The amount of decay for the shadow effect. + */ + decay: number; + + /** + * The power of the shadow effect. + */ + power: number; + + /** + * The internal gl color array. + */ + glcolor: number[]; + + /** + * The number of samples that the shadow effect will run for. + * + * This should be an integer with a minimum value of 1 and a maximum of 12. + */ + samples: number; + + /** + * The intensity of the shadow effect. + */ + intensity: number; + + } + + /** + * The Shine FX Pipeline. + * + * The shine effect is a visual technique that simulates the appearance of reflective + * or glossy surfaces by passing a light beam across a Game Object. This effect is used to + * enhance visual appeal, emphasize certain features, and create a sense of depth or + * material properties. + * + * A Shine effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addShine(); + * ``` + */ + class ShineFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The speed of the Shine effect. + */ + speed: number; + + /** + * The line width of the Shine effect. + */ + lineWidth: number; + + /** + * The gradient of the Shine effect. + */ + gradient: number; + + /** + * Does this Shine effect reveal or get added to its target? + */ + reveal: boolean; + + } + + /** + * The Vignette FX Pipeline. + * + * The vignette effect is a visual technique where the edges of the screen, or a Game Object, gradually darken or blur, + * creating a frame-like appearance. This effect is used to draw the player's focus towards the central action or subject, + * enhance immersion, and provide a cinematic or artistic quality to the game's visuals. + * + * A Vignette effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addVignette(); + * ``` + */ + class VignetteFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The horizontal offset of the vignette effect. This value is normalized to the range 0 to 1. + */ + x: number; + + /** + * The vertical offset of the vignette effect. This value is normalized to the range 0 to 1. + */ + y: number; + + /** + * The radius of the vignette effect. This value is normalized to the range 0 to 1. + */ + radius: number; + + /** + * The strength of the vignette effect. + */ + strength: number; + + } + + /** + * The Wipe FX Pipeline. + * + * The wipe or reveal effect is a visual technique that gradually uncovers or conceals elements + * in the game, such as images, text, or scene transitions. This effect is often used to create + * a sense of progression, reveal hidden content, or provide a smooth and visually appealing transition + * between game states. + * + * You can set both the direction and the axis of the wipe effect. The following combinations are possible: + * + * * left to right: direction 0, axis 0 + * * right to left: direction 1, axis 0 + * * top to bottom: direction 1, axis 1 + * * bottom to top: direction 1, axis 0 + * + * It is up to you to set the `progress` value yourself, i.e. via a Tween, in order to transition the effect. + * + * A Wipe effect is added to a Game Object via the FX component: + * + * ```js + * const sprite = this.add.sprite(); + * + * sprite.postFX.addWipe(); + * sprite.postFX.addReveal(); + * ``` + */ + class WipeFXPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline { + /** + * + * @param game A reference to the Phaser Game instance. + */ + constructor(game: Phaser.Game); + + /** + * The progress of the Wipe effect. This value is normalized to the range 0 to 1. + * + * Adjust this value to make the wipe transition (i.e. via a Tween) + */ + progress: number; + + /** + * The width of the wipe effect. This value is normalized in the range 0 to 1. + */ + wipeWidth: number; + + /** + * The direction of the wipe effect. Either 0 or 1. Set in conjunction with the axis property. + */ + direction: number; + + /** + * The axis of the wipe effect. Either 0 or 1. Set in conjunction with the direction property. + */ + axis: number; + + /** + * Is this a reveal (true) or a fade (false) effect? + */ + reveal: boolean; + + } + + } + + /** + * The FXPipeline is a built-in pipeline that controls the application of FX Controllers during + * the rendering process. It maintains all of the FX shaders, instances of Post FX Pipelines and + * is responsible for rendering. + * + * You should rarely interact with this pipeline directly. Instead, use the FX Controllers that + * is part of the Game Object class in order to manage the effects. + */ + class FXPipeline extends Phaser.Renderer.WebGL.Pipelines.PreFXPipeline { + /** + * + * @param game A reference to the Phaser game instance. + */ + constructor(game: Phaser.Game); + + /** + * An instance of the Glow Post FX Pipeline. + */ + glow: Phaser.Renderer.WebGL.Pipelines.FX.GlowFXPipeline; + + /** + * An instance of the Shadow Post FX Pipeline. + */ + shadow: Phaser.Renderer.WebGL.Pipelines.FX.ShadowFXPipeline; + + /** + * An instance of the Pixelate Post FX Pipeline. + */ + pixelate: Phaser.Renderer.WebGL.Pipelines.FX.PixelateFXPipeline; + + /** + * An instance of the Vignette Post FX Pipeline. + */ + vignette: Phaser.Renderer.WebGL.Pipelines.FX.VignetteFXPipeline; + + /** + * An instance of the Shine Post FX Pipeline. + */ + shine: Phaser.Renderer.WebGL.Pipelines.FX.ShineFXPipeline; + + /** + * An instance of the Gradient Post FX Pipeline. + */ + gradient: Phaser.Renderer.WebGL.Pipelines.FX.GradientFXPipeline; + + /** + * An instance of the Circle Post FX Pipeline. + */ + circle: Phaser.Renderer.WebGL.Pipelines.FX.CircleFXPipeline; + + /** + * An instance of the Barrel Post FX Pipeline. + */ + barrel: Phaser.Renderer.WebGL.Pipelines.FX.BarrelFXPipeline; + + /** + * An instance of the Wipe Post FX Pipeline. + */ + wipe: Phaser.Renderer.WebGL.Pipelines.FX.WipeFXPipeline; + + /** + * An instance of the Bokeh Post FX Pipeline. + */ + bokeh: Phaser.Renderer.WebGL.Pipelines.FX.BokehFXPipeline; + + /** + * An array containing references to the methods that map to the FX CONSTs. + * + * This array is intentionally sparse. Do not adjust. + */ + fxHandlers: Function[]; + + /** + * The source Render Target. + */ + source: Phaser.Renderer.WebGL.RenderTarget; + + /** + * The target Render Target. + */ + target: Phaser.Renderer.WebGL.RenderTarget; + + /** + * The swap Render Target. + */ + swap: Phaser.Renderer.WebGL.RenderTarget; + + /** + * Takes the currently bound Game Object and runs all of its pre-render effects, + * using the given Render Target as the source. + * + * Finally calls `drawToGame` to copy the result to the Game Canvas. + * @param target1 The source Render Target. + * @param target2 The target Render Target. + * @param target3 The swap Render Target. + */ + onDraw(target1: Phaser.Renderer.WebGL.RenderTarget, target2: Phaser.Renderer.WebGL.RenderTarget, target3: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Takes the source and target and runs a copy from source to target. + * + * This will use the current shader and pipeline. + */ + runDraw(): void; + + /** + * Runs the Glow FX controller. + * @param config The Glow FX controller. + * @param width The width of the target. + * @param height The height of the target. + */ + onGlow(config: Phaser.FX.Glow, width: number, height: number): void; + + /** + * Runs the Shadow FX controller. + * @param config The Shadow FX controller. + */ + onShadow(config: Phaser.FX.Shadow): void; + + /** + * Runs the Pixelate FX controller. + * @param config The Pixelate FX controller. + * @param width The width of the target. + * @param height The height of the target. + */ + onPixelate(config: Phaser.FX.Pixelate, width: number, height: number): void; + + /** + * Runs the Vignette FX controller. + * @param config The Vignette FX controller. + */ + onVignette(config: Phaser.FX.Vignette): void; + + /** + * Runs the Shine FX controller. + * @param config The Shine FX controller. + * @param width The width of the target. + * @param height The height of the target. + */ + onShine(config: Phaser.FX.Shine, width: number, height: number): void; + + /** + * Runs the Blur FX controller. + * @param config The Blur FX controller. + * @param width The width of the target. + * @param height The height of the target. + */ + onBlur(config: Phaser.FX.Blur, width: number, height: number): void; + + /** + * Runs the Gradient FX controller. + * @param config The Gradient FX controller. + */ + onGradient(config: Phaser.FX.Gradient): void; + + /** + * Runs the Bloom FX controller. + * @param config The Bloom FX controller. + * @param width The width of the target. + * @param height The height of the target. + */ + onBloom(config: Phaser.FX.Bloom, width: number, height: number): void; + + /** + * Runs the ColorMatrix FX controller. + * @param config The ColorMatrix FX controller. + */ + onColorMatrix(config: Phaser.FX.ColorMatrix): void; + + /** + * Runs the Circle FX controller. + * @param config The Circle FX controller. + * @param width The width of the target. + * @param height The height of the target. + */ + onCircle(config: Phaser.FX.Circle, width: number, height: number): void; + + /** + * Runs the Barrel FX controller. + * @param config The Barrel FX controller. + */ + onBarrel(config: Phaser.FX.Barrel): void; + + /** + * Runs the Displacement FX controller. + * @param config The Displacement FX controller. + */ + onDisplacement(config: Phaser.FX.Displacement): void; + + /** + * Runs the Wipe FX controller. + * @param config The Wipe FX controller. + */ + onWipe(config: Phaser.FX.Wipe): void; + + /** + * Runs the Bokeh FX controller. + * @param config The Bokeh FX controller. + */ + onBokeh(config: Phaser.FX.Bokeh): void; + + /** + * Destroys all shader instances, removes all object references and nulls all external references. + */ + destroy(): this; + + } + + /** + * The Light Pipeline is an extension of the Multi Pipeline and uses a custom shader + * designed to handle forward diffused rendering of 2D lights in a Scene. + * + * The shader works in tandem with Light Game Objects, and optionally texture normal maps, + * to provide an ambient illumination effect. + * + * If you wish to provide your own shader, you can use the `%LIGHT_COUNT%` declaration in the source, + * and it will be automatically replaced at run-time with the total number of configured lights. + * + * The maximum number of lights can be set in the Render Config `maxLights` property and defaults to 10. + * + * Prior to Phaser v3.50 this pipeline was called the `ForwardDiffuseLightPipeline`. + * + * The fragment shader it uses can be found in `shaders/src/Light.frag`. + * The vertex shader it uses can be found in `shaders/src/Multi.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * `inTexId` (float, offset 16) + * `inTintEffect` (float, offset 20) + * `inTint` (vec4, offset 24, normalized) + * + * The default shader uniforms for this pipeline are those from the Multi Pipeline, plus: + * + * `uMainSampler` (sampler2D) + * `uNormSampler` (sampler2D) + * `uCamera` (vec4) + * `uResolution` (vec2) + * `uAmbientLightColor` (vec3) + * `uInverseRotationMatrix` (mat3) + * `uLights` (Light struct) + */ + class LightPipeline extends Phaser.Renderer.WebGL.Pipelines.MultiPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * The currently bound normal map texture at texture unit one, if any. + */ + "currentNormalMap;": Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * A boolean that is set automatically during `onRender` that determines + * if the Scene LightManager is active, or not. + */ + readonly lightsActive: boolean; + + /** + * A persistent calculation vector used when processing the lights. + */ + tempVec2: Phaser.Math.Vector2; + + /** + * Called when the Game has fully booted and the Renderer has finished setting up. + * + * By this stage all Game level systems are now in place and you can perform any final + * tasks that the pipeline may need that relied on game systems such as the Texture Manager. + */ + boot(): void; + + /** + * Rotates the normal map vectors inversely by the given angle. + * Only works in 2D space. + * @param rotation The angle of rotation in radians. + */ + setNormalMapRotation(rotation: number): void; + + /** + * Returns the normal map WebGLTextureWrapper from the given Game Object. + * If the Game Object doesn't have one, it returns the default normal map from this pipeline instead. + * @param gameObject The Game Object to get the normal map from. + */ + getNormalMap(gameObject?: Phaser.GameObjects.GameObject): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Takes a Sprite Game Object, or any object that extends it, and adds it to the batch. + * @param gameObject The texture based Game Object to add to the batch. + * @param camera The Camera to use for the rendering transform. + * @param parentTransformMatrix The transform matrix of the parent container, if set. + */ + batchSprite(gameObject: Phaser.GameObjects.Image | Phaser.GameObjects.Sprite, camera: Phaser.Cameras.Scene2D.Camera, parentTransformMatrix?: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Generic function for batching a textured quad using argument values instead of a Game Object. + * @param gameObject Source GameObject. + * @param texture Texture associated with the quad. + * @param textureWidth Real texture width. + * @param textureHeight Real texture height. + * @param srcX X coordinate of the quad. + * @param srcY Y coordinate of the quad. + * @param srcWidth Width of the quad. + * @param srcHeight Height of the quad. + * @param scaleX X component of scale. + * @param scaleY Y component of scale. + * @param rotation Rotation of the quad. + * @param flipX Indicates if the quad is horizontally flipped. + * @param flipY Indicates if the quad is vertically flipped. + * @param scrollFactorX By which factor is the quad affected by the camera horizontal scroll. + * @param scrollFactorY By which factor is the quad effected by the camera vertical scroll. + * @param displayOriginX Horizontal origin in pixels. + * @param displayOriginY Vertical origin in pixels. + * @param frameX X coordinate of the texture frame. + * @param frameY Y coordinate of the texture frame. + * @param frameWidth Width of the texture frame. + * @param frameHeight Height of the texture frame. + * @param tintTL Tint for top left. + * @param tintTR Tint for top right. + * @param tintBL Tint for bottom left. + * @param tintBR Tint for bottom right. + * @param tintEffect The tint effect. + * @param uOffset Horizontal offset on texture coordinate. + * @param vOffset Vertical offset on texture coordinate. + * @param camera Current used camera. + * @param parentTransformMatrix Parent container. + * @param skipFlip Skip the renderTexture check. Default false. + * @param textureUnit Use the currently bound texture unit? + */ + batchTexture(gameObject: Phaser.GameObjects.GameObject, texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, textureWidth: number, textureHeight: number, srcX: number, srcY: number, srcWidth: number, srcHeight: number, scaleX: number, scaleY: number, rotation: number, flipX: boolean, flipY: boolean, scrollFactorX: number, scrollFactorY: number, displayOriginX: number, displayOriginY: number, frameX: number, frameY: number, frameWidth: number, frameHeight: number, tintTL: number, tintTR: number, tintBL: number, tintBR: number, tintEffect: number, uOffset: number, vOffset: number, camera: Phaser.Cameras.Scene2D.Camera, parentTransformMatrix: Phaser.GameObjects.Components.TransformMatrix, skipFlip?: boolean, textureUnit?: number): void; + + /** + * Adds a Texture Frame into the batch for rendering. + * @param frame The Texture Frame to be rendered. + * @param x The horizontal position to render the texture at. + * @param y The vertical position to render the texture at. + * @param tint The tint color. + * @param alpha The alpha value. + * @param transformMatrix The Transform Matrix to use for the texture. + * @param parentTransformMatrix A parent Transform Matrix. + */ + batchTextureFrame(frame: Phaser.Textures.Frame, x: number, y: number, tint: number, alpha: number, transformMatrix: Phaser.GameObjects.Components.TransformMatrix, parentTransformMatrix?: Phaser.GameObjects.Components.TransformMatrix): void; + + } + + /** + * The Mobile Pipeline is the core 2D texture rendering pipeline used by Phaser in WebGL + * when the device running the game is detected to be a mobile. + * + * You can control the use of this pipeline by setting the Game Configuration + * property `autoMobilePipeline`. If set to `false` then all devices will use + * the Multi Tint Pipeline. You can also call the `PipelineManager.setDefaultPipeline` + * method at run-time, rather than boot-time, to modify the default Game Object + * pipeline. + * + * Virtually all Game Objects use this pipeline by default, including Sprites, Graphics + * and Tilemaps. It handles the batching of quads and tris, as well as methods for + * drawing and batching geometry data. + * + * The fragment shader it uses can be found in `shaders/src/Mobile.frag`. + * The vertex shader it uses can be found in `shaders/src/Mobile.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * `inTexId` (float, offset 16) + * `inTintEffect` (float, offset 20) + * `inTint` (vec4, offset 24, normalized) + * + * Note that `inTexId` isn't used in the shader, it's just kept to allow us + * to piggy-back on the Multi Tint Pipeline functions. + * + * The default shader uniforms for this pipeline are: + * + * `uProjectionMatrix` (mat4) + * `uRoundPixels` (int) + * `uResolution` (vec2) + * `uMainSampler` (sampler2D, or sampler2D array) + */ + class MobilePipeline extends Phaser.Renderer.WebGL.Pipelines.MultiPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * Called when the Game has fully booted and the Renderer has finished setting up. + * + * By this stage all Game level systems are now in place and you can perform any final + * tasks that the pipeline may need that relied on game systems such as the Texture Manager. + */ + boot(): void; + + } + + /** + * The Multi Pipeline is the core 2D texture rendering pipeline used by Phaser in WebGL. + * Virtually all Game Objects use this pipeline by default, including Sprites, Graphics + * and Tilemaps. It handles the batching of quads and tris, as well as methods for + * drawing and batching geometry data. + * + * Prior to Phaser v3.50 this pipeline was called the `TextureTintPipeline`. + * + * In previous versions of Phaser only one single texture unit was supported at any one time. + * The Multi Pipeline is an evolution of the old Texture Tint Pipeline, updated to support + * multi-textures for increased performance. + * + * The fragment shader it uses can be found in `shaders/src/Multi.frag`. + * The vertex shader it uses can be found in `shaders/src/Multi.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * `inTexId` (float, offset 16) + * `inTintEffect` (float, offset 20) + * `inTint` (vec4, offset 24, normalized) + * + * The default shader uniforms for this pipeline are: + * + * `uProjectionMatrix` (mat4) + * `uRoundPixels` (int) + * `uResolution` (vec2) + * `uMainSampler` (sampler2D, or sampler2D array) + * + * If you wish to create a custom pipeline extending from this one, you can use two string + * declarations in your fragment shader source: `%count%` and `%forloop%`, where `count` is + * used to set the number of `sampler2Ds` available, and `forloop` is a block of GLSL code + * that will get the currently bound texture unit. + * + * This pipeline will automatically inject that code for you, should those values exist + * in your shader source. If you wish to handle this yourself, you can also use the + * function `Utils.parseFragmentShaderMaxTextures`. + * + * The following fragment shader shows how to use the two variables: + * + * ```glsl + * #define SHADER_NAME PHASER_MULTI_FS + * + * #ifdef GL_FRAGMENT_PRECISION_HIGH + * precision highp float; + * #else + * precision mediump float; + * #endif + * + * uniform sampler2D uMainSampler[%count%]; + * + * varying vec2 outTexCoord; + * varying float outTexId; + * varying float outTintEffect; + * varying vec4 outTint; + * + * void main () + * { + * vec4 texture; + * + * %forloop% + * + * vec4 texel = vec4(outTint.bgr * outTint.a, outTint.a); + * + * // Multiply texture tint + * vec4 color = texture * texel; + * + * if (outTintEffect == 1.0) + * { + * // Solid color + texture alpha + * color.rgb = mix(texture.rgb, outTint.bgr * outTint.a, texture.a); + * } + * else if (outTintEffect == 2.0) + * { + * // Solid color, no texture + * color = texel; + * } + * + * gl_FragColor = color; + * } + * ``` + * + * If you wish to create a pipeline that works from a single texture, or that doesn't have + * internal texture iteration, please see the `SinglePipeline` instead. If you wish to create + * a special effect, especially one that can impact the pixels around a texture (i.e. such as + * a glitch effect) then you should use the PreFX and PostFX Pipelines for this task. + */ + class MultiPipeline extends Phaser.Renderer.WebGL.WebGLPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * A temporary Transform Matrix, re-used internally during batching by the + * Shape Game Objects. + */ + calcMatrix: Phaser.GameObjects.Components.TransformMatrix; + + /** + * Called every time the pipeline is bound by the renderer. + * Sets the shader program, vertex buffer and other resources. + * Should only be called when changing pipeline. + */ + boot(): void; + + /** + * Takes a Sprite Game Object, or any object that extends it, and adds it to the batch. + * @param gameObject The texture based Game Object to add to the batch. + * @param camera The Camera to use for the rendering transform. + * @param parentTransformMatrix The transform matrix of the parent container, if set. + */ + batchSprite(gameObject: Phaser.GameObjects.Image | Phaser.GameObjects.Sprite, camera: Phaser.Cameras.Scene2D.Camera, parentTransformMatrix?: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Generic function for batching a textured quad using argument values instead of a Game Object. + * @param gameObject Source GameObject. + * @param texture Texture associated with the quad. + * @param textureWidth Real texture width. + * @param textureHeight Real texture height. + * @param srcX X coordinate of the quad. + * @param srcY Y coordinate of the quad. + * @param srcWidth Width of the quad. + * @param srcHeight Height of the quad. + * @param scaleX X component of scale. + * @param scaleY Y component of scale. + * @param rotation Rotation of the quad. + * @param flipX Indicates if the quad is horizontally flipped. + * @param flipY Indicates if the quad is vertically flipped. + * @param scrollFactorX By which factor is the quad affected by the camera horizontal scroll. + * @param scrollFactorY By which factor is the quad effected by the camera vertical scroll. + * @param displayOriginX Horizontal origin in pixels. + * @param displayOriginY Vertical origin in pixels. + * @param frameX X coordinate of the texture frame. + * @param frameY Y coordinate of the texture frame. + * @param frameWidth Width of the texture frame. + * @param frameHeight Height of the texture frame. + * @param tintTL Tint for top left. + * @param tintTR Tint for top right. + * @param tintBL Tint for bottom left. + * @param tintBR Tint for bottom right. + * @param tintEffect The tint effect. + * @param uOffset Horizontal offset on texture coordinate. + * @param vOffset Vertical offset on texture coordinate. + * @param camera Current used camera. + * @param parentTransformMatrix Parent container. + * @param skipFlip Skip the renderTexture check. Default false. + * @param textureUnit The texture unit to set (defaults to currently bound if undefined or null) + * @param skipPrePost Skip the pre and post manager calls? Default false. + */ + batchTexture(gameObject: Phaser.GameObjects.GameObject, texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, textureWidth: number, textureHeight: number, srcX: number, srcY: number, srcWidth: number, srcHeight: number, scaleX: number, scaleY: number, rotation: number, flipX: boolean, flipY: boolean, scrollFactorX: number, scrollFactorY: number, displayOriginX: number, displayOriginY: number, frameX: number, frameY: number, frameWidth: number, frameHeight: number, tintTL: number, tintTR: number, tintBL: number, tintBR: number, tintEffect: number, uOffset: number, vOffset: number, camera: Phaser.Cameras.Scene2D.Camera, parentTransformMatrix: Phaser.GameObjects.Components.TransformMatrix, skipFlip?: boolean, textureUnit?: number, skipPrePost?: boolean): void; + + /** + * Adds a Texture Frame into the batch for rendering. + * @param frame The Texture Frame to be rendered. + * @param x The horizontal position to render the texture at. + * @param y The vertical position to render the texture at. + * @param tint The tint color. + * @param alpha The alpha value. + * @param transformMatrix The Transform Matrix to use for the texture. + * @param parentTransformMatrix A parent Transform Matrix. + */ + batchTextureFrame(frame: Phaser.Textures.Frame, x: number, y: number, tint: number, alpha: number, transformMatrix: Phaser.GameObjects.Components.TransformMatrix, parentTransformMatrix?: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Pushes a filled rectangle into the vertex batch. + * + * Rectangle factors in the given transform matrices before adding to the batch. + * @param x Horizontal top left coordinate of the rectangle. + * @param y Vertical top left coordinate of the rectangle. + * @param width Width of the rectangle. + * @param height Height of the rectangle. + * @param currentMatrix The current transform. + * @param parentMatrix The parent transform. + */ + batchFillRect(x: number, y: number, width: number, height: number, currentMatrix: Phaser.GameObjects.Components.TransformMatrix, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Pushes a filled triangle into the vertex batch. + * + * Triangle factors in the given transform matrices before adding to the batch. + * @param x0 Point 0 x coordinate. + * @param y0 Point 0 y coordinate. + * @param x1 Point 1 x coordinate. + * @param y1 Point 1 y coordinate. + * @param x2 Point 2 x coordinate. + * @param y2 Point 2 y coordinate. + * @param currentMatrix The current transform. + * @param parentMatrix The parent transform. + */ + batchFillTriangle(x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, currentMatrix: Phaser.GameObjects.Components.TransformMatrix, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Pushes a stroked triangle into the vertex batch. + * + * Triangle factors in the given transform matrices before adding to the batch. + * + * The triangle is created from 3 lines and drawn using the `batchStrokePath` method. + * @param x0 Point 0 x coordinate. + * @param y0 Point 0 y coordinate. + * @param x1 Point 1 x coordinate. + * @param y1 Point 1 y coordinate. + * @param x2 Point 2 x coordinate. + * @param y2 Point 2 y coordinate. + * @param lineWidth The width of the line in pixels. + * @param currentMatrix The current transform. + * @param parentMatrix The parent transform. + */ + batchStrokeTriangle(x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, lineWidth: number, currentMatrix: Phaser.GameObjects.Components.TransformMatrix, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Adds the given path to the vertex batch for rendering. + * + * It works by taking the array of path data and then passing it through Earcut, which + * creates a list of polygons. Each polygon is then added to the batch. + * + * The path is always automatically closed because it's filled. + * @param path Collection of points that represent the path. + * @param currentMatrix The current transform. + * @param parentMatrix The parent transform. + */ + batchFillPath(path: Phaser.Types.Math.Vector2Like[], currentMatrix: Phaser.GameObjects.Components.TransformMatrix, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Adds the given path to the vertex batch for rendering. + * + * It works by taking the array of path data and calling `batchLine` for each section + * of the path. + * + * The path is optionally closed at the end. + * @param path Collection of points that represent the path. + * @param lineWidth The width of the line segments in pixels. + * @param pathOpen Indicates if the path should be closed or left open. + * @param currentMatrix The current transform. + * @param parentMatrix The parent transform. + */ + batchStrokePath(path: Phaser.Types.Math.Vector2Like[], lineWidth: number, pathOpen: boolean, currentMatrix: Phaser.GameObjects.Components.TransformMatrix, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Creates a line out of 4 quads and adds it to the vertex batch based on the given line values. + * @param ax x coordinate of the start of the line. + * @param ay y coordinate of the start of the line. + * @param bx x coordinate of the end of the line. + * @param by y coordinate of the end of the line. + * @param aLineWidth Width of the start of the line. + * @param bLineWidth Width of the end of the line. + * @param index If this line is part of a multi-line draw, the index of the line in the draw. + * @param closePath Does this line close a multi-line path? + * @param currentMatrix The current transform. + * @param parentMatrix The parent transform. + */ + batchLine(ax: number, ay: number, bx: number, by: number, aLineWidth: number, bLineWidth: number, index: number, closePath: boolean, currentMatrix: Phaser.GameObjects.Components.TransformMatrix, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * Destroys all shader instances, removes all object references and nulls all external references. + */ + destroy(): this; + + } + + /** + * The Point Light Pipeline handles rendering the Point Light Game Objects in WebGL. + * + * The fragment shader it uses can be found in `shaders/src/PointLight.frag`. + * The vertex shader it uses can be found in `shaders/src/PointLight.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2) + * `inLightPosition` (vec2) + * `inLightRadius` (float) + * `inLightAttenuation` (float) + * `inLightColor` (vec4) + * + * The default shader uniforms for this pipeline are: + * + * `uProjectionMatrix` (mat4) + * `uResolution` (vec2) + * `uCameraZoom` (sampler2D) + */ + class PointLightPipeline extends Phaser.Renderer.WebGL.WebGLPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * Adds a Point Light Game Object to the batch, flushing if required. + * @param light The Point Light Game Object. + * @param camera The camera rendering the Point Light. + * @param x0 The top-left x position. + * @param y0 The top-left y position. + * @param x1 The bottom-left x position. + * @param y1 The bottom-left y position. + * @param x2 The bottom-right x position. + * @param y2 The bottom-right y position. + * @param x3 The top-right x position. + * @param y3 The top-right y position. + * @param lightX The horizontal center of the light. + * @param lightY The vertical center of the light. + */ + batchPointLight(light: Phaser.GameObjects.PointLight, camera: Phaser.Cameras.Scene2D.Camera, x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, lightX: number, lightY: number): void; + + /** + * Adds a single Point Light vertex to the current vertex buffer and increments the + * `vertexCount` property by 1. + * + * This method is called directly by `batchPointLight`. + * @param x The vertex x position. + * @param y The vertex y position. + * @param lightX The horizontal center of the light. + * @param lightY The vertical center of the light. + * @param radius The radius of the light. + * @param attenuation The attenuation of the light. + * @param r The red color channel of the light. + * @param g The green color channel of the light. + * @param b The blue color channel of the light. + * @param a The alpha color channel of the light. + */ + batchLightVert(x: number, y: number, lightX: number, lightY: number, radius: number, attenuation: number, r: number, g: number, b: number, a: number): void; + + } + + /** + * The Post FX Pipeline is a special kind of pipeline specifically for handling post + * processing effects. Where-as a standard Pipeline allows you to control the process + * of rendering Game Objects by configuring the shaders and attributes used to draw them, + * a Post FX Pipeline is designed to allow you to apply processing _after_ the Game Object/s + * have been rendered. Typical examples of post processing effects are bloom filters, + * blurs, light effects and color manipulation. + * + * The pipeline works by creating a tiny vertex buffer with just one single hard-coded quad + * in it. Game Objects can have a Post Pipeline set on them. Those objects are then rendered + * using their standard pipeline, but are redirected to the Render Targets owned by the + * post pipeline, which can then apply their own shaders and effects, before passing them + * back to the main renderer. + * + * Please see the Phaser 3 examples for further details on this extensive subject. + * + * The default fragment shader it uses can be found in `shaders/src/PostFX.frag`. + * The default vertex shader it uses can be found in `shaders/src/Quad.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * + * The vertices array layout is: + * + * -1, 1 B----C 1, 1 + * 0, 1 | /| 1, 1 + * | / | + * | / | + * |/ | + * -1, -1 A----D 1, -1 + * 0, 0 1, 0 + * + * A = -1, -1 (pos) and 0, 0 (uv) + * B = -1, 1 (pos) and 0, 1 (uv) + * C = 1, 1 (pos) and 1, 1 (uv) + * D = 1, -1 (pos) and 1, 0 (uv) + * + * First tri: A, B, C + * Second tri: A, C, D + * + * Array index: + * + * 0 = Tri 1 - Vert A - x pos + * 1 = Tri 1 - Vert A - y pos + * 2 = Tri 1 - Vert A - uv u + * 3 = Tri 1 - Vert A - uv v + * + * 4 = Tri 1 - Vert B - x pos + * 5 = Tri 1 - Vert B - y pos + * 6 = Tri 1 - Vert B - uv u + * 7 = Tri 1 - Vert B - uv v + * + * 8 = Tri 1 - Vert C - x pos + * 9 = Tri 1 - Vert C - y pos + * 10 = Tri 1 - Vert C - uv u + * 11 = Tri 1 - Vert C - uv v + * + * 12 = Tri 2 - Vert A - x pos + * 13 = Tri 2 - Vert A - y pos + * 14 = Tri 2 - Vert A - uv u + * 15 = Tri 2 - Vert A - uv v + * + * 16 = Tri 2 - Vert C - x pos + * 17 = Tri 2 - Vert C - y pos + * 18 = Tri 2 - Vert C - uv u + * 19 = Tri 2 - Vert C - uv v + * + * 20 = Tri 2 - Vert D - x pos + * 21 = Tri 2 - Vert D - y pos + * 22 = Tri 2 - Vert D - uv u + * 23 = Tri 2 - Vert D - uv v + */ + class PostFXPipeline extends Phaser.Renderer.WebGL.WebGLPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * If this Post Pipeline belongs to a Game Object or Camera, + * this property contains a reference to it. + */ + gameObject: Phaser.GameObjects.GameObject | Phaser.Cameras.Scene2D.Camera; + + /** + * If this Post Pipeline belongs to an FX Controller, this is a + * reference to it. + */ + controller: Phaser.FX.Controller; + + /** + * A Color Matrix instance belonging to this pipeline. + * + * Used during calls to the `drawFrame` method. + */ + colorMatrix: Phaser.Display.ColorMatrix; + + /** + * A reference to the Full Frame 1 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is the full size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + fullFrame1: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Full Frame 2 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is the full size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + fullFrame2: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Half Frame 1 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is half the size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + halfFrame1: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Half Frame 2 Render Target that belongs to the + * Utility Pipeline. This property is set during the `boot` method. + * + * This Render Target is half the size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + halfFrame2: Phaser.Renderer.WebGL.RenderTarget; + + /** + * This method is called once, when this Post FX Pipeline needs to be used. + * + * Normally, pipelines will boot automatically, ready for instant-use, but Post FX + * Pipelines create quite a lot of internal resources, such as Render Targets, so + * they don't boot until they are told to do so by the Pipeline Manager, when an + * actual Game Object needs to use them. + */ + bootFX(): void; + + /** + * This method is called as a result of the `WebGLPipeline.batchQuad` method, right after a quad + * belonging to a Game Object has been added to the batch. When this is called, the + * renderer has just performed a flush. + * + * It calls the `onDraw` hook followed by the `onPostBatch` hook, which can be used to perform + * additional Post FX Pipeline processing. + * + * It is also called as part of the `PipelineManager.postBatch` method when processing Post FX Pipelines. + * @param gameObject The Game Object or Camera that invoked this pipeline, if any. + */ + postBatch(gameObject?: Phaser.GameObjects.GameObject | Phaser.Cameras.Scene2D.Camera): this; + + /** + * Returns the FX Controller for this Post FX Pipeline. + * + * This is called internally and not typically required outside. + * @param controller An FX Controller, or undefined. + */ + getController(controller?: Phaser.FX.Controller): Phaser.FX.Controller | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * This method does _not_ bind a shader. It uses whatever shader + * is currently bound in this pipeline. It also does _not_ clear + * the frame buffers after use. You should take care of both of + * these things if you call this method directly. + * @param source The source Render Target. + * @param target The target Render Target. + */ + copySprite(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * You can optionally set the brightness factor of the copy. + * + * The difference between this method and `drawFrame` is that this method + * uses a faster copy shader, where only the brightness can be modified. + * If you need color level manipulation, see `drawFrame` instead. + * @param source The source Render Target. + * @param target The target Render Target. + * @param brightness The brightness value applied to the frame copy. Default 1. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + copyFrame(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, brightness?: number, clear?: boolean, clearAlpha?: boolean): void; + + /** + * Pops the framebuffer from the renderers FBO stack and sets that as the active target, + * then draws the `source` Render Target to it. It then resets the renderer textures. + * + * This should be done when you need to draw the _final_ results of a pipeline to the game + * canvas, or the next framebuffer in line on the FBO stack. You should only call this once + * in the `onDraw` handler and it should be the final thing called. Be careful not to call + * this if you need to actually use the pipeline shader, instead of the copy shader. In + * those cases, use the `bindAndDraw` method. + * @param source The Render Target to draw from. + */ + copyToGame(source: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Copy the `source` Render Target to the `target` Render Target, using this pipelines + * Color Matrix. + * + * The difference between this method and `copyFrame` is that this method + * uses a color matrix shader, where you have full control over the luminance + * values used during the copy. If you don't need this, you can use the faster + * `copyFrame` method instead. + * @param source The source Render Target. + * @param target The target Render Target. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + drawFrame(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, clearAlpha?: boolean): void; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using a linear blend effect, which is controlled by the `strength` parameter. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFrames(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): void; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using an additive blend effect, which is controlled by the `strength` parameter. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFramesAdditive(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): void; + + /** + * Clears the given Render Target. + * @param target The Render Target to clear. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + clearFrame(target: Phaser.Renderer.WebGL.RenderTarget, clearAlpha?: boolean): void; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * The difference with this copy is that no resizing takes place. If the `source` + * Render Target is larger than the `target` then only a portion the same size as + * the `target` dimensions is copied across. + * + * You can optionally set the brightness factor of the copy. + * @param source The source Render Target. + * @param target The target Render Target. + * @param brightness The brightness value applied to the frame copy. Default 1. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param eraseMode Erase source from target using ERASE Blend Mode? Default false. + */ + blitFrame(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, brightness?: number, clear?: boolean, clearAlpha?: boolean, eraseMode?: boolean): void; + + /** + * Binds the `source` Render Target and then copies a section of it to the `target` Render Target. + * + * This method is extremely fast because it uses `gl.copyTexSubImage2D` and doesn't + * require the use of any shaders. Remember the coordinates are given in standard WebGL format, + * where x and y specify the lower-left corner of the section, not the top-left. Also, the + * copy entirely replaces the contents of the target texture, no 'merging' or 'blending' takes + * place. + * @param source The source Render Target. + * @param target The target Render Target. + * @param x The x coordinate of the lower left corner where to start copying. + * @param y The y coordinate of the lower left corner where to start copying. + * @param width The width of the texture. + * @param height The height of the texture. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + copyFrameRect(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, x: number, y: number, width: number, height: number, clear?: boolean, clearAlpha?: boolean): void; + + /** + * Binds this pipeline and draws the `source` Render Target to the `target` Render Target. + * + * If no `target` is specified, it will pop the framebuffer from the Renderers FBO stack + * and use that instead, which should be done when you need to draw the final results of + * this pipeline to the game canvas. + * + * You can optionally set the shader to be used for the draw here, if this is a multi-shader + * pipeline. By default `currentShader` will be used. If you need to set a shader but not + * a target, just pass `null` as the `target` parameter. + * @param source The Render Target to draw from. + * @param target The Render Target to draw to. If not set, it will pop the fbo from the stack. + * @param clear Clear the target before copying? Only used if `target` parameter is set. Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param currentShader The shader to use during the draw. + */ + bindAndDraw(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, clear?: boolean, clearAlpha?: boolean, currentShader?: Phaser.Renderer.WebGL.WebGLShader): void; + + /** + * Destroys all shader instances, removes all object references and nulls all external references. + */ + destroy(): this; + + } + + /** + * The Pre FX Pipeline is a special kind of pipeline designed specifically for applying + * special effects to Game Objects before they are rendered. Where-as the Post FX Pipeline applies an effect _after_ the + * object has been rendered, the Pre FX Pipeline allows you to control the rendering of + * the object itself - passing it off to its own texture, where multi-buffer compositing + * can take place. + * + * You can only use the PreFX Pipeline on the following types of Game Objects, or those + * that extend from them: + * + * Sprite + * Image + * Text + * TileSprite + * RenderTexture + * Video + */ + class PreFXPipeline extends Phaser.Renderer.WebGL.WebGLPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * A reference to the Draw Sprite Shader belonging to this Pipeline. + * + * This shader is used when the sprite is drawn to this fbo (or to the game if drawToFrame is false) + * + * This property is set during the `boot` method. + */ + drawSpriteShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Copy Shader belonging to this Pipeline. + * + * This shader is used when you call the `copySprite` method. + * + * This property is set during the `boot` method. + */ + copyShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Game Draw Shader belonging to this Pipeline. + * + * This shader draws the fbo to the game. + * + * This property is set during the `boot` method. + */ + gameShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Color Matrix Shader belonging to this Pipeline. + * + * This property is set during the `boot` method. + */ + colorMatrixShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * Raw byte buffer of vertices used specifically during the copySprite method. + */ + readonly quadVertexData: ArrayBuffer; + + /** + * The WebGLBuffer that holds the quadVertexData. + */ + readonly quadVertexBuffer: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper; + + /** + * Float32 view of the quad array buffer. + */ + quadVertexViewF32: Float32Array; + + /** + * The full-screen Render Target that the sprite is first drawn to. + */ + fsTarget: Phaser.Renderer.WebGL.RenderTarget; + + /** + * Handles the resizing of the quad vertex data. + * @param width The new width of the quad. + * @param height The new height of the quad. + */ + onResize(width: number, height: number): void; + + /** + * Adds the vertices data into the batch and flushes if full. + * + * Assumes 6 vertices in the following arrangement: + * + * ``` + * 0----3 + * |\ B| + * | \ | + * | \ | + * | A \| + * | \ + * 1----2 + * ``` + * + * Where x0 / y0 = 0, x1 / y1 = 1, x2 / y2 = 2 and x3 / y3 = 3 + * @param gameObject The Game Object, if any, drawing this quad. + * @param x0 The top-left x position. + * @param y0 The top-left y position. + * @param x1 The bottom-left x position. + * @param y1 The bottom-left y position. + * @param x2 The bottom-right x position. + * @param y2 The bottom-right y position. + * @param x3 The top-right x position. + * @param y3 The top-right y position. + * @param u0 UV u0 value. + * @param v0 UV v0 value. + * @param u1 UV u1 value. + * @param v1 UV v1 value. + * @param tintTL The top-left tint color value. + * @param tintTR The top-right tint color value. + * @param tintBL The bottom-left tint color value. + * @param tintBR The bottom-right tint color value. + * @param tintEffect The tint effect for the shader to use. + * @param texture Texture that will be assigned to the current batch if a flush occurs. + */ + batchQuad(gameObject: Phaser.GameObjects.GameObject | null, x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, u0: number, v0: number, u1: number, v1: number, tintTL: number, tintTR: number, tintBL: number, tintBR: number, tintEffect: number | boolean, texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): boolean; + + /** + * This callback is invoked when a sprite is drawn by this pipeline. + * + * It will fire after the shader has been set, but before the sprite has been drawn, + * so use it to set any additional uniforms you may need. + * + * Note: Manipulating the Sprite during this callback will _not_ change how it is drawn to the Render Target. + * @param gameObject The Sprite being drawn. + * @param target The Render Target the Sprite will be drawn to. + */ + onDrawSprite(gameObject: Phaser.GameObjects.Sprite, target: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * This callback is invoked when you call the `copySprite` method. + * + * It will fire after the shader has been set, but before the source target has been copied, + * so use it to set any additional uniforms you may need. + * + * Note: Manipulating the Sprite during this callback will _not_ change the Render Targets. + * @param source The source Render Target being copied from. + * @param target The target Render Target that will be copied to. + * @param gameObject The Sprite being copied. + */ + onCopySprite(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, gameObject: Phaser.GameObjects.Sprite): void; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * No target resizing takes place. If the `source` Render Target is larger than the `target`, + * then only a portion the same size as the `target` dimensions is copied across. + * + * Calling this method will invoke the `onCopySprite` handler and will also call + * the `onFXCopy` callback on the Sprite. Both of these happen prior to the copy, allowing you + * to use them to set shader uniforms and other values. + * + * You can optionally pass in a ColorMatrix. If so, it will use the ColorMatrix shader + * during the copy, allowing you to manipulate the colors to a fine degree. + * See the `ColorMatrix` class for more details. + * @param source The source Render Target being copied from. + * @param target The target Render Target that will be copied to. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param eraseMode Erase source from target using ERASE Blend Mode? Default false. + * @param colorMatrix Optional ColorMatrix to use when copying the Sprite. + * @param shader The shader to use to copy the target. Defaults to the `copyShader`. + */ + copySprite(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, clear?: boolean, clearAlpha?: boolean, eraseMode?: boolean, colorMatrix?: Phaser.Display.ColorMatrix, shader?: Phaser.Renderer.WebGL.WebGLShader): void; + + /** + * Draws the `source` Render Target to the `target` Render Target. + * + * This is done using whatever the currently bound shader is. This method does + * not set a shader. All it does is bind the source texture, set the viewport and UVs + * then bind the target framebuffer, clears it and draws the source to it. + * + * At the end a null framebuffer is bound. No other clearing-up takes place, so + * use this method carefully. + * @param source The source Render Target. + * @param target The target Render Target. + */ + copy(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using a linear blend effect, which is controlled by the `strength` parameter. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFrames(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): void; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using an additive blend effect, which is controlled by the `strength` parameter. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFramesAdditive(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): void; + + /** + * This method will copy the given Render Target to the game canvas using the `copyShader`. + * + * This applies the results of the copy shader during the draw. + * + * If you wish to copy the target without any effects see the `copyToGame` method instead. + * + * This method should be the final thing called in your pipeline. + * @param source The Render Target to draw to the game. + */ + drawToGame(source: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * This method will copy the given Render Target to the game canvas using the `gameShader`. + * + * Unless you've changed it, the `gameShader` copies the target without modifying it, just + * ensuring it is placed in the correct location on the canvas. + * + * If you wish to draw the target with and apply the fragment shader at the same time, + * see the `drawToGame` method instead. + * + * This method should be the final thing called in your pipeline. + * @param source The Render Target to copy to the game. + */ + copyToGame(source: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * This method is called by `drawToGame` and `copyToGame`. It takes the source Render Target + * and copies it back to the game canvas, or the next frame buffer in the stack, and should + * be considered the very last thing this pipeline does. + * + * You don't normally need to call this method, or override it, however it is left public + * should you wish to do so. + * + * Note that it does _not_ set a shader. You should do this yourself if invoking this. + * @param source The Render Target to draw to the game. + */ + bindAndDraw(source: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * This method is called every time the `batchSprite` method is called and is passed a + * reference to the current render target. + * + * If you override this method, then it should make sure it calls either the + * `drawToGame` or `copyToGame` methods as the final thing it does. However, you can do as + * much additional processing as you like prior to this. + * @param target The Render Target to draw to the game. + * @param swapTarget The Swap Render Target, useful for double-buffer effects. + * @param altSwapTarget The Swap Render Target, useful for double-buffer effects. + */ + onDraw(target: Phaser.Renderer.WebGL.RenderTarget, swapTarget?: Phaser.Renderer.WebGL.RenderTarget, altSwapTarget?: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Set the UV values for the 6 vertices that make up the quad used by the copy shader. + * + * Be sure to call `resetUVs` once you have finished manipulating the UV coordinates. + * @param uA The u value of vertex A. + * @param vA The v value of vertex A. + * @param uB The u value of vertex B. + * @param vB The v value of vertex B. + * @param uC The u value of vertex C. + * @param vC The v value of vertex C. + * @param uD The u value of vertex D. + * @param vD The v value of vertex D. + */ + setUVs(uA: number, vA: number, uB: number, vB: number, uC: number, vC: number, uD: number, vD: number): void; + + /** + * Sets the vertex UV coordinates of the quad used by the copy shaders + * so that they correctly adjust the texture coordinates for a blit frame effect. + * + * Be sure to call `resetUVs` once you have finished manipulating the UV coordinates. + * @param source The source Render Target. + * @param target The target Render Target. + */ + setTargetUVs(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Resets the quad vertice UV values to their default settings. + * + * The quad is used by the copy shader in this pipeline. + */ + resetUVs(): void; + + /** + * Destroys all shader instances, removes all object references and nulls all external references. + */ + destroy(): this; + + } + + /** + * The Rope Pipeline is a variation of the Multi Pipeline that uses a `TRIANGLE_STRIP` for + * its topology, instead of TRIANGLES. This is primarily used by the Rope Game Object, + * or anything that extends it. + * + * Prior to Phaser v3.50 this pipeline was called the `TextureTintStripPipeline`. + * + * The fragment shader it uses can be found in `shaders/src/Multi.frag`. + * The vertex shader it uses can be found in `shaders/src/Multi.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * `inTexId` (float, offset 16) + * `inTintEffect` (float, offset 20) + * `inTint` (vec4, offset 24, normalized) + * + * The default shader uniforms for this pipeline are: + * + * `uProjectionMatrix` (mat4) + * `uRoundPixels` (int) + * `uResolution` (vec2) + * `uMainSampler` (sampler2D, or sampler2D array) + * + * The pipeline is structurally identical to the Multi Pipeline and should be treated as such. + */ + class RopePipeline extends Phaser.Renderer.WebGL.Pipelines.MultiPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + } + + /** + * The Single Pipeline is a special version of the Multi Pipeline that only ever + * uses one texture, bound to texture unit zero. Although not as efficient as the + * Multi Pipeline, it provides an easier way to create custom pipelines that only require + * a single bound texture. + * + * Prior to Phaser v3.50 this pipeline didn't exist, but could be compared to the old `TextureTintPipeline`. + * + * The fragment shader it uses can be found in `shaders/src/Single.frag`. + * The vertex shader it uses can be found in `shaders/src/Single.vert`. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * `inTexId` (float, offset 16) - this value is always zero in the Single Pipeline + * `inTintEffect` (float, offset 20) + * `inTint` (vec4, offset 24, normalized) + * + * The default shader uniforms for this pipeline are: + * + * `uProjectionMatrix` (mat4) + * `uRoundPixels` (int) + * `uResolution` (vec2) + * `uMainSampler` (sampler2D, or sampler2D array) + */ + class SinglePipeline extends Phaser.Renderer.WebGL.Pipelines.MultiPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + } + + /** + * The Utility Pipeline is a special-use pipeline that belongs to the Pipeline Manager. + * + * It provides 4 shaders and handy associated methods: + * + * 1) Copy Shader. A fast texture to texture copy shader with optional brightness setting. + * 2) Additive Blend Mode Shader. Blends two textures using an additive blend mode. + * 3) Linear Blend Mode Shader. Blends two textures using a linear blend mode. + * 4) Color Matrix Copy Shader. Draws a texture to a target using a Color Matrix. + * + * You do not extend this pipeline, but instead get a reference to it from the Pipeline + * Manager via the `setUtility` method. You can also access methods such as `copyFrame` + * directly from the Pipeline Manager. + * + * This pipeline provides methods for manipulating framebuffer backed textures, such as + * copying or blending one texture to another, copying a portion of a texture, additively + * blending two textures, flipping textures and more. + * + * The default shader attributes for this pipeline are: + * + * `inPosition` (vec2, offset 0) + * `inTexCoord` (vec2, offset 8) + * + * This pipeline has a hard-coded batch size of 1 and a hard coded set of vertices. + */ + class UtilityPipeline extends Phaser.Renderer.WebGL.WebGLPipeline { + /** + * + * @param config The configuration options for this pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * A default Color Matrix, used by the Color Matrix Shader when one + * isn't provided. + */ + colorMatrix: Phaser.Display.ColorMatrix; + + /** + * A reference to the Copy Shader belonging to this Utility Pipeline. + * + * This property is set during the `boot` method. + */ + copyShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Additive Blend Shader belonging to this Utility Pipeline. + * + * This property is set during the `boot` method. + */ + addShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Linear Blend Shader belonging to this Utility Pipeline. + * + * This property is set during the `boot` method. + */ + linearShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Color Matrix Shader belonging to this Utility Pipeline. + * + * This property is set during the `boot` method. + */ + colorMatrixShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * A reference to the Full Frame 1 Render Target. + * + * This property is set during the `boot` method. + * + * This Render Target is the full size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + fullFrame1: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Full Frame 2 Render Target. + * + * This property is set during the `boot` method. + * + * This Render Target is the full size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + fullFrame2: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Half Frame 1 Render Target. + * + * This property is set during the `boot` method. + * + * This Render Target is half the size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + halfFrame1: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the Half Frame 2 Render Target. + * + * This property is set during the `boot` method. + * + * This Render Target is half the size of the renderer. + * + * You can use this directly in Post FX Pipelines for multi-target effects. + * However, be aware that these targets are shared between all post fx pipelines. + */ + halfFrame2: Phaser.Renderer.WebGL.RenderTarget; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * You can optionally set the brightness factor of the copy. + * + * The difference between this method and `drawFrame` is that this method + * uses a faster copy shader, where only the brightness can be modified. + * If you need color level manipulation, see `drawFrame` instead. + * @param source The source Render Target. + * @param target The target Render Target. + * @param brightness The brightness value applied to the frame copy. Default 1. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + copyFrame(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, brightness?: number, clear?: boolean, clearAlpha?: boolean): void; + + /** + * Copy the `source` Render Target to the `target` Render Target. + * + * The difference with this copy is that no resizing takes place. If the `source` + * Render Target is larger than the `target` then only a portion the same size as + * the `target` dimensions is copied across. + * + * You can optionally set the brightness factor of the copy. + * @param source The source Render Target. + * @param target The target Render Target. + * @param brightness The brightness value applied to the frame copy. Default 1. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param eraseMode Erase source from target using ERASE Blend Mode? Default false. + * @param flipY Flip the UV on the Y axis before drawing? Default false. + */ + blitFrame(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, brightness?: number, clear?: boolean, clearAlpha?: boolean, eraseMode?: boolean, flipY?: boolean): void; + + /** + * Binds the `source` Render Target and then copies a section of it to the `target` Render Target. + * + * This method is extremely fast because it uses `gl.copyTexSubImage2D` and doesn't + * require the use of any shaders. Remember the coordinates are given in standard WebGL format, + * where x and y specify the lower-left corner of the section, not the top-left. Also, the + * copy entirely replaces the contents of the target texture, no 'merging' or 'blending' takes + * place. + * @param source The source Render Target. + * @param target The target Render Target. + * @param x The x coordinate of the lower left corner where to start copying. + * @param y The y coordinate of the lower left corner where to start copying. + * @param width The width of the texture. + * @param height The height of the texture. + * @param clear Clear the target before copying? Default true. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + copyFrameRect(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget, x: number, y: number, width: number, height: number, clear?: boolean, clearAlpha?: boolean): void; + + /** + * Pops the framebuffer from the renderers FBO stack and sets that as the active target, + * then draws the `source` Render Target to it. It then resets the renderer textures. + * + * This should be done when you need to draw the _final_ results of a pipeline to the game + * canvas, or the next framebuffer in line on the FBO stack. You should only call this once + * in the `onDraw` handler and it should be the final thing called. Be careful not to call + * this if you need to actually use the pipeline shader, instead of the copy shader. In + * those cases, use the `bindAndDraw` method. + * @param source The Render Target to draw from. + */ + copyToGame(source: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Copy the `source` Render Target to the `target` Render Target, using the + * given Color Matrix. + * + * The difference between this method and `copyFrame` is that this method + * uses a color matrix shader, where you have full control over the luminance + * values used during the copy. If you don't need this, you can use the faster + * `copyFrame` method instead. + * @param source The source Render Target. + * @param target The target Render Target. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param colorMatrix The Color Matrix to use when performing the draw. + */ + drawFrame(source: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, clearAlpha?: boolean, colorMatrix?: Phaser.Display.ColorMatrix): void; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using a linear blend effect, which is controlled by the `strength` parameter. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + * @param blendShader The shader to use during the blend copy. + */ + blendFrames(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean, blendShader?: Phaser.Renderer.WebGL.WebGLShader): void; + + /** + * Draws the `source1` and `source2` Render Targets to the `target` Render Target + * using an additive blend effect, which is controlled by the `strength` parameter. + * @param source1 The first source Render Target. + * @param source2 The second source Render Target. + * @param target The target Render Target. + * @param strength The strength of the blend. Default 1. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + blendFramesAdditive(source1: Phaser.Renderer.WebGL.RenderTarget, source2: Phaser.Renderer.WebGL.RenderTarget, target?: Phaser.Renderer.WebGL.RenderTarget, strength?: number, clearAlpha?: boolean): void; + + /** + * Clears the given Render Target. + * @param target The Render Target to clear. + * @param clearAlpha Clear the alpha channel when running `gl.clear` on the target? Default true. + */ + clearFrame(target: Phaser.Renderer.WebGL.RenderTarget, clearAlpha?: boolean): void; + + /** + * Set the UV values for the 6 vertices that make up the quad used by the shaders + * in the Utility Pipeline. + * + * Be sure to call `resetUVs` once you have finished manipulating the UV coordinates. + * @param uA The u value of vertex A. + * @param vA The v value of vertex A. + * @param uB The u value of vertex B. + * @param vB The v value of vertex B. + * @param uC The u value of vertex C. + * @param vC The v value of vertex C. + * @param uD The u value of vertex D. + * @param vD The v value of vertex D. + */ + setUVs(uA: number, vA: number, uB: number, vB: number, uC: number, vC: number, uD: number, vD: number): void; + + /** + * Sets the vertex UV coordinates of the quad used by the shaders in the Utility Pipeline + * so that they correctly adjust the texture coordinates for a blit frame effect. + * + * Be sure to call `resetUVs` once you have finished manipulating the UV coordinates. + * @param source The source Render Target. + * @param target The target Render Target. + */ + setTargetUVs(source: Phaser.Renderer.WebGL.RenderTarget, target: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * Horizontally flips the UV coordinates of the quad used by the shaders in this + * Utility Pipeline. + * + * Be sure to call `resetUVs` once you have finished manipulating the UV coordinates. + */ + flipX(): void; + + /** + * Vertically flips the UV coordinates of the quad used by the shaders in this + * Utility Pipeline. + * + * Be sure to call `resetUVs` once you have finished manipulating the UV coordinates. + */ + flipY(): void; + + /** + * Resets the quad vertice UV values to their default settings. + * + * The quad is used by all shaders of the Utility Pipeline. + */ + resetUVs(): void; + + } + + } + + /** + * A Render Target encapsulates a WebGL framebuffer and the WebGL Texture that displays it. + * + * Instances of this class are typically created by, and belong to WebGL Pipelines, however + * other Game Objects and classes can take advantage of Render Targets as well. + */ + class RenderTarget { + /** + * + * @param renderer A reference to the WebGLRenderer. + * @param width The width of this Render Target. + * @param height The height of this Render Target. + * @param scale A value between 0 and 1. Controls the size of this Render Target in relation to the Renderer. Default 1. + * @param minFilter The minFilter mode of the texture when created. 0 is `LINEAR`, 1 is `NEAREST`. Default 0. + * @param autoClear Automatically clear this framebuffer when bound? Default true. + * @param autoResize Automatically resize this Render Target if the WebGL Renderer resizes? Default false. + * @param addDepthBuffer Add a DEPTH_STENCIL and attachment to this Render Target? Default true. + * @param forceClamp Force the texture to use the CLAMP_TO_EDGE wrap mode, even if a power of two? Default true. + */ + constructor(renderer: Phaser.Renderer.WebGL.WebGLRenderer, width: number, height: number, scale?: number, minFilter?: number, autoClear?: boolean, autoResize?: boolean, addDepthBuffer?: boolean, forceClamp?: boolean); + + /** + * A reference to the WebGLRenderer instance. + */ + renderer: Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The Framebuffer of this Render Target. + * + * This is created in the `RenderTarget.resize` method. + */ + framebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper; + + /** + * The WebGLTextureWrapper of this Render Target. + * + * This is created in the `RenderTarget.resize` method. + */ + texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * The width of the texture. + */ + readonly width: number; + + /** + * The height of the texture. + */ + readonly height: number; + + /** + * A value between 0 and 1. Controls the size of this Render Target in relation to the Renderer. + * + * A value of 1 matches it. 0.5 makes the Render Target half the size of the renderer, etc. + */ + scale: number; + + /** + * The minFilter mode of the texture. 0 is `LINEAR`, 1 is `NEAREST`. + */ + minFilter: number; + + /** + * Controls if this Render Target is automatically cleared (via `gl.COLOR_BUFFER_BIT`) + * during the `RenderTarget.bind` method. + * + * If you need more control over how, or if, the target is cleared, you can disable + * this via the config on creation, or even toggle it directly at runtime. + */ + autoClear: boolean; + + /** + * Does this Render Target automatically resize when the WebGL Renderer does? + * + * Modify this property via the `setAutoResize` method. + */ + readonly autoResize: boolean; + + /** + * Does this Render Target have a Depth Buffer? + */ + readonly hasDepthBuffer: boolean; + + /** + * Force the WebGL Texture to use the CLAMP_TO_EDGE wrap mode, even if a power of two? + * + * If `false` it will use `gl.REPEAT` instead, which may be required for some effects, such + * as using this Render Target as a texture for a Shader. + */ + forceClamp: boolean; + + /** + * Sets if this Render Target should automatically resize when the WebGL Renderer + * emits a resize event. + * @param autoResize Automatically resize this Render Target when the WebGL Renderer resizes? + */ + setAutoResize(autoResize: boolean): this; + + /** + * Resizes this Render Target. + * + * Deletes both the frame buffer and texture, if they exist and then re-creates + * them using the new sizes. + * + * This method is called automatically by the pipeline during its resize handler. + * @param width The new width of this Render Target. + * @param height The new height of this Render Target. + */ + resize(width: number, height: number): this; + + /** + * Checks if this Render Target will resize, or not, if given the new + * width and height values. + * @param width The new width of this Render Target. + * @param height The new height of this Render Target. + */ + willResize(width: number, height: number): boolean; + + /** + * Pushes this Render Target as the current frame buffer of the renderer. + * + * If `autoClear` is set, then clears the texture. + * + * If `adjustViewport` is `true` then it will flush the renderer and then adjust the GL viewport. + * @param adjustViewport Adjust the GL viewport by calling `RenderTarget.adjustViewport` ? Default false. + * @param width Optional new width of this Render Target. + * @param height Optional new height of this Render Target. + */ + bind(adjustViewport?: boolean, width?: number, height?: number): void; + + /** + * Adjusts the GL viewport to match the width and height of this Render Target. + * + * Also disables `SCISSOR_TEST`. + */ + adjustViewport(): void; + + /** + * Clears this Render Target. + */ + clear(): void; + + /** + * Unbinds this Render Target and optionally flushes the WebGL Renderer first. + */ + unbind: any; + + /** + * Removes all external references from this class and deletes the + * WebGL framebuffer and texture instances. + * + * Does not remove this Render Target from the parent pipeline. + */ + destroy: any; + + } + + namespace Shaders { + } + + namespace Utils { + /** + * Packs four floats on a range from 0.0 to 1.0 into a single Uint32 + * @param r Red component in a range from 0.0 to 1.0 + * @param g Green component in a range from 0.0 to 1.0 + * @param b Blue component in a range from 0.0 to 1.0 + * @param a Alpha component in a range from 0.0 to 1.0 + */ + function getTintFromFloats(r: number, g: number, b: number, a: number): number; + + /** + * Packs a Uint24, representing RGB components, with a Float32, representing + * the alpha component, with a range between 0.0 and 1.0 and return a Uint32 + * @param rgb Uint24 representing RGB components + * @param a Float32 representing Alpha component + */ + function getTintAppendFloatAlpha(rgb: number, a: number): number; + + /** + * Packs a Uint24, representing RGB components, with a Float32, representing + * the alpha component, with a range between 0.0 and 1.0 and return a + * swizzled Uint32 + * @param rgb Uint24 representing RGB components + * @param a Float32 representing Alpha component + */ + function getTintAppendFloatAlphaAndSwap(rgb: number, a: number): number; + + /** + * Unpacks a Uint24 RGB into an array of floats of ranges of 0.0 and 1.0 + * @param rgb RGB packed as a Uint24 + */ + function getFloatsFromUintRGB(rgb: number): any[]; + + /** + * Check to see how many texture units the GPU supports in a fragment shader + * and if the value specific in the game config is allowed. + * + * This value is hard-clamped to 16 for performance reasons on Android devices. + * @param gl The WebGLContext used to create the shaders. + * @param maxTextures The Game Config maxTextures value. + */ + function checkShaderMax(gl: WebGLRenderingContext, maxTextures: number): number; + + /** + * Checks the given Fragment Shader Source for `%count%` and `%forloop%` declarations and + * replaces those with GLSL code for setting `texture = texture2D(uMainSampler[i], outTexCoord)`. + * @param fragmentShaderSource The Fragment Shader source code to operate on. + * @param maxTextures The number of maxTextures value. + */ + function parseFragmentShaderMaxTextures(fragmentShaderSource: string, maxTextures: number): string; + + /** + * Takes the Glow FX Shader source and parses out the __SIZE__ and __DIST__ + * consts with the configuration values. + * @param shader The Fragment Shader source code to operate on. + * @param game The Phaser Game instance. + * @param quality The quality of the glow (defaults to 0.1) + * @param distance The distance of the glow (defaults to 10) + */ + function setGlowQuality(shader: string, game: Phaser.Game, quality?: number, distance?: number): string; + + } + + /** + * The `WebGLPipeline` is a base class used by all of the core Phaser pipelines. + * + * It describes the way elements will be rendered in WebGL. Internally, it handles + * compiling the shaders, creating vertex buffers, assigning primitive topology and + * binding vertex attributes, all based on the given configuration data. + * + * The pipeline is configured by passing in a `WebGLPipelineConfig` object. Please + * see the documentation for this type to fully understand the configuration options + * available to you. + * + * Usually, you would not extend from this class directly, but would instead extend + * from one of the core pipelines, such as the Multi Pipeline. + * + * The pipeline flow per render-step is as follows: + * + * 1) onPreRender - called once at the start of the render step + * 2) onRender - call for each Scene Camera that needs to render (so can be multiple times per render step) + * 3) Internal flow: + * 3a) bind (only called if a Game Object is using this pipeline and it's not currently active) + * 3b) onBind (called for every Game Object that uses this pipeline) + * 3c) flush (can be called by a Game Object, internal method or from outside by changing pipeline) + * 4) onPostRender - called once at the end of the render step + */ + class WebGLPipeline extends Phaser.Events.EventEmitter { + /** + * + * @param config The configuration object for this WebGL Pipeline. + */ + constructor(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig); + + /** + * Name of the pipeline. Used for identification and setting from Game Objects. + */ + name: string; + + /** + * The Phaser Game instance to which this pipeline is bound. + */ + game: Phaser.Game; + + /** + * The WebGL Renderer instance to which this pipeline is bound. + */ + renderer: Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * A reference to the WebGL Pipeline Manager. + * + * This is initially undefined and only set when this pipeline is added + * to the manager. + */ + manager: Phaser.Renderer.WebGL.PipelineManager | null; + + /** + * The WebGL context this WebGL Pipeline uses. + */ + gl: WebGLRenderingContext; + + /** + * The canvas which this WebGL Pipeline renders to. + */ + view: HTMLCanvasElement; + + /** + * Width of the current viewport. + */ + width: number; + + /** + * Height of the current viewport. + */ + height: number; + + /** + * The current number of vertices that have been added to the pipeline batch. + */ + vertexCount: number; + + /** + * The total number of vertices that this pipeline batch can hold before it will flush. + * + * This defaults to `renderer batchSize * 6`, where `batchSize` is defined in the Renderer Game Config. + */ + vertexCapacity: number; + + /** + * Raw byte buffer of vertices. + * + * Either set via the config object `vertices` property, or generates a new Array Buffer of + * size `vertexCapacity * vertexSize`. + */ + readonly vertexData: ArrayBuffer; + + /** + * The WebGLBuffer that holds the vertex data. + * + * Created from the `vertexData` ArrayBuffer. If `vertices` are set in the config, a `STATIC_DRAW` buffer + * is created. If not, a `DYNAMIC_DRAW` buffer is created. + */ + readonly vertexBuffer: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper; + + /** + * The currently active WebGLBuffer. + */ + activeBuffer: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper; + + /** + * The primitive topology which the pipeline will use to submit draw calls. + * + * Defaults to GL_TRIANGLES if not otherwise set in the config. + */ + topology: GLenum; + + /** + * Uint8 view to the `vertexData` ArrayBuffer. Used for uploading vertex buffer resources to the GPU. + */ + bytes: Uint8Array; + + /** + * Float32 view of the array buffer containing the pipeline's vertices. + */ + vertexViewF32: Float32Array; + + /** + * Uint32 view of the array buffer containing the pipeline's vertices. + */ + vertexViewU32: Uint32Array; + + /** + * Indicates if the current pipeline is active, or not. + * + * Toggle this property to enable or disable a pipeline from rendering anything. + */ + active: boolean; + + /** + * Some pipelines require the forced use of texture zero (like the light pipeline). + * + * This property should be set when that is the case. + */ + forceZero: boolean; + + /** + * Indicates if this pipeline has booted or not. + * + * A pipeline boots only when the Game instance itself, and all associated systems, is + * fully ready. + */ + readonly hasBooted: boolean; + + /** + * Indicates if this is a Post FX Pipeline, or not. + */ + readonly isPostFX: boolean; + + /** + * Indicates if this is a Pre FX Pipeline, or not. + */ + readonly isPreFX: boolean; + + /** + * An array of RenderTarget instances that belong to this pipeline. + */ + renderTargets: Phaser.Renderer.WebGL.RenderTarget[]; + + /** + * A reference to the currently bound Render Target instance from the `WebGLPipeline.renderTargets` array. + */ + currentRenderTarget: Phaser.Renderer.WebGL.RenderTarget; + + /** + * An array of all the WebGLShader instances that belong to this pipeline. + * + * Shaders manage their own attributes and uniforms, but share the same vertex data buffer, + * which belongs to this pipeline. + * + * Shaders are set in a call to the `setShadersFromConfig` method, which happens automatically, + * but can also be called at any point in your game. See the method documentation for details. + */ + shaders: Phaser.Renderer.WebGL.WebGLShader[]; + + /** + * A reference to the currently bound WebGLShader instance from the `WebGLPipeline.shaders` array. + * + * For lots of pipelines, this is the only shader, so it is a quick way to reference it without + * an array look-up. + */ + currentShader: Phaser.Renderer.WebGL.WebGLShader; + + /** + * The Projection matrix, used by shaders as 'uProjectionMatrix' uniform. + */ + projectionMatrix: Phaser.Math.Matrix4; + + /** + * The cached width of the Projection matrix. + */ + projectionWidth: number; + + /** + * The cached height of the Projection matrix. + */ + projectionHeight: number; + + /** + * The configuration object that was used to create this pipeline. + * + * Treat this object as 'read only', because changing it post-creation will not + * impact this pipeline in any way. However, it is used internally for cloning + * and post-boot set-up. + */ + config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig; + + /** + * Has the GL Context been reset to the Phaser defaults since the last time + * this pipeline was bound? This is set automatically when the Pipeline Manager + * resets itself, usually after handing off to a 3rd party renderer like Spine. + * + * You should treat this property as read-only. + */ + glReset: boolean; + + /** + * The temporary Pipeline batch. This array contains the batch entries for + * the current frame, which is a package of textures and vertex offsets used + * for drawing. This package is built dynamically as the frame is built + * and cleared during the flush method. + * + * Treat this array and all of its contents as read-only. + */ + batch: Phaser.Types.Renderer.WebGL.WebGLPipelineBatchEntry[]; + + /** + * The most recently created Pipeline batch entry. + * + * Reset to null as part of the flush method. + * + * Treat this value as read-only. + */ + currentBatch: Phaser.Types.Renderer.WebGL.WebGLPipelineBatchEntry | null; + + /** + * The most recently bound texture, used as part of the batch process. + * + * Reset to null as part of the flush method. + * + * Treat this value as read-only. + */ + currentTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * Holds the most recently assigned texture unit. + * + * Treat this value as read-only. + */ + currentUnit: number; + + /** + * The currently active WebGLTextures, used as part of the batch process. + * + * Reset to empty as part of the bind method. + * + * Treat this array as read-only. + */ + activeTextures: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper[]; + + /** + * If the WebGL Renderer changes size, this uniform will be set with the new width and height values + * as part of the pipeline resize method. Various built-in pipelines, such as the MultiPipeline, set + * this property automatically to `uResolution`. + */ + resizeUniform: string; + + /** + * Called when the Game has fully booted and the Renderer has finished setting up. + * + * By this stage all Game level systems are now in place. You can perform any final tasks that the + * pipeline may need, that relies on game systems such as the Texture Manager being ready. + */ + boot(): void; + + /** + * This method is called once when this pipeline has finished being set-up + * at the end of the boot process. By the time this method is called, all + * of the shaders are ready and configured. + */ + onBoot(): void; + + /** + * This method is called once when this pipeline has finished being set-up + * at the end of the boot process. By the time this method is called, all + * of the shaders are ready and configured. It's also called if the renderer + * changes size. + * @param width The new width of this WebGL Pipeline. + * @param height The new height of this WebGL Pipeline. + */ + onResize(width: number, height: number): void; + + /** + * Sets the currently active shader within this pipeline. + * @param shader The shader to set as being current. + * @param setAttributes Should the vertex attribute pointers be set? Default false. + * @param vertexBuffer The vertex buffer to be set before the shader is bound. Defaults to the one owned by this pipeline. + */ + setShader(shader: Phaser.Renderer.WebGL.WebGLShader, setAttributes?: boolean, vertexBuffer?: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper): this; + + /** + * Searches all shaders in this pipeline for one matching the given name, then returns it. + * @param name The index of the shader to set. + */ + getShaderByName(name: string): Phaser.Renderer.WebGL.WebGLShader; + + /** + * Destroys all shaders currently set in the `WebGLPipeline.shaders` array and then parses the given + * `config` object, extracting the shaders from it, creating `WebGLShader` instances and finally + * setting them into the `shaders` array of this pipeline. + * + * This is a destructive process. Be very careful when you call it, should you need to. + * @param config The configuration object for this WebGL Pipeline. + */ + setShadersFromConfig(config: Phaser.Types.Renderer.WebGL.WebGLPipelineConfig): this; + + /** + * Creates a new WebGL Pipeline Batch Entry, sets the texture unit as zero + * and pushes the entry into the batch. + * @param texture The texture assigned to this batch entry. + */ + createBatch(texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): number; + + /** + * Adds the given texture to the current WebGL Pipeline Batch Entry and + * increases the batch entry unit and maxUnit values by 1. + * @param texture The texture assigned to this batch entry. + */ + addTextureToBatch(texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): void; + + /** + * Takes the given WebGLTextureWrapper and determines what to do with it. + * + * If there is no current batch (i.e. after a flush) it will create a new + * batch from it. + * + * If the texture is already bound, it will return the current texture unit. + * + * If the texture already exists in the current batch, the unit gets reset + * to match it. + * + * If the texture cannot be found in the current batch, and it supports + * multiple textures, it's added into the batch and the unit indexes are + * advanced. + * @param texture The texture assigned to this batch entry. + */ + pushBatch(texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): number; + + /** + * Custom pipelines can use this method in order to perform any required pre-batch tasks + * for the given Game Object. It must return the texture unit the Game Object was assigned. + * @param gameObject The Game Object being rendered or added to the batch. + * @param frame Optional frame to use. Can override that of the Game Object. + */ + setGameObject(gameObject: Phaser.GameObjects.GameObject, frame?: Phaser.Textures.Frame): number; + + /** + * Check if the current batch of vertices is full. + * + * You can optionally provide an `amount` parameter. If given, it will check if the batch + * needs to flush _if_ the `amount` is added to it. This allows you to test if you should + * flush before populating the batch. + * @param amount Will the batch need to flush if this many vertices are added to it? Default 0. + */ + shouldFlush(amount?: number): boolean; + + /** + * Returns the number of vertices that can be added to the current batch before + * it will trigger a flush to happen. + */ + vertexAvailable(): number; + + /** + * Resizes the properties used to describe the viewport. + * + * This method is called automatically by the renderer during its resize handler. + * @param width The new width of this WebGL Pipeline. + * @param height The new height of this WebGL Pipeline. + */ + resize(width: number, height: number): this; + + /** + * Adjusts this pipelines ortho Projection Matrix to use the given dimensions + * and resets the `uProjectionMatrix` uniform on all bound shaders. + * + * This method is called automatically by the renderer during its resize handler. + * @param width The new width of this WebGL Pipeline. + * @param height The new height of this WebGL Pipeline. + */ + setProjectionMatrix(width: number, height: number): this; + + /** + * Adjusts this pipelines ortho Projection Matrix to flip the y + * and bottom values. Call with 'false' as the parameter to flip + * them back again. + * @param flipY Flip the y and bottom values? Default true. + */ + flipProjectionMatrix(flipY?: boolean): void; + + /** + * Adjusts this pipelines ortho Projection Matrix to match that of the global + * WebGL Renderer Projection Matrix. + * + * This method is called automatically by the Pipeline Manager when this + * pipeline is set. + */ + updateProjectionMatrix(): void; + + /** + * This method is called every time the Pipeline Manager makes this pipeline the currently active one. + * + * It binds the resources and shader needed for this pipeline, including setting the vertex buffer + * and attribute pointers. + * @param currentShader The shader to set as being current. + */ + bind(currentShader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * This method is called every time the Pipeline Manager rebinds this pipeline. + * + * It resets all shaders this pipeline uses, setting their attributes again. + * @param currentShader The shader to set as being current. + */ + rebind(currentShader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * This method is called if the WebGL context is lost and restored. + * It ensures that uniforms are synced back to the GPU + * for all shaders in this pipeline. + */ + restoreContext(): void; + + /** + * Binds the vertex buffer to be the active ARRAY_BUFFER on the WebGL context. + * + * It first checks to see if it's already set as the active buffer and only + * binds itself if not. + * @param buffer The Vertex Buffer to be bound. Defaults to the one owned by this pipeline. + */ + setVertexBuffer(buffer?: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper): boolean; + + /** + * This method is called as a result of the `WebGLPipeline.batchQuad` method, right before a quad + * belonging to a Game Object is about to be added to the batch. When this is called, the + * renderer has just performed a flush. It will bind the current render target, if any are set + * and finally call the `onPreBatch` hook. + * + * It is also called as part of the `PipelineManager.preBatch` method when processing Post FX Pipelines. + * @param gameObject The Game Object or Camera that invoked this pipeline, if any. + */ + preBatch(gameObject?: Phaser.GameObjects.GameObject | Phaser.Cameras.Scene2D.Camera): this; + + /** + * This method is called as a result of the `WebGLPipeline.batchQuad` method, right after a quad + * belonging to a Game Object has been added to the batch. When this is called, the + * renderer has just performed a flush. + * + * It calls the `onDraw` hook followed by the `onPostBatch` hook, which can be used to perform + * additional Post FX Pipeline processing. + * + * It is also called as part of the `PipelineManager.postBatch` method when processing Post FX Pipelines. + * @param gameObject The Game Object or Camera that invoked this pipeline, if any. + */ + postBatch(gameObject?: Phaser.GameObjects.GameObject | Phaser.Cameras.Scene2D.Camera): this; + + /** + * This method is only used by Sprite FX and Post FX Pipelines and those that extend from them. + * + * This method is called every time the `postBatch` method is called and is passed a + * reference to the current render target. + * + * At the very least a Post FX Pipeline should call `this.bindAndDraw(renderTarget)`, + * however, you can do as much additional processing as you like in this method if + * you override it from within your own pipelines. + * @param renderTarget The Render Target. + * @param swapTarget A Swap Render Target, useful for double-buffer effects. Only set by SpriteFX Pipelines. + */ + onDraw(renderTarget: Phaser.Renderer.WebGL.RenderTarget, swapTarget?: Phaser.Renderer.WebGL.RenderTarget): void; + + /** + * This method is called every time the Pipeline Manager deactivates this pipeline, swapping from + * it to another one. This happens after a call to `flush` and before the new pipeline is bound. + */ + unbind(): void; + + /** + * Uploads the vertex data and emits a draw call for the current batch of vertices. + * @param isPostFlush Was this flush invoked as part of a post-process, or not? Default false. + */ + flush(isPostFlush?: boolean): this; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called every time the Pipeline Manager makes this the active pipeline. It is called + * at the end of the `WebGLPipeline.bind` method, after the current shader has been set. The current + * shader is passed to this hook. + * + * For example, if a display list has 3 Sprites in it that all use the same pipeline, this hook will + * only be called for the first one, as the 2nd and 3rd Sprites do not cause the pipeline to be changed. + * + * If you need to listen for that event instead, use the `onBind` hook. + * @param currentShader The shader that was set as current. + */ + onActive(currentShader: Phaser.Renderer.WebGL.WebGLShader): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called every time a **Game Object** asks the Pipeline Manager to use this pipeline, + * even if the pipeline is already active. + * + * Unlike the `onActive` method, which is only called when the Pipeline Manager makes this pipeline + * active, this hook is called for every Game Object that requests use of this pipeline, allowing you to + * perform per-object set-up, such as loading shader uniform data. + * @param gameObject The Game Object that invoked this pipeline, if any. + */ + onBind(gameObject?: Phaser.GameObjects.GameObject): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called when the Pipeline Manager needs to rebind this pipeline. This happens after a + * pipeline has been cleared, usually when passing control over to a 3rd party WebGL library, like Spine, + * and then returing to Phaser again. + */ + onRebind(): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called every time the `batchQuad` or `batchTri` methods are called. If this was + * as a result of a Game Object, then the Game Object reference is passed to this hook too. + * + * This hook is called _after_ the quad (or tri) has been added to the batch, so you can safely + * call 'flush' from within this. + * + * Note that Game Objects may call `batchQuad` or `batchTri` multiple times for a single draw, + * for example the Graphics Game Object. + * @param gameObject The Game Object that invoked this pipeline, if any. + */ + onBatch(gameObject?: Phaser.GameObjects.GameObject): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called immediately before a **Game Object** is about to add itself to the batch. + * @param gameObject The Game Object that invoked this pipeline, if any. + */ + onPreBatch(gameObject?: Phaser.GameObjects.GameObject): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called immediately after a **Game Object** has been added to the batch. + * @param gameObject The Game Object that invoked this pipeline, if any. + */ + onPostBatch(gameObject?: Phaser.GameObjects.GameObject): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called once per frame, right before anything has been rendered, but after the canvas + * has been cleared. If this pipeline has a render target, it will also have been cleared by this point. + */ + onPreRender(): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called _once per frame_, by every Camera in a Scene that wants to render. + * + * It is called at the start of the rendering process, before anything has been drawn to the Camera. + * @param scene The Scene being rendered. + * @param camera The Scene Camera being rendered with. + */ + onRender(scene: Phaser.Scene, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called _once per frame_, after all rendering has happened and snapshots have been taken. + * + * It is called at the very end of the rendering process, once all Cameras, for all Scenes, have + * been rendered. + */ + onPostRender(): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called every time this pipeline is asked to flush its batch. + * + * It is called immediately before the `gl.bufferData` and `gl.drawArrays` calls are made, so you can + * perform any final pre-render modifications. To apply changes post-render, see `onAfterFlush`. + * @param isPostFlush Was this flush invoked as part of a post-process, or not? Default false. + */ + onBeforeFlush(isPostFlush?: boolean): void; + + /** + * By default this is an empty method hook that you can override and use in your own custom pipelines. + * + * This method is called immediately after this pipeline has finished flushing its batch. + * + * It is called after the `gl.drawArrays` call. + * + * You can perform additional post-render effects, but be careful not to call `flush` + * on this pipeline from within this method, or you'll cause an infinite loop. + * + * To apply changes pre-render, see `onBeforeFlush`. + * @param isPostFlush Was this flush invoked as part of a post-process, or not? Default false. + */ + onAfterFlush(isPostFlush?: boolean): void; + + /** + * Adds a single vertex to the current vertex buffer and increments the + * `vertexCount` property by 1. + * + * This method is called directly by `batchTri` and `batchQuad`. + * + * It does not perform any batch limit checking itself, so if you need to call + * this method directly, do so in the same way that `batchQuad` does, for example. + * @param x The vertex x position. + * @param y The vertex y position. + * @param u UV u value. + * @param v UV v value. + * @param unit Texture unit to which the texture needs to be bound. + * @param tintEffect The tint effect for the shader to use. + * @param tint The tint color value. + */ + batchVert(x: number, y: number, u: number, v: number, unit: number, tintEffect: number | boolean, tint: number): void; + + /** + * Adds the vertices data into the batch and flushes if full. + * + * Assumes 6 vertices in the following arrangement: + * + * ``` + * 0----3 + * |\ B| + * | \ | + * | \ | + * | A \| + * | \ + * 1----2 + * ``` + * + * Where tx0/ty0 = 0, tx1/ty1 = 1, tx2/ty2 = 2 and tx3/ty3 = 3 + * @param gameObject The Game Object, if any, drawing this quad. + * @param x0 The top-left x position. + * @param y0 The top-left y position. + * @param x1 The bottom-left x position. + * @param y1 The bottom-left y position. + * @param x2 The bottom-right x position. + * @param y2 The bottom-right y position. + * @param x3 The top-right x position. + * @param y3 The top-right y position. + * @param u0 UV u0 value. + * @param v0 UV v0 value. + * @param u1 UV u1 value. + * @param v1 UV v1 value. + * @param tintTL The top-left tint color value. + * @param tintTR The top-right tint color value. + * @param tintBL The bottom-left tint color value. + * @param tintBR The bottom-right tint color value. + * @param tintEffect The tint effect for the shader to use. + * @param texture Texture that will be assigned to the current batch if a flush occurs. + * @param unit Texture unit to which the texture needs to be bound. Default 0. + */ + batchQuad(gameObject: Phaser.GameObjects.GameObject | null, x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, u0: number, v0: number, u1: number, v1: number, tintTL: number, tintTR: number, tintBL: number, tintBR: number, tintEffect: number | boolean, texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, unit?: number): boolean; + + /** + * Adds the vertices data into the batch and flushes if full. + * + * Assumes 3 vertices in the following arrangement: + * + * ``` + * 0 + * |\ + * | \ + * | \ + * | \ + * | \ + * 1-----2 + * ``` + * @param gameObject The Game Object, if any, drawing this quad. + * @param x1 The bottom-left x position. + * @param y1 The bottom-left y position. + * @param x2 The bottom-right x position. + * @param y2 The bottom-right y position. + * @param x3 The top-right x position. + * @param y3 The top-right y position. + * @param u0 UV u0 value. + * @param v0 UV v0 value. + * @param u1 UV u1 value. + * @param v1 UV v1 value. + * @param tintTL The top-left tint color value. + * @param tintTR The top-right tint color value. + * @param tintBL The bottom-left tint color value. + * @param tintEffect The tint effect for the shader to use. + * @param texture Texture that will be assigned to the current batch if a flush occurs. + * @param unit Texture unit to which the texture needs to be bound. Default 0. + */ + batchTri(gameObject: Phaser.GameObjects.GameObject | null, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, u0: number, v0: number, u1: number, v1: number, tintTL: number, tintTR: number, tintBL: number, tintEffect: number | boolean, texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, unit?: number): boolean; + + /** + * Pushes a filled rectangle into the vertex batch. + * + * The dimensions are run through `Math.floor` before the quad is generated. + * + * Rectangle has no transform values and isn't transformed into the local space. + * + * Used for directly batching untransformed rectangles, such as Camera background colors. + * @param x Horizontal top left coordinate of the rectangle. + * @param y Vertical top left coordinate of the rectangle. + * @param width Width of the rectangle. + * @param height Height of the rectangle. + * @param color Color of the rectangle to draw. + * @param alpha Alpha value of the rectangle to draw. + * @param texture texture that will be assigned to the current batch if a flush occurs. + * @param flipUV Flip the vertical UV coordinates of the texture before rendering? Default true. + */ + drawFillRect(x: number, y: number, width: number, height: number, color: number, alpha: number, texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, flipUV?: boolean): void; + + /** + * Sets the texture to be bound to the next available texture unit and returns + * the unit id. + * @param texture Texture that will be assigned to the current batch. If not given uses `whiteTexture`. + */ + setTexture2D(texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): number; + + /** + * Activates the given WebGL Texture and binds it to the requested texture slot. + * @param target Texture to activate and bind. + * @param unit The WebGL texture ID to activate. Defaults to `gl.TEXTURE0`. Default 0. + */ + bindTexture(target?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, unit?: number): this; + + /** + * Activates the given Render Target texture and binds it to the + * requested WebGL texture slot. + * @param target The Render Target to activate and bind. + * @param unit The WebGL texture ID to activate. Defaults to `gl.TEXTURE0`. Default 0. + */ + bindRenderTarget(target?: Phaser.Renderer.WebGL.RenderTarget, unit?: number): this; + + /** + * Sets the current duration into a 1f uniform value based on the given name. + * + * This can be used for mapping time uniform values, such as `iTime`. + * @param name The name of the uniform to set. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + setTime(name: string, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a boolean uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param value The new value of the `boolean` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + setBoolean(name: string, value: boolean, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 1f uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x The new value of the `float` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set1f(name: string, x: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 2f uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x The new X component of the `vec2` uniform. + * @param y The new Y component of the `vec2` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set2f(name: string, x: number, y: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 3f uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x The new X component of the `vec3` uniform. + * @param y The new Y component of the `vec3` uniform. + * @param z The new Z component of the `vec3` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set3f(name: string, x: number, y: number, z: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 4f uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x X component of the uniform + * @param y Y component of the uniform + * @param z Z component of the uniform + * @param w W component of the uniform + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set4f(name: string, x: number, y: number, z: number, w: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 1fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set1fv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 2fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set2fv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 3fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set3fv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 4fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set4fv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 1iv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set1iv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 2iv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set2iv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 3iv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set3iv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 4iv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set4iv(name: string, arr: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 1i uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x The new value of the `int` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set1i(name: string, x: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 2i uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x The new X component of the `ivec2` uniform. + * @param y The new Y component of the `ivec2` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set2i(name: string, x: number, y: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 3i uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x The new X component of the `ivec3` uniform. + * @param y The new Y component of the `ivec3` uniform. + * @param z The new Z component of the `ivec3` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set3i(name: string, x: number, y: number, z: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a 4i uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param x X component of the uniform. + * @param y Y component of the uniform. + * @param z Z component of the uniform. + * @param w W component of the uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + set4i(name: string, x: number, y: number, z: number, w: number, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a matrix 2fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param transpose Whether to transpose the matrix. Should be `false`. + * @param matrix The new values for the `mat2` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + setMatrix2fv(name: string, transpose: boolean, matrix: number[] | Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a matrix 3fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param transpose Whether to transpose the matrix. Should be `false`. + * @param matrix The new values for the `mat3` uniform. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + setMatrix3fv(name: string, transpose: boolean, matrix: Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Sets a matrix 4fv uniform value based on the given name on the currently set shader. + * + * The current shader is bound, before the uniform is set, making it active within the + * WebGLRenderer. This means you can safely call this method from a location such as + * a Scene `create` or `update` method. However, when working within a Shader file + * directly, use the `WebGLShader` method equivalent instead, to avoid the program + * being set. + * @param name The name of the uniform to set. + * @param transpose Whether to transpose the matrix. Should be `false`. + * @param matrix The matrix data. If using a Matrix4 this should be the `Matrix4.val` property. + * @param shader The shader to set the value on. If not given, the `currentShader` is used. + */ + setMatrix4fv(name: string, transpose: boolean, matrix: Float32Array, shader?: Phaser.Renderer.WebGL.WebGLShader): this; + + /** + * Destroys all shader instances, removes all object references and nulls all external references. + */ + destroy(): this; + + } + + /** + * WebGLRenderer is a class that contains the needed functionality to keep the + * WebGLRenderingContext state clean. The main idea of the WebGLRenderer is to keep track of + * any context change that happens for WebGL rendering inside of Phaser. This means + * if raw webgl functions are called outside the WebGLRenderer of the Phaser WebGL + * rendering ecosystem they might pollute the current WebGLRenderingContext state producing + * unexpected behavior. It's recommended that WebGL interaction is done through + * WebGLRenderer and/or WebGLPipeline. + */ + class WebGLRenderer extends Phaser.Events.EventEmitter { + /** + * + * @param game The Game instance which owns this WebGL Renderer. + */ + constructor(game: Phaser.Game); + + /** + * Checks to see if the given diffuse and normal map textures are already bound, or not. + * @param texture The diffuse texture. + * @param normalMap The normal map texture. + */ + isNewNormalMap(texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, normalMap: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): boolean; + + /** + * The local configuration settings of this WebGL Renderer. + */ + config: object; + + /** + * The Game instance which owns this WebGL Renderer. + */ + game: Phaser.Game; + + /** + * A constant which allows the renderer to be easily identified as a WebGL Renderer. + */ + type: number; + + /** + * An instance of the Pipeline Manager class, that handles all WebGL Pipelines. + * + * Use this to manage all of your interactions with pipelines, such as adding, getting, + * setting and rendering them. + * + * The Pipeline Manager class is created in the `init` method and then populated + * with pipelines during the `boot` method. + * + * Prior to Phaser v3.50.0 this was just a plain JavaScript object, not a class. + */ + pipelines: Phaser.Renderer.WebGL.PipelineManager; + + /** + * The width of the canvas being rendered to. + * This is populated in the onResize event handler. + */ + width: number; + + /** + * The height of the canvas being rendered to. + * This is populated in the onResize event handler. + */ + height: number; + + /** + * The canvas which this WebGL Renderer draws to. + */ + canvas: HTMLCanvasElement; + + /** + * An array of blend modes supported by the WebGL Renderer. + * + * This array includes the default blend modes as well as any custom blend modes added through {@link #addBlendMode}. + */ + blendModes: any[]; + + /** + * This property is set to `true` if the WebGL context of the renderer is lost. + */ + contextLost: boolean; + + /** + * Details about the currently scheduled snapshot. + * + * If a non-null `callback` is set in this object, a snapshot of the canvas will be taken after the current frame is fully rendered. + */ + snapshotState: Phaser.Types.Renderer.Snapshot.SnapshotState; + + /** + * The maximum number of textures the GPU can handle. The minimum under the WebGL1 spec is 8. + * This is set via the Game Config `maxTextures` property and should never be changed after boot. + */ + maxTextures: number; + + /** + * An array of the available WebGL texture units, used to populate the uSampler uniforms. + * + * This array is populated during the init phase and should never be changed after boot. + */ + textureIndexes: any[]; + + /** + * A list of all WebGLBufferWrappers that have been created by this renderer. + */ + glBufferWrappers: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper[]; + + /** + * A list of all WebGLProgramWrappers that have been created by this renderer. + */ + glProgramWrappers: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper[]; + + /** + * A list of all WebGLTextureWrappers that have been created by this renderer. + */ + glTextureWrappers: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper[]; + + /** + * A list of all WebGLFramebufferWrappers that have been created by this renderer. + */ + glFramebufferWrappers: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper[]; + + /** + * A list of all WebGLAttribLocationWrappers that have been created by this renderer. + */ + glAttribLocationWrappers: Phaser.Renderer.WebGL.Wrappers.WebGLAttribLocationWrapper[]; + + /** + * A list of all WebGLUniformLocationWrappers that have been created by this renderer. + */ + glUniformLocationWrappers: Phaser.Renderer.WebGL.Wrappers.WebGLUniformLocationWrapper[]; + + /** + * The currently bound framebuffer in use. + */ + currentFramebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper; + + /** + * A stack into which the frame buffer objects are pushed and popped. + */ + fboStack: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper[]; + + /** + * Current WebGLProgram in use. + */ + currentProgram: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper; + + /** + * Current blend mode in use + */ + currentBlendMode: number; + + /** + * Indicates if the the scissor state is enabled in WebGLRenderingContext + */ + currentScissorEnabled: boolean; + + /** + * Stores the current scissor data + */ + currentScissor: Uint32Array; + + /** + * Stack of scissor data + */ + scissorStack: Uint32Array; + + /** + * The handler to invoke when the context is lost. + * This should not be changed and is set in the boot method. + */ + contextLostHandler: Function; + + /** + * The handler to invoke when the context is restored. + * This should not be changed and is set in the boot method. + */ + contextRestoredHandler: Function; + + /** + * The underlying WebGL context of the renderer. + */ + gl: WebGLRenderingContext; + + /** + * Array of strings that indicate which WebGL extensions are supported by the browser. + * This is populated in the `boot` method. + */ + supportedExtensions: string[]; + + /** + * If the browser supports the `ANGLE_instanced_arrays` extension, this property will hold + * a reference to the glExtension for it. + */ + instancedArraysExtension: ANGLE_instanced_arrays; + + /** + * If the browser supports the `OES_vertex_array_object` extension, this property will hold + * a reference to the glExtension for it. + */ + vaoExtension: OES_vertex_array_object; + + /** + * The WebGL Extensions loaded into the current context. + */ + extensions: object; + + /** + * Stores the current WebGL component formats for further use. + * + * This array is populated in the `init` method. + */ + glFormats: any[]; + + /** + * Stores the WebGL texture compression formats that this device and browser supports. + * + * Support for using compressed texture formats was added in Phaser version 3.60. + */ + compression: Phaser.Types.Renderer.WebGL.WebGLTextureCompression; + + /** + * Cached drawing buffer height to reduce gl calls. + */ + readonly drawingBufferHeight: number; + + /** + * A blank 32x32 transparent texture, as used by the Graphics system where needed. + * This is set in the `boot` method. + */ + readonly blankTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * A blank 1x1 #7f7fff texture, a flat normal map, + * as used by the Graphics system where needed. + * This is set in the `boot` method. + */ + readonly normalTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * A pure white 4x4 texture, as used by the Graphics system where needed. + * This is set in the `boot` method. + */ + readonly whiteTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * The total number of masks currently stacked. + */ + maskCount: number; + + /** + * The mask stack. + */ + maskStack: Phaser.Display.Masks.GeometryMask[]; + + /** + * Internal property that tracks the currently set mask. + */ + currentMask: any; + + /** + * Internal property that tracks the currently set camera mask. + */ + currentCameraMask: any; + + /** + * Internal gl function mapping for uniform look-up. + * https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/uniform + */ + glFuncMap: any; + + /** + * The `type` of the Game Object being currently rendered. + * This can be used by advanced render functions for batching look-ahead. + */ + currentType: string; + + /** + * Is the `type` of the Game Object being currently rendered different than the + * type of the object before it in the display list? I.e. it's a 'new' type. + */ + newType: boolean; + + /** + * Does the `type` of the next Game Object in the display list match that + * of the object being currently rendered? + */ + nextTypeMatch: boolean; + + /** + * Is the Game Object being currently rendered the final one in the list? + */ + finalType: boolean; + + /** + * The mipmap magFilter to be used when creating textures. + * + * You can specify this as a string in the game config, i.e.: + * + * `render: { mipmapFilter: 'NEAREST_MIPMAP_LINEAR' }` + * + * The 6 options for WebGL1 are, in order from least to most computationally expensive: + * + * NEAREST (for pixel art) + * LINEAR (the default) + * NEAREST_MIPMAP_NEAREST + * LINEAR_MIPMAP_NEAREST + * NEAREST_MIPMAP_LINEAR + * LINEAR_MIPMAP_LINEAR + * + * Mipmaps only work with textures that are fully power-of-two in size. + * + * For more details see https://webglfundamentals.org/webgl/lessons/webgl-3d-textures.html + * + * As of v3.60 no mipmaps will be generated unless a string is given in + * the game config. This saves on VRAM use when it may not be required. + * To obtain the previous result set the property to `LINEAR` in the config. + */ + mipmapFilter: GLenum; + + /** + * Has this renderer fully booted yet? + */ + isBooted: boolean; + + /** + * A Render Target you can use to capture the current state of the Renderer. + * + * A Render Target encapsulates a framebuffer and texture for the WebGL Renderer. + */ + renderTarget: Phaser.Renderer.WebGL.RenderTarget; + + /** + * The global game Projection matrix, used by shaders as 'uProjectionMatrix' uniform. + */ + projectionMatrix: Phaser.Math.Matrix4; + + /** + * The cached width of the Projection matrix. + */ + projectionWidth: number; + + /** + * The cached height of the Projection matrix. + */ + projectionHeight: number; + + /** + * A RenderTarget used by the BitmapMask Pipeline. + * + * This is the source, i.e. the masked Game Object itself. + */ + maskSource: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A RenderTarget used by the BitmapMask Pipeline. + * + * This is the target, i.e. the framebuffer the masked objects are drawn to. + */ + maskTarget: Phaser.Renderer.WebGL.RenderTarget; + + /** + * An instance of SpectorJS used for WebGL Debugging. + * + * Only available in the Phaser Debug build. + */ + spector: Function; + + /** + * Creates a new WebGLRenderingContext and initializes all internal state. + * @param config The configuration object for the renderer. + */ + init(config: object): this; + + /** + * This method is only available in the Debug Build of Phaser, or a build with the + * `WEBGL_DEBUG` flag set in the Webpack Config. + * + * Phaser v3.60 Debug has a build of Spector.js embedded in it, which is a WebGL inspector + * that allows for live inspection of your WebGL calls. Although it's easy to add the Spector + * extension to a desktop browsr, by embedding it in Phaser we can make it available in mobile + * browsers too, making it a powerful tool for debugging WebGL games on mobile devices where + * extensions are not permitted. + * + * See https://github.com/BabylonJS/Spector.js for more details. + * + * This method will capture the current WebGL frame and send it to the Spector.js tool for inspection. + * @param quickCapture If `true` thumbnails are not captured in order to speed up the capture. Default false. + * @param fullCapture If `true` all details are captured. Default false. + */ + captureFrame(quickCapture?: boolean, fullCapture?: boolean): void; + + /** + * This method is only available in the Debug Build of Phaser, or a build with the + * `WEBGL_DEBUG` flag set in the Webpack Config. + * + * Phaser v3.60 Debug has a build of Spector.js embedded in it, which is a WebGL inspector + * that allows for live inspection of your WebGL calls. Although it's easy to add the Spector + * extension to a desktop browsr, by embedding it in Phaser we can make it available in mobile + * browsers too, making it a powerful tool for debugging WebGL games on mobile devices where + * extensions are not permitted. + * + * See https://github.com/BabylonJS/Spector.js for more details. + * + * This method will capture the next WebGL frame and send it to the Spector.js tool for inspection. + */ + captureNextFrame(): void; + + /** + * This method is only available in the Debug Build of Phaser, or a build with the + * `WEBGL_DEBUG` flag set in the Webpack Config. + * + * Phaser v3.60 Debug has a build of Spector.js embedded in it, which is a WebGL inspector + * that allows for live inspection of your WebGL calls. Although it's easy to add the Spector + * extension to a desktop browsr, by embedding it in Phaser we can make it available in mobile + * browsers too, making it a powerful tool for debugging WebGL games on mobile devices where + * extensions are not permitted. + * + * See https://github.com/BabylonJS/Spector.js for more details. + * + * This method will return the current FPS of the WebGL canvas. + */ + getFps(): number; + + /** + * This method is only available in the Debug Build of Phaser, or a build with the + * `WEBGL_DEBUG` flag set in the Webpack Config. + * + * Phaser v3.60 Debug has a build of Spector.js embedded in it, which is a WebGL inspector + * that allows for live inspection of your WebGL calls. Although it's easy to add the Spector + * extension to a desktop browsr, by embedding it in Phaser we can make it available in mobile + * browsers too, making it a powerful tool for debugging WebGL games on mobile devices where + * extensions are not permitted. + * + * See https://github.com/BabylonJS/Spector.js for more details. + * + * This method adds a command with the name value in the list. This can be filtered in the search. + * All logs can be filtered searching for "LOG". + * @param arguments The arguments to log to Spector. + */ + log(...arguments: any[]): string; + + /** + * This method is only available in the Debug Build of Phaser, or a build with the + * `WEBGL_DEBUG` flag set in the Webpack Config. + * + * Phaser v3.60 Debug has a build of Spector.js embedded in it, which is a WebGL inspector + * that allows for live inspection of your WebGL calls. Although it's easy to add the Spector + * extension to a desktop browsr, by embedding it in Phaser we can make it available in mobile + * browsers too, making it a powerful tool for debugging WebGL games on mobile devices where + * extensions are not permitted. + * + * See https://github.com/BabylonJS/Spector.js for more details. + * + * This method will start a capture on the Phaser canvas. The capture will stop once it reaches + * the number of commands specified as a parameter, or after 10 seconds. If quick capture is true, + * the thumbnails are not captured in order to speed up the capture. + * @param commandCount The number of commands to capture. If zero it will capture for 10 seconds. Default 0. + * @param quickCapture If `true` thumbnails are not captured in order to speed up the capture. Default false. + * @param fullCapture If `true` all details are captured. Default false. + */ + startCapture(commandCount?: number, quickCapture?: boolean, fullCapture?: boolean): void; + + /** + * This method is only available in the Debug Build of Phaser, or a build with the + * `WEBGL_DEBUG` flag set in the Webpack Config. + * + * Phaser v3.60 Debug has a build of Spector.js embedded in it, which is a WebGL inspector + * that allows for live inspection of your WebGL calls. Although it's easy to add the Spector + * extension to a desktop browsr, by embedding it in Phaser we can make it available in mobile + * browsers too, making it a powerful tool for debugging WebGL games on mobile devices where + * extensions are not permitted. + * + * See https://github.com/BabylonJS/Spector.js for more details. + * + * This method will stop the current capture and returns the result in JSON. It displays the + * result if the UI has been displayed. This returns undefined if the capture has not been completed + * or did not find any commands. + */ + stopCapture(): object; + + /** + * The event handler that manages the `resize` event dispatched by the Scale Manager. + * @param gameSize The default Game Size object. This is the un-modified game dimensions. + * @param baseSize The base Size object. The game dimensions. The canvas width / height values match this. + */ + onResize(gameSize: Phaser.Structs.Size, baseSize: Phaser.Structs.Size): void; + + /** + * Binds the WebGL Renderers Render Target, so all drawn content is now redirected to it. + * + * Make sure to call `endCapture` when you are finished. + * @param width Optional new width of the Render Target. + * @param height Optional new height of the Render Target. + */ + beginCapture(width?: number, height?: number): void; + + /** + * Unbinds the WebGL Renderers Render Target and returns it, stopping any further content being drawn to it. + * + * If the viewport or scissors were modified during the capture, you should reset them by calling + * `resetViewport` and `resetScissor` accordingly. + */ + endCapture(): Phaser.Renderer.WebGL.RenderTarget; + + /** + * Resizes the drawing buffer to match that required by the Scale Manager. + * @param width The new width of the renderer. + * @param height The new height of the renderer. + */ + resize(width?: number, height?: number): this; + + /** + * Determines which compressed texture formats this browser and device supports. + * + * Called automatically as part of the WebGL Renderer init process. If you need to investigate + * which formats it supports, see the `Phaser.Renderer.WebGL.WebGLRenderer#compression` property instead. + */ + getCompressedTextures(): Phaser.Types.Renderer.WebGL.WebGLTextureCompression; + + /** + * Returns a compressed texture format GLenum name based on the given format. + * @param baseFormat The Base Format to check. + * @param format An optional GLenum format to check within the base format. + */ + getCompressedTextureName(baseFormat: string, format?: GLenum): string; + + /** + * Checks if the given compressed texture format is supported, or not. + * @param baseFormat The Base Format to check. + * @param format An optional GLenum format to check within the base format. + */ + supportsCompressedTexture(baseFormat: string, format?: GLenum): boolean; + + /** + * Gets the aspect ratio of the WebGLRenderer dimensions. + */ + getAspectRatio(): number; + + /** + * Sets the Projection Matrix of this renderer to the given dimensions. + * @param width The new width of the Projection Matrix. + * @param height The new height of the Projection Matrix. + */ + setProjectionMatrix(width: number, height: number): this; + + /** + * Resets the Projection Matrix back to this renderers width and height. + * + * This is called during `endCapture`, should the matrix have been changed + * as a result of the capture process. + */ + resetProjectionMatrix(): this; + + /** + * Checks if a WebGL extension is supported + * @param extensionName Name of the WebGL extension + */ + hasExtension(extensionName: string): boolean; + + /** + * Loads a WebGL extension + * @param extensionName The name of the extension to load. + */ + getExtension(extensionName: string): object; + + /** + * Flushes the current pipeline if the pipeline is bound + */ + flush(): void; + + /** + * Pushes a new scissor state. This is used to set nested scissor states. + * @param x The x position of the scissor. + * @param y The y position of the scissor. + * @param width The width of the scissor. + * @param height The height of the scissor. + * @param drawingBufferHeight Optional drawingBufferHeight override value. + */ + pushScissor(x: number, y: number, width: number, height: number, drawingBufferHeight?: number): number[]; + + /** + * Sets the current scissor state. + * @param x The x position of the scissor. + * @param y The y position of the scissor. + * @param width The width of the scissor. + * @param height The height of the scissor. + * @param drawingBufferHeight Optional drawingBufferHeight override value. + */ + setScissor(x: number, y: number, width: number, height: number, drawingBufferHeight?: number): void; + + /** + * Resets the gl scissor state to be whatever the current scissor is, if there is one, without + * modifying the scissor stack. + */ + resetScissor(): void; + + /** + * Pops the last scissor state and sets it. + */ + popScissor(): void; + + /** + * Is there an active stencil mask? + */ + hasActiveStencilMask(): boolean; + + /** + * Resets the gl viewport to the current renderer dimensions. + */ + resetViewport(): void; + + /** + * Sets the blend mode to the value given. + * + * If the current blend mode is different from the one given, the pipeline is flushed and the new + * blend mode is enabled. + * @param blendModeId The blend mode to be set. Can be a `BlendModes` const or an integer value. + * @param force Force the blend mode to be set, regardless of the currently set blend mode. Default false. + */ + setBlendMode(blendModeId: number, force?: boolean): boolean; + + /** + * Creates a new custom blend mode for the renderer. + * + * See https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants#Blending_modes + * @param func An array containing the WebGL functions to use for the source and the destination blending factors, respectively. See the possible constants for {@link WebGLRenderingContext#blendFunc()}. + * @param equation The equation to use for combining the RGB and alpha components of a new pixel with a rendered one. See the possible constants for {@link WebGLRenderingContext#blendEquation()}. + */ + addBlendMode(func: GLenum[], equation: GLenum): number; + + /** + * Updates the function bound to a given custom blend mode. + * @param index The index of the custom blend mode. + * @param func The function to use for the blend mode. + * @param equation The equation to use for the blend mode. + */ + updateBlendMode(index: number, func: Function, equation: Function): this; + + /** + * Removes a custom blend mode from the renderer. + * Any Game Objects still using this blend mode will error, so be sure to clear them first. + * @param index The index of the custom blend mode to be removed. + */ + removeBlendMode(index: number): this; + + /** + * Pushes a new framebuffer onto the FBO stack and makes it the currently bound framebuffer. + * + * If there was another framebuffer already bound it will force a pipeline flush. + * + * Call `popFramebuffer` to remove it again. + * @param framebuffer The framebuffer that needs to be bound. + * @param updateScissor Set the gl scissor to match the frame buffer size? Or, if `null` given, pop the scissor from the stack. Default false. + * @param setViewport Should the WebGL viewport be set? Default true. + * @param texture Bind the given frame buffer texture? Default null. + * @param clear Clear the frame buffer after binding? Default false. + */ + pushFramebuffer(framebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper, updateScissor?: boolean, setViewport?: boolean, texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, clear?: boolean): this; + + /** + * Sets the given framebuffer as the active and currently bound framebuffer. + * + * If there was another framebuffer already bound it will force a pipeline flush. + * + * Typically, you should call `pushFramebuffer` instead of this method. + * @param framebuffer The framebuffer that needs to be bound, or `null` to bind back to the default framebuffer. + * @param updateScissor If a framebuffer is given, set the gl scissor to match the frame buffer size? Or, if `null` given, pop the scissor from the stack. Default false. + * @param setViewport Should the WebGL viewport be set? Default true. + * @param texture Bind the given frame buffer texture? Default null. + * @param clear Clear the frame buffer after binding? Default false. + */ + setFramebuffer(framebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper | null, updateScissor?: boolean, setViewport?: boolean, texture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, clear?: boolean): this; + + /** + * Pops the previous framebuffer from the fbo stack and sets it. + * @param updateScissor If a framebuffer is given, set the gl scissor to match the frame buffer size? Or, if `null` given, pop the scissor from the stack. Default false. + * @param setViewport Should the WebGL viewport be set? Default true. + */ + popFramebuffer(updateScissor?: boolean, setViewport?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper; + + /** + * Restores the previous framebuffer from the fbo stack and sets it. + * @param updateScissor If a framebuffer is given, set the gl scissor to match the frame buffer size? Or, if `null` given, pop the scissor from the stack. Default false. + * @param setViewport Should the WebGL viewport be set? Default true. + */ + restoreFramebuffer(updateScissor?: boolean, setViewport?: boolean): void; + + /** + * Binds a shader program. + * + * If there was a different program already bound it will force a pipeline flush first. + * + * If the same program given to this method is already set as the current program, no change + * will take place and this method will return `false`. + * @param program The program that needs to be bound. + */ + setProgram(program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper): boolean; + + /** + * Rebinds whatever program `WebGLRenderer.currentProgram` is set as, without + * changing anything, or flushing. + */ + resetProgram(): this; + + /** + * Creates a texture from an image source. If the source is not valid it creates an empty texture. + * @param source The source of the texture. + * @param width The width of the texture. + * @param height The height of the texture. + * @param scaleMode The scale mode to be used by the texture. + * @param forceClamp Force the texture to use the CLAMP_TO_EDGE wrap mode, even if a power of two? Default false. + */ + createTextureFromSource(source: object, width: number, height: number, scaleMode: number, forceClamp?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * A wrapper for creating a WebGLTextureWrapper. If no pixel data is passed it will create an empty texture. + * @param mipLevel Mip level of the texture. + * @param minFilter Filtering of the texture. + * @param magFilter Filtering of the texture. + * @param wrapT Wrapping mode of the texture. + * @param wrapS Wrapping mode of the texture. + * @param format Which format does the texture use. + * @param pixels pixel data. + * @param width Width of the texture in pixels. If not supplied, it must be derived from `pixels`. + * @param height Height of the texture in pixels. If not supplied, it must be derived from `pixels`. + * @param pma Does the texture have premultiplied alpha? Default true. + * @param forceSize If `true` it will use the width and height passed to this method, regardless of the pixels dimension. Default false. + * @param flipY Sets the `UNPACK_FLIP_Y_WEBGL` flag the WebGL Texture uses during upload. Default false. + */ + createTexture2D(mipLevel: number, minFilter: number, magFilter: number, wrapT: number, wrapS: number, format: number, pixels: object | undefined, width: number | undefined, height: number | undefined, pma?: boolean, forceSize?: boolean, flipY?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Creates a WebGL Framebuffer object and optionally binds a depth stencil render buffer. + * + * This will unbind any currently bound framebuffer. + * @param width If `addDepthStencilBuffer` is true, this controls the width of the depth stencil. + * @param height If `addDepthStencilBuffer` is true, this controls the height of the depth stencil. + * @param renderTexture The color texture where the color pixels are written. + * @param addDepthStencilBuffer Create a Renderbuffer for the depth stencil? Default false. + */ + createFramebuffer(width: number, height: number, renderTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, addDepthStencilBuffer?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper; + + /** + * Binds necessary resources and renders the mask to a separated framebuffer. + * The framebuffer for the masked object is also bound for further use. + * @param mask The BitmapMask instance that called beginMask. + * @param camera The camera rendering the current mask. + */ + beginBitmapMask(mask: Phaser.Display.Masks.BitmapMask, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Binds necessary resources and renders the mask to a separated framebuffer. + * The framebuffer for the masked object is also bound for further use. + * @param mask The BitmapMask instance that called beginMask. + * @param camera The camera rendering the current mask. + * @param bitmapMaskPipeline The BitmapMask Pipeline instance that is requesting the draw. + */ + drawBitmapMask(mask: Phaser.Display.Masks.BitmapMask, camera: Phaser.Cameras.Scene2D.Camera, bitmapMaskPipeline: Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline): void; + + /** + * Creates a WebGLProgram instance based on the given vertex and fragment shader source. + * + * Then compiles, attaches and links the program before wrapping and returning it. + * @param vertexShader The vertex shader source code as a single string. + * @param fragmentShader The fragment shader source code as a single string. + */ + createProgram(vertexShader: string, fragmentShader: string): Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper; + + /** + * Wrapper for creating a vertex buffer. + * @param initialDataOrSize It's either ArrayBuffer or an integer indicating the size of the vbo + * @param bufferUsage How the buffer is used. gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW + */ + createVertexBuffer(initialDataOrSize: ArrayBuffer, bufferUsage: number): Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper; + + /** + * Creates a WebGLAttribLocationWrapper instance based on the given WebGLProgramWrapper and attribute name. + * @param program The WebGLProgramWrapper instance. + * @param name The name of the attribute. + */ + createAttribLocation(program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper, name: string): void; + + /** + * Creates a WebGLUniformLocationWrapper instance based on the given WebGLProgramWrapper and uniform name. + * @param program The WebGLProgramWrapper instance. + * @param name The name of the uniform. + */ + createUniformLocation(program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper, name: string): void; + + /** + * Wrapper for creating a vertex buffer. + * @param initialDataOrSize Either ArrayBuffer or an integer indicating the size of the vbo. + * @param bufferUsage How the buffer is used. gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW. + */ + createIndexBuffer(initialDataOrSize: ArrayBuffer, bufferUsage: number): Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper; + + /** + * Removes a texture from the GPU. + * @param texture The WebGL Texture to be deleted. + */ + deleteTexture(texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): this; + + /** + * Deletes a Framebuffer from the GL instance. + * @param framebuffer The Framebuffer to be deleted. + */ + deleteFramebuffer(framebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper | null): this; + + /** + * Deletes a WebGLProgram from the GL instance. + * @param program The shader program to be deleted. + */ + deleteProgram(program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper): this; + + /** + * Deletes a WebGLAttribLocation from the GL instance. + * @param attrib The attrib location to be deleted. + */ + deleteAttribLocation(attrib: Phaser.Renderer.WebGL.Wrappers.WebGLAttribLocationWrapper): void; + + /** + * Deletes a WebGLUniformLocation from the GL instance. + * @param uniform The uniform location to be deleted. + */ + deleteUniformLocation(uniform: Phaser.Renderer.WebGL.Wrappers.WebGLUniformLocationWrapper): void; + + /** + * Deletes a WebGLBuffer from the GL instance. + * @param vertexBuffer The WebGLBuffer to be deleted. + */ + deleteBuffer(vertexBuffer: Phaser.Renderer.WebGL.Wrappers.WebGLBufferWrapper): this; + + /** + * Controls the pre-render operations for the given camera. + * Handles any clipping needed by the camera and renders the background color if a color is visible. + * @param camera The Camera to pre-render. + */ + preRenderCamera(camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Controls the post-render operations for the given camera. + * + * Renders the foreground camera effects like flash and fading, then resets the current scissor state. + * @param camera The Camera to post-render. + */ + postRenderCamera(camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Clears the current vertex buffer and updates pipelines. + */ + preRender(): void; + + /** + * The core render step for a Scene Camera. + * + * Iterates through the given array of Game Objects and renders them with the given Camera. + * + * This is called by the `CameraManager.render` method. The Camera Manager instance belongs to a Scene, and is invoked + * by the Scene Systems.render method. + * + * This method is not called if `Camera.visible` is `false`, or `Camera.alpha` is zero. + * @param scene The Scene to render. + * @param children An array of filtered Game Objects that can be rendered by the given Camera. + * @param camera The Scene Camera to render with. + */ + render(scene: Phaser.Scene, children: Phaser.GameObjects.GameObject[], camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * The post-render step happens after all Cameras in all Scenes have been rendered. + */ + postRender(): void; + + /** + * Disables the STENCIL_TEST but does not change the status + * of the current stencil mask. + */ + clearStencilMask(): void; + + /** + * Restores the current stencil function to the one that was in place + * before `clearStencilMask` was called. + */ + restoreStencilMask(): void; + + /** + * Schedules a snapshot of the entire game viewport to be taken after the current frame is rendered. + * + * To capture a specific area see the `snapshotArea` method. To capture a specific pixel, see `snapshotPixel`. + * + * Only one snapshot can be active _per frame_. If you have already called `snapshotPixel`, for example, then + * calling this method will override it. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer into an ArrayBufferView. + * It then parses this, copying the contents to a temporary Canvas and finally creating an Image object from it, + * which is the image returned to the callback provided. All in all, this is a computationally expensive and blocking process, + * which gets more expensive the larger the canvas size gets, so please be careful how you employ this in your game. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshot(callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Schedules a snapshot of the given area of the game viewport to be taken after the current frame is rendered. + * + * To capture the whole game viewport see the `snapshot` method. To capture a specific pixel, see `snapshotPixel`. + * + * Only one snapshot can be active _per frame_. If you have already called `snapshotPixel`, for example, then + * calling this method will override it. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer into an ArrayBufferView. + * It then parses this, copying the contents to a temporary Canvas and finally creating an Image object from it, + * which is the image returned to the callback provided. All in all, this is a computationally expensive and blocking process, + * which gets more expensive the larger the canvas size gets, so please be careful how you employ this in your game. + * @param x The x coordinate to grab from. This is based on the game viewport, not the world. + * @param y The y coordinate to grab from. This is based on the game viewport, not the world. + * @param width The width of the area to grab. + * @param height The height of the area to grab. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshotArea(x: number, y: number, width: number, height: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Schedules a snapshot of the given pixel from the game viewport to be taken after the current frame is rendered. + * + * To capture the whole game viewport see the `snapshot` method. To capture a specific area, see `snapshotArea`. + * + * Only one snapshot can be active _per frame_. If you have already called `snapshotArea`, for example, then + * calling this method will override it. + * + * Unlike the other two snapshot methods, this one will return a `Color` object containing the color data for + * the requested pixel. It doesn't need to create an internal Canvas or Image object, so is a lot faster to execute, + * using less memory. + * @param x The x coordinate of the pixel to get. This is based on the game viewport, not the world. + * @param y The y coordinate of the pixel to get. This is based on the game viewport, not the world. + * @param callback The Function to invoke after the snapshot pixel data is extracted. + */ + snapshotPixel(x: number, y: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback): this; + + /** + * Takes a snapshot of the given area of the given frame buffer. + * + * Unlike the other snapshot methods, this one is processed immediately and doesn't wait for the next render. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer into an ArrayBufferView. + * It then parses this, copying the contents to a temporary Canvas and finally creating an Image object from it, + * which is the image returned to the callback provided. All in all, this is a computationally expensive and blocking process, + * which gets more expensive the larger the canvas size gets, so please be careful how you employ this in your game. + * @param framebuffer The framebuffer to grab from. + * @param bufferWidth The width of the framebuffer. + * @param bufferHeight The height of the framebuffer. + * @param callback The Function to invoke after the snapshot image is created. + * @param getPixel Grab a single pixel as a Color object, or an area as an Image object? Default false. + * @param x The x coordinate to grab from. This is based on the framebuffer, not the world. Default 0. + * @param y The y coordinate to grab from. This is based on the framebuffer, not the world. Default 0. + * @param width The width of the area to grab. Default bufferWidth. + * @param height The height of the area to grab. Default bufferHeight. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshotFramebuffer(framebuffer: Phaser.Renderer.WebGL.Wrappers.WebGLFramebufferWrapper, bufferWidth: number, bufferHeight: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, getPixel?: boolean, x?: number, y?: number, width?: number, height?: number, type?: string, encoderOptions?: number): this; + + /** + * Creates a new WebGL Texture based on the given Canvas Element. + * + * If the `dstTexture` parameter is given, the WebGL Texture is updated, rather than created fresh. + * @param srcCanvas The Canvas to create the WebGL Texture from + * @param dstTexture The destination WebGLTextureWrapper to set. + * @param noRepeat Should this canvas be allowed to set `REPEAT` (such as for Text objects?) Default false. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y`? Default false. + */ + canvasToTexture(srcCanvas: HTMLCanvasElement, dstTexture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, noRepeat?: boolean, flipY?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Creates a new WebGL Texture based on the given Canvas Element. + * @param srcCanvas The Canvas to create the WebGL Texture from. + * @param noRepeat Should this canvas be allowed to set `REPEAT` (such as for Text objects?) Default false. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y`? Default false. + */ + createCanvasTexture(srcCanvas: HTMLCanvasElement, noRepeat?: boolean, flipY?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Updates a WebGL Texture based on the given Canvas Element. + * @param srcCanvas The Canvas to update the WebGL Texture from. + * @param dstTexture The destination WebGLTextureWrapper to update. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y`? Default false. + * @param noRepeat Should this canvas be allowed to set `REPEAT` (such as for Text objects?) Default false. + */ + updateCanvasTexture(srcCanvas: HTMLCanvasElement, dstTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, flipY?: boolean, noRepeat?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Creates or updates a WebGL Texture based on the given HTML Video Element. + * + * If the `dstTexture` parameter is given, the WebGL Texture is updated, rather than created fresh. + * @param srcVideo The Video to create the WebGL Texture from + * @param dstTexture The destination WebGLTextureWrapper to set. + * @param noRepeat Should this canvas be allowed to set `REPEAT`? Default false. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y`? Default false. + */ + videoToTexture(srcVideo: HTMLVideoElement, dstTexture?: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, noRepeat?: boolean, flipY?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Creates a new WebGL Texture based on the given HTML Video Element. + * @param srcVideo The Video to create the WebGL Texture from + * @param noRepeat Should this canvas be allowed to set `REPEAT`? Default false. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y`? Default false. + */ + createVideoTexture(srcVideo: HTMLVideoElement, noRepeat?: boolean, flipY?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Updates a WebGL Texture based on the given HTML Video Element. + * @param srcVideo The Video to update the WebGL Texture with. + * @param dstTexture The destination WebGLTextureWrapper to update. + * @param flipY Should the WebGL Texture set `UNPACK_MULTIPLY_FLIP_Y`? Default false. + * @param noRepeat Should this canvas be allowed to set `REPEAT`? Default false. + */ + updateVideoTexture(srcVideo: HTMLVideoElement, dstTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, flipY?: boolean, noRepeat?: boolean): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Create a WebGLTexture from a Uint8Array. + * + * The Uint8Array is assumed to be RGBA values, one byte per color component. + * + * The texture will be filtered with `gl.NEAREST` and will not be mipped. + * @param data The Uint8Array to create the texture from. + * @param width The width of the texture. + * @param height The height of the texture. + */ + createUint8ArrayTexture(data: Uint8Array, width: number, height: number): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Sets the minification and magnification filter for a texture. + * @param texture The texture to set the filter for. + * @param filter The filter to set. 0 for linear filtering, 1 for nearest neighbor (blocky) filtering. + */ + setTextureFilter(texture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, filter: number): this; + + /** + * Returns the largest texture size (either width or height) that can be created. + * Note that VRAM may not allow a texture of any given size, it just expresses + * hardware / driver support for a given size. + */ + getMaxTextureSize(): number; + + /** + * Destroy this WebGLRenderer, cleaning up all related resources such as pipelines, native textures, etc. + */ + destroy(): void; + + } + + /** + * Instances of the WebGLShader class belong to the WebGL Pipeline classes. When the pipeline is + * created it will create an instance of this class for each one of its shaders, as defined in + * the pipeline configuration. + * + * This class encapsulates everything needed to manage a shader in a pipeline, including the + * shader attributes and uniforms, as well as lots of handy methods such as `set2f`, for setting + * uniform values on this shader. + * + * Typically, you do not create an instance of this class directly, as it works in unison with + * the pipeline to which it belongs. You can gain access to this class via a pipeline's `shaders` + * array, post-creation. + */ + class WebGLShader { + /** + * + * @param pipeline The WebGLPipeline to which this Shader belongs. + * @param name The name of this Shader. + * @param vertexShader The vertex shader source code as a single string. + * @param fragmentShader The fragment shader source code as a single string. + * @param attributes An array of attributes. + */ + constructor(pipeline: Phaser.Renderer.WebGL.WebGLPipeline, name: string, vertexShader: string, fragmentShader: string, attributes: Phaser.Types.Renderer.WebGL.WebGLPipelineAttributeConfig[]); + + /** + * A reference to the WebGLPipeline that owns this Shader. + * + * A Shader class can only belong to a single pipeline. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The name of this shader. + */ + name: string; + + /** + * A reference to the WebGLRenderer instance. + */ + renderer: Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * A reference to the WebGL Rendering Context the WebGL Renderer is using. + */ + gl: WebGLRenderingContext; + + /** + * The fragment shader source code. + */ + fragSrc: string; + + /** + * The vertex shader source code. + */ + vertSrc: string; + + /** + * The WebGLProgram created from the vertex and fragment shaders. + */ + program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper; + + /** + * Array of objects that describe the vertex attributes. + */ + attributes: Phaser.Types.Renderer.WebGL.WebGLPipelineAttribute[]; + + /** + * The amount of vertex attribute components of 32 bit length. + */ + vertexComponentCount: number; + + /** + * The size, in bytes, of a single vertex. + * + * This is derived by adding together all of the vertex attributes. + * + * For example, the Multi Pipeline has the following attributes: + * + * inPosition - (size 2 x gl.FLOAT) = 8 + * inTexCoord - (size 2 x gl.FLOAT) = 8 + * inTexId - (size 1 x gl.FLOAT) = 4 + * inTintEffect - (size 1 x gl.FLOAT) = 4 + * inTint - (size 4 x gl.UNSIGNED_BYTE) = 4 + * + * The total, in this case, is 8 + 8 + 4 + 4 + 4 = 28. + * + * This is calculated automatically during the `createAttributes` method. + */ + readonly vertexSize: number; + + /** + * The active uniforms that this shader has. + * + * This is an object that maps the uniform names to their WebGL location and cached values. + * + * It is populated automatically via the `createUniforms` method. + */ + uniforms: Phaser.Types.Renderer.WebGL.WebGLPipelineUniformsConfig; + + /** + * Takes the vertex attributes config and parses it, creating the resulting array that is stored + * in this shaders `attributes` property, calculating the offset, normalization and location + * in the process. + * + * Calling this method resets `WebGLShader.attributes`, `WebGLShader.vertexSize` and + * `WebGLShader.vertexComponentCount`. + * + * It is called automatically when this class is created, but can be called manually if required. + * @param attributes An array of attributes configs. + */ + createAttributes(attributes: Phaser.Types.Renderer.WebGL.WebGLPipelineAttributeConfig[]): void; + + /** + * Sets the program this shader uses as being the active shader in the WebGL Renderer. + * + * This method is called every time the parent pipeline is made the current active pipeline. + * @param setAttributes Should the vertex attribute pointers be set? Default false. + * @param flush Flush the pipeline before binding this shader? Default false. + */ + bind(setAttributes?: boolean, flush?: boolean): this; + + /** + * Sets the program this shader uses as being the active shader in the WebGL Renderer. + * + * Then resets all of the attribute pointers. + */ + rebind(): this; + + /** + * Sets the vertex attribute pointers. + * + * This should only be called after the vertex buffer has been bound. + * + * It is called automatically during the `bind` method. + * @param reset Reset the vertex attribute locations? Default false. + */ + setAttribPointers(reset?: boolean): this; + + /** + * Sets up the `WebGLShader.uniforms` object, populating it with the names + * and locations of the shader uniforms this shader requires. + * + * It works by first calling `gl.getProgramParameter(program.webGLProgram, gl.ACTIVE_UNIFORMS)` to + * find out how many active uniforms this shader has. It then iterates through them, + * calling `gl.getActiveUniform` to get the WebGL Active Info from each one. Finally, + * the name and location are stored in the local array. + * + * This method is called automatically when this class is created. + */ + createUniforms(): this; + + /** + * Repopulate uniforms on the GPU. + * + * This is called automatically by the pipeline when the context is + * lost and then recovered. By the time this method is called, + * the WebGL resources are already recreated, so we just need to + * re-populate them. + */ + syncUniforms(): void; + + /** + * Checks to see if the given uniform name exists and is active in this shader. + * @param name The name of the uniform to check for. + */ + hasUniform(name: string): boolean; + + /** + * Resets the cached values of the given uniform. + * @param name The name of the uniform to reset. + */ + resetUniform(name: string): this; + + /** + * Sets the given uniform value/s based on the name and GL function. + * + * This method is called internally by other methods such as `set1f` and `set3iv`. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param setter The GL function to call. + * @param name The name of the uniform to set. + * @param value1 The new value of the uniform. + * @param skipCheck Skip the value comparison? Default false. + */ + setUniform1(setter: Function, name: string, value1: boolean | number | number[] | Float32Array, skipCheck?: boolean): this; + + /** + * Sets the given uniform value/s based on the name and GL function. + * + * This method is called internally by other methods such as `set1f` and `set3iv`. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param setter The GL function to call. + * @param name The name of the uniform to set. + * @param value1 The new value of the uniform. + * @param value2 The new value of the uniform. + * @param skipCheck Skip the value comparison? Default false. + */ + setUniform2(setter: Function, name: string, value1: boolean | number | number[] | Float32Array, value2: boolean | number | number[] | Float32Array, skipCheck?: boolean): this; + + /** + * Sets the given uniform value/s based on the name and GL function. + * + * This method is called internally by other methods such as `set1f` and `set3iv`. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param setter The GL function to call. + * @param name The name of the uniform to set. + * @param value1 The new value of the uniform. + * @param value2 The new value of the uniform. + * @param value3 The new value of the uniform. + * @param skipCheck Skip the value comparison? Default false. + */ + setUniform3(setter: Function, name: string, value1: boolean | number | number[] | Float32Array, value2: boolean | number | number[] | Float32Array, value3: boolean | number | number[] | Float32Array, skipCheck?: boolean): this; + + /** + * Sets the given uniform value/s based on the name and GL function. + * + * This method is called internally by other methods such as `set1f` and `set3iv`. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param setter The GL function to call. + * @param name The name of the uniform to set. + * @param value1 The new value of the uniform. + * @param value2 The new value of the uniform. + * @param value3 The new value of the uniform. + * @param value4 The new value of the uniform. + * @param skipCheck Skip the value comparison? Default false. + */ + setUniform4(setter: Function, name: string, value1: boolean | number | number[] | Float32Array, value2: boolean | number | number[] | Float32Array, value3: boolean | number | number[] | Float32Array, value4: boolean | number | number[] | Float32Array, skipCheck?: boolean): this; + + /** + * Sets a boolean uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param value The new value of the `boolean` uniform. + */ + setBoolean(name: string, value: boolean): this; + + /** + * Sets a 1f uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x The new value of the `float` uniform. + */ + set1f(name: string, x: number): this; + + /** + * Sets a 2f uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x The new X component of the `vec2` uniform. + * @param y The new Y component of the `vec2` uniform. + */ + set2f(name: string, x: number, y: number): this; + + /** + * Sets a 3f uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x The new X component of the `vec3` uniform. + * @param y The new Y component of the `vec3` uniform. + * @param z The new Z component of the `vec3` uniform. + */ + set3f(name: string, x: number, y: number, z: number): this; + + /** + * Sets a 4f uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x X component of the uniform + * @param y Y component of the uniform + * @param z Z component of the uniform + * @param w W component of the uniform + */ + set4f(name: string, x: number, y: number, z: number, w: number): this; + + /** + * Sets a 1fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set1fv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 2fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set2fv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 3fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set3fv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 4fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set4fv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 1iv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set1iv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 2iv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set2iv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 3iv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set3iv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 4iv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param arr The new value to be used for the uniform variable. + */ + set4iv(name: string, arr: number[] | Float32Array): this; + + /** + * Sets a 1i uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x The new value of the `int` uniform. + */ + set1i(name: string, x: number): this; + + /** + * Sets a 2i uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x The new X component of the `ivec2` uniform. + * @param y The new Y component of the `ivec2` uniform. + */ + set2i(name: string, x: number, y: number): this; + + /** + * Sets a 3i uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x The new X component of the `ivec3` uniform. + * @param y The new Y component of the `ivec3` uniform. + * @param z The new Z component of the `ivec3` uniform. + */ + set3i(name: string, x: number, y: number, z: number): this; + + /** + * Sets a 4i uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param x X component of the uniform + * @param y Y component of the uniform + * @param z Z component of the uniform + * @param w W component of the uniform + */ + set4i(name: string, x: number, y: number, z: number, w: number): this; + + /** + * Sets a matrix 2fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param transpose Whether to transpose the matrix. Should be `false`. + * @param matrix The new values for the `mat2` uniform. + */ + setMatrix2fv(name: string, transpose: boolean, matrix: number[] | Float32Array): this; + + /** + * Sets a matrix 3fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param transpose Whether to transpose the matrix. Should be `false`. + * @param matrix The new values for the `mat3` uniform. + */ + setMatrix3fv(name: string, transpose: boolean, matrix: Float32Array): this; + + /** + * Sets a matrix 4fv uniform value based on the given name on this shader. + * + * The uniform is only set if the value/s given are different to those previously set. + * + * This method works by first setting this shader as being the current shader within the + * WebGL Renderer, if it isn't already. It also sets this shader as being the current + * one within the pipeline it belongs to. + * @param name The name of the uniform to set. + * @param transpose Should the matrix be transpose + * @param matrix Matrix data + */ + setMatrix4fv(name: string, transpose: boolean, matrix: Float32Array): this; + + /** + * This method will create the Shader Program on the current GL context. + * + * If a program already exists, it will be destroyed and the new one will take its place. + * + * After the program is created the uniforms will be reset and + * this shader will be rebound. + * + * This is a very expensive process and if your shader is referenced elsewhere in + * your game those references may then be lost, so be sure to use this carefully. + * + * However, if you need to update say the fragment shader source, then you can pass + * the new source into this method and it'll rebuild the program using it. If you + * don't want to change the vertex shader src, pass `undefined` as the parameter. + * @param vertSrc The source code of the vertex shader. If not given, uses the source already defined in this Shader. + * @param fragSrc The source code of the fragment shader. If not given, uses the source already defined in this Shader. + */ + createProgram(vertSrc?: string, fragSrc?: string): this; + + /** + * Removes all external references from this class and deletes the WebGL program from the WebGL context. + * + * Does not remove this shader from the parent pipeline. + */ + destroy(): void; + + } + + namespace Wrappers { + /** + * Wrapper for a WebGL attribute location, containing all the information that was used to create it. + * + * A WebGLAttribLocation should never be exposed outside the WebGLRenderer, + * so the WebGLRenderer can handle context loss and other events without other systems having to be aware of it. + * Always use WebGLAttribLocationWrapper instead. + */ + class WebGLAttribLocationWrapper { + /** + * + * @param gl The WebGLRenderingContext to create the WebGLAttribLocation for. + * @param program The WebGLProgram that this location refers to. This must be created first. + * @param name The name of this location, as defined in the shader source code. + */ + constructor(gl: WebGLRenderingContext, program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper, name: string); + + /** + * The WebGLAttribLocation being wrapped by this class. + * + * This property could change at any time. + * Therefore, you should never store a reference to this value. + * It should only be passed directly to the WebGL API for drawing. + */ + webGLAttribLocation: GLint; + + /** + * The WebGLRenderingContext that owns this location. + */ + gl: WebGLRenderingContext; + + /** + * The WebGLProgram that this location refers to. + */ + program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper; + + /** + * The name of this location, as defined in the shader source code. + */ + name: string; + + /** + * Creates the WebGLAttribLocation. + */ + createResource(): void; + + /** + * Destroys this WebGLAttribLocationWrapper. + */ + destroy(): void; + + } + + /** + * Wrapper for a WebGL buffer, containing all the information that was used + * to create it. This can be a VertexBuffer or IndexBuffer. + * + * A WebGLBuffer should never be exposed outside the WebGLRenderer, so the + * WebGLRenderer can handle context loss and other events without other + * systems having to be aware of it. Always use WebGLBufferWrapper instead. + */ + class WebGLBufferWrapper { + /** + * + * @param gl The WebGLRenderingContext to create the WebGLBuffer for. + * @param initialDataOrSize Either an ArrayBuffer of data, or the size of the buffer to create. + * @param bufferType The type of the buffer being created. + * @param bufferUsage The usage of the buffer being created. gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW. + */ + constructor(gl: WebGLRenderingContext, initialDataOrSize: ArrayBuffer | number, bufferType: GLenum, bufferUsage: GLenum); + + /** + * The WebGLBuffer being wrapped by this class. + * + * This property could change at any time. + * Therefore, you should never store a reference to this value. + * It should only be passed directly to the WebGL API for drawing. + */ + webGLBuffer: WebGLBuffer | null; + + /** + * The WebGLRenderingContext that owns this WebGLBuffer. + */ + gl: WebGLRenderingContext; + + /** + * The initial data or size of the buffer. + * + * Note that this will be used to recreate the buffer if the WebGL context is lost. + */ + initialDataOrSize: ArrayBuffer | number; + + /** + * The type of the buffer. + */ + bufferType: GLenum; + + /** + * The usage of the buffer. gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW. + */ + bufferUsage: GLenum; + + /** + * Creates a WebGLBuffer for this WebGLBufferWrapper. + * + * This is called automatically by the constructor. It may also be + * called again if the WebGLBuffer needs re-creating. + */ + createResource(): void; + + /** + * Remove this WebGLBufferWrapper from the GL context. + */ + destroy(): void; + + } + + /** + * Wrapper for a WebGL frame buffer, + * containing all the information that was used to create it. + * + * A WebGLFramebuffer should never be exposed outside the WebGLRenderer, + * so the WebGLRenderer can handle context loss and other events + * without other systems having to be aware of it. + * Always use WebGLFramebufferWrapper instead. + */ + class WebGLFramebufferWrapper { + /** + * + * @param gl The WebGLRenderingContext to create the WebGLFramebuffer for. + * @param width If `addDepthStencilBuffer` is true, this controls the width of the depth stencil. + * @param height If `addDepthStencilBuffer` is true, this controls the height of the depth stencil. + * @param renderTexture The color texture where the color pixels are written. + * @param addDepthStencilBuffer Create a Renderbuffer for the depth stencil? Default false. + */ + constructor(gl: WebGLRenderingContext, width: number, height: number, renderTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, addDepthStencilBuffer?: boolean); + + /** + * The WebGLFramebuffer being wrapped by this class. + * + * This property could change at any time. + * Therefore, you should never store a reference to this value. + * It should only be passed directly to the WebGL API for drawing. + */ + webGLFramebuffer: WebGLFramebuffer | null; + + /** + * The WebGL context this WebGLFramebuffer belongs to. + */ + gl: WebGLRenderingContext; + + /** + * Width of the depth stencil. + */ + width: number; + + /** + * Height of the depth stencil. + */ + height: number; + + /** + * The color texture where the color pixels are written. + */ + renderTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * Create a Renderbuffer for the depth stencil? + */ + addDepthStencilBuffer: boolean; + + /** + * Creates a WebGLFramebuffer from the given parameters. + * + * This is called automatically by the constructor. It may also be + * called again if the WebGLFramebuffer needs re-creating. + */ + createResource(): void; + + /** + * Destroys this WebGLFramebufferWrapper. + */ + destroy(): void; + + } + + /** + * Wrapper for a WebGL program, containing all the information that was used to create it. + * + * A WebGLProgram should never be exposed outside the WebGLRenderer, so the WebGLRenderer + * can handle context loss and other events without other systems having to be aware of it. + * Always use WebGLProgramWrapper instead. + */ + class WebGLProgramWrapper { + /** + * + * @param gl The WebGLRenderingContext to create the WebGLProgram for. + * @param vertexSource The vertex shader source code as a string. + * @param fragmentShader The fragment shader source code as a string. + */ + constructor(gl: WebGLRenderingContext, vertexSource: string, fragmentShader: string); + + /** + * The WebGLProgram being wrapped by this class. + * + * This property could change at any time. + * Therefore, you should never store a reference to this value. + * It should only be passed directly to the WebGL API for drawing. + */ + webGLProgram: WebGLProgram | null; + + /** + * The WebGLRenderingContext that owns this WebGLProgram. + */ + gl: WebGLRenderingContext; + + /** + * The vertex shader source code as a string. + */ + vertexSource: string; + + /** + * The fragment shader source code as a string. + */ + fragmentSource: string; + + /** + * Creates a WebGLProgram from the given vertex and fragment shaders. + * + * This is called automatically by the constructor. It may also be + * called again if the WebGLProgram needs re-creating. + */ + createResource(): void; + + /** + * Remove this WebGLProgram from the GL context. + */ + destroy(): void; + + } + + /** + * Wrapper for a WebGL texture, containing all the information that was used + * to create it. + * + * A WebGLTexture should never be exposed outside the WebGLRenderer, + * so the WebGLRenderer can handle context loss and other events + * without other systems having to be aware of it. + * Always use WebGLTextureWrapper instead. + */ + class WebGLTextureWrapper { + /** + * + * @param gl WebGL context the texture belongs to. + * @param mipLevel Mip level of the texture. + * @param minFilter Filtering of the texture. + * @param magFilter Filtering of the texture. + * @param wrapT Wrapping mode of the texture. + * @param wrapS Wrapping mode of the texture. + * @param format Which format does the texture use. + * @param pixels pixel data. + * @param width Width of the texture in pixels. + * @param height Height of the texture in pixels. + * @param pma Does the texture have premultiplied alpha? Default true. + * @param forceSize If `true` it will use the width and height passed to this method, regardless of the pixels dimension. Default false. + * @param flipY Sets the `UNPACK_FLIP_Y_WEBGL` flag the WebGL Texture uses during upload. Default false. + */ + constructor(gl: WebGLRenderingContext, mipLevel: number, minFilter: number, magFilter: number, wrapT: number, wrapS: number, format: number, pixels: object | undefined, width: number, height: number, pma?: boolean, forceSize?: boolean, flipY?: boolean); + + /** + * The WebGLTexture that this wrapper is wrapping. + * + * This property could change at any time. + * Therefore, you should never store a reference to this value. + * It should only be passed directly to the WebGL API for drawing. + */ + webGLTexture: WebGLTexture | null; + + /** + * Whether this is used as a RenderTexture. + */ + isRenderTexture: boolean; + + /** + * The WebGL context this WebGLTexture belongs to. + */ + gl: WebGLRenderingContext; + + /** + * Mip level of the texture. + */ + mipLevel: number; + + /** + * Filtering of the texture. + */ + minFilter: number; + + /** + * Filtering of the texture. + */ + magFilter: number; + + /** + * Wrapping mode of the texture. + */ + wrapT: number; + + /** + * Wrapping mode of the texture. + */ + wrapS: number; + + /** + * Which format does the texture use. + */ + format: number; + + /** + * Pixel data. This is the source data used to create the WebGLTexture. + */ + pixels: object | null; + + /** + * Width of the texture in pixels. + */ + width: number; + + /** + * Height of the texture in pixels. + */ + height: number; + + /** + * Does the texture have premultiplied alpha? + */ + pma: boolean; + + /** + * Whether to use the width and height properties, regardless of pixel dimensions. + */ + forceSize: boolean; + + /** + * Sets the `UNPACK_FLIP_Y_WEBGL` flag the WebGL Texture uses during upload. + */ + flipY: boolean; + + /** + * Creates a WebGLTexture from the given parameters. + * + * This is called automatically by the constructor. It may also be + * called again if the WebGLTexture needs re-creating. + */ + createResource(): void; + + /** + * Updates the WebGLTexture from an updated source. + * + * This should only be used when the source is a Canvas or Video element. + * @param source The source to update the WebGLTexture with. + * @param width The new width of the WebGLTexture. + * @param height The new height of the WebGLTexture. + * @param flipY Should the WebGLTexture set `UNPACK_MULTIPLY_FLIP_Y`? + * @param wrapS The new wrapping mode for the WebGLTexture. + * @param wrapT The new wrapping mode for the WebGLTexture. + * @param minFilter The new minification filter for the WebGLTexture. + * @param magFilter The new magnification filter for the WebGLTexture. + * @param format The new format for the WebGLTexture. + */ + update(source: object | undefined, width: number, height: number, flipY: boolean, wrapS: number, wrapT: number, minFilter: number, magFilter: number, format: number): void; + + /** + * The `__SPECTOR_Metadata` property of the `WebGLTexture`, + * used to add extra data to the debug SpectorJS integration. + */ + spectorMetadata: object; + + /** + * Deletes the WebGLTexture from the GPU, if it has not been already. + */ + destroy(): void; + + } + + /** + * Wrapper for a WebGL uniform location, containing all the information that was used to create it. + * + * A WebGLUniformLocation should never be exposed outside the WebGLRenderer, + * so the WebGLRenderer can handle context loss and other events without other systems having to be aware of it. + * Always use WebGLUniformLocationWrapper instead. + */ + class WebGLUniformLocationWrapper { + /** + * + * @param gl The WebGLRenderingContext to create the WebGLUniformLocation for. + * @param program The WebGLProgram that this location refers to. This must be created first. + * @param name The name of this location, as defined in the shader source code. + */ + constructor(gl: WebGLRenderingContext, program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper, name: string); + + /** + * The WebGLUniformLocation being wrapped by this class. + * + * This property could change at any time. + * Therefore, you should never store a reference to this value. + * It should only be passed directly to the WebGL API for drawing. + */ + webGLUniformLocation: WebGLUniformLocation | null; + + /** + * The WebGLRenderingContext that owns this location. + */ + gl: WebGLRenderingContext; + + /** + * The WebGLProgram that this location refers to. + */ + program: Phaser.Renderer.WebGL.Wrappers.WebGLProgramWrapper; + + /** + * The name of this location, as defined in the shader source code. + */ + name: string; + + /** + * Creates the WebGLUniformLocation. + */ + createResource(): void; + + /** + * Destroys this WebGLUniformLocationWrapper. + */ + destroy(): void; + + } + + } + + } + + } + + /** + * Phaser Scale Modes. + */ + enum ScaleModes { + /** + * Default Scale Mode (Linear). + */ + DEFAULT, + /** + * Linear Scale Mode. + */ + LINEAR, + /** + * Nearest Scale Mode. + */ + NEAREST, + } + + namespace Scale { + /** + * Phaser Scale Manager constants for centering the game canvas. + */ + enum Center { + /** + * The game canvas is not centered within the parent by Phaser. + * You can still center it yourself via CSS. + */ + NO_CENTER, + /** + * The game canvas is centered both horizontally and vertically within the parent. + * To do this, the parent has to have a bounds that can be calculated and not be empty. + * + * Centering is achieved by setting the margin left and top properties of the + * game canvas, and does not factor in any other CSS styles you may have applied. + */ + CENTER_BOTH, + /** + * The game canvas is centered horizontally within the parent. + * To do this, the parent has to have a bounds that can be calculated and not be empty. + * + * Centering is achieved by setting the margin left and top properties of the + * game canvas, and does not factor in any other CSS styles you may have applied. + */ + CENTER_HORIZONTALLY, + /** + * The game canvas is centered both vertically within the parent. + * To do this, the parent has to have a bounds that can be calculated and not be empty. + * + * Centering is achieved by setting the margin left and top properties of the + * game canvas, and does not factor in any other CSS styles you may have applied. + */ + CENTER_VERTICALLY, + } + + /** + * Phaser Scale Manager constants for centering the game canvas. + * + * To find out what each mode does please see [Phaser.Scale.Center]{@link Phaser.Scale.Center}. + */ + type CenterType = Phaser.Scale.Center; + + /** + * Phaser Scale Manager constants for orientation. + */ + enum Orientation { + /** + * A landscape orientation. + */ + LANDSCAPE, + /** + * A portrait orientation. + */ + PORTRAIT, + } + + /** + * Phaser Scale Manager constants for orientation. + * + * To find out what each mode does please see [Phaser.Scale.Orientation]{@link Phaser.Scale.Orientation}. + */ + type OrientationType = Phaser.Scale.Orientation; + + /** + * Phaser Scale Manager constants for the different scale modes available. + */ + enum ScaleModes { + /** + * No scaling happens at all. The canvas is set to the size given in the game config and Phaser doesn't change it + * again from that point on. If you change the canvas size, either via CSS, or directly via code, then you need + * to call the Scale Managers `resize` method to give the new dimensions, or input events will stop working. + */ + NONE, + /** + * The height is automatically adjusted based on the width. + */ + WIDTH_CONTROLS_HEIGHT, + /** + * The width is automatically adjusted based on the height. + */ + HEIGHT_CONTROLS_WIDTH, + /** + * The width and height are automatically adjusted to fit inside the given target area, + * while keeping the aspect ratio. Depending on the aspect ratio there may be some space + * inside the area which is not covered. + */ + FIT, + /** + * The width and height are automatically adjusted to make the size cover the entire target + * area while keeping the aspect ratio. This may extend further out than the target size. + */ + ENVELOP, + /** + * The Canvas is resized to fit all available _parent_ space, regardless of aspect ratio. + */ + RESIZE, + /** + * The Canvas's visible area is resized to fit all available _parent_ space like RESIZE mode, + * and scale canvas size to fit inside the visible area like FIT mode. + */ + EXPAND, + } + + /** + * Phaser Scale Manager constants for the different scale modes available. + * + * To find out what each mode does please see [Phaser.Scale.ScaleModes]{@link Phaser.Scale.ScaleModes}. + */ + type ScaleModeType = Phaser.Scale.ScaleModes; + + /** + * Phaser Scale Manager constants for zoom modes. + */ + enum Zoom { + /** + * The game canvas will not be zoomed by Phaser. + */ + NO_ZOOM, + /** + * The game canvas will be 2x zoomed by Phaser. + */ + ZOOM_2X, + /** + * The game canvas will be 4x zoomed by Phaser. + */ + ZOOM_4X, + /** + * Calculate the zoom value based on the maximum multiplied game size that will + * fit into the parent, or browser window if no parent is set. + */ + MAX_ZOOM, + } + + /** + * Phaser Scale Manager constants for zoom modes. + * + * To find out what each mode does please see [Phaser.Scale.Zoom]{@link Phaser.Scale.Zoom}. + */ + type ZoomType = Phaser.Scale.Zoom; + + namespace Events { + /** + * The Scale Manager has successfully entered fullscreen mode. + */ + const ENTER_FULLSCREEN: string; + + /** + * The Scale Manager tried to enter fullscreen mode but failed. + */ + const FULLSCREEN_FAILED: string; + + /** + * The Scale Manager tried to enter fullscreen mode, but it is unsupported by the browser. + */ + const FULLSCREEN_UNSUPPORTED: string; + + /** + * The Scale Manager was in fullscreen mode, but has since left, either directly via game code, + * or via a user gestured, such as pressing the ESC key. + */ + const LEAVE_FULLSCREEN: string; + + /** + * The Scale Manager Orientation Change Event. + * + * This event is dispatched whenever the Scale Manager detects an orientation change event from the browser. + */ + const ORIENTATION_CHANGE: string; + + /** + * The Scale Manager Resize Event. + * + * This event is dispatched whenever the Scale Manager detects a resize event from the browser. + * It sends three parameters to the callback, each of them being Size components. You can read + * the `width`, `height`, `aspectRatio` and other properties of these components to help with + * scaling your own game content. + */ + const RESIZE: string; + + } + + /** + * The Scale Manager handles the scaling, resizing and alignment of the game canvas. + * + * The way scaling is handled is by setting the game canvas to a fixed size, which is defined in the + * game configuration. You also define the parent container in the game config. If no parent is given, + * it will default to using the document body. The Scale Manager will then look at the available space + * within the _parent_ and scale the canvas accordingly. Scaling is handled by setting the canvas CSS + * width and height properties, leaving the width and height of the canvas element itself untouched. + * Scaling is therefore achieved by keeping the core canvas the same size and 'stretching' + * it via its CSS properties. This gives the same result and speed as using the `transform-scale` CSS + * property, without the need for browser prefix handling. + * + * The calculations for the scale are heavily influenced by the bounding parent size, which is the computed + * dimensions of the canvas's parent. The CSS rules of the parent element play an important role in the + * operation of the Scale Manager. For example, if the parent has no defined width or height, then actions + * like auto-centering will fail to achieve the required result. The Scale Manager works in tandem with the + * CSS you set-up on the page hosting your game, rather than taking control of it. + * + * #### Parent and Display canvas containment guidelines: + * + * - Style the Parent element (of the game canvas) to control the Parent size and thus the games size and layout. + * + * - The Parent element's CSS styles should _effectively_ apply maximum (and minimum) bounding behavior. + * + * - The Parent element should _not_ apply a padding as this is not accounted for. + * If a padding is required apply it to the Parent's parent or apply a margin to the Parent. + * If you need to add a border, margin or any other CSS around your game container, then use a parent element and + * apply the CSS to this instead, otherwise you'll be constantly resizing the shape of the game container. + * + * - The Display canvas layout CSS styles (i.e. margins, size) should not be altered / specified as + * they may be updated by the Scale Manager. + * + * #### Scale Modes + * + * The way the scaling is handled is determined by the `scaleMode` property. The default is `NONE`, + * which prevents Phaser from scaling or touching the canvas, or its parent, at all. In this mode, you are + * responsible for all scaling. The other scaling modes afford you automatic scaling. + * + * If you wish to scale your game so that it always fits into the available space within the parent, you + * should use the scale mode `FIT`. Look at the documentation for other scale modes to see what options are + * available. Here is a basic config showing how to set this scale mode: + * + * ```javascript + * scale: { + * parent: 'yourgamediv', + * mode: Phaser.Scale.FIT, + * width: 800, + * height: 600 + * } + * ``` + * + * Place the `scale` config object within your game config. + * + * If you wish for the canvas to be resized directly, so that the canvas itself fills the available space + * (i.e. it isn't scaled, it's resized) then use the `RESIZE` scale mode. This will give you a 1:1 mapping + * of canvas pixels to game size. In this mode CSS isn't used to scale the canvas, it's literally adjusted + * to fill all available space within the parent. You should be extremely careful about the size of the + * canvas you're creating when doing this, as the larger the area, the more work the GPU has to do and it's + * very easy to hit fill-rate limits quickly. + * + * For complex, custom-scaling requirements, you should probably consider using the `RESIZE` scale mode, + * with your own limitations in place re: canvas dimensions and managing the scaling with the game scenes + * yourself. For the vast majority of games, however, the `FIT` mode is likely to be the most used. + * + * Please appreciate that the Scale Manager cannot perform miracles. All it does is scale your game canvas + * as best it can, based on what it can infer from its surrounding area. There are all kinds of environments + * where it's up to you to guide and help the canvas position itself, especially when built into rendering + * frameworks like React and Vue. If your page requires meta tags to prevent user scaling gestures, or such + * like, then it's up to you to ensure they are present in the html. + * + * #### Centering + * + * You can also have the game canvas automatically centered. Again, this relies heavily on the parent being + * properly configured and styled, as the centering offsets are based entirely on the available space + * within the parent element. Centering is disabled by default, or can be applied horizontally, vertically, + * or both. Here's an example: + * + * ```javascript + * scale: { + * parent: 'yourgamediv', + * autoCenter: Phaser.Scale.CENTER_BOTH, + * width: 800, + * height: 600 + * } + * ``` + * + * #### Fullscreen API + * + * If the browser supports it, you can send your game into fullscreen mode. In this mode, the game will fill + * the entire display, removing all browser UI and anything else present on the screen. It will remain in this + * mode until your game either disables it, or until the user tabs out or presses ESCape if on desktop. It's a + * great way to achieve a desktop-game like experience from the browser, but it does require a modern browser + * to handle it. Some mobile browsers also support this. + */ + class ScaleManager extends Phaser.Events.EventEmitter { + /** + * + * @param game A reference to the Phaser.Game instance. + */ + constructor(game: Phaser.Game); + + /** + * A reference to the Phaser.Game instance. + */ + readonly game: Phaser.Game; + + /** + * A reference to the HTML Canvas Element that Phaser uses to render the game. + */ + canvas: HTMLCanvasElement; + + /** + * The DOM bounds of the canvas element. + */ + canvasBounds: Phaser.Geom.Rectangle; + + /** + * The parent object of the Canvas. Often a div, or the browser window, or nothing in non-browser environments. + * + * This is set in the Game Config as the `parent` property. If undefined (or just not present), it will default + * to use the document body. If specifically set to `null` Phaser will ignore all parent operations. + */ + parent: any | null; + + /** + * Is the parent element the browser window? + */ + parentIsWindow: boolean; + + /** + * The Parent Size component. + */ + parentSize: Phaser.Structs.Size; + + /** + * The Game Size component. + * + * The un-modified game size, as requested in the game config (the raw width / height), + * as used for world bounds, cameras, etc + */ + gameSize: Phaser.Structs.Size; + + /** + * The Base Size component. + * + * The modified game size, which is the auto-rounded gameSize, used to set the canvas width and height + * (but not the CSS style) + */ + baseSize: Phaser.Structs.Size; + + /** + * The Display Size component. + * + * The size used for the canvas style, factoring in the scale mode, parent and other values. + */ + displaySize: Phaser.Structs.Size; + + /** + * The game scale mode. + */ + scaleMode: Phaser.Scale.ScaleModeType; + + /** + * The game zoom factor. + * + * This value allows you to multiply your games base size by the given zoom factor. + * This is then used when calculating the display size, even in `NONE` situations. + * If you don't want Phaser to touch the canvas style at all, this value should be 1. + * + * Can also be set to `MAX_ZOOM` in which case the zoom value will be derived based + * on the game size and available space within the parent. + */ + zoom: number; + + /** + * Internal flag set when the game zoom factor is modified. + */ + readonly _resetZoom: boolean; + + /** + * The scale factor between the baseSize and the canvasBounds. + */ + displayScale: Phaser.Math.Vector2; + + /** + * If set, the canvas sizes will be automatically passed through Math.floor. + * This results in rounded pixel display values, which is important for performance on legacy + * and low powered devices, but at the cost of not achieving a 'perfect' fit in some browser windows. + */ + autoRound: boolean; + + /** + * Automatically center the canvas within the parent? The different centering modes are: + * + * 1. No centering. + * 2. Center both horizontally and vertically. + * 3. Center horizontally. + * 4. Center vertically. + * + * Please be aware that in order to center the game canvas, you must have specified a parent + * that has a size set, or the canvas parent is the document.body. + */ + autoCenter: Phaser.Scale.CenterType; + + /** + * The current device orientation. + * + * Orientation events are dispatched via the Device Orientation API, typically only on mobile browsers. + */ + orientation: Phaser.Scale.OrientationType; + + /** + * A reference to the Device.Fullscreen object. + */ + fullscreen: Phaser.Device.Fullscreen; + + /** + * The DOM Element which is sent into fullscreen mode. + */ + fullscreenTarget: any | null; + + /** + * The dirty state of the Scale Manager. + * Set if there is a change between the parent size and the current size. + */ + dirty: boolean; + + /** + * How many milliseconds should elapse before checking if the browser size has changed? + * + * Most modern browsers dispatch a 'resize' event, which the Scale Manager will listen for. + * However, older browsers fail to do this, or do it consistently, so we fall back to a + * more traditional 'size check' based on a time interval. You can control how often it is + * checked here. + */ + resizeInterval: number; + + /** + * Called _before_ the canvas object is created and added to the DOM. + */ + protected preBoot(): void; + + /** + * The Boot handler is called by Phaser.Game when it first starts up. + * The renderer is available by now and the canvas has been added to the DOM. + */ + protected boot(): void; + + /** + * Parses the game configuration to set-up the scale defaults. + * @param config The Game configuration object. + */ + protected parseConfig(config: Phaser.Types.Core.GameConfig): void; + + /** + * Determines the parent element of the game canvas, if any, based on the game configuration. + * @param config The Game configuration object. + */ + getParent(config: Phaser.Types.Core.GameConfig): void; + + /** + * Calculates the size of the parent bounds and updates the `parentSize` + * properties, only if the canvas has a dom parent. + */ + getParentBounds(): boolean; + + /** + * Attempts to lock the orientation of the web browser using the Screen Orientation API. + * + * This API is only available on modern mobile browsers. + * See https://developer.mozilla.org/en-US/docs/Web/API/Screen/lockOrientation for details. + * @param orientation The orientation you'd like to lock the browser in. Should be an API string such as 'landscape', 'landscape-primary', 'portrait', etc. + */ + lockOrientation(orientation: string): boolean; + + /** + * This method will set the size of the Parent Size component, which is used in scaling + * and centering calculations. You only need to call this method if you have explicitly + * disabled the use of a parent in your game config, but still wish to take advantage of + * other Scale Manager features. + * @param width The new width of the parent. + * @param height The new height of the parent. + */ + setParentSize(width: number, height: number): this; + + /** + * This method will set a new size for your game. + * + * It should only be used if you're looking to change the base size of your game and are using + * one of the Scale Manager scaling modes, i.e. `FIT`. If you're using `NONE` and wish to + * change the game and canvas size directly, then please use the `resize` method instead. + * @param width The new width of the game. + * @param height The new height of the game. + */ + setGameSize(width: number, height: number): this; + + /** + * Call this to modify the size of the Phaser canvas element directly. + * You should only use this if you are using the `NONE` scale mode, + * it will update all internal components completely. + * + * If all you want to do is change the size of the parent, see the `setParentSize` method. + * + * If all you want is to change the base size of the game, but still have the Scale Manager + * manage all the scaling (i.e. you're **not** using `NONE`), then see the `setGameSize` method. + * + * This method will set the `gameSize`, `baseSize` and `displaySize` components to the given + * dimensions. It will then resize the canvas width and height to the values given, by + * directly setting the properties. Finally, if you have set the Scale Manager zoom value + * to anything other than 1 (the default), it will set the canvas CSS width and height to + * be the given size multiplied by the zoom factor (the canvas pixel size remains untouched). + * + * If you have enabled `autoCenter`, it is then passed to the `updateCenter` method and + * the margins are set, allowing the canvas to be centered based on its parent element + * alone. Finally, the `displayScale` is adjusted and the RESIZE event dispatched. + * @param width The new width of the game. + * @param height The new height of the game. + */ + resize(width: number, height: number): this; + + /** + * Sets the zoom value of the Scale Manager. + * @param value The new zoom value of the game. + */ + setZoom(value: number): this; + + /** + * Sets the zoom to be the maximum possible based on the _current_ parent size. + */ + setMaxZoom(): this; + + /** + * By setting a Snap value, when the browser size is modified, its dimensions will automatically + * be snapped to the nearest grid slice, using floor. For example, if you have snap value of 16, + * and the width changes to 68, then it will snap down to 64 (the closest multiple of 16 when floored) + * + * This mode is best used with the `FIT` scale mode. + * + * Call this method with no arguments to reset the snap values. + * + * Calling this method automatically invokes `ScaleManager.refresh` which emits a `RESIZE` event. + * @param snapWidth The amount to snap the width to. If you don't want to snap the width, pass a value of zero. Default 0. + * @param snapHeight The amount to snap the height to. If not provided it will use the `snapWidth` value. If you don't want to snap the height, pass a value of zero. Default snapWidth. + */ + setSnap(snapWidth?: number, snapHeight?: number): this; + + /** + * Refreshes the internal scale values, bounds sizes and orientation checks. + * + * Once finished, dispatches the resize event. + * + * This is called automatically by the Scale Manager when the browser window size changes, + * as long as it is using a Scale Mode other than 'NONE'. + * @param previousWidth The previous width of the game. Only set if the gameSize has changed. + * @param previousHeight The previous height of the game. Only set if the gameSize has changed. + */ + refresh(previousWidth?: number, previousHeight?: number): this; + + /** + * Internal method that checks the current screen orientation, only if the internal check flag is set. + * + * If the orientation has changed it updates the orientation property and then dispatches the orientation change event. + */ + updateOrientation(): void; + + /** + * Internal method that manages updating the size components based on the scale mode. + */ + updateScale(): void; + + /** + * Calculates and returns the largest possible zoom factor, based on the current + * parent and game sizes. If the parent has no dimensions (i.e. an unstyled div), + * or is smaller than the un-zoomed game, then this will return a value of 1 (no zoom) + */ + getMaxZoom(): number; + + /** + * Calculates and updates the canvas CSS style in order to center it within the + * bounds of its parent. If you have explicitly set parent to be `null` in your + * game config then this method will likely give incorrect results unless you have called the + * `setParentSize` method first. + * + * It works by modifying the canvas CSS `marginLeft` and `marginTop` properties. + * + * If they have already been set by your own style sheet, or code, this will overwrite them. + * + * To prevent the Scale Manager from centering the canvas, either do not set the + * `autoCenter` property in your game config, or make sure it is set to `NO_CENTER`. + */ + updateCenter(): void; + + /** + * Updates the `canvasBounds` rectangle to match the bounding client rectangle of the + * canvas element being used to track input events. + */ + updateBounds(): void; + + /** + * Transforms the pageX value into the scaled coordinate space of the Scale Manager. + * @param pageX The DOM pageX value. + */ + transformX(pageX: number): number; + + /** + * Transforms the pageY value into the scaled coordinate space of the Scale Manager. + * @param pageY The DOM pageY value. + */ + transformY(pageY: number): number; + + /** + * Sends a request to the browser to ask it to go in to full screen mode, using the {@link https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API Fullscreen API}. + * + * If the browser does not support this, a `FULLSCREEN_UNSUPPORTED` event will be emitted. + * + * This method _must_ be called from a `pointerup` user-input gesture (**not** `pointerdown`). You cannot launch + * games fullscreen without this, as most browsers block it. Games within an iframe will also be blocked + * from fullscreen unless the iframe has the `allowfullscreen` attribute. + * + * On touch devices, such as Android and iOS Safari, you should always use `pointerup` and NOT `pointerdown`, + * otherwise the request will fail unless the document in which your game is embedded has already received + * some form of touch input, which you cannot guarantee. Activating fullscreen via `pointerup` circumvents + * this issue. + * + * Performing an action that navigates to another page, or opens another tab, will automatically cancel + * fullscreen mode, as will the user pressing the ESC key. To cancel fullscreen mode directly from your game, + * i.e. by clicking an icon, call the `stopFullscreen` method. + * + * A browser can only send one DOM element into fullscreen. You can control which element this is by + * setting the `fullscreenTarget` property in your game config, or changing the property in the Scale Manager. + * Note that the game canvas _must_ be a child of the target. If you do not give a target, Phaser will + * automatically create a blank `
    ` element and move the canvas into it, before going fullscreen. + * When it leaves fullscreen, the div will be removed. + * @param fullscreenOptions The FullscreenOptions dictionary is used to provide configuration options when entering full screen. + */ + startFullscreen(fullscreenOptions?: object): void; + + /** + * An internal method that gets the target element that is used when entering fullscreen mode. + */ + getFullscreenTarget(): object; + + /** + * Removes the fullscreen target that was added to the DOM. + */ + removeFullscreenTarget(): void; + + /** + * Calling this method will cancel fullscreen mode, if the browser has entered it. + */ + stopFullscreen(): void; + + /** + * Toggles the fullscreen mode. If already in fullscreen, calling this will cancel it. + * If not in fullscreen, this will request the browser to enter fullscreen mode. + * + * If the browser does not support this, a `FULLSCREEN_UNSUPPORTED` event will be emitted. + * + * This method _must_ be called from a user-input gesture, such as `pointerdown`. You cannot launch + * games fullscreen without this, as most browsers block it. Games within an iframe will also be blocked + * from fullscreen unless the iframe has the `allowfullscreen` attribute. + * @param fullscreenOptions The FullscreenOptions dictionary is used to provide configuration options when entering full screen. + */ + toggleFullscreen(fullscreenOptions?: object): void; + + /** + * An internal method that starts the different DOM event listeners running. + */ + startListeners(): void; + + /** + * Triggered when a fullscreenchange event is dispatched by the DOM. + */ + protected onFullScreenChange(): void; + + /** + * Triggered when a fullscreenerror event is dispatched by the DOM. + */ + onFullScreenError(): void; + + /** + * Get Rectange of visible area. + * @param camera The camera this viewport is respond upon. + * @param out The Rectangle of visible area. + */ + getViewPort(camera?: Phaser.Cameras.Scene2D.Camera, out?: Phaser.Geom.Rectangle): Phaser.Geom.Rectangle; + + /** + * Internal method, called automatically by the game step. + * Monitors the elapsed time and resize interval to see if a parent bounds check needs to take place. + * @param time The time value from the most recent Game step. Typically a high-resolution timer value, or Date.now(). + * @param delta The delta value since the last frame. This is smoothed to avoid delta spikes by the TimeStep class. + */ + step(time: number, delta: number): void; + + /** + * Stops all DOM event listeners. + */ + stopListeners(): void; + + /** + * Destroys this Scale Manager, releasing all references to external resources. + * Once destroyed, the Scale Manager cannot be used again. + */ + destroy(): void; + + /** + * Is the browser currently in fullscreen mode or not? + */ + readonly isFullscreen: boolean; + + /** + * The game width. + * + * This is typically the size given in the game configuration. + */ + readonly width: number; + + /** + * The game height. + * + * This is typically the size given in the game configuration. + */ + readonly height: number; + + /** + * Is the device in a portrait orientation as reported by the Orientation API? + * This value is usually only available on mobile devices. + */ + readonly isPortrait: boolean; + + /** + * Is the device in a landscape orientation as reported by the Orientation API? + * This value is usually only available on mobile devices. + */ + readonly isLandscape: boolean; + + /** + * Are the game dimensions portrait? (i.e. taller than they are wide) + * + * This is different to the device itself being in a portrait orientation. + */ + readonly isGamePortrait: boolean; + + /** + * Are the game dimensions landscape? (i.e. wider than they are tall) + * + * This is different to the device itself being in a landscape orientation. + */ + readonly isGameLandscape: boolean; + + } + + /** + * The game canvas is not centered within the parent by Phaser. + * You can still center it yourself via CSS. + */ + const NO_CENTER: number; + + /** + * The game canvas is centered both horizontally and vertically within the parent. + * To do this, the parent has to have a bounds that can be calculated and not be empty. + * + * Centering is achieved by setting the margin left and top properties of the + * game canvas, and does not factor in any other CSS styles you may have applied. + */ + const CENTER_BOTH: number; + + /** + * The game canvas is centered horizontally within the parent. + * To do this, the parent has to have a bounds that can be calculated and not be empty. + * + * Centering is achieved by setting the margin left and top properties of the + * game canvas, and does not factor in any other CSS styles you may have applied. + */ + const CENTER_HORIZONTALLY: number; + + /** + * The game canvas is centered both vertically within the parent. + * To do this, the parent has to have a bounds that can be calculated and not be empty. + * + * Centering is achieved by setting the margin left and top properties of the + * game canvas, and does not factor in any other CSS styles you may have applied. + */ + const CENTER_VERTICALLY: number; + + /** + * A landscape orientation. + */ + const LANDSCAPE: string; + + /** + * A portrait orientation. + */ + const PORTRAIT: string; + + /** + * No scaling happens at all. The canvas is set to the size given in the game config and Phaser doesn't change it + * again from that point on. If you change the canvas size, either via CSS, or directly via code, then you need + * to call the Scale Managers `resize` method to give the new dimensions, or input events will stop working. + */ + const NONE: number; + + /** + * The height is automatically adjusted based on the width. + */ + const WIDTH_CONTROLS_HEIGHT: number; + + /** + * The width is automatically adjusted based on the height. + */ + const HEIGHT_CONTROLS_WIDTH: number; + + /** + * The width and height are automatically adjusted to fit inside the given target area, + * while keeping the aspect ratio. Depending on the aspect ratio there may be some space + * inside the area which is not covered. + */ + const FIT: number; + + /** + * The width and height are automatically adjusted to make the size cover the entire target + * area while keeping the aspect ratio. This may extend further out than the target size. + */ + const ENVELOP: number; + + /** + * The Canvas is resized to fit all available _parent_ space, regardless of aspect ratio. + */ + const RESIZE: number; + + /** + * The game canvas will not be zoomed by Phaser. + */ + const NO_ZOOM: number; + + /** + * The game canvas will be 2x zoomed by Phaser. + */ + const ZOOM_2X: number; + + /** + * The game canvas will be 4x zoomed by Phaser. + */ + const ZOOM_4X: number; + + /** + * Calculate the zoom value based on the maximum multiplied game size that will + * fit into the parent, or browser window if no parent is set. + */ + const MAX_ZOOM: number; + + } + + namespace Scenes { + /** + * Scene state. + */ + var PENDING: number; + + /** + * Scene state. + */ + var INIT: number; + + /** + * Scene state. + */ + var START: number; + + /** + * Scene state. + */ + var LOADING: number; + + /** + * Scene state. + */ + var CREATING: number; + + /** + * Scene state. + */ + var RUNNING: number; + + /** + * Scene state. + */ + var PAUSED: number; + + /** + * Scene state. + */ + var SLEEPING: number; + + /** + * Scene state. + */ + var SHUTDOWN: number; + + /** + * Scene state. + */ + var DESTROYED: number; + + namespace Events { + /** + * The Game Object Added to Scene Event. + * + * This event is dispatched when a Game Object is added to a Scene. + * + * Listen for it from a Scene using `this.events.on('addedtoscene', listener)`. + */ + const ADDED_TO_SCENE: string; + + /** + * The Scene Systems Boot Event. + * + * This event is dispatched by a Scene during the Scene Systems boot process. Primarily used by Scene Plugins. + * + * Listen to it from a Scene using `this.events.on('boot', listener)`. + */ + const BOOT: string; + + /** + * The Scene Create Event. + * + * This event is dispatched by a Scene after it has been created by the Scene Manager. + * + * If a Scene has a `create` method then this event is emitted _after_ that has run. + * + * If there is a transition, this event will be fired after the `TRANSITION_START` event. + * + * Listen to it from a Scene using `this.events.on('create', listener)`. + */ + const CREATE: string; + + /** + * The Scene Systems Destroy Event. + * + * This event is dispatched by a Scene during the Scene Systems destroy process. + * + * Listen to it from a Scene using `this.events.on('destroy', listener)`. + * + * You should destroy any resources that may be in use by your Scene in this event handler. + */ + const DESTROY: string; + + /** + * The Scene Systems Pause Event. + * + * This event is dispatched by a Scene when it is paused, either directly via the `pause` method, or as an + * action from another Scene. + * + * Listen to it from a Scene using `this.events.on('pause', listener)`. + */ + const PAUSE: string; + + /** + * The Scene Systems Post Update Event. + * + * This event is dispatched by a Scene during the main game loop step. + * + * The event flow for a single step of a Scene is as follows: + * + * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE} + * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE} + * 3. The `Scene.update` method is called, if it exists + * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE} + * 5. [PRE_RENDER]{@linkcode Phaser.Scenes.Events#event:PRE_RENDER} + * 6. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER} + * + * Listen to it from a Scene using `this.events.on('postupdate', listener)`. + * + * A Scene will only run its step if it is active. + */ + const POST_UPDATE: string; + + /** + * The Scene Systems Pre-Render Event. + * + * This event is dispatched by a Scene during the main game loop step. + * + * The event flow for a single step of a Scene is as follows: + * + * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE} + * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE} + * 3. The `Scene.update` method is called, if it exists + * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE} + * 5. [PRE_RENDER]{@linkcode Phaser.Scenes.Events#event:PRE_RENDER} + * 6. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER} + * + * Listen to this event from a Scene using `this.events.on('prerender', listener)`. + * + * A Scene will only render if it is visible. + * + * This event is dispatched after the Scene Display List is sorted and before the Scene is rendered. + */ + const PRE_RENDER: string; + + /** + * The Scene Systems Pre Update Event. + * + * This event is dispatched by a Scene during the main game loop step. + * + * The event flow for a single step of a Scene is as follows: + * + * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE} + * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE} + * 3. The `Scene.update` method is called, if it exists + * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE} + * 5. [PRE_RENDER]{@linkcode Phaser.Scenes.Events#event:PRE_RENDER} + * 6. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER} + * + * Listen to it from a Scene using `this.events.on('preupdate', listener)`. + * + * A Scene will only run its step if it is active. + */ + const PRE_UPDATE: string; + + /** + * The Scene Systems Ready Event. + * + * This event is dispatched by a Scene during the Scene Systems start process. + * By this point in the process the Scene is now fully active and rendering. + * This event is meant for your game code to use, as all plugins have responded to the earlier 'start' event. + * + * Listen to it from a Scene using `this.events.on('ready', listener)`. + */ + const READY: string; + + /** + * The Game Object Removed from Scene Event. + * + * This event is dispatched when a Game Object is removed from a Scene. + * + * Listen for it from a Scene using `this.events.on('removedfromscene', listener)`. + */ + const REMOVED_FROM_SCENE: string; + + /** + * The Scene Systems Render Event. + * + * This event is dispatched by a Scene during the main game loop step. + * + * The event flow for a single step of a Scene is as follows: + * + * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE} + * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE} + * 3. The `Scene.update` method is called, if it exists + * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE} + * 5. [PRE_RENDER]{@linkcode Phaser.Scenes.Events#event:PRE_RENDER} + * 6. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER} + * + * Listen to it from a Scene using `this.events.on('render', listener)`. + * + * A Scene will only render if it is visible. + * + * By the time this event is dispatched, the Scene will have already been rendered. + */ + const RENDER: string; + + /** + * The Scene Systems Resume Event. + * + * This event is dispatched by a Scene when it is resumed from a paused state, either directly via the `resume` method, + * or as an action from another Scene. + * + * Listen to it from a Scene using `this.events.on('resume', listener)`. + */ + const RESUME: string; + + /** + * The Scene Systems Shutdown Event. + * + * This event is dispatched by a Scene during the Scene Systems shutdown process. + * + * Listen to it from a Scene using `this.events.on('shutdown', listener)`. + * + * You should free-up any resources that may be in use by your Scene in this event handler, on the understanding + * that the Scene may, at any time, become active again. A shutdown Scene is not 'destroyed', it's simply not + * currently active. Use the [DESTROY]{@linkcode Phaser.Scenes.Events#event:DESTROY} event to completely clear resources. + */ + const SHUTDOWN: string; + + /** + * The Scene Systems Sleep Event. + * + * This event is dispatched by a Scene when it is sent to sleep, either directly via the `sleep` method, + * or as an action from another Scene. + * + * Listen to it from a Scene using `this.events.on('sleep', listener)`. + */ + const SLEEP: string; + + /** + * The Scene Systems Start Event. + * + * This event is dispatched by a Scene during the Scene Systems start process. Primarily used by Scene Plugins. + * + * Listen to it from a Scene using `this.events.on('start', listener)`. + */ + const START: string; + + /** + * The Scene Transition Complete Event. + * + * This event is dispatched by the Target Scene of a transition. + * + * It happens when the transition process has completed. This occurs when the duration timer equals or exceeds the duration + * of the transition. + * + * Listen to it from a Scene using `this.events.on('transitioncomplete', listener)`. + * + * The Scene Transition event flow is as follows: + * + * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event. + * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method. + * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ... + * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to. + * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes. + */ + const TRANSITION_COMPLETE: string; + + /** + * The Scene Transition Init Event. + * + * This event is dispatched by the Target Scene of a transition. + * + * It happens immediately after the `Scene.init` method is called. If the Scene does not have an `init` method, + * this event is not dispatched. + * + * Listen to it from a Scene using `this.events.on('transitioninit', listener)`. + * + * The Scene Transition event flow is as follows: + * + * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event. + * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method. + * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ... + * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to. + * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes. + */ + const TRANSITION_INIT: string; + + /** + * The Scene Transition Out Event. + * + * This event is dispatched by a Scene when it initiates a transition to another Scene. + * + * Listen to it from a Scene using `this.events.on('transitionout', listener)`. + * + * The Scene Transition event flow is as follows: + * + * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event. + * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method. + * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ... + * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to. + * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes. + */ + const TRANSITION_OUT: string; + + /** + * The Scene Transition Start Event. + * + * This event is dispatched by the Target Scene of a transition, only if that Scene was not asleep. + * + * It happens immediately after the `Scene.create` method is called. If the Scene does not have a `create` method, + * this event is dispatched anyway. + * + * If the Target Scene was sleeping then the [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} event is + * dispatched instead of this event. + * + * Listen to it from a Scene using `this.events.on('transitionstart', listener)`. + * + * The Scene Transition event flow is as follows: + * + * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event. + * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method. + * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ... + * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to. + * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes. + */ + const TRANSITION_START: string; + + /** + * The Scene Transition Wake Event. + * + * This event is dispatched by the Target Scene of a transition, only if that Scene was asleep before + * the transition began. If the Scene was not asleep the [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} event is dispatched instead. + * + * Listen to it from a Scene using `this.events.on('transitionwake', listener)`. + * + * The Scene Transition event flow is as follows: + * + * 1. [TRANSITION_OUT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_OUT} - the Scene that started the transition will emit this event. + * 2. [TRANSITION_INIT]{@linkcode Phaser.Scenes.Events#event:TRANSITION_INIT} - the Target Scene will emit this event if it has an `init` method. + * 3. [TRANSITION_START]{@linkcode Phaser.Scenes.Events#event:TRANSITION_START} - the Target Scene will emit this event after its `create` method is called, OR ... + * 4. [TRANSITION_WAKE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_WAKE} - the Target Scene will emit this event if it was asleep and has been woken-up to be transitioned to. + * 5. [TRANSITION_COMPLETE]{@linkcode Phaser.Scenes.Events#event:TRANSITION_COMPLETE} - the Target Scene will emit this event when the transition finishes. + */ + const TRANSITION_WAKE: string; + + /** + * The Scene Systems Update Event. + * + * This event is dispatched by a Scene during the main game loop step. + * + * The event flow for a single step of a Scene is as follows: + * + * 1. [PRE_UPDATE]{@linkcode Phaser.Scenes.Events#event:PRE_UPDATE} + * 2. [UPDATE]{@linkcode Phaser.Scenes.Events#event:UPDATE} + * 3. The `Scene.update` method is called, if it exists and the Scene is in a Running state, otherwise this is skipped. + * 4. [POST_UPDATE]{@linkcode Phaser.Scenes.Events#event:POST_UPDATE} + * 5. [PRE_RENDER]{@linkcode Phaser.Scenes.Events#event:PRE_RENDER} + * 6. [RENDER]{@linkcode Phaser.Scenes.Events#event:RENDER} + * + * Listen to it from a Scene using `this.events.on('update', listener)`. + * + * A Scene will only run its step if it is active. + */ + const UPDATE: string; + + /** + * The Scene Systems Wake Event. + * + * This event is dispatched by a Scene when it is woken from sleep, either directly via the `wake` method, + * or as an action from another Scene. + * + * Listen to it from a Scene using `this.events.on('wake', listener)`. + */ + const WAKE: string; + + } + + /** + * Builds an array of which physics plugins should be activated for the given Scene. + * @param sys The scene system to get the physics systems of. + */ + function GetPhysicsPlugins(sys: Phaser.Scenes.Systems): any[]; + + /** + * Builds an array of which plugins (not including physics plugins) should be activated for the given Scene. + * @param sys The Scene Systems object to check for plugins. + */ + function GetScenePlugins(sys: Phaser.Scenes.Systems): any[]; + + /** + * The Scene Manager. + * + * The Scene Manager is a Game level system, responsible for creating, processing and updating all of the + * Scenes in a Game instance. + * + * You should not usually interact directly with the Scene Manager at all. Instead, you should use + * the Scene Plugin, which is available from every Scene in your game via the `this.scene` property. + * + * Using methods in this Scene Manager directly will break queued operations and can cause runtime + * errors. Instead, go via the Scene Plugin. Every feature this Scene Manager provides is also + * available via the Scene Plugin. + */ + class SceneManager { + /** + * + * @param game The Phaser.Game instance this Scene Manager belongs to. + * @param sceneConfig Scene specific configuration settings. + */ + constructor(game: Phaser.Game, sceneConfig: object); + + /** + * The Game that this SceneManager belongs to. + */ + game: Phaser.Game; + + /** + * An object that maps the keys to the scene so we can quickly get a scene from a key without iteration. + */ + keys: Record; + + /** + * The array in which all of the scenes are kept. + */ + scenes: Phaser.Scene[]; + + /** + * Is the Scene Manager actively processing the Scenes list? + */ + readonly isProcessing: boolean; + + /** + * Has the Scene Manager properly started? + */ + readonly isBooted: boolean; + + /** + * Do any of the Cameras in any of the Scenes require a custom viewport? + * If not we can skip scissor tests. + */ + customViewports: number; + + /** + * This system Scene is created during `bootQueue` and is a default + * empty Scene that lives outside of the Scene list, but can be used + * by plugins and managers that need access to a live Scene, without + * being tied to one. + */ + systemScene: Phaser.Scene; + + /** + * Process the Scene operations queue. + */ + processQueue(): void; + + /** + * Adds a new Scene into the SceneManager. + * You must give each Scene a unique key by which you'll identify it. + * + * The `sceneConfig` can be: + * + * * A `Phaser.Scene` object, or an object that extends it. + * * A plain JavaScript object + * * A JavaScript ES6 Class that extends `Phaser.Scene` + * * A JavaScript ES5 prototype based Class + * * A JavaScript function + * + * If a function is given then a new Scene will be created by calling it. + * @param key A unique key used to reference the Scene, i.e. `MainMenu` or `Level1`. + * @param sceneConfig The config for the Scene + * @param autoStart If `true` the Scene will be started immediately after being added. Default false. + * @param data Optional data object. This will be set as `Scene.settings.data` and passed to `Scene.init`, and `Scene.create`. + */ + add(key: string, sceneConfig: Phaser.Types.Scenes.SceneType, autoStart?: boolean, data?: object): Phaser.Scene | null; + + /** + * Removes a Scene from the SceneManager. + * + * The Scene is removed from the local scenes array, it's key is cleared from the keys + * cache and Scene.Systems.destroy is then called on it. + * + * If the SceneManager is processing the Scenes when this method is called it will + * queue the operation for the next update sequence. + * @param key A unique key used to reference the Scene, i.e. `MainMenu` or `Level1`. + */ + remove(key: string): this; + + /** + * Updates the Scenes. + * @param time Time elapsed. + * @param delta Delta time from the last update. + */ + update(time: number, delta: number): void; + + /** + * Renders the Scenes. + * @param renderer The renderer to use. + */ + render(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer): void; + + /** + * Returns an array of all the current Scenes being managed by this Scene Manager. + * + * You can filter the output by the active state of the Scene and choose to have + * the array returned in normal or reversed order. + * @param isActive Only include Scene's that are currently active? Default true. + * @param inReverse Return the array of Scenes in reverse? Default false. + */ + getScenes(isActive?: boolean, inReverse?: boolean): T; + + /** + * Retrieves a Scene based on the given key. + * + * If an actual Scene is passed to this method, it can be used to check if + * its currently within the Scene Manager, or not. + * @param key The key of the Scene to retrieve. + */ + getScene(key: (T|string)): T; + + /** + * Determines whether a Scene is running. + * @param key The Scene to check. + */ + isActive(key: (T|string)): boolean; + + /** + * Determines whether a Scene is paused. + * @param key The Scene to check. + */ + isPaused(key: (T|string)): boolean; + + /** + * Determines whether a Scene is visible. + * @param key The Scene to check. + */ + isVisible(key: (T|string)): boolean; + + /** + * Determines whether a Scene is sleeping. + * @param key The Scene to check. + */ + isSleeping(key: (T|string)): boolean; + + /** + * Pauses the given Scene. + * @param key The Scene to pause. + * @param data An optional data object that will be passed to the Scene and emitted by its pause event. + */ + pause(key: (T|string), data?: object): this; + + /** + * Resumes the given Scene. + * @param key The Scene to resume. + * @param data An optional data object that will be passed to the Scene and emitted by its resume event. + */ + resume(key: (T|string), data?: object): this; + + /** + * Puts the given Scene to sleep. + * @param key The Scene to put to sleep. + * @param data An optional data object that will be passed to the Scene and emitted by its sleep event. + */ + sleep(key: (T|string), data?: object): this; + + /** + * Awakens the given Scene. + * @param key The Scene to wake up. + * @param data An optional data object that will be passed to the Scene and emitted by its wake event. + */ + wake(key: (T|string), data?: object): this; + + /** + * Runs the given Scene. + * + * If the given Scene is paused, it will resume it. If sleeping, it will wake it. + * If not running at all, it will be started. + * + * Use this if you wish to open a modal Scene by calling `pause` on the current + * Scene, then `run` on the modal Scene. + * @param key The Scene to run. + * @param data A data object that will be passed to the Scene on start, wake, or resume. + */ + run(key: (T|string), data?: object): this; + + /** + * Starts the given Scene, if it is not starting, loading, or creating. + * + * If the Scene is running, paused, or sleeping, it will be shutdown and then started. + * @param key The Scene to start. + * @param data Optional data object to pass to `Scene.Settings` and `Scene.init`, and `Scene.create`. + */ + start(key: (T|string), data?: object): this; + + /** + * Stops the given Scene. + * @param key The Scene to stop. + * @param data Optional data object to pass to Scene.shutdown. + */ + stop(key: (T|string), data?: object): this; + + /** + * Sleeps one one Scene and starts the other. + * @param from The Scene to sleep. + * @param to The Scene to start. + */ + switch(from: (T|string), to: (T|string)): this; + + /** + * Retrieves a Scene by numeric index. + * @param index The index of the Scene to retrieve. + */ + getAt(index: number): T; + + /** + * Retrieves the numeric index of a Scene. + * @param key The key of the Scene. + */ + getIndex(key: (T|string)): number; + + /** + * Brings a Scene to the top of the Scenes list. + * + * This means it will render above all other Scenes. + * @param key The Scene to move. + */ + bringToTop(key: (T|string)): this; + + /** + * Sends a Scene to the back of the Scenes list. + * + * This means it will render below all other Scenes. + * @param key The Scene to move. + */ + sendToBack(key: (T|string)): this; + + /** + * Moves a Scene down one position in the Scenes list. + * @param key The Scene to move. + */ + moveDown(key: (T|string)): this; + + /** + * Moves a Scene up one position in the Scenes list. + * @param key The Scene to move. + */ + moveUp(key: (T|string)): this; + + /** + * Moves a Scene so it is immediately above another Scene in the Scenes list. + * + * This means it will render over the top of the other Scene. + * @param keyA The Scene that Scene B will be moved above. + * @param keyB The Scene to be moved. + */ + moveAbove(keyA: (T|string), keyB: (T|string)): this; + + /** + * Moves a Scene so it is immediately below another Scene in the Scenes list. + * + * This means it will render behind the other Scene. + * @param keyA The Scene that Scene B will be moved below. + * @param keyB The Scene to be moved. + */ + moveBelow(keyA: (T|string), keyB: (T|string)): this; + + /** + * Swaps the positions of two Scenes in the Scenes list. + * @param keyA The first Scene to swap. + * @param keyB The second Scene to swap. + */ + swapPosition(keyA: (T|string), keyB: (T|string)): this; + + /** + * Dumps debug information about each Scene to the developer console. + */ + dump(): void; + + /** + * Destroy this Scene Manager and all of its systems. + * + * This process cannot be reversed. + * + * This method is called automatically when a Phaser Game instance is destroyed. + */ + destroy(): void; + + } + + /** + * The Scene Plugin is the main interface to the Scene Manager and allows you to control + * any Scene running in your game. You should always use this plugin. By default, it is + * mapped to the Scene property `this.scene`. Meaning, from within a Scene, you can call + * methods such as `this.scene.start()`. + * + * Note that nearly all methods in this class are run on a queue-basis and not + * immediately. For example, calling `this.scene.launch('SceneB')` will try to + * launch SceneB when the Scene Manager next updates, which is at the start of the game + * step. All operations are queued and run in the order in which they are invoked here. + */ + class ScenePlugin { + /** + * + * @param scene The Scene that this ScenePlugin belongs to. + */ + constructor(scene: Phaser.Scene); + + /** + * The Scene that this ScenePlugin belongs to. + */ + scene: Phaser.Scene; + + /** + * The Scene Systems instance of the Scene that this ScenePlugin belongs to. + */ + systems: Phaser.Scenes.Systems; + + /** + * The settings of the Scene this ScenePlugin belongs to. + */ + settings: Phaser.Types.Scenes.SettingsObject; + + /** + * The key of the Scene this ScenePlugin belongs to. + */ + key: string; + + /** + * The Game's SceneManager. + */ + manager: Phaser.Scenes.SceneManager; + + /** + * If this Scene is currently transitioning to another, this holds + * the current percentage of the transition progress, between 0 and 1. + */ + transitionProgress: number; + + /** + * Shutdown this Scene and run the given one. + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to start. + * @param data The Scene data. If no value is given it will not overwrite any previous data that may exist. + */ + start(key?: (T|string), data?: object): this; + + /** + * Restarts this Scene. + * + * This will happen at the next Scene Manager update, not immediately. + * @param data The Scene data. If no value is given it will not overwrite any previous data that may exist. + */ + restart(data?: object): this; + + /** + * This will start a transition from the current Scene to the target Scene given. + * + * The target Scene cannot be the same as the current Scene. + * + * The transition will last for the duration specified in milliseconds. + * + * You can have the target Scene moved above or below this one in the display list. + * + * You can specify an update callback. This callback will be invoked _every frame_ for the duration + * of the transition. + * + * This Scene can either be sent to sleep at the end of the transition, or stopped. The default is to stop. + * + * There are also 5 transition related events: This scene will emit the event `transitionout` when + * the transition begins, which is typically the frame after calling this method. + * + * The target Scene will emit the event `transitioninit` when that Scene's `init` method is called. + * It will then emit the event `transitionstart` when its `create` method is called. + * If the Scene was sleeping and has been woken up, it will emit the event `transitionwake` instead of these two, + * as the Scenes `init` and `create` methods are not invoked when a Scene wakes up. + * + * When the duration of the transition has elapsed it will emit the event `transitioncomplete`. + * These events are cleared of all listeners when the Scene shuts down, but not if it is sent to sleep. + * + * It's important to understand that the duration of the transition begins the moment you call this method. + * If the Scene you are transitioning to includes delayed processes, such as waiting for files to load, the + * time still counts down even while that is happening. If the game itself pauses, or something else causes + * this Scenes update loop to stop, then the transition will also pause for that duration. There are + * checks in place to prevent you accidentally stopping a transitioning Scene but if you've got code to + * override this understand that until the target Scene completes it might never be unlocked for input events. + * @param config The transition configuration object. + */ + transition(config: Phaser.Types.Scenes.SceneTransitionConfig): boolean; + + /** + * Add the Scene into the Scene Manager and start it if 'autoStart' is true or the Scene config 'active' property is set. + * @param key A unique key used to reference the Scene, i.e. `MainMenu` or `Level1`. + * @param sceneConfig The config for the Scene + * @param autoStart If `true` the Scene will be started immediately after being added. Default false. + * @param data Optional data object. This will be set as `Scene.settings.data` and passed to `Scene.init`, and `Scene.create`. + */ + add(key: string, sceneConfig: Phaser.Types.Scenes.SceneType, autoStart?: boolean, data?: object): Phaser.Scene | null; + + /** + * Launch the given Scene and run it in parallel with this one. + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to launch. + * @param data The Scene data. + */ + launch(key: (T|string), data?: object): this; + + /** + * Runs the given Scene, but does not change the state of this Scene. + * + * This will happen at the next Scene Manager update, not immediately. + * + * If the given Scene is paused, it will resume it. If sleeping, it will wake it. + * If not running at all, it will be started. + * + * Use this if you wish to open a modal Scene by calling `pause` on the current + * Scene, then `run` on the modal Scene. + * @param key The Scene to run. + * @param data A data object that will be passed to the Scene and emitted in its ready, wake, or resume events. + */ + run(key: (T|string), data?: object): this; + + /** + * Pause the Scene - this stops the update step from happening but it still renders. + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to pause. + * @param data An optional data object that will be passed to the Scene and emitted in its pause event. + */ + pause(key?: (T|string), data?: object): this; + + /** + * Resume the Scene - starts the update loop again. + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to resume. + * @param data An optional data object that will be passed to the Scene and emitted in its resume event. + */ + resume(key?: (T|string), data?: object): this; + + /** + * Makes the Scene sleep (no update, no render) but doesn't shutdown. + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to put to sleep. + * @param data An optional data object that will be passed to the Scene and emitted in its sleep event. + */ + sleep(key?: (T|string), data?: object): this; + + /** + * Makes the Scene wake-up (starts update and render) + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to wake up. + * @param data An optional data object that will be passed to the Scene and emitted in its wake event. + */ + wake(key?: (T|string), data?: object): this; + + /** + * Makes this Scene sleep then starts the Scene given. + * + * This will happen at the next Scene Manager update, not immediately. + * @param key The Scene to start. + */ + switch(key: (T|string)): this; + + /** + * Shutdown the Scene, clearing display list, timers, etc. + * + * This happens at the next Scene Manager update, not immediately. + * @param key The Scene to stop. + * @param data Optional data object to pass to Scene.Systems.shutdown. + */ + stop(key?: (T|string), data?: any): this; + + /** + * Sets the active state of the given Scene. + * @param value If `true` the Scene will be resumed. If `false` it will be paused. + * @param key The Scene to set the active state of. + * @param data An optional data object that will be passed to the Scene and emitted with its events. + */ + setActive(value: boolean, key?: (T|string), data?: object): this; + + /** + * Sets the visible state of the given Scene. + * @param value The visible value. + * @param key The Scene to set the visible state for. + */ + setVisible(value: boolean, key?: (T|string)): this; + + /** + * Checks if the given Scene is sleeping or not? + * @param key The Scene to check. + */ + isSleeping(key?: (T|string)): boolean; + + /** + * Checks if the given Scene is running or not? + * @param key The Scene to check. + */ + isActive(key?: (T|string)): boolean; + + /** + * Checks if the given Scene is paused or not? + * @param key The Scene to check. + */ + isPaused(key?: (T|string)): boolean; + + /** + * Checks if the given Scene is visible or not? + * @param key The Scene to check. + */ + isVisible(key?: (T|string)): boolean; + + /** + * Swaps the position of two scenes in the Scenes list. + * + * This controls the order in which they are rendered and updated. + * @param keyA The first Scene to swap. + * @param keyB The second Scene to swap. If none is given it defaults to this Scene. + */ + swapPosition(keyA: (T|string), keyB?: (T|string)): this; + + /** + * Swaps the position of two scenes in the Scenes list, so that Scene B is directly above Scene A. + * + * This controls the order in which they are rendered and updated. + * @param keyA The Scene that Scene B will be moved to be above. + * @param keyB The Scene to be moved. If none is given it defaults to this Scene. + */ + moveAbove(keyA: (T|string), keyB?: (T|string)): this; + + /** + * Swaps the position of two scenes in the Scenes list, so that Scene B is directly below Scene A. + * + * This controls the order in which they are rendered and updated. + * @param keyA The Scene that Scene B will be moved to be below. + * @param keyB The Scene to be moved. If none is given it defaults to this Scene. + */ + moveBelow(keyA: (T|string), keyB?: (T|string)): this; + + /** + * Removes a Scene from the SceneManager. + * + * The Scene is removed from the local scenes array, it's key is cleared from the keys + * cache and Scene.Systems.destroy is then called on it. + * + * If the SceneManager is processing the Scenes when this method is called it will + * queue the operation for the next update sequence. + * @param key The Scene to be removed. + */ + remove(key?: (T|string)): this; + + /** + * Moves a Scene up one position in the Scenes list. + * @param key The Scene to move. + */ + moveUp(key?: (T|string)): this; + + /** + * Moves a Scene down one position in the Scenes list. + * @param key The Scene to move. + */ + moveDown(key?: (T|string)): this; + + /** + * Brings a Scene to the top of the Scenes list. + * + * This means it will render above all other Scenes. + * @param key The Scene to move. + */ + bringToTop(key?: (T|string)): this; + + /** + * Sends a Scene to the back of the Scenes list. + * + * This means it will render below all other Scenes. + * @param key The Scene to move. + */ + sendToBack(key?: (T|string)): this; + + /** + * Retrieve a Scene. + * @param key The Scene to retrieve. + */ + get(key: (T|string)): T; + + /** + * Return the status of the Scene. + * @param key The Scene to get the status from. + */ + getStatus(key: (T|string)): number; + + /** + * Retrieves the numeric index of a Scene in the Scenes list. + * @param key The Scene to get the index of. + */ + getIndex(key?: (T|string)): number; + + } + + namespace Settings { + /** + * Takes a Scene configuration object and returns a fully formed System Settings object. + * @param config The Scene configuration object used to create this Scene Settings. + */ + function create(config: string | Phaser.Types.Scenes.SettingsConfig): Phaser.Types.Scenes.SettingsObject; + + } + + /** + * The Scene Systems class. + * + * This class is available from within a Scene under the property `sys`. + * It is responsible for managing all of the plugins a Scene has running, including the display list, and + * handling the update step and renderer. It also contains references to global systems belonging to Game. + */ + class Systems { + /** + * + * @param scene The Scene that owns this Systems instance. + * @param config Scene specific configuration settings. + */ + constructor(scene: Phaser.Scene, config: string | Phaser.Types.Scenes.SettingsConfig); + + /** + * A reference to the Scene that these Systems belong to. + */ + scene: Phaser.Scene; + + /** + * A reference to the Phaser Game instance. + */ + game: Phaser.Game; + + /** + * A reference to either the Canvas or WebGL Renderer that this Game is using. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The Facebook Instant Games Plugin. + */ + facebook: Phaser.FacebookInstantGamesPlugin; + + /** + * The Scene Configuration object, as passed in when creating the Scene. + */ + config: string | Phaser.Types.Scenes.SettingsConfig; + + /** + * The Scene Settings. This is the parsed output based on the Scene configuration. + */ + settings: Phaser.Types.Scenes.SettingsObject; + + /** + * A handy reference to the Scene canvas / context. + */ + canvas: HTMLCanvasElement; + + /** + * A reference to the Canvas Rendering Context being used by the renderer. + */ + context: CanvasRenderingContext2D; + + /** + * A reference to the global Animations Manager. + * + * In the default set-up you can access this from within a Scene via the `this.anims` property. + */ + anims: Phaser.Animations.AnimationManager; + + /** + * A reference to the global Cache. The Cache stores all files bought in to Phaser via + * the Loader, with the exception of images. Images are stored in the Texture Manager. + * + * In the default set-up you can access this from within a Scene via the `this.cache` property. + */ + cache: Phaser.Cache.CacheManager; + + /** + * A reference to the global Plugins Manager. + * + * In the default set-up you can access this from within a Scene via the `this.plugins` property. + */ + plugins: Phaser.Plugins.PluginManager; + + /** + * A reference to the global registry. This is a game-wide instance of the Data Manager, allowing + * you to exchange data between Scenes via a universal and shared point. + * + * In the default set-up you can access this from within a Scene via the `this.registry` property. + */ + registry: Phaser.Data.DataManager; + + /** + * A reference to the global Scale Manager. + * + * In the default set-up you can access this from within a Scene via the `this.scale` property. + */ + scale: Phaser.Scale.ScaleManager; + + /** + * A reference to the global Sound Manager. + * + * In the default set-up you can access this from within a Scene via the `this.sound` property. + */ + sound: Phaser.Sound.NoAudioSoundManager | Phaser.Sound.HTML5AudioSoundManager | Phaser.Sound.WebAudioSoundManager; + + /** + * A reference to the global Texture Manager. + * + * In the default set-up you can access this from within a Scene via the `this.textures` property. + */ + textures: Phaser.Textures.TextureManager; + + /** + * A reference to the Scene's Game Object Factory. + * + * Use this to quickly and easily create new Game Object's. + * + * In the default set-up you can access this from within a Scene via the `this.add` property. + */ + add: Phaser.GameObjects.GameObjectFactory; + + /** + * A reference to the Scene's Camera Manager. + * + * Use this to manipulate and create Cameras for this specific Scene. + * + * In the default set-up you can access this from within a Scene via the `this.cameras` property. + */ + cameras: Phaser.Cameras.Scene2D.CameraManager; + + /** + * A reference to the Scene's Display List. + * + * Use this to organize the children contained in the display list. + * + * In the default set-up you can access this from within a Scene via the `this.children` property. + */ + displayList: Phaser.GameObjects.DisplayList; + + /** + * A reference to the Scene's Event Manager. + * + * Use this to listen for Scene specific events, such as `pause` and `shutdown`. + * + * In the default set-up you can access this from within a Scene via the `this.events` property. + */ + events: Phaser.Events.EventEmitter; + + /** + * A reference to the Scene's Game Object Creator. + * + * Use this to quickly and easily create new Game Object's. The difference between this and the + * Game Object Factory, is that the Creator just creates and returns Game Object instances, it + * doesn't then add them to the Display List or Update List. + * + * In the default set-up you can access this from within a Scene via the `this.make` property. + */ + make: Phaser.GameObjects.GameObjectCreator; + + /** + * A reference to the Scene Manager Plugin. + * + * Use this to manipulate both this and other Scene's in your game, for example to launch a parallel Scene, + * or pause or resume a Scene, or switch from this Scene to another. + * + * In the default set-up you can access this from within a Scene via the `this.scene` property. + */ + scenePlugin: Phaser.Scenes.ScenePlugin; + + /** + * A reference to the Scene's Update List. + * + * Use this to organize the children contained in the update list. + * + * The Update List is responsible for managing children that need their `preUpdate` methods called, + * in order to process so internal components, such as Sprites with Animations. + * + * In the default set-up there is no reference to this from within the Scene itself. + */ + updateList: Phaser.GameObjects.UpdateList; + + /** + * This method is called only once by the Scene Manager when the Scene is instantiated. + * It is responsible for setting up all of the Scene plugins and references. + * It should never be called directly. + * @param game A reference to the Phaser Game instance. + */ + protected init(game: Phaser.Game): void; + + /** + * A single game step. Called automatically by the Scene Manager as a result of a Request Animation + * Frame or Set Timeout call to the main Game instance. + * @param time The time value from the most recent Game step. Typically a high-resolution timer value, or Date.now(). + * @param delta The delta value since the last frame. This is smoothed to avoid delta spikes by the TimeStep class. + */ + step(time: number, delta: number): void; + + /** + * Called automatically by the Scene Manager. + * Instructs the Scene to render itself via its Camera Manager to the renderer given. + * @param renderer The renderer that invoked the render call. + */ + render(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer): void; + + /** + * Force a sort of the display list on the next render. + */ + queueDepthSort(): void; + + /** + * Immediately sorts the display list if the flag is set. + */ + depthSort(): void; + + /** + * Pause this Scene. + * + * A paused Scene still renders, it just doesn't run any of its update handlers or systems. + * @param data A data object that will be passed in the 'pause' event. + */ + pause(data?: object): Phaser.Scenes.Systems; + + /** + * Resume this Scene from a paused state. + * @param data A data object that will be passed in the 'resume' event. + */ + resume(data?: object): Phaser.Scenes.Systems; + + /** + * Send this Scene to sleep. + * + * A sleeping Scene doesn't run its update step or render anything, but it also isn't shut down + * or has any of its systems or children removed, meaning it can be re-activated at any point and + * will carry on from where it left off. It also keeps everything in memory and events and callbacks + * from other Scenes may still invoke changes within it, so be careful what is left active. + * @param data A data object that will be passed in the 'sleep' event. + */ + sleep(data?: object): Phaser.Scenes.Systems; + + /** + * Wake-up this Scene if it was previously asleep. + * @param data A data object that will be passed in the 'wake' event. + */ + wake(data?: object): Phaser.Scenes.Systems; + + /** + * Returns any data that was sent to this Scene by another Scene. + * + * The data is also passed to `Scene.init` and in various Scene events, but + * you can access it at any point via this method. + */ + getData(): any; + + /** + * Returns the current status of this Scene. + */ + getStatus(): number; + + /** + * Can this Scene receive Input events? + */ + canInput(): boolean; + + /** + * Is this Scene sleeping? + */ + isSleeping(): boolean; + + /** + * Is this Scene running? + */ + isActive(): boolean; + + /** + * Is this Scene paused? + */ + isPaused(): boolean; + + /** + * Is this Scene currently transitioning out to, or in from another Scene? + */ + isTransitioning(): boolean; + + /** + * Is this Scene currently transitioning out from itself to another Scene? + */ + isTransitionOut(): boolean; + + /** + * Is this Scene currently transitioning in from another Scene? + */ + isTransitionIn(): boolean; + + /** + * Is this Scene visible and rendering? + */ + isVisible(): boolean; + + /** + * Sets the visible state of this Scene. + * An invisible Scene will not render, but will still process updates. + * @param value `true` to render this Scene, otherwise `false`. + */ + setVisible(value: boolean): Phaser.Scenes.Systems; + + /** + * Set the active state of this Scene. + * + * An active Scene will run its core update loop. + * @param value If `true` the Scene will be resumed, if previously paused. If `false` it will be paused. + * @param data A data object that will be passed in the 'resume' or 'pause' events. + */ + setActive(value: boolean, data?: object): Phaser.Scenes.Systems; + + /** + * Start this Scene running and rendering. + * Called automatically by the SceneManager. + * @param data Optional data object that may have been passed to this Scene from another. + */ + start(data: object): void; + + /** + * Shutdown this Scene and send a shutdown event to all of its systems. + * A Scene that has been shutdown will not run its update loop or render, but it does + * not destroy any of its plugins or references. It is put into hibernation for later use. + * If you don't ever plan to use this Scene again, then it should be destroyed instead + * to free-up resources. + * @param data A data object that will be passed in the 'shutdown' event. + */ + shutdown(data?: object): void; + + } + + } + + /** + * A base Phaser.Scene class which can be extended for your own use. + * + * You can also define the optional methods {@link Phaser.Types.Scenes.SceneInitCallback init()}, {@link Phaser.Types.Scenes.ScenePreloadCallback preload()}, and {@link Phaser.Types.Scenes.SceneCreateCallback create()}. + */ + class Scene { + /** + * + * @param config The scene key or scene specific configuration settings. + */ + constructor(config?: string | Phaser.Types.Scenes.SettingsConfig); + + /** + * The Scene Systems. You must never overwrite this property, or all hell will break lose. + */ + sys: Phaser.Scenes.Systems; + + /** + * A reference to the Phaser.Game instance. + * + * This property will only be available if defined in the Scene Injection Map. + */ + game: Phaser.Game; + + /** + * A reference to the global Animation Manager. + * + * This property will only be available if defined in the Scene Injection Map. + */ + anims: Phaser.Animations.AnimationManager; + + /** + * A reference to the global Cache. + * + * This property will only be available if defined in the Scene Injection Map. + */ + cache: Phaser.Cache.CacheManager; + + /** + * A reference to the global Data Manager. + * + * This property will only be available if defined in the Scene Injection Map. + */ + registry: Phaser.Data.DataManager; + + /** + * A reference to the Sound Manager. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + sound: Phaser.Sound.NoAudioSoundManager | Phaser.Sound.HTML5AudioSoundManager | Phaser.Sound.WebAudioSoundManager; + + /** + * A reference to the Texture Manager. + * + * This property will only be available if defined in the Scene Injection Map. + */ + textures: Phaser.Textures.TextureManager; + + /** + * A Scene specific Event Emitter. + * + * This property will only be available if defined in the Scene Injection Map. + */ + events: Phaser.Events.EventEmitter; + + /** + * The Scene Camera Manager. + * + * This property will only be available if defined in the Scene Injection Map. + */ + cameras: Phaser.Cameras.Scene2D.CameraManager; + + /** + * The Scene Game Object Factory. + * + * This property will only be available if defined in the Scene Injection Map. + */ + add: Phaser.GameObjects.GameObjectFactory; + + /** + * The Scene Game Object Creator. + * + * This property will only be available if defined in the Scene Injection Map. + */ + make: Phaser.GameObjects.GameObjectCreator; + + /** + * A reference to the Scene Manager Plugin. + * + * This property will only be available if defined in the Scene Injection Map. + */ + scene: Phaser.Scenes.ScenePlugin; + + /** + * The Game Object Display List belonging to this Scene. + * + * This property will only be available if defined in the Scene Injection Map. + */ + children: Phaser.GameObjects.DisplayList; + + /** + * The Scene Lights Manager Plugin. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + lights: Phaser.GameObjects.LightsManager; + + /** + * A Scene specific Data Manager Plugin. + * + * See the `registry` property for the global Data Manager. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + data: Phaser.Data.DataManager; + + /** + * The Scene Input Manager Plugin. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + input: Phaser.Input.InputPlugin; + + /** + * The Scene Loader Plugin. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + load: Phaser.Loader.LoaderPlugin; + + /** + * The Scene Time and Clock Plugin. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + time: Phaser.Time.Clock; + + /** + * The Scene Tween Manager Plugin. + * + * This property will only be available if defined in the Scene Injection Map and the plugin is installed. + */ + tweens: Phaser.Tweens.TweenManager; + + /** + * The Scene Arcade Physics Plugin. + * + * This property will only be available if defined in the Scene Injection Map, the plugin is installed and configured. + */ + physics: Phaser.Physics.Arcade.ArcadePhysics; + + /** + * The Scene Matter Physics Plugin. + * + * This property will only be available if defined in the Scene Injection Map, the plugin is installed and configured. + */ + matter: Phaser.Physics.Matter.MatterPhysics; + + /** + * The Facebook Instant Games Plugin. + * + * This property will only be available if defined in the Scene Injection Map, the plugin is installed and configured. + */ + facebook: Phaser.FacebookInstantGamesPlugin; + + /** + * A reference to the global Scale Manager. + * + * This property will only be available if defined in the Scene Injection Map. + */ + scale: Phaser.Scale.ScaleManager; + + /** + * A reference to the global Plugin Manager. + * + * The Plugin Manager is a global system that allows plugins to register themselves with it, and can then install + * those plugins into Scenes as required. + */ + plugins: Phaser.Plugins.PluginManager; + + /** + * A reference to the renderer instance Phaser is using, either Canvas Renderer or WebGL Renderer. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * This method should be overridden by your own Scenes. + * + * This method is called once per game step while the scene is running. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(time: number, delta: number): void; + + } + + namespace Sound { + /** + * Class containing all the shared state and behavior of a sound object, independent of the implementation. + */ + class BaseSound extends Phaser.Events.EventEmitter { + /** + * + * @param manager Reference to the current sound manager instance. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + constructor(manager: Phaser.Sound.BaseSoundManager, key: string, config?: Phaser.Types.Sound.SoundConfig); + + /** + * Local reference to the sound manager. + */ + manager: Phaser.Sound.BaseSoundManager; + + /** + * Asset key for the sound. + */ + readonly key: string; + + /** + * Flag indicating if sound is currently playing. + */ + readonly isPlaying: boolean; + + /** + * Flag indicating if sound is currently paused. + */ + readonly isPaused: boolean; + + /** + * A property that holds the value of sound's actual playback rate, + * after its rate and detune values has been combined with global + * rate and detune values. + */ + readonly totalRate: number; + + /** + * A value representing the duration, in seconds. + * It could be total sound duration or a marker duration. + */ + readonly duration: number; + + /** + * The total duration of the sound in seconds. + */ + readonly totalDuration: number; + + /** + * Object containing markers definitions. + */ + readonly markers: {[key: string]: Phaser.Types.Sound.SoundMarker}; + + /** + * Currently playing marker. + * 'null' if whole sound is playing. + */ + readonly currentMarker: Phaser.Types.Sound.SoundMarker; + + /** + * Flag indicating if destroy method was called on this sound. + */ + pendingRemove: boolean; + + /** + * Adds a marker into the current sound. A marker is represented by name, start time, duration, and optionally config object. + * This allows you to bundle multiple sounds together into a single audio file and use markers to jump between them for playback. + * @param marker Marker object. + */ + addMarker(marker: Phaser.Types.Sound.SoundMarker): boolean; + + /** + * Updates previously added marker. + * @param marker Marker object with updated values. + */ + updateMarker(marker: Phaser.Types.Sound.SoundMarker): boolean; + + /** + * Removes a marker from the sound. + * @param markerName The name of the marker to remove. + */ + removeMarker(markerName: string): Phaser.Types.Sound.SoundMarker | null; + + /** + * Play this sound, or a marked section of it. + * + * It always plays the sound from the start. If you want to start playback from a specific time + * you can set 'seek' setting of the config object, provided to this call, to that value. + * @param markerName If you want to play a marker then provide the marker name here. Alternatively, this parameter can be a SoundConfig object. Default ''. + * @param config Optional sound config object to be applied to this marker or entire sound if no marker name is provided. It gets memorized for future plays of current section of the sound. + */ + play(markerName?: string | Phaser.Types.Sound.SoundConfig, config?: Phaser.Types.Sound.SoundConfig): boolean; + + /** + * Pauses the sound. This only works if the sound is currently playing. + * + * You can inspect the `isPlaying` and `isPaused` properties to check the state. + */ + pause(): boolean; + + /** + * Resumes the sound. This only works if the sound is paused and not already playing. + * + * You can inspect the `isPlaying` and `isPaused` properties to check the state. + */ + resume(): boolean; + + /** + * Stop playing this sound. + */ + stop(): boolean; + + /** + * Method used internally for applying config values to some of the sound properties. + */ + applyConfig(): void; + + /** + * Method used internally for resetting values of some of the config properties. + */ + resetConfig(): void; + + /** + * Update method called automatically by sound manager on every game step. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Method used internally to calculate total playback rate of the sound. + */ + calculateRate(): void; + + /** + * Destroys this sound and all associated events and marks it for removal from the sound manager. + */ + destroy(): void; + + } + + /** + * Base class for other Sound Manager classes. + */ + class BaseSoundManager extends Phaser.Events.EventEmitter { + /** + * + * @param game Reference to the current game instance. + */ + constructor(game: Phaser.Game); + + /** + * Local reference to game. + */ + readonly game: Phaser.Game; + + /** + * Local reference to the JSON Cache, as used by Audio Sprites. + */ + readonly jsonCache: Phaser.Cache.BaseCache; + + /** + * Global mute setting. + */ + mute: boolean; + + /** + * Global volume setting. + */ + volume: number; + + /** + * Flag indicating if sounds should be paused when game looses focus, + * for instance when user switches to another tab/program/app. + */ + pauseOnBlur: boolean; + + /** + * Mobile devices require sounds to be triggered from an explicit user action, + * such as a tap, before any sound can be loaded/played on a web page. + * Set to true if the audio system is currently locked awaiting user interaction. + */ + readonly locked: boolean; + + /** + * Flag used to track if the game has lost focus. + */ + gameLostFocus: boolean; + + /** + * The Spatial Audio listener position. + * + * Only available with WebAudio. + * + * You can modify the x/y properties of this Vec2 directly to + * adjust the listener position within the game world. + */ + listenerPosition: Phaser.Math.Vector2; + + /** + * Adds a new sound into the sound manager. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + add(key: string, config?: Phaser.Types.Sound.SoundConfig): Phaser.Sound.BaseSound; + + /** + * Adds a new audio sprite sound into the sound manager. + * Audio Sprites are a combination of audio files and a JSON configuration. + * The JSON follows the format of that created by https://github.com/tonistiigi/audiosprite + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + addAudioSprite(key: string, config?: Phaser.Types.Sound.SoundConfig): Phaser.Sound.NoAudioSound | Phaser.Sound.HTML5AudioSound | Phaser.Sound.WebAudioSound; + + /** + * Gets the first sound in this Sound Manager that matches the given key. + * If none can be found it returns `null`. + * @param key Sound asset key. + */ + get(key: string): T; + + /** + * Gets all sounds in this Sound Manager. + * + * You can optionally specify a key, in which case only Sound instances that match the given key + * will be returned. + * @param key Optional asset key. If given, only Sound instances with this key will be returned. + */ + getAll(key?: string): T[]; + + /** + * Returns all sounds from this Sound Manager that are currently + * playing. That is, Sound instances that have their `isPlaying` + * property set to `true`. + */ + getAllPlaying(): T[]; + + /** + * Adds a new sound to the sound manager and plays it. + * + * The sound will be automatically removed (destroyed) once playback ends. + * + * This lets you play a new sound on the fly without the need to keep a reference to it. + * @param key Asset key for the sound. + * @param extra An optional additional object containing settings to be applied to the sound. It could be either config or marker object. + */ + play(key: string, extra?: Phaser.Types.Sound.SoundConfig | Phaser.Types.Sound.SoundMarker): boolean; + + /** + * Adds a new audio sprite sound to the sound manager and plays it. + * The sprite will be automatically removed (destroyed) once playback ends. + * This lets you play a new sound on the fly without the need to keep a reference to it. + * @param key Asset key for the sound. + * @param spriteName The name of the sound sprite to play. + * @param config An optional config object containing default sound settings. + */ + playAudioSprite(key: string, spriteName: string, config?: Phaser.Types.Sound.SoundConfig): boolean; + + /** + * Removes a sound from the sound manager. + * The removed sound is destroyed before removal. + * @param sound The sound object to remove. + */ + remove(sound: Phaser.Sound.BaseSound): boolean; + + /** + * Removes all sounds from the manager, destroying the sounds. + */ + removeAll(): void; + + /** + * Removes all sounds from the sound manager that have an asset key matching the given value. + * The removed sounds are destroyed before removal. + * @param key The key to match when removing sound objects. + */ + removeByKey(key: string): number; + + /** + * Pauses all the sounds in the game. + */ + pauseAll(): void; + + /** + * Resumes all the sounds in the game. + */ + resumeAll(): void; + + /** + * Sets the X and Y position of the Spatial Audio listener on this Web Audios context. + * + * If you call this method with no parameters it will default to the center-point of + * the game canvas. Depending on the type of game you're making, you may need to call + * this method constantly to reset the listener position as the camera scrolls. + * + * Calling this method does nothing on HTML5Audio. + * @param x The x position of the Spatial Audio listener. + * @param y The y position of the Spatial Audio listener. + */ + setListenerPosition(x?: number, y?: number): void; + + /** + * Stops all the sounds in the game. + */ + stopAll(): void; + + /** + * Stops any sounds matching the given key. + * @param key Sound asset key. + */ + stopByKey(key: string): number; + + /** + * Method used internally for unlocking audio playback on devices that + * require user interaction before any sound can be played on a web page. + * + * Read more about how this issue is handled here in [this article](https://medium.com/@pgoloskokovic/unlocking-web-audio-the-smarter-way-8858218c0e09). + */ + protected unlock(): void; + + /** + * Method used internally for pausing sound manager if + * Phaser.Sound.BaseSoundManager#pauseOnBlur is set to true. + */ + protected onBlur(): void; + + /** + * Method used internally for resuming sound manager if + * Phaser.Sound.BaseSoundManager#pauseOnBlur is set to true. + */ + protected onFocus(): void; + + /** + * Update method called on every game step. + * Removes destroyed sounds and updates every active sound in the game. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time elapsed since the last frame. + */ + protected update(time: number, delta: number): void; + + /** + * Destroys all the sounds in the game and all associated events. + */ + destroy(): void; + + /** + * Sets the global playback rate at which all the sounds will be played. + * + * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + * @param value Global playback rate at which all the sounds will be played. + */ + setRate(value: number): this; + + /** + * Global playback rate at which all the sounds will be played. + * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audio's playback speed. + */ + rate: number; + + /** + * Sets the global detuning of all sounds in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + * @param value The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + setDetune(value: number): this; + + /** + * Global detuning of all sounds in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + detune: number; + + } + + namespace Events { + /** + * The Sound Complete Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they complete playback. + * + * Listen to it from a Sound instance using `Sound.on('complete', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('complete', listener); + * music.play(); + * ``` + */ + const COMPLETE: string; + + /** + * The Audio Data Decoded All Event. + * + * This event is dispatched by the Web Audio Sound Manager as a result of calling the `decodeAudio` method, + * once all files passed to the method have been decoded (or errored). + * + * Use `Phaser.Sound.Events#DECODED` to listen for single sounds being decoded, and `DECODED_ALL` to + * listen for them all completing. + * + * Listen to it from the Sound Manager in a Scene using `this.sound.on('decodedall', listener)`, i.e.: + * + * ```javascript + * this.sound.once('decodedall', handler); + * this.sound.decodeAudio([ audioFiles ]); + * ``` + */ + const DECODED_ALL: string; + + /** + * The Audio Data Decoded Event. + * + * This event is dispatched by the Web Audio Sound Manager as a result of calling the `decodeAudio` method. + * + * Listen to it from the Sound Manager in a Scene using `this.sound.on('decoded', listener)`, i.e.: + * + * ```javascript + * this.sound.on('decoded', handler); + * this.sound.decodeAudio(key, audioData); + * ``` + */ + const DECODED: string; + + /** + * The Sound Destroy Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are destroyed, either + * directly or via a Sound Manager. + * + * Listen to it from a Sound instance using `Sound.on('destroy', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('destroy', listener); + * music.destroy(); + * ``` + */ + const DESTROY: string; + + /** + * The Sound Detune Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their detune value changes. + * + * Listen to it from a Sound instance using `Sound.on('detune', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('detune', listener); + * music.play(); + * music.setDetune(200); + * ``` + */ + const DETUNE: string; + + /** + * The Sound Manager Global Detune Event. + * + * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager, + * or the HTML5 Audio Manager. It is dispatched when the `detune` property of the Sound Manager is changed, which globally + * adjusts the detuning of all active sounds. + * + * Listen to it from a Scene using: `this.sound.on('rate', listener)`. + */ + const GLOBAL_DETUNE: string; + + /** + * The Sound Manager Global Mute Event. + * + * This event is dispatched by the Sound Manager when its `mute` property is changed, either directly + * or via the `setMute` method. This changes the mute state of all active sounds. + * + * Listen to it from a Scene using: `this.sound.on('mute', listener)`. + */ + const GLOBAL_MUTE: string; + + /** + * The Sound Manager Global Rate Event. + * + * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager, + * or the HTML5 Audio Manager. It is dispatched when the `rate` property of the Sound Manager is changed, which globally + * adjusts the playback rate of all active sounds. + * + * Listen to it from a Scene using: `this.sound.on('rate', listener)`. + */ + const GLOBAL_RATE: string; + + /** + * The Sound Manager Global Volume Event. + * + * This event is dispatched by the Sound Manager when its `volume` property is changed, either directly + * or via the `setVolume` method. This changes the volume of all active sounds. + * + * Listen to it from a Scene using: `this.sound.on('volume', listener)`. + */ + const GLOBAL_VOLUME: string; + + /** + * The Sound Looped Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they loop during playback. + * + * Listen to it from a Sound instance using `Sound.on('looped', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('looped', listener); + * music.setLoop(true); + * music.play(); + * ``` + * + * This is not to be confused with the [LOOP]{@linkcode Phaser.Sound.Events#event:LOOP} event, which only emits when the loop state of a Sound is changed. + */ + const LOOPED: string; + + /** + * The Sound Loop Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their loop state is changed. + * + * Listen to it from a Sound instance using `Sound.on('loop', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('loop', listener); + * music.setLoop(true); + * ``` + * + * This is not to be confused with the [LOOPED]{@linkcode Phaser.Sound.Events#event:LOOPED} event, which emits each time a Sound loops during playback. + */ + const LOOP: string; + + /** + * The Sound Mute Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their mute state changes. + * + * Listen to it from a Sound instance using `Sound.on('mute', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('mute', listener); + * music.play(); + * music.setMute(true); + * ``` + */ + const MUTE: string; + + /** + * The Sound Pan Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their pan changes. + * + * Listen to it from a Sound instance using `Sound.on('pan', listener)`, i.e.: + * + * ```javascript + * var sound = this.sound.add('key'); + * sound.on('pan', listener); + * sound.play(); + * sound.setPan(0.5); + * ``` + */ + const PAN: string; + + /** + * The Pause All Sounds Event. + * + * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager, + * or the HTML5 Audio Manager. It is dispatched when the `pauseAll` method is invoked and after all current Sounds + * have been paused. + * + * Listen to it from a Scene using: `this.sound.on('pauseall', listener)`. + */ + const PAUSE_ALL: string; + + /** + * The Sound Pause Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are paused. + * + * Listen to it from a Sound instance using `Sound.on('pause', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('pause', listener); + * music.play(); + * music.pause(); + * ``` + */ + const PAUSE: string; + + /** + * The Sound Play Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are played. + * + * Listen to it from a Sound instance using `Sound.on('play', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('play', listener); + * music.play(); + * ``` + */ + const PLAY: string; + + /** + * The Sound Rate Change Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their rate changes. + * + * Listen to it from a Sound instance using `Sound.on('rate', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('rate', listener); + * music.play(); + * music.setRate(0.5); + * ``` + */ + const RATE: string; + + /** + * The Resume All Sounds Event. + * + * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager, + * or the HTML5 Audio Manager. It is dispatched when the `resumeAll` method is invoked and after all current Sounds + * have been resumed. + * + * Listen to it from a Scene using: `this.sound.on('resumeall', listener)`. + */ + const RESUME_ALL: string; + + /** + * The Sound Resume Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are resumed from a paused state. + * + * Listen to it from a Sound instance using `Sound.on('resume', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('resume', listener); + * music.play(); + * music.pause(); + * music.resume(); + * ``` + */ + const RESUME: string; + + /** + * The Sound Seek Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are seeked to a new position. + * + * Listen to it from a Sound instance using `Sound.on('seek', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('seek', listener); + * music.play(); + * music.setSeek(5000); + * ``` + */ + const SEEK: string; + + /** + * The Stop All Sounds Event. + * + * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager, + * or the HTML5 Audio Manager. It is dispatched when the `stopAll` method is invoked and after all current Sounds + * have been stopped. + * + * Listen to it from a Scene using: `this.sound.on('stopall', listener)`. + */ + const STOP_ALL: string; + + /** + * The Sound Stop Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when they are stopped. + * + * Listen to it from a Sound instance using `Sound.on('stop', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('stop', listener); + * music.play(); + * music.stop(); + * ``` + */ + const STOP: string; + + /** + * The Sound Manager Unlocked Event. + * + * This event is dispatched by the Base Sound Manager, or more typically, an instance of the Web Audio Sound Manager, + * or the HTML5 Audio Manager. It is dispatched during the update loop when the Sound Manager becomes unlocked. For + * Web Audio this is on the first user gesture on the page. + * + * Listen to it from a Scene using: `this.sound.on('unlocked', listener)`. + */ + const UNLOCKED: string; + + /** + * The Sound Volume Event. + * + * This event is dispatched by both Web Audio and HTML5 Audio Sound objects when their volume changes. + * + * Listen to it from a Sound instance using `Sound.on('volume', listener)`, i.e.: + * + * ```javascript + * var music = this.sound.add('key'); + * music.on('volume', listener); + * music.play(); + * music.setVolume(0.5); + * ``` + */ + const VOLUME: string; + + } + + /** + * HTML5 Audio implementation of the sound. + */ + class HTML5AudioSound extends Phaser.Sound.BaseSound { + /** + * + * @param manager Reference to the current sound manager instance. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. Default {}. + */ + constructor(manager: Phaser.Sound.HTML5AudioSoundManager, key: string, config?: Phaser.Types.Sound.SoundConfig); + + /** + * An array containing all HTML5 Audio tags that could be used for individual + * sound playback. Number of instances depends on the config value passed + * to the `Loader#audio` method call, default is 1. + */ + tags: HTMLAudioElement[]; + + /** + * Reference to an HTML5 Audio tag used for playing sound. + */ + audio: HTMLAudioElement; + + /** + * Timestamp as generated by the Request Animation Frame or SetTimeout + * representing the time at which the delayed sound playback should start. + * Set to 0 if sound playback is not delayed. + */ + startTime: number; + + /** + * Audio tag's playback position recorded on previous + * update method call. Set to 0 if sound is not playing. + */ + previousTime: number; + + /** + * Play this sound, or a marked section of it. + * + * It always plays the sound from the start. If you want to start playback from a specific time + * you can set 'seek' setting of the config object, provided to this call, to that value. + * + * If you want to play the same sound simultaneously, then you need to create another instance + * of it and play that Sound. For HTML5 Audio this also requires creating multiple audio instances + * when loading the audio files. + * @param markerName If you want to play a marker then provide the marker name here. Alternatively, this parameter can be a SoundConfig object. Default ''. + * @param config Optional sound config object to be applied to this marker or entire sound if no marker name is provided. It gets memorized for future plays of current section of the sound. + */ + play(markerName?: string | Phaser.Types.Sound.SoundConfig, config?: Phaser.Types.Sound.SoundConfig): boolean; + + /** + * Pauses the sound. + */ + pause(): boolean; + + /** + * Resumes the sound. + */ + resume(): boolean; + + /** + * Stop playing this sound. + */ + stop(): boolean; + + /** + * This method is used internally to pick and play the next available audio tag. + */ + pickAndPlayAudioTag(): boolean; + + /** + * This method performs the audio tag pooling logic. It first looks for + * unused audio tag to assign to this sound object. If there are no unused + * audio tags, based on HTML5AudioSoundManager#override property value, it + * looks for sound with most advanced playback and hijacks its audio tag or + * does nothing. + */ + pickAudioTag(): boolean; + + /** + * Method used for playing audio tag and catching possible exceptions + * thrown from rejected Promise returned from play method call. + */ + playCatchPromise(): void; + + /** + * This method is used internally to stop and release the current audio tag. + */ + stopAndReleaseAudioTag(): void; + + /** + * Method used internally to reset sound state, usually when stopping sound + * or when hijacking audio tag from another sound. + */ + reset(): void; + + /** + * Method used internally by sound manager for pausing sound if + * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true. + */ + onBlur(): void; + + /** + * Method used internally by sound manager for resuming sound if + * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true. + */ + onFocus(): void; + + /** + * Update method called automatically by sound manager on every game step. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + */ + update(time: number): void; + + /** + * Calls Phaser.Sound.BaseSound#destroy method + * and cleans up all HTML5 Audio related stuff. + */ + destroy(): void; + + /** + * This method is used internally to update the mute setting of this sound. + */ + updateMute(): void; + + /** + * This method is used internally to update the volume of this sound. + */ + updateVolume(): void; + + /** + * This method is used internally to update the playback rate of this sound. + */ + calculateRate(): void; + + /** + * Boolean indicating whether the sound is muted or not. + * Gets or sets the muted state of this sound. + */ + mute: boolean; + + /** + * Sets the muted state of this Sound. + * @param value `true` to mute this sound, `false` to unmute it. + */ + setMute(value: boolean): this; + + /** + * Gets or sets the volume of this sound, a value between 0 (silence) and 1 (full volume). + */ + volume: number; + + /** + * Sets the volume of this Sound. + * @param value The volume of the sound. + */ + setVolume(value: number): this; + + /** + * Rate at which this Sound will be played. + * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + */ + rate: number; + + /** + * Sets the playback rate of this Sound. + * + * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + * @param value The playback rate at of this Sound. + */ + setRate(value: number): this; + + /** + * The detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + detune: number; + + /** + * Sets the detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + * @param value The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + setDetune(value: number): this; + + /** + * Property representing the position of playback for this sound, in seconds. + * Setting it to a specific value moves current playback to that position. + * The value given is clamped to the range 0 to current marker duration. + * Setting seek of a stopped sound has no effect. + */ + seek: number; + + /** + * Seeks to a specific point in this sound. + * @param value The point in the sound to seek to. + */ + setSeek(value: number): this; + + /** + * Flag indicating whether or not the sound or current sound marker will loop. + */ + loop: boolean; + + /** + * Sets the loop state of this Sound. + * @param value `true` to loop this sound, `false` to not loop it. + */ + setLoop(value: boolean): Phaser.Sound.HTML5AudioSound; + + /** + * Gets or sets the pan of this sound, a value between -1 (full left pan) and 1 (full right pan). + * + * Has no audible effect on HTML5 Audio Sound, but still generates the PAN Event. + */ + pan: number; + + /** + * Sets the pan of this sound, a value between -1 (full left pan) and 1 (full right pan). + * + * Has no audible effect on HTML5 Audio Sound, but still generates the PAN Event. + * @param value The pan of the sound. A value between -1 (full left pan) and 1 (full right pan). + */ + setPan(value: number): this; + + } + + /** + * HTML5AudioSoundManager + */ + class HTML5AudioSoundManager extends Phaser.Sound.BaseSoundManager { + /** + * + * @param game Reference to the current game instance. + */ + constructor(game: Phaser.Game); + + /** + * Flag indicating whether if there are no idle instances of HTML5 Audio tag, + * for any particular sound, if one of the used tags should be hijacked and used + * for succeeding playback or if succeeding Phaser.Sound.HTML5AudioSound#play + * call should be ignored. + */ + override: boolean; + + /** + * Value representing time difference, in seconds, between calling + * play method on an audio tag and when it actually starts playing. + * It is used to achieve more accurate delayed sound playback. + * + * You might need to tweak this value to get the desired results + * since audio play delay varies depending on the browser/platform. + */ + audioPlayDelay: number; + + /** + * A value by which we should offset the loop end marker of the + * looping sound to compensate for lag, caused by changing audio + * tag playback position, in order to achieve gapless looping. + * + * You might need to tweak this value to get the desired results + * since loop lag varies depending on the browser/platform. + */ + loopEndOffset: number; + + /** + * Adds a new sound into the sound manager. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + add(key: string, config?: Phaser.Types.Sound.SoundConfig): Phaser.Sound.HTML5AudioSound; + + /** + * Unlocks HTML5 Audio loading and playback on mobile + * devices on the initial explicit user interaction. + */ + unlock(): void; + + /** + * Method used internally for pausing sound manager if + * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true. + */ + protected onBlur(): void; + + /** + * Method used internally for resuming sound manager if + * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true. + */ + protected onFocus(): void; + + /** + * Calls Phaser.Sound.BaseSoundManager#destroy method + * and cleans up all HTML5 Audio related stuff. + */ + destroy(): void; + + /** + * Method used internally by Phaser.Sound.HTML5AudioSound class methods and property setters + * to check if sound manager is locked and then either perform action immediately or queue it + * to be performed once the sound manager gets unlocked. + * @param sound Sound object on which to perform queued action. + * @param prop Name of the method to be called or property to be assigned a value to. + * @param value An optional parameter that either holds an array of arguments to be passed to the method call or value to be set to the property. + */ + protected isLocked(sound: Phaser.Sound.HTML5AudioSound, prop: string, value?: any): boolean; + + /** + * Sets the muted state of all this Sound Manager. + * @param value `true` to mute all sounds, `false` to unmute them. + */ + setMute(value: boolean): Phaser.Sound.HTML5AudioSoundManager; + + mute: boolean; + + /** + * Sets the volume of this Sound Manager. + * @param value The global volume of this Sound Manager. + */ + setVolume(value: number): Phaser.Sound.HTML5AudioSoundManager; + + volume: number; + + } + + /** + * No audio implementation of the sound. It is used if audio has been + * disabled in the game config or the device doesn't support any audio. + * + * It represents a graceful degradation of sound logic that provides + * minimal functionality and prevents Phaser projects that use audio from + * breaking on devices that don't support any audio playback technologies. + */ + class NoAudioSound extends Phaser.Events.EventEmitter { + /** + * + * @param manager Reference to the current sound manager instance. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. Default {}. + */ + constructor(manager: Phaser.Sound.NoAudioSoundManager, key: string, config?: Phaser.Types.Sound.SoundConfig); + + /** + * Local reference to the sound manager. + */ + manager: Phaser.Sound.BaseSoundManager; + + /** + * Asset key for the sound. + */ + readonly key: string; + + /** + * Flag indicating if sound is currently playing. + */ + readonly isPlaying: boolean; + + /** + * Flag indicating if sound is currently paused. + */ + readonly isPaused: boolean; + + /** + * A property that holds the value of sound's actual playback rate, + * after its rate and detune values has been combined with global + * rate and detune values. + */ + readonly totalRate: number; + + /** + * A value representing the duration, in seconds. + * It could be total sound duration or a marker duration. + */ + readonly duration: number; + + /** + * The total duration of the sound in seconds. + */ + readonly totalDuration: number; + + /** + * A config object used to store default sound settings' values. + * Default values will be set by properties' setters. + */ + config: Phaser.Types.Sound.SoundConfig; + + /** + * Reference to the currently used config. + * It could be default config or marker config. + */ + currentConfig: Phaser.Types.Sound.SoundConfig; + + /** + * Boolean indicating whether the sound is muted or not. + * Gets or sets the muted state of this sound. + */ + mute: boolean; + + /** + * Gets or sets the volume of this sound, a value between 0 (silence) and 1 (full volume). + */ + volume: number; + + /** + * Rate at which this Sound will be played. + * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + */ + rate: number; + + /** + * The detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + detune: number; + + /** + * Property representing the position of playback for this sound, in seconds. + * Setting it to a specific value moves current playback to that position. + * The value given is clamped to the range 0 to current marker duration. + * Setting seek of a stopped sound has no effect. + */ + seek: number; + + /** + * Flag indicating whether or not the sound or current sound marker will loop. + */ + loop: boolean; + + /** + * Gets or sets the pan of this sound, a value between -1 (full left pan) and 1 (full right pan). + * + * Always returns zero on iOS / Safari as it doesn't support the stereo panner node. + */ + pan: number; + + /** + * Object containing markers definitions. + */ + readonly markers: {[key: string]: Phaser.Types.Sound.SoundMarker}; + + /** + * Currently playing marker. + * 'null' if whole sound is playing. + */ + readonly currentMarker: Phaser.Types.Sound.SoundMarker; + + /** + * Flag indicating if destroy method was called on this sound. + */ + pendingRemove: boolean; + + /** + * + * @param marker Marker object. + */ + addMarker(marker: Phaser.Types.Sound.SoundMarker): boolean; + + /** + * + * @param marker Marker object with updated values. + */ + updateMarker(marker: Phaser.Types.Sound.SoundMarker): boolean; + + /** + * + * @param markerName The name of the marker to remove. + */ + removeMarker(markerName: string): null; + + /** + * + * @param markerName If you want to play a marker then provide the marker name here. Alternatively, this parameter can be a SoundConfig object. Default ''. + * @param config Optional sound config object to be applied to this marker or entire sound if no marker name is provided. It gets memorized for future plays of current section of the sound. + */ + play(markerName?: string | Phaser.Types.Sound.SoundConfig, config?: Phaser.Types.Sound.SoundConfig): boolean; + + pause(): boolean; + + /** + * Resumes the sound. + */ + resume(): boolean; + + /** + * Stop playing this sound. + */ + stop(): boolean; + + /** + * Sets the muted state of this Sound. + * @param value `true` to mute this sound, `false` to unmute it. + */ + setMute(value: boolean): this; + + /** + * Sets the volume of this Sound. + * @param value The volume of the sound. + */ + setVolume(value: number): this; + + /** + * Sets the playback rate of this Sound. + * + * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + * @param value The playback rate at of this Sound. + */ + setRate(value: number): this; + + /** + * Sets the detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + * @param value The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + setDetune(value: number): this; + + /** + * Seeks to a specific point in this sound. + * @param value The point in the sound to seek to. + */ + setSeek(value: number): this; + + /** + * Sets the loop state of this Sound. + * @param value `true` to loop this sound, `false` to not loop it. + */ + setLoop(value: boolean): this; + + /** + * Sets the pan of this sound, a value between -1 (full left pan) and 1 (full right pan). + * + * Note: iOS / Safari doesn't support the stereo panner node. + * @param value The pan of the sound. A value between -1 (full left pan) and 1 (full right pan). + */ + setPan(value: number): this; + + /** + * Method used internally for applying config values to some of the sound properties. + */ + applyConfig(): void; + + /** + * Method used internally for resetting values of some of the config properties. + */ + resetConfig(): void; + + /** + * Update method called automatically by sound manager on every game step. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time elapsed since the last frame. + */ + update(time: number, delta: number): void; + + /** + * Method used internally to calculate total playback rate of the sound. + */ + calculateRate(): void; + + /** + * Destroys this sound and all associated events and marks it for removal from the sound manager. + */ + destroy(): void; + + } + + /** + * No-audio implementation of the Sound Manager. It is used if audio has been + * disabled in the game config or the device doesn't support any audio. + * + * It represents a graceful degradation of Sound Manager logic that provides + * minimal functionality and prevents Phaser projects that use audio from + * breaking on devices that don't support any audio playback technologies. + */ + class NoAudioSoundManager extends Phaser.Sound.BaseSoundManager { + /** + * + * @param game Reference to the current game instance. + */ + constructor(game: Phaser.Game); + + /** + * Adds a new sound into the sound manager. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + add(key: string, config?: Phaser.Types.Sound.SoundConfig): Phaser.Sound.NoAudioSound; + + /** + * Adds a new audio sprite sound into the sound manager. + * Audio Sprites are a combination of audio files and a JSON configuration. + * The JSON follows the format of that created by https://github.com/tonistiigi/audiosprite + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + addAudioSprite(key: string, config?: Phaser.Types.Sound.SoundConfig): Phaser.Sound.NoAudioSound; + + /** + * Gets the first sound in the manager matching the given key, if any. + * @param key Sound asset key. + */ + get(key: string): T; + + /** + * Gets any sounds in the manager matching the given key. + * @param key Sound asset key. + */ + getAll(key: string): T[]; + + /** + * This method does nothing but return 'false' for the No Audio Sound Manager, to maintain + * compatibility with the other Sound Managers. + * @param key Asset key for the sound. + * @param extra An optional additional object containing settings to be applied to the sound. It could be either config or marker object. + */ + play(key: string, extra?: Phaser.Types.Sound.SoundConfig | Phaser.Types.Sound.SoundMarker): boolean; + + /** + * This method does nothing but return 'false' for the No Audio Sound Manager, to maintain + * compatibility with the other Sound Managers. + * @param key Asset key for the sound. + * @param spriteName The name of the sound sprite to play. + * @param config An optional config object containing default sound settings. + */ + playAudioSprite(key: string, spriteName: string, config?: Phaser.Types.Sound.SoundConfig): boolean; + + /** + * Removes a sound from the sound manager. + * The removed sound is destroyed before removal. + * @param sound The sound object to remove. + */ + remove(sound: Phaser.Sound.BaseSound): boolean; + + /** + * Removes all sounds from the manager, destroying the sounds. + */ + removeAll(): void; + + /** + * Removes all sounds from the sound manager that have an asset key matching the given value. + * The removed sounds are destroyed before removal. + * @param key The key to match when removing sound objects. + */ + removeByKey(key: string): number; + + /** + * Stops any sounds matching the given key. + * @param key Sound asset key. + */ + stopByKey(key: string): number; + + /** + * Empty function for the No Audio Sound Manager. + */ + onBlur(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + onFocus(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + onGameBlur(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + onGameFocus(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + pauseAll(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + resumeAll(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + stopAll(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + update(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + setRate(): this; + + /** + * Empty function for the No Audio Sound Manager. + */ + setDetune(): this; + + /** + * Empty function for the No Audio Sound Manager. + */ + setMute(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + setVolume(): void; + + /** + * Empty function for the No Audio Sound Manager. + */ + unlock(): void; + + /** + * Destroys all the sounds in the game and all associated events. + */ + destroy(): void; + + } + + /** + * Creates a Web Audio, HTML5 Audio or No Audio Sound Manager based on config and device settings. + * + * Be aware of https://developers.google.com/web/updates/2017/09/autoplay-policy-changes + * @param game Reference to the current game instance. + */ + function SoundManagerCreator(game: Phaser.Game): Phaser.Sound.HTML5AudioSoundManager | Phaser.Sound.WebAudioSoundManager | Phaser.Sound.NoAudioSoundManager; + + /** + * Web Audio API implementation of the sound. + */ + class WebAudioSound extends Phaser.Sound.BaseSound { + /** + * + * @param manager Reference to the WebAudio Sound Manager that owns this Sound instance. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. Default {}. + */ + constructor(manager: Phaser.Sound.WebAudioSoundManager, key: string, config?: Phaser.Types.Sound.SoundConfig); + + /** + * Audio buffer containing decoded data of the audio asset to be played. + */ + audioBuffer: AudioBuffer; + + /** + * A reference to an audio source node used for playing back audio from + * audio data stored in Phaser.Sound.WebAudioSound#audioBuffer. + */ + source: AudioBufferSourceNode; + + /** + * A reference to a second audio source used for gapless looped playback. + */ + loopSource: AudioBufferSourceNode; + + /** + * Gain node responsible for controlling this sound's muting. + */ + muteNode: GainNode; + + /** + * Gain node responsible for controlling this sound's volume. + */ + volumeNode: GainNode; + + /** + * Panner node responsible for controlling this sound's pan. + * + * Doesn't work on iOS / Safari. + */ + pannerNode: StereoPannerNode; + + /** + * The Stereo Spatial Panner node. + */ + spatialNode: PannerNode; + + /** + * If the Spatial Panner node has been set to track a vector or + * Game Object, this retains a reference to it. + */ + spatialSource: Phaser.Types.Math.Vector2Like; + + /** + * The time at which the sound should have started playback from the beginning. + * + * Treat this property as read-only. + * + * Based on `BaseAudioContext.currentTime` value. + */ + playTime: number; + + /** + * The time at which the sound source should have actually started playback. + * + * Treat this property as read-only. + * + * Based on `BaseAudioContext.currentTime` value. + */ + startTime: number; + + /** + * The time at which the sound loop source should actually start playback. + * + * Based on `BaseAudioContext.currentTime` value. + */ + loopTime: number; + + /** + * An array where we keep track of all rate updates during playback. + * + * Treat this property as read-only. + * + * Array of object types: `{ time: number, rate: number }` + */ + rateUpdates: any[]; + + /** + * Used for keeping track when sound source playback has ended + * so its state can be updated accordingly. + */ + readonly hasEnded: boolean; + + /** + * Used for keeping track when sound source has looped + * so its state can be updated accordingly. + */ + readonly hasLooped: boolean; + + /** + * Play this sound, or a marked section of it. + * + * It always plays the sound from the start. If you want to start playback from a specific time + * you can set 'seek' setting of the config object, provided to this call, to that value. + * + * If you want to play the same sound simultaneously, then you need to create another instance + * of it and play that Sound. + * @param markerName If you want to play a marker then provide the marker name here. Alternatively, this parameter can be a SoundConfig object. Default ''. + * @param config Optional sound config object to be applied to this marker or entire sound if no marker name is provided. It gets memorized for future plays of current section of the sound. + */ + play(markerName?: string | Phaser.Types.Sound.SoundConfig, config?: Phaser.Types.Sound.SoundConfig): boolean; + + /** + * Pauses the sound. + */ + pause(): boolean; + + /** + * Resumes the sound. + */ + resume(): boolean; + + /** + * Stop playing this sound. + */ + stop(): boolean; + + /** + * This method is only used internally and it creates a looping buffer source. + */ + createAndStartLoopBufferSource(): void; + + /** + * This method is only used internally and it creates a buffer source. + */ + createBufferSource(): AudioBufferSourceNode; + + /** + * This method is only used internally and it stops and removes a buffer source. + */ + stopAndRemoveBufferSource(): void; + + /** + * This method is only used internally and it stops and removes a looping buffer source. + */ + stopAndRemoveLoopBufferSource(): void; + + /** + * Method used internally for applying config values to some of the sound properties. + */ + applyConfig(): void; + + /** + * Sets the x position of this Sound in Spatial Audio space. + * + * This only has any effect if the sound was created with a SpatialSoundConfig object. + * + * Also see the `WebAudioSoundManager.setListenerPosition` method. + * + * If you find that the sound becomes too quiet, too quickly, as it moves away from + * the listener, then try different `refDistance` property values when configuring + * the spatial sound. + */ + x: number; + + /** + * Sets the y position of this Sound in Spatial Audio space. + * + * This only has any effect if the sound was created with a SpatialSoundConfig object. + * + * Also see the `WebAudioSoundManager.setListenerPosition` method. + * + * If you find that the sound becomes too quiet, too quickly, as it moves away from + * the listener, then try different `refDistance` property values when configuring + * the spatial sound. + */ + y: number; + + /** + * Update method called automatically by sound manager on every game step. + */ + update(): void; + + /** + * Calls Phaser.Sound.BaseSound#destroy method + * and cleans up all Web Audio API related stuff. + */ + destroy(): void; + + /** + * Method used internally to calculate total playback rate of the sound. + */ + calculateRate(): void; + + /** + * Method used internally for calculating current playback time of a playing sound. + */ + getCurrentTime(): void; + + /** + * Method used internally for calculating the time + * at witch the loop source should start playing. + */ + getLoopTime(): void; + + /** + * Rate at which this Sound will be played. + * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + */ + rate: number; + + /** + * Sets the playback rate of this Sound. + * + * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed + * and 2.0 doubles the audios playback speed. + * @param value The playback rate at of this Sound. + */ + setRate(value: number): this; + + /** + * The detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + detune: number; + + /** + * Sets the detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29). + * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + * @param value The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent). + */ + setDetune(value: number): this; + + /** + * Boolean indicating whether the sound is muted or not. + * Gets or sets the muted state of this sound. + */ + mute: boolean; + + /** + * Sets the muted state of this Sound. + * @param value `true` to mute this sound, `false` to unmute it. + */ + setMute(value: boolean): this; + + /** + * Gets or sets the volume of this sound, a value between 0 (silence) and 1 (full volume). + */ + volume: number; + + /** + * Sets the volume of this Sound. + * @param value The volume of the sound. + */ + setVolume(value: number): this; + + /** + * Property representing the position of playback for this sound, in seconds. + * Setting it to a specific value moves current playback to that position. + * The value given is clamped to the range 0 to current marker duration. + * Setting seek of a stopped sound has no effect. + */ + seek: number; + + /** + * Seeks to a specific point in this sound. + * @param value The point in the sound to seek to. + */ + setSeek(value: number): this; + + /** + * Flag indicating whether or not the sound or current sound marker will loop. + */ + loop: boolean; + + /** + * Sets the loop state of this Sound. + * @param value `true` to loop this sound, `false` to not loop it. + */ + setLoop(value: boolean): this; + + /** + * Gets or sets the pan of this sound, a value between -1 (full left pan) and 1 (full right pan). + * + * Always returns zero on iOS / Safari as it doesn't support the stereo panner node. + */ + pan: number; + + /** + * Sets the pan of this sound, a value between -1 (full left pan) and 1 (full right pan). + * + * Note: iOS / Safari doesn't support the stereo panner node. + * @param value The pan of the sound. A value between -1 (full left pan) and 1 (full right pan). + */ + setPan(value: number): this; + + } + + /** + * Web Audio API implementation of the Sound Manager. + * + * Not all browsers can play all audio formats. + * + * There is a good guide to what's supported: [Cross-browser audio basics: Audio codec support](https://developer.mozilla.org/en-US/Apps/Fundamentals/Audio_and_video_delivery/Cross-browser_audio_basics#Audio_Codec_Support). + */ + class WebAudioSoundManager extends Phaser.Sound.BaseSoundManager { + /** + * + * @param game Reference to the current game instance. + */ + constructor(game: Phaser.Game); + + /** + * The AudioContext being used for playback. + */ + context: AudioContext; + + /** + * Gain node responsible for controlling global muting. + */ + masterMuteNode: GainNode; + + /** + * Gain node responsible for controlling global volume. + */ + masterVolumeNode: GainNode; + + /** + * Destination node for connecting individual sounds to. + */ + destination: AudioNode; + + /** + * Method responsible for instantiating and returning AudioContext instance. + * If an instance of an AudioContext class was provided through the game config, + * that instance will be returned instead. This can come in handy if you are reloading + * a Phaser game on a page that never properly refreshes (such as in an SPA project) + * and you want to reuse already instantiated AudioContext. + * @param game Reference to the current game instance. + */ + createAudioContext(game: Phaser.Game): AudioContext; + + /** + * This method takes a new AudioContext reference and then sets + * this Sound Manager to use that context for all playback. + * + * As part of this call it also disconnects the master mute and volume + * nodes and then re-creates them on the new given context. + * @param context Reference to an already created AudioContext instance. + */ + setAudioContext(context: AudioContext): this; + + /** + * Adds a new sound into the sound manager. + * @param key Asset key for the sound. + * @param config An optional config object containing default sound settings. + */ + add(key: string, config?: Phaser.Types.Sound.SoundConfig): Phaser.Sound.WebAudioSound; + + /** + * Decode audio data into a format ready for playback via Web Audio. + * + * The audio data can be a base64 encoded string, an audio media-type data uri, or an ArrayBuffer instance. + * + * The `audioKey` is the key that will be used to save the decoded audio to the audio cache. + * + * Instead of passing a single entry you can instead pass an array of `Phaser.Types.Sound.DecodeAudioConfig` + * objects as the first and only argument. + * + * Decoding is an async process, so be sure to listen for the events to know when decoding has completed. + * + * Once the audio has decoded it can be added to the Sound Manager or played via its key. + * @param audioKey The string-based key to be used to reference the decoded audio in the audio cache, or an array of audio config objects. + * @param audioData The audio data, either a base64 encoded string, an audio media-type data uri, or an ArrayBuffer instance. + */ + decodeAudio(audioKey?: Phaser.Types.Sound.DecodeAudioConfig[] | string, audioData?: ArrayBuffer | string): void; + + /** + * Sets the X and Y position of the Spatial Audio listener on this Web Audios context. + * + * If you call this method with no parameters it will default to the center-point of + * the game canvas. Depending on the type of game you're making, you may need to call + * this method constantly to reset the listener position as the camera scrolls. + * + * Calling this method does nothing on HTML5Audio. + * @param x The x position of the Spatial Audio listener. + * @param y The y position of the Spatial Audio listener. + */ + setListenerPosition(x?: number, y?: number): void; + + /** + * Unlocks Web Audio API on the initial input event. + * + * Read more about how this issue is handled here in [this article](https://medium.com/@pgoloskokovic/unlocking-web-audio-the-smarter-way-8858218c0e09). + */ + unlock(): void; + + /** + * Method used internally for pausing sound manager if + * Phaser.Sound.WebAudioSoundManager#pauseOnBlur is set to true. + */ + protected onBlur(): void; + + /** + * Method used internally for resuming sound manager if + * Phaser.Sound.WebAudioSoundManager#pauseOnBlur is set to true. + */ + protected onFocus(): void; + + /** + * Update method called on every game step. + * + * Removes destroyed sounds and updates every active sound in the game. + * @param time The current timestamp as generated by the Request Animation Frame or SetTimeout. + * @param delta The delta time elapsed since the last frame. + */ + protected update(time: number, delta: number): void; + + /** + * Calls Phaser.Sound.BaseSoundManager#destroy method + * and cleans up all Web Audio API related stuff. + */ + destroy(): void; + + /** + * Sets the muted state of all this Sound Manager. + * @param value `true` to mute all sounds, `false` to unmute them. + */ + setMute(value: boolean): Phaser.Sound.WebAudioSoundManager; + + mute: boolean; + + /** + * Sets the volume of this Sound Manager. + * @param value The global volume of this Sound Manager. + */ + setVolume(value: number): Phaser.Sound.WebAudioSoundManager; + + volume: number; + + } + + } + + namespace Structs { + namespace Events { + /** + * The Process Queue Add Event. + * + * This event is dispatched by a Process Queue when a new item is successfully moved to its active list. + * + * You will most commonly see this used by a Scene's Update List when a new Game Object has been added. + * + * In that instance, listen to this event from within a Scene using: `this.sys.updateList.on('add', listener)`. + */ + const PROCESS_QUEUE_ADD: string; + + /** + * The Process Queue Remove Event. + * + * This event is dispatched by a Process Queue when a new item is successfully removed from its active list. + * + * You will most commonly see this used by a Scene's Update List when a Game Object has been removed. + * + * In that instance, listen to this event from within a Scene using: `this.sys.updateList.on('remove', listener)`. + */ + const PROCESS_QUEUE_REMOVE: string; + + } + + /** + * List is a generic implementation of an ordered list which contains utility methods for retrieving, manipulating, and iterating items. + */ + class List { + /** + * + * @param parent The parent of this list. + */ + constructor(parent: any); + + /** + * The parent of this list. + */ + parent: any; + + /** + * The objects that belong to this collection. + */ + list: T[]; + + /** + * The index of the current element. + * + * This is used internally when iterating through the list with the {@link #first}, {@link #last}, {@link #get}, and {@link #previous} properties. + */ + position: number; + + /** + * A callback that is invoked every time a child is added to this list. + */ + addCallback: Function; + + /** + * A callback that is invoked every time a child is removed from this list. + */ + removeCallback: Function; + + /** + * The property key to sort by. + */ + _sortKey: string; + + /** + * Adds the given item to the end of the list. Each item must be unique. + * @param child The item, or array of items, to add to the list. + * @param skipCallback Skip calling the List.addCallback if this child is added successfully. Default false. + */ + add(child: any | any[], skipCallback?: boolean): any; + + /** + * Adds an item to list, starting at a specified index. Each item must be unique within the list. + * @param child The item, or array of items, to add to the list. + * @param index The index in the list at which the element(s) will be inserted. Default 0. + * @param skipCallback Skip calling the List.addCallback if this child is added successfully. Default false. + */ + addAt(child: (T|T[]), index?: number, skipCallback?: boolean): (T|T[]); + + /** + * Retrieves the item at a given position inside the List. + * @param index The index of the item. + */ + getAt(index: number): T; + + /** + * Locates an item within the List and returns its index. + * @param child The item to locate. + */ + getIndex(child: T): number; + + /** + * Sort the contents of this List so the items are in order based on the given property. + * For example, `sort('alpha')` would sort the List contents based on the value of their `alpha` property. + * @param property The property to lexically sort by. + * @param handler Provide your own custom handler function. Will receive 2 children which it should compare and return a boolean. + */ + sort(property: string, handler?: Function): T[]; + + /** + * Searches for the first instance of a child with its `name` + * property matching the given argument. Should more than one child have + * the same name only the first is returned. + * @param name The name to search for. + */ + getByName(name: string): T | null; + + /** + * Returns a random child from the group. + * @param startIndex Offset from the front of the group (lowest child). Default 0. + * @param length Restriction on the number of values you want to randomly select from. Default (to top). + */ + getRandom(startIndex?: number, length?: number): T | null; + + /** + * Returns the first element in a given part of the List which matches a specific criterion. + * @param property The name of the property to test or a falsey value to have no criterion. + * @param value The value to test the `property` against, or `undefined` to allow any value and only check for existence. + * @param startIndex The position in the List to start the search at. Default 0. + * @param endIndex The position in the List to optionally stop the search at. It won't be checked. + */ + getFirst(property: string, value: any, startIndex?: number, endIndex?: number): T | null; + + /** + * Returns all children in this List. + * + * You can optionally specify a matching criteria using the `property` and `value` arguments. + * + * For example: `getAll('parent')` would return only children that have a property called `parent`. + * + * You can also specify a value to compare the property to: + * + * `getAll('visible', true)` would return only children that have their visible property set to `true`. + * + * Optionally you can specify a start and end index. For example if this List had 100 children, + * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only + * the first 50 children in the List. + * @param property An optional property to test against the value argument. + * @param value If property is set then Child.property must strictly equal this value to be included in the results. + * @param startIndex The first child index to start the search from. + * @param endIndex The last child index to search up until. + */ + getAll(property?: string, value?: any, startIndex?: number, endIndex?: number): T[]; + + /** + * Returns the total number of items in the List which have a property matching the given value. + * @param property The property to test on each item. + * @param value The value to test the property against. + */ + count(property: string, value: T): number; + + /** + * Swaps the positions of two items in the list. + * @param child1 The first item to swap. + * @param child2 The second item to swap. + */ + swap(child1: T, child2: T): void; + + /** + * Moves an item in the List to a new position. + * @param child The item to move. + * @param index Moves an item in the List to a new position. + */ + moveTo(child: T, index: number): T; + + /** + * Moves the given array element above another one in the array. + * @param child1 The element to move above base element. + * @param child2 The base element. + */ + moveAbove(child1: T, child2: T): void; + + /** + * Moves the given array element below another one in the array. + * @param child1 The element to move below base element. + * @param child2 The base element. + */ + moveBelow(child1: T, child2: T): void; + + /** + * Removes one or many items from the List. + * @param child The item, or array of items, to remove. + * @param skipCallback Skip calling the List.removeCallback. Default false. + */ + remove(child: any, skipCallback?: boolean): any; + + /** + * Removes the item at the given position in the List. + * @param index The position to remove the item from. + * @param skipCallback Skip calling the List.removeCallback. Default false. + */ + removeAt(index: number, skipCallback?: boolean): T; + + /** + * Removes the items within the given range in the List. + * @param startIndex The index to start removing from. Default 0. + * @param endIndex The position to stop removing at. The item at this position won't be removed. + * @param skipCallback Skip calling the List.removeCallback. Default false. + */ + removeBetween(startIndex?: number, endIndex?: number, skipCallback?: boolean): T[]; + + /** + * Removes all the items. + * @param skipCallback Skip calling the List.removeCallback. Default false. + */ + removeAll(skipCallback?: boolean): this; + + /** + * Brings the given child to the top of this List. + * @param child The item to bring to the top of the List. + */ + bringToTop(child: T): T; + + /** + * Sends the given child to the bottom of this List. + * @param child The item to send to the back of the list. + */ + sendToBack(child: T): T; + + /** + * Moves the given child up one place in this group unless it's already at the top. + * @param child The item to move up. + */ + moveUp(child: T): T; + + /** + * Moves the given child down one place in this group unless it's already at the bottom. + * @param child The item to move down. + */ + moveDown(child: T): T; + + /** + * Reverses the order of all children in this List. + */ + reverse(): Phaser.Structs.List; + + /** + * Shuffles the items in the list. + */ + shuffle(): Phaser.Structs.List; + + /** + * Replaces a child of this List with the given newChild. The newChild cannot be a member of this List. + * @param oldChild The child in this List that will be replaced. + * @param newChild The child to be inserted into this List. + */ + replace(oldChild: T, newChild: T): T; + + /** + * Checks if an item exists within the List. + * @param child The item to check for the existence of. + */ + exists(child: T): boolean; + + /** + * Sets the property `key` to the given value on all members of this List. + * @param property The name of the property to set. + * @param value The value to set the property to. + * @param startIndex The first child index to start the search from. + * @param endIndex The last child index to search up until. + */ + setAll(property: string, value: T, startIndex?: number, endIndex?: number): void; + + /** + * Passes all children to the given callback. + * @param callback The function to call. + * @param context Value to use as `this` when executing callback. + * @param args Additional arguments that will be passed to the callback, after the child. + */ + each(callback: EachListCallback, context?: any, ...args: any[]): void; + + /** + * Clears the List and recreates its internal array. + */ + shutdown(): void; + + /** + * Destroys this List. + */ + destroy(): void; + + /** + * The number of items inside the List. + */ + readonly length: number; + + /** + * The first item in the List or `null` for an empty List. + */ + readonly first: T; + + /** + * The last item in the List, or `null` for an empty List. + */ + readonly last: T; + + /** + * The next item in the List, or `null` if the entire List has been traversed. + * + * This property can be read successively after reading {@link #first} or manually setting the {@link #position} to iterate the List. + */ + readonly next: T; + + /** + * The previous item in the List, or `null` if the entire List has been traversed. + * + * This property can be read successively after reading {@link #last} or manually setting the {@link #position} to iterate the List backwards. + */ + readonly previous: T; + + } + + /** + * The keys of a Map can be arbitrary values. + * + * ```javascript + * var map = new Map([ + * [ 1, 'one' ], + * [ 2, 'two' ], + * [ 3, 'three' ] + * ]); + * ``` + */ + class Map { + /** + * + * @param elements An optional array of key-value pairs to populate this Map with. + */ + constructor(elements: V[]); + + /** + * The entries in this Map. + */ + entries: {[key: string]: V}; + + /** + * The number of key / value pairs in this Map. + */ + size: number; + + /** + * Adds all the elements in the given array to this Map. + * + * If the element already exists, the value will be skipped. + * @param elements An array of key-value pairs to populate this Map with. + */ + setAll(elements: V[]): this; + + /** + * Adds an element with a specified `key` and `value` to this Map. + * + * If the `key` already exists, the value will be replaced. + * + * If you wish to add multiple elements in a single call, use the `setAll` method instead. + * @param key The key of the element to be added to this Map. + * @param value The value of the element to be added to this Map. + */ + set(key: K, value: V): Phaser.Structs.Map; + + /** + * Returns the value associated to the `key`, or `undefined` if there is none. + * @param key The key of the element to return from the `Map` object. + */ + get(key: K): V; + + /** + * Returns an `Array` of all the values stored in this Map. + */ + getArray(): V[]; + + /** + * Returns a boolean indicating whether an element with the specified key exists or not. + * @param key The key of the element to test for presence of in this Map. + */ + has(key: K): boolean; + + /** + * Delete the specified element from this Map. + * @param key The key of the element to delete from this Map. + */ + delete(key: K): Phaser.Structs.Map; + + /** + * Delete all entries from this Map. + */ + clear(): Phaser.Structs.Map; + + /** + * Returns all entries keys in this Map. + */ + keys(): K[]; + + /** + * Returns an `Array` of all entries. + */ + values(): V[]; + + /** + * Dumps the contents of this Map to the console via `console.group`. + */ + dump(): void; + + /** + * Iterates through all entries in this Map, passing each one to the given callback. + * + * If the callback returns `false`, the iteration will break. + * @param callback The callback which will receive the keys and entries held in this Map. + */ + each(callback: EachMapCallback): Phaser.Structs.Map; + + /** + * Returns `true` if the value exists within this Map. Otherwise, returns `false`. + * @param value The value to search for. + */ + contains(value: V): boolean; + + /** + * Merges all new keys from the given Map into this one. + * If it encounters a key that already exists it will be skipped unless override is set to `true`. + * @param map The Map to merge in to this Map. + * @param override Set to `true` to replace values in this Map with those from the source map, or `false` to skip them. Default false. + */ + merge(map: Phaser.Structs.Map, override?: boolean): Phaser.Structs.Map; + + } + + /** + * A Process Queue maintains three internal lists. + * + * The `pending` list is a selection of items which are due to be made 'active' in the next update. + * The `active` list is a selection of items which are considered active and should be updated. + * The `destroy` list is a selection of items that were active and are awaiting being destroyed in the next update. + * + * When new items are added to a Process Queue they are put in the pending list, rather than being added + * immediately the active list. Equally, items that are removed are put into the destroy list, rather than + * being destroyed immediately. This allows the Process Queue to carefully process each item at a specific, fixed + * time, rather than at the time of the request from the API. + */ + class ProcessQueue extends Phaser.Events.EventEmitter { + /** + * If `true` only unique objects will be allowed in the queue. + */ + checkQueue: boolean; + + /** + * Checks the given item to see if it is already active within this Process Queue. + * @param item The item to check. + */ + isActive(item: T): Phaser.Structs.ProcessQueue; + + /** + * Checks the given item to see if it is already pending addition to this Process Queue. + * @param item The item to check. + */ + isPending(item: T): Phaser.Structs.ProcessQueue; + + /** + * Checks the given item to see if it is already pending destruction from this Process Queue. + * @param item The item to check. + */ + isDestroying(item: T): Phaser.Structs.ProcessQueue; + + /** + * Adds a new item to the Process Queue. + * + * The item is added to the pending list and made active in the next update. + * @param item The item to add to the queue. + */ + add(item: T): Phaser.Structs.ProcessQueue; + + /** + * Removes an item from the Process Queue. + * + * The item is added to the 'destroy' list and is fully removed in the next update. + * @param item The item to be removed from the queue. + */ + remove(item: T): Phaser.Structs.ProcessQueue; + + /** + * Removes all active items from this Process Queue. + * + * All the items are marked as 'pending destroy' and fully removed in the next update. + */ + removeAll(): this; + + /** + * Update this queue. First it will process any items awaiting destruction, and remove them. + * + * Then it will check to see if there are any items pending insertion, and move them to an + * active state. Finally, it will return a list of active items for further processing. + */ + update(): T[]; + + /** + * Returns the current list of active items. + * + * This method returns a reference to the active list array, not a copy of it. + * Therefore, be careful to not modify this array outside of the ProcessQueue. + */ + getActive(): T[]; + + /** + * The number of entries in the active list. + */ + readonly length: number; + + /** + * Immediately destroys this process queue, clearing all of its internal arrays and resetting the process totals. + */ + destroy(): void; + + } + + /** + * RBush is a high-performance JavaScript library for 2D spatial indexing of points and rectangles. + * It's based on an optimized R-tree data structure with bulk insertion support. + * + * Spatial index is a special data structure for points and rectangles that allows you to perform queries like + * "all items within this bounding box" very efficiently (e.g. hundreds of times faster than looping over all items). + * + * This version of RBush uses a fixed min/max accessor structure of `[ '.left', '.top', '.right', '.bottom' ]`. + * This is to avoid the eval like function creation that the original library used, which caused CSP policy violations. + * + * rbush is forked from https://github.com/mourner/rbush by Vladimir Agafonkin + */ + class RTree { + } + + /** + * A Set is a collection of unique elements. + */ + class Set { + /** + * + * @param elements An optional array of elements to insert into this Set. + */ + constructor(elements?: T[]); + + /** + * The entries of this Set. Stored internally as an array. + */ + entries: T[]; + + /** + * Inserts the provided value into this Set. If the value is already contained in this Set this method will have no effect. + * @param value The value to insert into this Set. + */ + set(value: T): Phaser.Structs.Set; + + /** + * Get an element of this Set which has a property of the specified name, if that property is equal to the specified value. + * If no elements of this Set satisfy the condition then this method will return `null`. + * @param property The property name to check on the elements of this Set. + * @param value The value to check for. + */ + get(property: string, value: T): T; + + /** + * Returns an array containing all the values in this Set. + */ + getArray(): T[]; + + /** + * Removes the given value from this Set if this Set contains that value. + * @param value The value to remove from the Set. + */ + delete(value: T): Phaser.Structs.Set; + + /** + * Dumps the contents of this Set to the console via `console.group`. + */ + dump(): void; + + /** + * Passes each value in this Set to the given callback. + * Use this function when you know this Set will be modified during the iteration, otherwise use `iterate`. + * @param callback The callback to be invoked and passed each value this Set contains. + * @param callbackScope The scope of the callback. + */ + each(callback: EachSetCallback, callbackScope?: any): Phaser.Structs.Set; + + /** + * Passes each value in this Set to the given callback. + * + * For when you absolutely know this Set won't be modified during the iteration. + * + * The callback must return a boolean. If it returns `false` then it will abort + * the Set iteration immediately. If it returns `true`, it will carry on + * iterating the next child in the Set. + * @param callback The callback to be invoked and passed each value this Set contains. + * @param callbackScope The scope of the callback. + */ + iterate(callback: EachSetCallback, callbackScope?: any): Phaser.Structs.Set; + + /** + * Goes through each entry in this Set and invokes the given function on them, passing in the arguments. + * @param callbackKey The key of the function to be invoked on each Set entry. + * @param args Additional arguments that will be passed to the callback, after the child. + */ + iterateLocal(callbackKey: string, ...args: any[]): Phaser.Structs.Set; + + /** + * Clears this Set so that it no longer contains any values. + */ + clear(): Phaser.Structs.Set; + + /** + * Returns `true` if this Set contains the given value, otherwise returns `false`. + * @param value The value to check for in this Set. + */ + contains(value: T): boolean; + + /** + * Returns a new Set containing all values that are either in this Set or in the Set provided as an argument. + * @param set The Set to perform the union with. + */ + union(set: Phaser.Structs.Set): Phaser.Structs.Set; + + /** + * Returns a new Set that contains only the values which are in this Set and that are also in the given Set. + * @param set The Set to intersect this set with. + */ + intersect(set: Phaser.Structs.Set): Phaser.Structs.Set; + + /** + * Returns a new Set containing all the values in this Set which are *not* also in the given Set. + * @param set The Set to perform the difference with. + */ + difference(set: Phaser.Structs.Set): Phaser.Structs.Set; + + /** + * The size of this Set. This is the number of entries within it. + * Changing the size will truncate the Set if the given value is smaller than the current size. + * Increasing the size larger than the current size has no effect. + */ + size: number; + + } + + /** + * The Size component allows you to set `width` and `height` properties and define the relationship between them. + * + * The component can automatically maintain the aspect ratios between the two values, and clamp them + * to a defined min-max range. You can also control the dominant axis. When dimensions are given to the Size component + * that would cause it to exceed its min-max range, the dimensions are adjusted based on the dominant axis. + */ + class Size { + /** + * + * @param width The width of the Size component. Default 0. + * @param height The height of the Size component. If not given, it will use the `width`. Default width. + * @param aspectMode The aspect mode of the Size component. Defaults to 0, no mode. Default 0. + * @param parent The parent of this Size component. Can be any object with public `width` and `height` properties. Dimensions are clamped to keep them within the parent bounds where possible. Default null. + */ + constructor(width?: number, height?: number, aspectMode?: number, parent?: any); + + /** + * The aspect mode this Size component will use when calculating its dimensions. + * This property is read-only. To change it use the `setAspectMode` method. + */ + readonly aspectMode: number; + + /** + * The proportional relationship between the width and height. + * + * This property is read-only and is updated automatically when either the `width` or `height` properties are changed, + * depending on the aspect mode. + */ + readonly aspectRatio: number; + + /** + * The minimum allowed width. + * Cannot be less than zero. + * This value is read-only. To change it see the `setMin` method. + */ + readonly minWidth: number; + + /** + * The minimum allowed height. + * Cannot be less than zero. + * This value is read-only. To change it see the `setMin` method. + */ + readonly minHeight: number; + + /** + * The maximum allowed width. + * This value is read-only. To change it see the `setMax` method. + */ + readonly maxWidth: number; + + /** + * The maximum allowed height. + * This value is read-only. To change it see the `setMax` method. + */ + readonly maxHeight: number; + + /** + * A Vector2 containing the horizontal and vertical snap values, which the width and height are snapped to during resizing. + * + * By default this is disabled. + * + * This property is read-only. To change it see the `setSnap` method. + */ + readonly snapTo: Phaser.Math.Vector2; + + /** + * Sets the aspect mode of this Size component. + * + * The aspect mode controls what happens when you modify the `width` or `height` properties, or call `setSize`. + * + * It can be a number from 0 to 4, or a Size constant: + * + * 0. NONE = Do not make the size fit the aspect ratio. Change the ratio when the size changes. + * 1. WIDTH_CONTROLS_HEIGHT = The height is automatically adjusted based on the width. + * 2. HEIGHT_CONTROLS_WIDTH = The width is automatically adjusted based on the height. + * 3. FIT = The width and height are automatically adjusted to fit inside the given target area, while keeping the aspect ratio. Depending on the aspect ratio there may be some space inside the area which is not covered. + * 4. ENVELOP = The width and height are automatically adjusted to make the size cover the entire target area while keeping the aspect ratio. This may extend further out than the target size. + * + * Calling this method automatically recalculates the `width` and the `height`, if required. + * @param value The aspect mode value. Default 0. + */ + setAspectMode(value?: number): this; + + /** + * By setting snap values, when this Size component is modified its dimensions will automatically + * be snapped to the nearest grid slice, using floor. For example, if you have snap value of 16, + * and the width changes to 68, then it will snap down to 64 (the closest multiple of 16 when floored) + * + * Note that snapping takes place before adjustments by the parent, or the min / max settings. If these + * values are not multiples of the given snap values, then this can result in un-snapped dimensions. + * + * Call this method with no arguments to reset the snap values. + * + * Calling this method automatically recalculates the `width` and the `height`, if required. + * @param snapWidth The amount to snap the width to. If you don't want to snap the width, pass a value of zero. Default 0. + * @param snapHeight The amount to snap the height to. If not provided it will use the `snapWidth` value. If you don't want to snap the height, pass a value of zero. Default snapWidth. + */ + setSnap(snapWidth?: number, snapHeight?: number): this; + + /** + * Sets, or clears, the parent of this Size component. + * + * To clear the parent call this method with no arguments. + * + * The parent influences the maximum extents to which this Size component can expand, + * based on the aspect mode: + * + * NONE - The parent clamps both the width and height. + * WIDTH_CONTROLS_HEIGHT - The parent clamps just the width. + * HEIGHT_CONTROLS_WIDTH - The parent clamps just the height. + * FIT - The parent clamps whichever axis is required to ensure the size fits within it. + * ENVELOP - The parent is used to ensure the size fully envelops the parent. + * + * Calling this method automatically calls `setSize`. + * @param parent Sets the parent of this Size component. Don't provide a value to clear an existing parent. + */ + setParent(parent?: any): this; + + /** + * Set the minimum width and height values this Size component will allow. + * + * The minimum values can never be below zero, or greater than the maximum values. + * + * Setting this will automatically adjust both the `width` and `height` properties to ensure they are within range. + * + * Note that based on the aspect mode, and if this Size component has a parent set or not, the minimums set here + * _can_ be exceed in some situations. + * @param width The minimum allowed width of the Size component. Default 0. + * @param height The minimum allowed height of the Size component. If not given, it will use the `width`. Default width. + */ + setMin(width?: number, height?: number): this; + + /** + * Set the maximum width and height values this Size component will allow. + * + * Setting this will automatically adjust both the `width` and `height` properties to ensure they are within range. + * + * Note that based on the aspect mode, and if this Size component has a parent set or not, the maximums set here + * _can_ be exceed in some situations. + * @param width The maximum allowed width of the Size component. Default Number.MAX_VALUE. + * @param height The maximum allowed height of the Size component. If not given, it will use the `width`. Default width. + */ + setMax(width?: number, height?: number): this; + + /** + * Sets the width and height of this Size component based on the aspect mode. + * + * If the aspect mode is 'none' then calling this method will change the aspect ratio, otherwise the current + * aspect ratio is honored across all other modes. + * + * If snapTo values have been set then the given width and height are snapped first, prior to any further + * adjustment via min/max values, or a parent. + * + * If minimum and/or maximum dimensions have been specified, the values given to this method will be clamped into + * that range prior to adjustment, but may still exceed them depending on the aspect mode. + * + * If this Size component has a parent set, and the aspect mode is `fit` or `envelop`, then the given sizes will + * be clamped to the range specified by the parent. + * @param width The new width of the Size component. Default 0. + * @param height The new height of the Size component. If not given, it will use the `width`. Default width. + */ + setSize(width?: number, height?: number): this; + + /** + * Sets a new aspect ratio, overriding what was there previously. + * + * It then calls `setSize` immediately using the current dimensions. + * @param ratio The new aspect ratio. + */ + setAspectRatio(ratio: number): this; + + /** + * Sets a new width and height for this Size component and updates the aspect ratio based on them. + * + * It _doesn't_ change the `aspectMode` and still factors in size limits such as the min max and parent bounds. + * @param width The new width of the Size component. + * @param height The new height of the Size component. If not given, it will use the `width`. Default width. + */ + resize(width: number, height?: number): this; + + /** + * Takes a new width and passes it through the min/max clamp and then checks it doesn't exceed the parent width. + * @param value The value to clamp and check. + * @param checkParent Check the given value against the parent, if set. Default true. + */ + getNewWidth(value: number, checkParent?: boolean): number; + + /** + * Takes a new height and passes it through the min/max clamp and then checks it doesn't exceed the parent height. + * @param value The value to clamp and check. + * @param checkParent Check the given value against the parent, if set. Default true. + */ + getNewHeight(value: number, checkParent?: boolean): number; + + /** + * The current `width` and `height` are adjusted to fit inside the given dimensions, while keeping the aspect ratio. + * + * If `fit` is true there may be some space inside the target area which is not covered if its aspect ratio differs. + * If `fit` is false the size may extend further out than the target area if the aspect ratios differ. + * + * If this Size component has a parent set, then the width and height passed to this method will be clamped so + * it cannot exceed that of the parent. + * @param width The new width of the Size component. Default 0. + * @param height The new height of the Size component. If not given, it will use the width value. + * @param fit Perform a `fit` (true) constraint, or an `envelop` (false) constraint. Default true. + */ + constrain(width?: number, height?: number, fit?: boolean): this; + + /** + * The current `width` and `height` are adjusted to fit inside the given dimensions, while keeping the aspect ratio. + * + * There may be some space inside the target area which is not covered if its aspect ratio differs. + * + * If this Size component has a parent set, then the width and height passed to this method will be clamped so + * it cannot exceed that of the parent. + * @param width The new width of the Size component. Default 0. + * @param height The new height of the Size component. If not given, it will use the width value. + */ + fitTo(width?: number, height?: number): this; + + /** + * The current `width` and `height` are adjusted so that they fully envelope the given dimensions, while keeping the aspect ratio. + * + * The size may extend further out than the target area if the aspect ratios differ. + * + * If this Size component has a parent set, then the values are clamped so that it never exceeds the parent + * on the longest axis. + * @param width The new width of the Size component. Default 0. + * @param height The new height of the Size component. If not given, it will use the width value. + */ + envelop(width?: number, height?: number): this; + + /** + * Sets the width of this Size component. + * + * Depending on the aspect mode, changing the width may also update the height and aspect ratio. + * @param width The new width of the Size component. + */ + setWidth(width: number): this; + + /** + * Sets the height of this Size component. + * + * Depending on the aspect mode, changing the height may also update the width and aspect ratio. + * @param height The new height of the Size component. + */ + setHeight(height: number): this; + + /** + * Returns a string representation of this Size component. + */ + toString(): string; + + /** + * Sets the values of this Size component to the `element.style.width` and `height` + * properties of the given DOM Element. The properties are set as `px` values. + * @param element The DOM Element to set the CSS style on. + */ + setCSS(element: HTMLElement): void; + + /** + * Copies the aspect mode, aspect ratio, width and height from this Size component + * to the given Size component. Note that the parent, if set, is not copied across. + * @param destination The Size component to copy the values to. + */ + copy(destination: Phaser.Structs.Size): Phaser.Structs.Size; + + /** + * Destroys this Size component. + * + * This clears the local properties and any parent object, if set. + * + * A destroyed Size component cannot be re-used. + */ + destroy(): void; + + /** + * The width of this Size component. + * + * This value is clamped to the range specified by `minWidth` and `maxWidth`, if enabled. + * + * A width can never be less than zero. + * + * Changing this value will automatically update the `height` if the aspect ratio lock is enabled. + * You can also use the `setWidth` and `getWidth` methods. + */ + width: number; + + /** + * The height of this Size component. + * + * This value is clamped to the range specified by `minHeight` and `maxHeight`, if enabled. + * + * A height can never be less than zero. + * + * Changing this value will automatically update the `width` if the aspect ratio lock is enabled. + * You can also use the `setHeight` and `getHeight` methods. + */ + height: number; + + /** + * Do not make the size fit the aspect ratio. Change the ratio when the size changes. + */ + static readonly NONE: number; + + /** + * The height is automatically adjusted based on the width. + */ + static readonly WIDTH_CONTROLS_HEIGHT: number; + + /** + * The width is automatically adjusted based on the height. + */ + static readonly HEIGHT_CONTROLS_WIDTH: number; + + /** + * The width and height are automatically adjusted to fit inside the given target area, while keeping the aspect ratio. Depending on the aspect ratio there may be some space inside the area which is not covered. + */ + static readonly FIT: number; + + /** + * The width and height are automatically adjusted to make the size cover the entire target area while keeping the aspect ratio. This may extend further out than the target size. + */ + static readonly ENVELOP: number; + + } + + } + + namespace Textures { + /** + * A Canvas Texture is a special kind of Texture that is backed by an HTML Canvas Element as its source. + * + * You can use the properties of this texture to draw to the canvas element directly, using all of the standard + * canvas operations available in the browser. Any Game Object can be given this texture and will render with it. + * + * Note: When running under WebGL the Canvas Texture needs to re-generate its base WebGLTexture and reupload it to + * the GPU every time you modify it, otherwise the changes you make to this texture will not be visible. To do this + * you should call `CanvasTexture.refresh()` once you are finished with your changes to the canvas. Try and keep + * this to a minimum, especially on large canvas sizes, or you may inadvertently thrash the GPU by constantly uploading + * texture data to it. This restriction does not apply if using the Canvas Renderer. + * + * It starts with only one frame that covers the whole of the canvas. You can add further frames, that specify + * sections of the canvas using the `add` method. + * + * Should you need to resize the canvas use the `setSize` method so that it accurately updates all of the underlying + * texture data as well. Forgetting to do this (i.e. by changing the canvas size directly from your code) could cause + * graphical errors. + */ + class CanvasTexture extends Phaser.Textures.Texture { + /** + * + * @param manager A reference to the Texture Manager this Texture belongs to. + * @param key The unique string-based key of this Texture. + * @param source The canvas element that is used as the base of this texture. + * @param width The width of the canvas. + * @param height The height of the canvas. + */ + constructor(manager: Phaser.Textures.TextureManager, key: string, source: HTMLCanvasElement, width: number, height: number); + + /** + * The source Canvas Element. + */ + readonly canvas: HTMLCanvasElement; + + /** + * The 2D Canvas Rendering Context. + */ + readonly context: CanvasRenderingContext2D; + + /** + * The width of the Canvas. + * This property is read-only, if you wish to change it use the `setSize` method. + */ + readonly width: number; + + /** + * The height of the Canvas. + * This property is read-only, if you wish to change it use the `setSize` method. + */ + readonly height: number; + + /** + * The context image data. + * Use the `update` method to populate this when the canvas changes. + */ + imageData: ImageData; + + /** + * A Uint8ClampedArray view into the `buffer`. + * Use the `update` method to populate this when the canvas changes. + * Note that this is unavailable in some browsers, such as Epic Browser, due to their security restrictions. + */ + data: Uint8ClampedArray; + + /** + * An Uint32Array view into the `buffer`. + */ + pixels: Uint32Array; + + /** + * An ArrayBuffer the same size as the context ImageData. + */ + buffer: ArrayBuffer; + + /** + * This re-creates the `imageData` from the current context. + * It then re-builds the ArrayBuffer, the `data` Uint8ClampedArray reference and the `pixels` Int32Array. + * + * Warning: This is a very expensive operation, so use it sparingly. + */ + update(): Phaser.Textures.CanvasTexture; + + /** + * Draws the given Image or Canvas element to this CanvasTexture, then updates the internal + * ImageData buffer and arrays. + * @param x The x coordinate to draw the source at. + * @param y The y coordinate to draw the source at. + * @param source The element to draw to this canvas. + * @param update Update the internal ImageData buffer and arrays. Default true. + */ + draw(x: number, y: number, source: HTMLImageElement | HTMLCanvasElement, update?: boolean): Phaser.Textures.CanvasTexture; + + /** + * Draws the given texture frame to this CanvasTexture, then updates the internal + * ImageData buffer and arrays. + * @param key The unique string-based key of the Texture. + * @param frame The string-based name, or integer based index, of the Frame to get from the Texture. + * @param x The x coordinate to draw the source at. Default 0. + * @param y The y coordinate to draw the source at. Default 0. + * @param update Update the internal ImageData buffer and arrays. Default true. + */ + drawFrame(key: string, frame?: string | number, x?: number, y?: number, update?: boolean): Phaser.Textures.CanvasTexture; + + /** + * Sets a pixel in the CanvasTexture to the given color and alpha values. + * + * This is an expensive operation to run in large quantities, so use sparingly. + * @param x The x coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param y The y coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param red The red color value. A number between 0 and 255. + * @param green The green color value. A number between 0 and 255. + * @param blue The blue color value. A number between 0 and 255. + * @param alpha The alpha value. A number between 0 and 255. Default 255. + */ + setPixel(x: number, y: number, red: number, green: number, blue: number, alpha?: number): this; + + /** + * Puts the ImageData into the context of this CanvasTexture at the given coordinates. + * @param imageData The ImageData to put at the given location. + * @param x The x coordinate to put the imageData. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param y The y coordinate to put the imageData. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param dirtyX Horizontal position (x coordinate) of the top-left corner from which the image data will be extracted. Default 0. + * @param dirtyY Vertical position (x coordinate) of the top-left corner from which the image data will be extracted. Default 0. + * @param dirtyWidth Width of the rectangle to be painted. Defaults to the width of the image data. + * @param dirtyHeight Height of the rectangle to be painted. Defaults to the height of the image data. + */ + putData(imageData: ImageData, x: number, y: number, dirtyX?: number, dirtyY?: number, dirtyWidth?: number, dirtyHeight?: number): this; + + /** + * Gets an ImageData region from this CanvasTexture from the position and size specified. + * You can write this back using `CanvasTexture.putData`, or manipulate it. + * @param x The x coordinate of the top-left of the area to get the ImageData from. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param y The y coordinate of the top-left of the area to get the ImageData from. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param width The width of the rectangle from which the ImageData will be extracted. Positive values are to the right, and negative to the left. + * @param height The height of the rectangle from which the ImageData will be extracted. Positive values are down, and negative are up. + */ + getData(x: number, y: number, width: number, height: number): ImageData; + + /** + * Get the color of a specific pixel from this texture and store it in a Color object. + * + * If you have drawn anything to this CanvasTexture since it was created you must call `CanvasTexture.update` to refresh the array buffer, + * otherwise this may return out of date color values, or worse - throw a run-time error as it tries to access an array element that doesn't exist. + * @param x The x coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param y The y coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param out A Color object to store the pixel values in. If not provided a new Color object will be created. + */ + getPixel(x: number, y: number, out?: Phaser.Display.Color): Phaser.Display.Color; + + /** + * Returns an array containing all of the pixels in the given region. + * + * If the requested region extends outside the bounds of this CanvasTexture, + * the region is truncated to fit. + * + * If you have drawn anything to this CanvasTexture since it was created you must call `CanvasTexture.update` to refresh the array buffer, + * otherwise this may return out of date color values, or worse - throw a run-time error as it tries to access an array element that doesn't exist. + * @param x The x coordinate of the top-left of the region. Must lay within the dimensions of this CanvasTexture and be an integer. Default 0. + * @param y The y coordinate of the top-left of the region. Must lay within the dimensions of this CanvasTexture and be an integer. Default 0. + * @param width The width of the region to get. Must be an integer. Defaults to the canvas width if not given. + * @param height The height of the region to get. Must be an integer. If not given will be set to the `width`. + */ + getPixels(x?: number, y?: number, width?: number, height?: number): Phaser.Types.Textures.PixelConfig[][]; + + /** + * Returns the Image Data index for the given pixel in this CanvasTexture. + * + * The index can be used to read directly from the `this.data` array. + * + * The index points to the red value in the array. The subsequent 3 indexes + * point to green, blue and alpha respectively. + * @param x The x coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer. + * @param y The y coordinate of the pixel to get. Must lay within the dimensions of this CanvasTexture and be an integer. + */ + getIndex(x: number, y: number): number; + + /** + * This should be called manually if you are running under WebGL. + * It will refresh the WebGLTexture from the Canvas source. Only call this if you know that the + * canvas has changed, as there is a significant GPU texture allocation cost involved in doing so. + */ + refresh(): Phaser.Textures.CanvasTexture; + + /** + * Gets the Canvas Element. + */ + getCanvas(): HTMLCanvasElement; + + /** + * Gets the 2D Canvas Rendering Context. + */ + getContext(): CanvasRenderingContext2D; + + /** + * Clears the given region of this Canvas Texture, resetting it back to transparent. + * If no region is given, the whole Canvas Texture is cleared. + * @param x The x coordinate of the top-left of the region to clear. Default 0. + * @param y The y coordinate of the top-left of the region to clear. Default 0. + * @param width The width of the region. + * @param height The height of the region. + * @param update Update the internal ImageData buffer and arrays. Default true. + */ + clear(x?: number, y?: number, width?: number, height?: number, update?: boolean): Phaser.Textures.CanvasTexture; + + /** + * Changes the size of this Canvas Texture. + * @param width The new width of the Canvas. + * @param height The new height of the Canvas. If not given it will use the width as the height. + */ + setSize(width: number, height?: number): Phaser.Textures.CanvasTexture; + + /** + * Destroys this Texture and releases references to its sources and frames. + */ + destroy(): void; + + } + + /** + * Filter Types. + */ + enum FilterMode { + /** + * Linear filter type. + */ + LINEAR, + /** + * Nearest neighbor filter type. + */ + NEAREST, + } + + /** + * A Dynamic Texture is a special texture that allows you to draw textures, frames and most kind of + * Game Objects directly to it. + * + * You can take many complex objects and draw them to this one texture, which can then be used as the + * base texture for other Game Objects, such as Sprites. Should you then update this texture, all + * Game Objects using it will instantly be updated as well, reflecting the changes immediately. + * + * It's a powerful way to generate dynamic textures at run-time that are WebGL friendly and don't invoke + * expensive GPU uploads on each change. + * + * ```js + * const t = this.textures.addDynamicTexture('player', 64, 128); + * // draw objects to t + * this.add.sprite(x, y, 'player'); + * ``` + * + * Because this is a standard Texture within Phaser, you can add frames to it, meaning you can use it + * to generate sprite sheets, texture atlases or tile sets. + * + * Under WebGL1, a FrameBuffer, which is what this Dynamic Texture uses internally, cannot be anti-aliased. + * This means that when drawing objects such as Shapes or Graphics instances to this texture, they may appear + * to be drawn with no aliasing around the edges. This is a technical limitation of WebGL1. To get around it, + * create your shape as a texture in an art package, then draw that to this texture. + * + * Based on the assumption that you will be using this Dynamic Texture as a source for Sprites, it will + * automatically invert any drawing done to it on the y axis. If you do not require this, please call the + * `setIsSpriteTexture()` method and pass it `false` as its parameter. Do this before you start drawing + * to this texture, otherwise you will get vertically inverted frames under WebGL. This isn't required + * for Canvas. + */ + class DynamicTexture extends Phaser.Textures.Texture { + /** + * + * @param manager A reference to the Texture Manager this Texture belongs to. + * @param key The unique string-based key of this Texture. + * @param width The width of this Dymamic Texture in pixels. Defaults to 256 x 256. Default 256. + * @param height The height of this Dymamic Texture in pixels. Defaults to 256 x 256. Default 256. + */ + constructor(manager: Phaser.Textures.TextureManager, key: string, width?: number, height?: number); + + /** + * The internal data type of this object. + */ + readonly type: string; + + /** + * A reference to either the Canvas or WebGL Renderer that the Game instance is using. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The width of this Dynamic Texture. + * + * Treat this property as read-only. Use the `setSize` method to change the size. + */ + width: number; + + /** + * The height of this Dynamic Texture. + * + * Treat this property as read-only. Use the `setSize` method to change the size. + */ + height: number; + + /** + * This flag is set to 'true' during `beginDraw` and reset to 'false` in `endDraw`, + * allowing you to determine if this Dynamic Texture is batch drawing, or not. + */ + readonly isDrawing: boolean; + + /** + * A reference to the Rendering Context belonging to the Canvas Element this Dynamic Texture is drawing to. + */ + canvas: HTMLCanvasElement; + + /** + * The 2D Canvas Rendering Context. + */ + readonly context: CanvasRenderingContext2D; + + /** + * Is this Dynamic Texture dirty or not? If not it won't spend time clearing or filling itself. + */ + dirty: boolean; + + /** + * Is this Dynamic Texture being used as the base texture for a Sprite Game Object? + * + * This is enabled by default, as we expect that will be the core use for Dynamic Textures. + * + * However, to disable it, call `RenderTexture.setIsSpriteTexture(false)`. + * + * You should do this _before_ drawing to this texture, so that it correctly + * inverses the frames for WebGL rendering. Not doing so will result in vertically flipped frames. + * + * This property is used in the `endDraw` method. + */ + isSpriteTexture: boolean; + + /** + * An internal Camera that can be used to move around this Dynamic Texture. + * + * Control it just like you would any Scene Camera. The difference is that it only impacts + * the placement of **Game Objects** (not textures) that you then draw to this texture. + * + * You can scroll, zoom and rotate this Camera. + */ + camera: Phaser.Cameras.Scene2D.BaseCamera; + + /** + * The Render Target that belongs to this Dynamic Texture. + * + * A Render Target encapsulates a framebuffer and texture for the WebGL Renderer. + * + * This property remains `null` under Canvas. + */ + renderTarget: Phaser.Renderer.WebGL.RenderTarget; + + /** + * A reference to the WebGL Single Pipeline. + * + * This property remains `null` under Canvas. + */ + pipeline: Phaser.Renderer.WebGL.Pipelines.SinglePipeline; + + /** + * Resizes this Dynamic Texture to the new dimensions given. + * + * In WebGL it will destroy and then re-create the frame buffer being used by this Dynamic Texture. + * In Canvas it will resize the underlying canvas DOM element. + * + * Both approaches will erase everything currently drawn to this texture. + * + * If the dimensions given are the same as those already being used, calling this method will do nothing. + * @param width The new width of this Dynamic Texture. + * @param height The new height of this Dynamic Texture. If not specified, will be set the same as the `width`. Default width. + */ + setSize(width: number, height?: number): this; + + /** + * Links the WebGL Textures used by this Dynamic Texture to its Render Target. + * + * This method is called internally by the Dynamic Texture when it is first created, + * or if you change its size. + */ + setFromRenderTarget(): this; + + /** + * If you are planning on using this Render Texture as a base texture for Sprite + * Game Objects, then you should call this method with a value of `true` before + * drawing anything to it, otherwise you will get inverted frames in WebGL. + * @param value Is this Render Target being used as a Sprite Texture, or not? + */ + setIsSpriteTexture(value: boolean): this; + + /** + * Fills this Dynamic Texture with the given color. + * + * By default it will fill the entire texture, however you can set it to fill a specific + * rectangular area by using the x, y, width and height arguments. + * + * The color should be given in hex format, i.e. 0xff0000 for red, 0x00ff00 for green, etc. + * @param rgb The color to fill this Dynamic Texture with, such as 0xff0000 for red. + * @param alpha The alpha value used by the fill. Default 1. + * @param x The left coordinate of the fill rectangle. Default 0. + * @param y The top coordinate of the fill rectangle. Default 0. + * @param width The width of the fill rectangle. Default this.width. + * @param height The height of the fill rectangle. Default this.height. + */ + fill(rgb: number, alpha?: number, x?: number, y?: number, width?: number, height?: number): this; + + /** + * Fully clears this Dynamic Texture, erasing everything from it and resetting it back to + * a blank, transparent, texture. + */ + clear(): this; + + /** + * Takes the given texture key and frame and then stamps it at the given + * x and y coordinates. You can use the optional 'config' argument to provide + * lots more options about how the stamp is applied, including the alpha, + * tint, angle, scale and origin. + * + * By default, the frame will stamp on the x/y coordinates based on its center. + * + * If you wish to stamp from the top-left, set the config `originX` and + * `originY` properties both to zero. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. Set to `null` to skip this argument if not required. + * @param x The x position to draw the frame at. Default 0. + * @param y The y position to draw the frame at. Default 0. + * @param config The stamp configuration object, allowing you to set the alpha, tint, angle, scale and origin of the stamp. + */ + stamp(key: string, frame?: string | number, x?: number, y?: number, config?: Phaser.Types.Textures.StampConfig): this; + + /** + * Draws the given object, or an array of objects, to this Dynamic Texture using a blend mode of ERASE. + * This has the effect of erasing any filled pixels present in the objects from this texture. + * + * It can accept any of the following: + * + * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite. + * * Tilemap Layers. + * * A Group. The contents of which will be iterated and drawn in turn. + * * A Container. The contents of which will be iterated fully, and drawn in turn. + * * A Scene Display List. Pass in `Scene.children` to draw the whole list. + * * Another Dynamic Texture, or a Render Texture. + * * A Texture Frame instance. + * * A string. This is used to look-up the texture from the Texture Manager. + * + * Note: You cannot erase a Dynamic Texture from itself. + * + * If passing in a Group or Container it will only draw children that return `true` + * when their `willRender()` method is called. I.e. a Container with 10 children, + * 5 of which have `visible=false` will only draw the 5 visible ones. + * + * If passing in an array of Game Objects it will draw them all, regardless if + * they pass a `willRender` check or not. + * + * You can pass in a string in which case it will look for a texture in the Texture + * Manager matching that string, and draw the base frame. + * + * You can pass in the `x` and `y` coordinates to draw the objects at. The use of + * the coordinates differ based on what objects are being drawn. If the object is + * a Group, Container or Display List, the coordinates are _added_ to the positions + * of the children. For all other types of object, the coordinates are exact. + * + * Calling this method causes the WebGL batch to flush, so it can write the texture + * data to the framebuffer being used internally. The batch is flushed at the end, + * after the entries have been iterated. So if you've a bunch of objects to draw, + * try and pass them in an array in one single call, rather than making lots of + * separate calls. + * + * If you are not planning on using this Dynamic Texture as a base texture for Sprite + * Game Objects, then you should set `DynamicTexture.isSpriteTexture = false` before + * calling this method, otherwise you will get vertically inverted frames in WebGL. + * @param entries Any renderable Game Object, or Group, Container, Display List, Render Texture, Texture Frame, or an array of any of these. + * @param x The x position to draw the Frame at, or the offset applied to the object. Default 0. + * @param y The y position to draw the Frame at, or the offset applied to the object. Default 0. + */ + erase(entries: any, x?: number, y?: number): this; + + /** + * Draws the given object, or an array of objects, to this Dynamic Texture. + * + * It can accept any of the following: + * + * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite. + * * Tilemap Layers. + * * A Group. The contents of which will be iterated and drawn in turn. + * * A Container. The contents of which will be iterated fully, and drawn in turn. + * * A Scene Display List. Pass in `Scene.children` to draw the whole list. + * * Another Dynamic Texture, or a Render Texture. + * * A Texture Frame instance. + * * A string. This is used to look-up the texture from the Texture Manager. + * + * Note 1: You cannot draw a Dynamic Texture to itself. + * + * Note 2: For Game Objects that have Post FX Pipelines, the pipeline _cannot_ be + * used when drawn to this texture. + * + * If passing in a Group or Container it will only draw children that return `true` + * when their `willRender()` method is called. I.e. a Container with 10 children, + * 5 of which have `visible=false` will only draw the 5 visible ones. + * + * If passing in an array of Game Objects it will draw them all, regardless if + * they pass a `willRender` check or not. + * + * You can pass in a string in which case it will look for a texture in the Texture + * Manager matching that string, and draw the base frame. If you need to specify + * exactly which frame to draw then use the method `drawFrame` instead. + * + * You can pass in the `x` and `y` coordinates to draw the objects at. The use of + * the coordinates differ based on what objects are being drawn. If the object is + * a Group, Container or Display List, the coordinates are _added_ to the positions + * of the children. For all other types of object, the coordinates are exact. + * + * The `alpha` and `tint` values are only used by Texture Frames. + * Game Objects use their own alpha and tint values when being drawn. + * + * Calling this method causes the WebGL batch to flush, so it can write the texture + * data to the framebuffer being used internally. The batch is flushed at the end, + * after the entries have been iterated. So if you've a bunch of objects to draw, + * try and pass them in an array in one single call, rather than making lots of + * separate calls. + * + * If you are not planning on using this Dynamic Texture as a base texture for Sprite + * Game Objects, then you should set `DynamicTexture.isSpriteTexture = false` before + * calling this method, otherwise you will get vertically inverted frames in WebGL. + * @param entries Any renderable Game Object, or Group, Container, Display List, other Render Texture, Texture Frame or an array of any of these. + * @param x The x position to draw the Frame at, or the offset applied to the object. Default 0. + * @param y The y position to draw the Frame at, or the offset applied to the object. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Game Objects use their own alpha. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. Game Objects use their own tint. WebGL only. Default 0xffffff. + */ + draw(entries: any, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Draws the Texture Frame to the Render Texture at the given position. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * ```javascript + * var rt = this.add.renderTexture(0, 0, 800, 600); + * rt.drawFrame(key, frame); + * ``` + * + * You can optionally provide a position, alpha and tint value to apply to the frame + * before it is drawn. + * + * Calling this method will cause a batch flush, so if you've got a stack of things to draw + * in a tight loop, try using the `draw` method instead. + * + * If you need to draw a Sprite to this Render Texture, use the `draw` method instead. + * + * If you are not planning on using this Dynamic Texture as a base texture for Sprite + * Game Objects, then you should set `DynamicTexture.isSpriteTexture = false` before + * calling this method, otherwise you will get vertically inverted frames in WebGL. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. Set to `null` to skip this argument if not required. + * @param x The x position to draw the frame at. Default 0. + * @param y The y position to draw the frame at. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. WebGL only. Default 0xffffff. + */ + drawFrame(key: string, frame?: string | number, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Takes the given Texture Frame and draws it to this Dynamic Texture as a fill pattern, + * i.e. in a grid-layout based on the frame dimensions. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * You can optionally provide a position, width, height, alpha and tint value to apply to + * the frames before they are drawn. The position controls the top-left where the repeating + * fill will start from. The width and height control the size of the filled area. + * + * The position can be negative if required, but the dimensions cannot. + * + * Calling this method will cause a batch flush by default. Use the `skipBatch` argument + * to disable this if this call is part of a larger batch draw. + * + * If you are not planning on using this Dynamic Texture as a base texture for Sprite + * Game Objects, then you should set `DynamicTexture.isSpriteTexture = false` before + * calling this method, otherwise you will get vertically inverted frames in WebGL. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. Set to `null` to skip this argument if not required. + * @param x The x position to start drawing the frames from (can be negative to offset). Default 0. + * @param y The y position to start drawing the frames from (can be negative to offset). Default 0. + * @param width The width of the area to repeat the frame within. Defaults to the width of this Dynamic Texture. Default this.width. + * @param height The height of the area to repeat the frame within. Defaults to the height of this Dynamic Texture. Default this.height. + * @param alpha The alpha to use. Defaults to 1, no alpha. Default 1. + * @param tint WebGL only. The tint color to use. Leave as undefined, or 0xffffff to have no tint. Default 0xffffff. + * @param skipBatch Skip beginning and ending a batch with this call. Use if this is part of a bigger batched draw. Default false. + */ + repeat(key: string, frame?: string | number, x?: number, y?: number, width?: number, height?: number, alpha?: number, tint?: number, skipBatch?: boolean): this; + + /** + * Use this method if you need to batch draw a large number of Game Objects to + * this Dynamic Texture in a single pass, or on a frequent basis. This is especially + * useful under WebGL, however, if your game is using Canvas only, it will not make + * any speed difference in that situation. + * + * This method starts the beginning of a batched draw, unless one is already open. + * + * Batched drawing is faster than calling `draw` in loop, but you must be careful + * to manage the flow of code and remember to call `endDraw()` when you're finished. + * + * If you don't need to draw large numbers of objects it's much safer and easier + * to use the `draw` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * DynamicTexture.beginDraw(); + * + * // repeat n times: + * DynamicTexture.batchDraw(); + * // or + * DynamicTexture.batchDrawFrame(); + * + * // Call once: + * DynamicTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Dynamic Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `DynamicTexture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + */ + beginDraw(): this; + + /** + * Use this method if you have already called `beginDraw` and need to batch + * draw a large number of objects to this Dynamic Texture. + * + * This method batches the drawing of the given objects to this texture, + * without causing a WebGL bind or batch flush for each one. + * + * It is faster than calling `draw`, but you must be careful to manage the + * flow of code and remember to call `endDraw()`. If you don't need to draw large + * numbers of objects it's much safer and easier to use the `draw` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * DynamicTexture.beginDraw(); + * + * // repeat n times: + * DynamicTexture.batchDraw(); + * // or + * DynamicTexture.batchDrawFrame(); + * + * // Call once: + * DynamicTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Dynamic Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `DynamicTexture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + * + * This method can accept any of the following: + * + * * Any renderable Game Object, such as a Sprite, Text, Graphics or TileSprite. + * * Tilemap Layers. + * * A Group. The contents of which will be iterated and drawn in turn. + * * A Container. The contents of which will be iterated fully, and drawn in turn. + * * A Scene's Display List. Pass in `Scene.children` to draw the whole list. + * * Another Dynamic Texture or Render Texture. + * * A Texture Frame instance. + * * A string. This is used to look-up a texture from the Texture Manager. + * + * Note: You cannot draw a Dynamic Texture to itself. + * + * If passing in a Group or Container it will only draw children that return `true` + * when their `willRender()` method is called. I.e. a Container with 10 children, + * 5 of which have `visible=false` will only draw the 5 visible ones. + * + * If passing in an array of Game Objects it will draw them all, regardless if + * they pass a `willRender` check or not. + * + * You can pass in a string in which case it will look for a texture in the Texture + * Manager matching that string, and draw the base frame. If you need to specify + * exactly which frame to draw then use the method `drawFrame` instead. + * + * You can pass in the `x` and `y` coordinates to draw the objects at. The use of + * the coordinates differ based on what objects are being drawn. If the object is + * a Group, Container or Display List, the coordinates are _added_ to the positions + * of the children. For all other types of object, the coordinates are exact. + * + * The `alpha` and `tint` values are only used by Texture Frames. + * Game Objects use their own alpha and tint values when being drawn. + * @param entries Any renderable Game Object, or Group, Container, Display List, other Dynamic or Texture, Texture Frame or an array of any of these. + * @param x The x position to draw the Frame at, or the offset applied to the object. Default 0. + * @param y The y position to draw the Frame at, or the offset applied to the object. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Game Objects use their own alpha. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. Game Objects use their own tint. WebGL only. Default 0xffffff. + */ + batchDraw(entries: any, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Use this method if you have already called `beginDraw` and need to batch + * draw a large number of texture frames to this Dynamic Texture. + * + * This method batches the drawing of the given frames to this Dynamic Texture, + * without causing a WebGL bind or batch flush for each one. + * + * It is faster than calling `drawFrame`, but you must be careful to manage the + * flow of code and remember to call `endDraw()`. If you don't need to draw large + * numbers of frames it's much safer and easier to use the `drawFrame` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * DynamicTexture.beginDraw(); + * + * // repeat n times: + * DynamicTexture.batchDraw(); + * // or + * DynamicTexture.batchDrawFrame(); + * + * // Call once: + * DynamicTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Dynamic Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `DynamicTexture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + * + * Textures are referenced by their string-based keys, as stored in the Texture Manager. + * + * You can optionally provide a position, alpha and tint value to apply to the frame + * before it is drawn. + * @param key The key of the texture to be used, as stored in the Texture Manager. + * @param frame The name or index of the frame within the Texture. + * @param x The x position to draw the frame at. Default 0. + * @param y The y position to draw the frame at. Default 0. + * @param alpha The alpha value. Only used when drawing Texture Frames to this texture. Game Objects use their own alpha. Default 1. + * @param tint The tint color value. Only used when drawing Texture Frames to this texture. Game Objects use their own tint. WebGL only. Default 0xffffff. + */ + batchDrawFrame(key: string, frame?: string | number, x?: number, y?: number, alpha?: number, tint?: number): this; + + /** + * Use this method to finish batch drawing to this Dynamic Texture. + * + * Doing so will stop the WebGL Renderer from capturing draws and then blit the + * framebuffer to the Render Target owned by this texture. + * + * Calling this method without first calling `beginDraw` will have no effect. + * + * Batch drawing is faster than calling `draw`, but you must be careful to manage the + * flow of code and remember to call `endDraw()` when you're finished. + * + * If you don't need to draw large numbers of objects it's much safer and easier + * to use the `draw` method instead. + * + * The flow should be: + * + * ```javascript + * // Call once: + * DynamicTexture.beginDraw(); + * + * // repeat n times: + * DynamicTexture.batchDraw(); + * // or + * DynamicTexture.batchDrawFrame(); + * + * // Call once: + * DynamicTexture.endDraw(); + * ``` + * + * Do not call any methods other than `batchDraw`, `batchDrawFrame`, or `endDraw` once you + * have started a batch. Also, be very careful not to destroy this Dynamic Texture while the + * batch is still open. Doing so will cause a run-time error in the WebGL Renderer. + * + * You can use the `DynamicTexture.isDrawing` boolean property to tell if a batch is + * currently open, or not. + * @param erase Draws all objects in this batch using a blend mode of ERASE. This has the effect of erasing any filled pixels in the objects being drawn. Default false. + */ + endDraw(erase?: boolean): this; + + /** + * Takes a snapshot of the given area of this Dynamic Texture. + * + * The snapshot is taken immediately, but the results are returned via the given callback. + * + * To capture the whole Dynamic Texture see the `snapshot` method. + * To capture just a specific pixel, see the `snapshotPixel` method. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer + * into an ArrayBufferView. It then parses this, copying the contents to a temporary Canvas and finally + * creating an Image object from it, which is the image returned to the callback provided. + * + * All in all, this is a computationally expensive and blocking process, which gets more expensive + * the larger the resolution this Dynamic Texture has, so please be careful how you employ this in your game. + * @param x The x coordinate to grab from. + * @param y The y coordinate to grab from. + * @param width The width of the area to grab. + * @param height The height of the area to grab. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshotArea(x: number, y: number, width: number, height: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Takes a snapshot of the whole of this Dynamic Texture. + * + * The snapshot is taken immediately, but the results are returned via the given callback. + * + * To capture a portion of this Dynamic Texture see the `snapshotArea` method. + * To capture just a specific pixel, see the `snapshotPixel` method. + * + * Snapshots work by using the WebGL `readPixels` feature to grab every pixel from the frame buffer + * into an ArrayBufferView. It then parses this, copying the contents to a temporary Canvas and finally + * creating an Image object from it, which is the image returned to the callback provided. + * + * All in all, this is a computationally expensive and blocking process, which gets more expensive + * the larger the resolution this Dynamic Texture has, so please be careful how you employ this in your game. + * @param callback The Function to invoke after the snapshot image is created. + * @param type The format of the image to create, usually `image/png` or `image/jpeg`. Default 'image/png'. + * @param encoderOptions The image quality, between 0 and 1. Used for image formats with lossy compression, such as `image/jpeg`. Default 0.92. + */ + snapshot(callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback, type?: string, encoderOptions?: number): this; + + /** + * Takes a snapshot of the given pixel from this Dynamic Texture. + * + * The snapshot is taken immediately, but the results are returned via the given callback. + * + * To capture the whole Dynamic Texture see the `snapshot` method. + * To capture a portion of this Dynamic Texture see the `snapshotArea` method. + * + * Unlike the two other snapshot methods, this one will send your callback a `Color` object + * containing the color data for the requested pixel. It doesn't need to create an internal + * Canvas or Image object, so is a lot faster to execute, using less memory than the other snapshot methods. + * @param x The x coordinate of the pixel to get. + * @param y The y coordinate of the pixel to get. + * @param callback The Function to invoke after the snapshot pixel data is extracted. + */ + snapshotPixel(x: number, y: number, callback: Phaser.Types.Renderer.Snapshot.SnapshotCallback): this; + + /** + * Returns the underlying WebGLTextureWrapper, if not running in Canvas mode. + */ + getWebGLTexture(): Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * Renders this Dynamic Texture onto the Stamp Game Object as a BitmapMask. + * @param renderer A reference to the current active WebGL renderer. + * @param src The Game Object being rendered in this call. + * @param camera The Camera that is rendering the Game Object. + * @param parentMatrix This transform matrix is defined if the game object is nested + */ + renderWebGL(renderer: Phaser.Renderer.WebGL.WebGLRenderer, src: Phaser.GameObjects.Image, camera: Phaser.Cameras.Scene2D.Camera, parentMatrix: Phaser.GameObjects.Components.TransformMatrix): void; + + /** + * This is a NOOP method. Bitmap Masks are not supported by the Canvas Renderer. + * @param renderer The Canvas Renderer which would be rendered to. + * @param mask The masked Game Object which would be rendered. + * @param camera The Camera to render to. + */ + renderCanvas(renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer, mask: Phaser.GameObjects.GameObject, camera: Phaser.Cameras.Scene2D.Camera): void; + + /** + * Destroys this Texture and releases references to its sources and frames. + */ + destroy(): void; + + } + + namespace Events { + /** + * The Texture Add Event. + * + * This event is dispatched by the Texture Manager when a texture is added to it. + * + * Listen to this event from within a Scene using: `this.textures.on('addtexture', listener)`. + */ + const ADD: string; + + /** + * The Texture Add Key Event. + * + * This event is dispatched by the Texture Manager when a texture with the given key is added to it. + * + * Listen to this event from within a Scene using: `this.textures.on('addtexture-key', listener)`. + */ + const ADD_KEY: string; + + /** + * The Texture Load Error Event. + * + * This event is dispatched by the Texture Manager when a texture it requested to load failed. + * This only happens when base64 encoded textures fail. All other texture types are loaded via the Loader Plugin. + * + * Listen to this event from within a Scene using: `this.textures.on('onerror', listener)`. + */ + const ERROR: string; + + /** + * The Texture Load Event. + * + * This event is dispatched by the Texture Manager when a texture has finished loading on it. + * This only happens for base64 encoded textures. All other texture types are loaded via the Loader Plugin. + * + * Listen to this event from within a Scene using: `this.textures.on('onload', listener)`. + * + * This event is dispatched after the [ADD]{@linkcode Phaser.Textures.Events#event:ADD} event. + */ + const LOAD: string; + + /** + * This internal event signifies that the Texture Manager is now ready and the Game can continue booting. + * + * When a Phaser Game instance is booting for the first time, the Texture Manager has to wait on a couple of non-blocking + * async events before it's fully ready to carry on. When those complete the Texture Manager emits this event via the Game + * instance, which tells the Game to carry on booting. + */ + const READY: string; + + /** + * The Texture Remove Event. + * + * This event is dispatched by the Texture Manager when a texture is removed from it. + * + * Listen to this event from within a Scene using: `this.textures.on('removetexture', listener)`. + * + * If you have any Game Objects still using the removed texture, they will start throwing + * errors the next time they try to render. Be sure to clear all use of the texture in this event handler. + */ + const REMOVE: string; + + /** + * The Texture Remove Key Event. + * + * This event is dispatched by the Texture Manager when a texture with the given key is removed from it. + * + * Listen to this event from within a Scene using: `this.textures.on('removetexture-key', listener)`. + * + * If you have any Game Objects still using the removed texture, they will start throwing + * errors the next time they try to render. Be sure to clear all use of the texture in this event handler. + */ + const REMOVE_KEY: string; + + } + + /** + * A Frame is a section of a Texture. + */ + class Frame { + /** + * + * @param texture The Texture this Frame is a part of. + * @param name The name of this Frame. The name is unique within the Texture. + * @param sourceIndex The index of the TextureSource that this Frame is a part of. + * @param x The x coordinate of the top-left of this Frame. + * @param y The y coordinate of the top-left of this Frame. + * @param width The width of this Frame. + * @param height The height of this Frame. + */ + constructor(texture: Phaser.Textures.Texture, name: number | string, sourceIndex: number, x: number, y: number, width: number, height: number); + + /** + * The Texture this Frame is a part of. + */ + texture: Phaser.Textures.Texture; + + /** + * The name of this Frame. + * The name is unique within the Texture. + */ + name: string; + + /** + * The TextureSource this Frame is part of. + */ + source: Phaser.Textures.TextureSource; + + /** + * The index of the TextureSource in the Texture sources array. + */ + sourceIndex: number; + + /** + * X position within the source image to cut from. + */ + cutX: number; + + /** + * Y position within the source image to cut from. + */ + cutY: number; + + /** + * The width of the area in the source image to cut. + */ + cutWidth: number; + + /** + * The height of the area in the source image to cut. + */ + cutHeight: number; + + /** + * The X rendering offset of this Frame, taking trim into account. + */ + x: number; + + /** + * The Y rendering offset of this Frame, taking trim into account. + */ + y: number; + + /** + * The rendering width of this Frame, taking trim into account. + */ + width: number; + + /** + * The rendering height of this Frame, taking trim into account. + */ + height: number; + + /** + * Half the width, floored. + * Precalculated for the renderer. + */ + halfWidth: number; + + /** + * Half the height, floored. + * Precalculated for the renderer. + */ + halfHeight: number; + + /** + * The x center of this frame, floored. + */ + centerX: number; + + /** + * The y center of this frame, floored. + */ + centerY: number; + + /** + * The horizontal pivot point of this Frame. + */ + pivotX: number; + + /** + * The vertical pivot point of this Frame. + */ + pivotY: number; + + /** + * Does this Frame have a custom pivot point? + */ + customPivot: boolean; + + /** + * **CURRENTLY UNSUPPORTED** + * + * Is this frame is rotated or not in the Texture? + * Rotation allows you to use rotated frames in texture atlas packing. + * It has nothing to do with Sprite rotation. + */ + rotated: boolean; + + /** + * Over-rides the Renderer setting. + * -1 = use Renderer Setting + * 0 = No rounding + * 1 = Round + */ + autoRound: number; + + /** + * Any Frame specific custom data can be stored here. + */ + customData: object; + + /** + * WebGL UV u0 value. + */ + u0: number; + + /** + * WebGL UV v0 value. + */ + v0: number; + + /** + * WebGL UV u1 value. + */ + u1: number; + + /** + * WebGL UV v1 value. + */ + v1: number; + + /** + * Sets the width, height, x and y of this Frame. + * + * This is called automatically by the constructor + * and should rarely be changed on-the-fly. + * @param width The width of the frame before being trimmed. + * @param height The height of the frame before being trimmed. + * @param x The x coordinate of the top-left of this Frame. Default 0. + * @param y The y coordinate of the top-left of this Frame. Default 0. + */ + setSize(width: number, height: number, x?: number, y?: number): this; + + /** + * If the frame was trimmed when added to the Texture Atlas, this records the trim and source data. + * @param actualWidth The width of the frame before being trimmed. + * @param actualHeight The height of the frame before being trimmed. + * @param destX The destination X position of the trimmed frame for display. + * @param destY The destination Y position of the trimmed frame for display. + * @param destWidth The destination width of the trimmed frame for display. + * @param destHeight The destination height of the trimmed frame for display. + */ + setTrim(actualWidth: number, actualHeight: number, destX: number, destY: number, destWidth: number, destHeight: number): this; + + /** + * Sets the scale9 center rectangle values. + * + * Scale9 is a feature of Texture Packer, allowing you to define a nine-slice scaling grid. + * + * This is set automatically by the JSONArray and JSONHash parsers. + * @param x The left coordinate of the center scale9 rectangle. + * @param y The top coordinate of the center scale9 rectangle. + * @param width The width of the center scale9 rectangle. + * @param height The height coordinate of the center scale9 rectangle. + */ + setScale9(x: number, y: number, width: number, height: number): this; + + /** + * Takes a crop data object and, based on the rectangular region given, calculates the + * required UV coordinates in order to crop this Frame for WebGL and Canvas rendering. + * + * The crop size as well as coordinates can not exceed the the size of the frame. + * + * This is called directly by the Game Object Texture Components `setCrop` method. + * Please use that method to crop a Game Object. + * @param crop The crop data object. This is the `GameObject._crop` property. + * @param x The x coordinate to start the crop from. Cannot be negative or exceed the Frame width. + * @param y The y coordinate to start the crop from. Cannot be negative or exceed the Frame height. + * @param width The width of the crop rectangle. Cannot exceed the Frame width. + * @param height The height of the crop rectangle. Cannot exceed the Frame height. + * @param flipX Does the parent Game Object have flipX set? + * @param flipY Does the parent Game Object have flipY set? + */ + setCropUVs(crop: object, x: number, y: number, width: number, height: number, flipX: boolean, flipY: boolean): object; + + /** + * Takes a crop data object and recalculates the UVs based on the dimensions inside the crop object. + * Called automatically by `setFrame`. + * @param crop The crop data object. This is the `GameObject._crop` property. + * @param flipX Does the parent Game Object have flipX set? + * @param flipY Does the parent Game Object have flipY set? + */ + updateCropUVs(crop: object, flipX: boolean, flipY: boolean): object; + + /** + * Directly sets the canvas and WebGL UV data for this frame. + * + * Use this if you need to override the values that are generated automatically + * when the Frame is created. + * @param width Width of this frame for the Canvas data. + * @param height Height of this frame for the Canvas data. + * @param u0 UV u0 value. + * @param v0 UV v0 value. + * @param u1 UV u1 value. + * @param v1 UV v1 value. + */ + setUVs(width: number, height: number, u0: number, v0: number, u1: number, v1: number): this; + + /** + * Updates the internal WebGL UV cache and the drawImage cache. + */ + updateUVs(): this; + + /** + * Updates the internal WebGL UV cache. + */ + updateUVsInverted(): this; + + /** + * Clones this Frame into a new Frame object. + */ + clone(): Phaser.Textures.Frame; + + /** + * Destroys this Frame by nulling its reference to the parent Texture and and data objects. + */ + destroy(): void; + + /** + * A reference to the Texture Source WebGL Texture that this Frame is using. + */ + readonly glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper; + + /** + * The width of the Frame in its un-trimmed, un-padded state, as prepared in the art package, + * before being packed. + */ + readonly realWidth: number; + + /** + * The height of the Frame in its un-trimmed, un-padded state, as prepared in the art package, + * before being packed. + */ + readonly realHeight: number; + + /** + * The radius of the Frame (derived from sqrt(w * w + h * h) / 2) + */ + readonly radius: number; + + /** + * Is the Frame trimmed or not? + */ + readonly trimmed: boolean; + + /** + * Does the Frame have scale9 border data? + */ + readonly scale9: boolean; + + /** + * If the Frame has scale9 border data, is it 3-slice or 9-slice data? + */ + readonly is3Slice: boolean; + + /** + * The Canvas drawImage data object. + */ + readonly canvasData: object; + + } + + /** + * Linear filter type. + */ + const LINEAR: number; + + /** + * Nearest Neighbor filter type. + */ + const NEAREST: number; + + namespace Parsers { + /** + * Parses a KTX format Compressed Texture file and generates texture data suitable for WebGL from it. + * @param data The data object created by the Compressed Texture File Loader. + */ + function KTXParser(data: ArrayBuffer): Phaser.Types.Textures.CompressedTextureData; + + /** + * Parses a PVR format Compressed Texture file and generates texture data suitable for WebGL from it. + * @param data The data object created by the Compressed Texture File Loader. + */ + function PVRParser(data: ArrayBuffer): Phaser.Types.Textures.CompressedTextureData; + + /** + * Verify whether the given compressed texture data is valid. + * + * Compare the dimensions of each mip layer to the rules for that + * specific format. + * + * Mip layer size is assumed to have been calculated correctly during parsing. + * @param data The compressed texture data to verify. + */ + function verifyCompressedTexture(data: Phaser.Types.Textures.CompressedTextureData): boolean; + + } + + /** + * A Texture consists of a source, usually an Image from the Cache, and a collection of Frames. + * The Frames represent the different areas of the Texture. For example a texture atlas + * may have many Frames, one for each element within the atlas. Where-as a single image would have + * just one frame, that encompasses the whole image. + * + * Every Texture, no matter where it comes from, always has at least 1 frame called the `__BASE` frame. + * This frame represents the entirety of the source image. + * + * Textures are managed by the global TextureManager. This is a singleton class that is + * responsible for creating and delivering Textures and their corresponding Frames to Game Objects. + * + * Sprites and other Game Objects get the texture data they need from the TextureManager. + */ + class Texture { + /** + * + * @param manager A reference to the Texture Manager this Texture belongs to. + * @param key The unique string-based key of this Texture. + * @param source An array of sources that are used to create the texture. Usually Images, but can also be a Canvas. + * @param width The width of the Texture. This is optional and automatically derived from the source images. + * @param height The height of the Texture. This is optional and automatically derived from the source images. + */ + constructor(manager: Phaser.Textures.TextureManager, key: string, source: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[] | Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, width?: number, height?: number); + + /** + * A reference to the Texture Manager this Texture belongs to. + */ + manager: Phaser.Textures.TextureManager; + + /** + * The unique string-based key of this Texture. + */ + key: string; + + /** + * An array of TextureSource instances. + * These are unique to this Texture and contain the actual Image (or Canvas) data. + */ + source: Phaser.Textures.TextureSource[]; + + /** + * An array of TextureSource data instances. + * Used to store additional data images, such as normal maps or specular maps. + */ + dataSource: any[]; + + /** + * A key-value object pair associating the unique Frame keys with the Frames objects. + */ + frames: object; + + /** + * Any additional data that was set in the source JSON (if any), + * or any extra data you'd like to store relating to this texture + */ + customData: object; + + /** + * The name of the first frame of the Texture. + */ + firstFrame: string; + + /** + * The total number of Frames in this Texture, including the `__BASE` frame. + * + * A Texture will always contain at least 1 frame because every Texture contains a `__BASE` frame by default, + * in addition to any extra frames that have been added to it, such as when parsing a Sprite Sheet or Texture Atlas. + */ + frameTotal: number; + + /** + * Adds a new Frame to this Texture. + * + * A Frame is a rectangular region of a TextureSource with a unique index or string-based key. + * + * The name given must be unique within this Texture. If it already exists, this method will return `null`. + * @param name The name of this Frame. The name is unique within the Texture. + * @param sourceIndex The index of the TextureSource that this Frame is a part of. + * @param x The x coordinate of the top-left of this Frame. + * @param y The y coordinate of the top-left of this Frame. + * @param width The width of this Frame. + * @param height The height of this Frame. + */ + add(name: number | string, sourceIndex: number, x: number, y: number, width: number, height: number): Phaser.Textures.Frame | null; + + /** + * Removes the given Frame from this Texture. The Frame is destroyed immediately. + * + * Any Game Objects using this Frame should stop using it _before_ you remove it, + * as it does not happen automatically. + * @param name The key of the Frame to remove. + */ + remove(name: string): boolean; + + /** + * Checks to see if a Frame matching the given key exists within this Texture. + * @param name The key of the Frame to check for. + */ + has(name: string): boolean; + + /** + * Gets a Frame from this Texture based on either the key or the index of the Frame. + * + * In a Texture Atlas Frames are typically referenced by a key. + * In a Sprite Sheet Frames are referenced by an index. + * Passing no value for the name returns the base texture. + * @param name The string-based name, or integer based index, of the Frame to get from this Texture. + */ + get(name?: string | number): Phaser.Textures.Frame; + + /** + * Takes the given TextureSource and returns the index of it within this Texture. + * If it's not in this Texture, it returns -1. + * Unless this Texture has multiple TextureSources, such as with a multi-atlas, this + * method will always return zero or -1. + * @param source The TextureSource to check. + */ + getTextureSourceIndex(source: Phaser.Textures.TextureSource): number; + + /** + * Returns an array of all the Frames in the given TextureSource. + * @param sourceIndex The index of the TextureSource to get the Frames from. + * @param includeBase Include the `__BASE` Frame in the output array? Default false. + */ + getFramesFromTextureSource(sourceIndex: number, includeBase?: boolean): Phaser.Textures.Frame[]; + + /** + * Based on the given Texture Source Index, this method will get all of the Frames using + * that source and then work out the bounds that they encompass, returning them in an object. + * + * This is useful if this Texture is, for example, a sprite sheet within an Atlas, and you + * need to know the total bounds of the sprite sheet. + * @param sourceIndex The index of the TextureSource to get the Frame bounds from. + */ + getFrameBounds(sourceIndex: number): Phaser.Types.Math.RectangleLike; + + /** + * Returns an array with all of the names of the Frames in this Texture. + * + * Useful if you want to randomly assign a Frame to a Game Object, as you can + * pick a random element from the returned array. + * @param includeBase Include the `__BASE` Frame in the output array? Default false. + */ + getFrameNames(includeBase?: boolean): string[]; + + /** + * Given a Frame name, return the source image it uses to render with. + * + * This will return the actual DOM Image or Canvas element. + * @param name The string-based name, or integer based index, of the Frame to get from this Texture. + */ + getSourceImage(name?: string | number): HTMLImageElement | HTMLCanvasElement | Phaser.GameObjects.RenderTexture; + + /** + * Given a Frame name, return the data source image it uses to render with. + * You can use this to get the normal map for an image for example. + * + * This will return the actual DOM Image. + * @param name The string-based name, or integer based index, of the Frame to get from this Texture. + */ + getDataSourceImage(name?: string | number): HTMLImageElement | HTMLCanvasElement; + + /** + * Adds a data source image to this Texture. + * + * An example of a data source image would be a normal map, where all of the Frames for this Texture + * equally apply to the normal map. + * @param data The source image. + */ + setDataSource(data: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[]): void; + + /** + * Sets the Filter Mode for this Texture. + * + * The mode can be either Linear, the default, or Nearest. + * + * For pixel-art you should use Nearest. + * + * The mode applies to the entire Texture, not just a specific Frame of it. + * @param filterMode The Filter Mode. + */ + setFilter(filterMode: Phaser.Textures.FilterMode): void; + + /** + * Destroys this Texture and releases references to its sources and frames. + */ + destroy(): void; + + } + + /** + * When Phaser boots it will create an instance of this Texture Manager class. + * + * It is a global manager that handles all textures in your game. You can access it from within + * a Scene via the `this.textures` property. + * + * Its role is as a manager for all textures that your game uses. It can create, update and remove + * textures globally, as well as parse texture data from external files, such as sprite sheets + * and texture atlases. + * + * Sprites and other texture-based Game Objects get their texture data directly from this class. + */ + class TextureManager extends Phaser.Events.EventEmitter { + /** + * + * @param game The Phaser.Game instance this Texture Manager belongs to. + */ + constructor(game: Phaser.Game); + + /** + * The Game that the Texture Manager belongs to. + * + * A game will only ever have one instance of a Texture Manager. + */ + game: Phaser.Game; + + /** + * The internal name of this manager. + */ + readonly name: string; + + /** + * This object contains all Textures that belong to this Texture Manager. + * + * Textures are identified by string-based keys, which are used as the property + * within this object. Therefore, you can access any texture directly from this + * object without any iteration. + * + * You should not typically modify this object directly, but instead use the + * methods provided by the Texture Manager to add and remove entries from it. + */ + list: object; + + /** + * An Image Game Object that belongs to this Texture Manager. + * + * Used as a drawing stamp within Dynamic Textures. + * + * This is not part of the display list and doesn't render. + */ + readonly stamp: Phaser.GameObjects.Image; + + /** + * The crop Rectangle as used by the Stamp when it needs to crop itself. + */ + stampCrop: Phaser.Geom.Rectangle; + + /** + * If this flag is `true` then the Texture Manager will never emit any + * warnings to the console log that report missing textures. + */ + silentWarnings: boolean; + + /** + * Checks the given texture key and throws a console.warn if the key is already in use, then returns false. + * + * If you wish to avoid the console.warn then use `TextureManager.exists` instead. + * @param key The texture key to check. + */ + checkKey(key: string): boolean; + + /** + * Removes a Texture from the Texture Manager and destroys it. This will immediately + * clear all references to it from the Texture Manager, and if it has one, destroy its + * WebGLTexture. This will emit a `removetexture` event. + * + * Note: If you have any Game Objects still using this texture they will start throwing + * errors the next time they try to render. Make sure that removing the texture is the final + * step when clearing down to avoid this. + * @param key The key of the Texture to remove, or a reference to it. + */ + remove(key: string | Phaser.Textures.Texture): Phaser.Textures.TextureManager; + + /** + * Removes a key from the Texture Manager but does not destroy the Texture that was using the key. + * @param key The key to remove from the texture list. + */ + removeKey(key: string): Phaser.Textures.TextureManager; + + /** + * Adds a new Texture to the Texture Manager created from the given Base64 encoded data. + * + * It works by creating an `Image` DOM object, then setting the `src` attribute to + * the given base64 encoded data. As a result, the process is asynchronous by its nature, + * so be sure to listen for the events this method dispatches before using the texture. + * @param key The unique string-based key of the Texture. + * @param data The Base64 encoded data. + */ + addBase64(key: string, data: any): this; + + /** + * Gets an existing texture frame and converts it into a base64 encoded image and returns the base64 data. + * + * You can also provide the image type and encoder options. + * + * This will only work with bitmap based texture frames, such as those created from Texture Atlases. + * It will not work with GL Texture objects, such as Shaders, or Render Textures. For those please + * see the WebGL Snapshot function instead. + * @param key The unique string-based key of the Texture. + * @param frame The string-based name, or integer based index, of the Frame to get from the Texture. + * @param type A DOMString indicating the image format. The default format type is image/png. Default 'image/png'. + * @param encoderOptions A Number between 0 and 1 indicating the image quality to use for image formats that use lossy compression such as image/jpeg and image/webp. If this argument is anything else, the default value for image quality is used. The default value is 0.92. Other arguments are ignored. Default 0.92. + */ + getBase64(key: string, frame?: string | number, type?: string, encoderOptions?: number): string; + + /** + * Adds a new Texture to the Texture Manager created from the given Image element. + * @param key The unique string-based key of the Texture. + * @param source The source Image element. + * @param dataSource An optional data Image element. + */ + addImage(key: string, source: HTMLImageElement, dataSource?: HTMLImageElement | HTMLCanvasElement): Phaser.Textures.Texture | null; + + /** + * Takes a WebGLTextureWrapper and creates a Phaser Texture from it, which is added to the Texture Manager using the given key. + * + * This allows you to then use the Texture as a normal texture for texture based Game Objects like Sprites. + * + * This is a WebGL only feature. + * + * Prior to Phaser 3.80.0, this method took a bare `WebGLTexture` + * as the `glTexture` parameter. You must now wrap the `WebGLTexture` in a + * `WebGLTextureWrapper` instance before passing it to this method. + * @param key The unique string-based key of the Texture. + * @param glTexture The source Render Texture. + */ + addGLTexture(key: string, glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper): Phaser.Textures.Texture | null; + + /** + * Adds a Compressed Texture to this Texture Manager. + * + * The texture should typically have been loaded via the `CompressedTextureFile` loader, + * in order to prepare the correct data object this method requires. + * + * You can optionally also pass atlas data to this method, in which case a texture atlas + * will be generated from the given compressed texture, combined with the atlas data. + * @param key The unique string-based key of the Texture. + * @param textureData The Compressed Texture data object. + * @param atlasData Optional Texture Atlas data. + */ + addCompressedTexture(key: string, textureData: Phaser.Types.Textures.CompressedTextureData, atlasData?: object): Phaser.Textures.Texture | null; + + /** + * Adds a Render Texture to the Texture Manager using the given key. + * This allows you to then use the Render Texture as a normal texture for texture based Game Objects like Sprites. + * @param key The unique string-based key of the Texture. + * @param renderTexture The source Render Texture. + */ + addRenderTexture(key: string, renderTexture: Phaser.GameObjects.RenderTexture): Phaser.Textures.Texture | null; + + /** + * Creates a new Texture using the given config values. + * + * Generated textures consist of a Canvas element to which the texture data is drawn. + * + * Generates a texture based on the given Create configuration object. + * + * The texture is drawn using a fixed-size indexed palette of 16 colors, where the hex value in the + * data cells map to a single color. For example, if the texture config looked like this: + * + * ```javascript + * var star = [ + * '.....828.....', + * '....72227....', + * '....82228....', + * '...7222227...', + * '2222222222222', + * '8222222222228', + * '.72222222227.', + * '..787777787..', + * '..877777778..', + * '.78778887787.', + * '.27887.78872.', + * '.787.....787.' + * ]; + * + * this.textures.generate('star', { data: star, pixelWidth: 4 }); + * ``` + * + * Then it would generate a texture that is 52 x 48 pixels in size, because each cell of the data array + * represents 1 pixel multiplied by the `pixelWidth` value. The cell values, such as `8`, maps to color + * number 8 in the palette. If a cell contains a period character `.` then it is transparent. + * + * The default palette is Arne16, but you can specify your own using the `palette` property. + * @param key The unique string-based key of the Texture. + * @param config The configuration object needed to generate the texture. + */ + generate(key: string, config: Phaser.Types.Create.GenerateTextureConfig): Phaser.Textures.Texture | null; + + /** + * Creates a new Texture using a blank Canvas element of the size given. + * + * Canvas elements are automatically pooled and calling this method will + * extract a free canvas from the CanvasPool, or create one if none are available. + * @param key The unique string-based key of the Texture. + * @param width The width of the Canvas element. Default 256. + * @param height The height of the Canvas element. Default 256. + */ + createCanvas(key: string, width?: number, height?: number): Phaser.Textures.CanvasTexture | null; + + /** + * Creates a new Canvas Texture object from an existing Canvas element + * and adds it to this Texture Manager, unless `skipCache` is true. + * @param key The unique string-based key of the Texture. + * @param source The Canvas element to form the base of the new Texture. + * @param skipCache Skip adding this Texture into the Cache? Default false. + */ + addCanvas(key: string, source: HTMLCanvasElement, skipCache?: boolean): Phaser.Textures.CanvasTexture | null; + + /** + * Creates a Dynamic Texture instance and adds itself to this Texture Manager. + * + * A Dynamic Texture is a special texture that allows you to draw textures, frames and most kind of + * Game Objects directly to it. + * + * You can take many complex objects and draw them to this one texture, which can then be used as the + * base texture for other Game Objects, such as Sprites. Should you then update this texture, all + * Game Objects using it will instantly be updated as well, reflecting the changes immediately. + * + * It's a powerful way to generate dynamic textures at run-time that are WebGL friendly and don't invoke + * expensive GPU uploads on each change. + * + * See the methods available on the `DynamicTexture` class for more details. + * + * Optionally, you can also pass a Dynamic Texture instance to this method to have + * it added to the Texture Manager. + * @param key The string-based key of this Texture. Must be unique within the Texture Manager. Or, a DynamicTexture instance. + * @param width The width of this Dynamic Texture in pixels. Defaults to 256 x 256. Ignored if an instance is passed as the key. Default 256. + * @param height The height of this Dynamic Texture in pixels. Defaults to 256 x 256. Ignored if an instance is passed as the key. Default 256. + */ + addDynamicTexture(key: string | Phaser.Textures.DynamicTexture, width?: number, height?: number): Phaser.Textures.DynamicTexture | null; + + /** + * Adds a Texture Atlas to this Texture Manager. + * + * In Phaser terminology, a Texture Atlas is a combination of an atlas image and a JSON data file, + * such as those exported by applications like Texture Packer. + * + * It can accept either JSON Array or JSON Hash formats, as exported by Texture Packer and similar software. + * + * As of Phaser 3.60 you can use this method to add a atlas data to an existing Phaser Texture. + * @param key The unique string-based key of the Texture. + * @param source The source Image element/s, or a Phaser Texture. + * @param data The Texture Atlas data/s. + * @param dataSource An optional data Image element. + */ + addAtlas(key: string, source: HTMLImageElement | HTMLImageElement[] | Phaser.Textures.Texture, data: object | object[], dataSource?: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[]): Phaser.Textures.Texture | null; + + /** + * Adds a Texture Atlas to this Texture Manager. + * + * In Phaser terminology, a Texture Atlas is a combination of an atlas image and a JSON data file, + * such as those exported by applications like Texture Packer. + * + * The frame data of the atlas must be stored in an Array within the JSON. + * + * This is known as a JSON Array in software such as Texture Packer. + * + * As of Phaser 3.60 you can use this method to add a atlas data to an existing Phaser Texture. + * @param key The unique string-based key of the Texture. + * @param source The source Image element/s, or a Phaser Texture. + * @param data The Texture Atlas data/s. + * @param dataSource An optional data Image element. + */ + addAtlasJSONArray(key: string, source: HTMLImageElement | HTMLImageElement[] | Phaser.Textures.Texture, data: object | object[], dataSource?: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[]): Phaser.Textures.Texture | null; + + /** + * Adds a Texture Atlas to this Texture Manager. + * + * In Phaser terminology, a Texture Atlas is a combination of an atlas image and a JSON data file, + * such as those exported by applications like Texture Packer. + * + * The frame data of the atlas must be stored in an Object within the JSON. + * + * This is known as a JSON Hash in software such as Texture Packer. + * + * As of Phaser 3.60 you can use this method to add a atlas data to an existing Phaser Texture. + * @param key The unique string-based key of the Texture. + * @param source The source Image element/s, or a Phaser Texture. + * @param data The Texture Atlas data/s. + * @param dataSource An optional data Image element. + */ + addAtlasJSONHash(key: string, source: HTMLImageElement | HTMLImageElement[] | Phaser.Textures.Texture, data: object | object[], dataSource?: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[]): Phaser.Textures.Texture | null; + + /** + * Adds a Texture Atlas to this Texture Manager. + * + * In Phaser terminology, a Texture Atlas is a combination of an atlas image and a data file, + * such as those exported by applications like Texture Packer. + * + * The frame data of the atlas must be stored in an XML file. + * + * As of Phaser 3.60 you can use this method to add a atlas data to an existing Phaser Texture. + * @param key The unique string-based key of the Texture. + * @param source The source Image element, or a Phaser Texture. + * @param data The Texture Atlas XML data. + * @param dataSource An optional data Image element. + */ + addAtlasXML(key: string, source: HTMLImageElement | Phaser.Textures.Texture, data: object, dataSource?: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[]): Phaser.Textures.Texture | null; + + /** + * Adds a Unity Texture Atlas to this Texture Manager. + * + * In Phaser terminology, a Texture Atlas is a combination of an atlas image and a data file, + * such as those exported by applications like Texture Packer or Unity. + * + * The frame data of the atlas must be stored in a Unity YAML file. + * + * As of Phaser 3.60 you can use this method to add a atlas data to an existing Phaser Texture. + * @param key The unique string-based key of the Texture. + * @param source The source Image element. + * @param data The Texture Atlas data. + * @param dataSource An optional data Image element. + */ + addUnityAtlas(key: string, source: HTMLImageElement, data: object, dataSource?: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[]): Phaser.Textures.Texture | null; + + /** + * Adds a Sprite Sheet to this Texture Manager. + * + * In Phaser terminology a Sprite Sheet is a texture containing different frames, but each frame is the exact + * same size and cannot be trimmed or rotated. This is different to a Texture Atlas, created by tools such as + * Texture Packer, and more akin with the fixed-frame exports you get from apps like Aseprite or old arcade + * games. + * + * As of Phaser 3.60 you can use this method to add a sprite sheet to an existing Phaser Texture. + * @param key The unique string-based key of the Texture. Give an empty string if you provide a Phaser Texture as the 2nd argument. + * @param source The source Image element, or a Phaser Texture. + * @param config The configuration object for this Sprite Sheet. + * @param dataSource An optional data Image element. + */ + addSpriteSheet(key: string, source: HTMLImageElement | Phaser.Textures.Texture, config: Phaser.Types.Textures.SpriteSheetConfig, dataSource?: HTMLImageElement | HTMLCanvasElement): Phaser.Textures.Texture | null; + + /** + * Adds a Sprite Sheet to this Texture Manager, where the Sprite Sheet exists as a Frame within a Texture Atlas. + * + * In Phaser terminology a Sprite Sheet is a texture containing different frames, but each frame is the exact + * same size and cannot be trimmed or rotated. + * @param key The unique string-based key of the Texture. + * @param config The configuration object for this Sprite Sheet. + */ + addSpriteSheetFromAtlas(key: string, config: Phaser.Types.Textures.SpriteSheetFromAtlasConfig): Phaser.Textures.Texture | null; + + /** + * Creates a texture from an array of colour data. + * + * This is only available in WebGL mode. + * + * If the dimensions provided are powers of two, the resulting texture + * will be automatically set to wrap by the WebGL Renderer. + * @param key The unique string-based key of the Texture. + * @param data The color data for the texture. + * @param width The width of the texture. + * @param height The height of the texture. + */ + addUint8Array(key: string, data: Uint8Array, width: number, height: number): Phaser.Textures.Texture | null; + + /** + * Creates a new Texture using the given source and dimensions. + * @param key The unique string-based key of the Texture. + * @param source An array of sources that are used to create the texture. Usually Images, but can also be a Canvas. + * @param width The width of the Texture. This is optional and automatically derived from the source images. + * @param height The height of the Texture. This is optional and automatically derived from the source images. + */ + create(key: string, source: HTMLImageElement | HTMLCanvasElement | HTMLImageElement[] | HTMLCanvasElement[] | Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper, width?: number, height?: number): Phaser.Textures.Texture | null; + + /** + * Checks the given key to see if a Texture using it exists within this Texture Manager. + * @param key The unique string-based key of the Texture. + */ + exists(key: string): boolean; + + /** + * Returns a Texture from the Texture Manager that matches the given key. + * + * If the key is `undefined` it will return the `__DEFAULT` Texture. + * + * If the key is an instance of a Texture, it will return the instance. + * + * If the key is an instance of a Frame, it will return the frames parent Texture instance. + * + * Finally, if the key is given, but not found, and not a Texture or Frame instance, it will return the `__MISSING` Texture. + * @param key The unique string-based key of the Texture, or a Texture, or Frame instance. + */ + get(key: string | Phaser.Textures.Texture | Phaser.Textures.Frame): Phaser.Textures.Texture; + + /** + * Takes a Texture key and Frame name and returns a clone of that Frame if found. + * @param key The unique string-based key of the Texture. + * @param frame The string or index of the Frame to be cloned. + */ + cloneFrame(key: string, frame: string | number): Phaser.Textures.Frame; + + /** + * Takes a Texture key and Frame name and returns a reference to that Frame, if found. + * @param key The unique string-based key of the Texture. + * @param frame The string-based name, or integer based index, of the Frame to get from the Texture. + */ + getFrame(key: string, frame?: string | number): Phaser.Textures.Frame; + + /** + * Parses the 'key' parameter and returns a Texture Frame instance. + * + * It can accept the following formats: + * + * 1) A string + * 2) An array where the elements are: [ key, [frame] ] + * 3) An object with the properties: { key, [frame] } + * 4) A Texture instance - which returns the default frame from the Texture + * 5) A Frame instance - returns itself + * @param key The key to be parsed. + */ + parseFrame(key: string | any[] | object | Phaser.Textures.Texture | Phaser.Textures.Frame): Phaser.Textures.Frame; + + /** + * Returns an array with all of the keys of all Textures in this Texture Manager. + * The output array will exclude the `__DEFAULT`, `__MISSING`, `__WHITE`, and `__NORMAL` keys. + */ + getTextureKeys(): string[]; + + /** + * Given a Texture and an `x` and `y` coordinate this method will return a new + * Color object that has been populated with the color and alpha values of the pixel + * at that location in the Texture. + * @param x The x coordinate of the pixel within the Texture. + * @param y The y coordinate of the pixel within the Texture. + * @param key The unique string-based key of the Texture. + * @param frame The string or index of the Frame. + */ + getPixel(x: number, y: number, key: string, frame?: string | number): Phaser.Display.Color | null; + + /** + * Given a Texture and an `x` and `y` coordinate this method will return a value between 0 and 255 + * corresponding to the alpha value of the pixel at that location in the Texture. If the coordinate + * is out of bounds it will return null. + * @param x The x coordinate of the pixel within the Texture. + * @param y The y coordinate of the pixel within the Texture. + * @param key The unique string-based key of the Texture. + * @param frame The string or index of the Frame. + */ + getPixelAlpha(x: number, y: number, key: string, frame?: string | number): number; + + /** + * Sets the given Game Objects `texture` and `frame` properties so that it uses + * the Texture and Frame specified in the `key` and `frame` arguments to this method. + * @param gameObject The Game Object the texture would be set on. + * @param key The unique string-based key of the Texture. + * @param frame The string or index of the Frame. + */ + setTexture(gameObject: Phaser.GameObjects.GameObject, key: string, frame?: string | number): Phaser.GameObjects.GameObject; + + /** + * Changes the key being used by a Texture to the new key provided. + * + * The old key is removed, allowing it to be re-used. + * + * Game Objects are linked to Textures by a reference to the Texture object, so + * all existing references will be retained. + * @param currentKey The current string-based key of the Texture you wish to rename. + * @param newKey The new unique string-based key to use for the Texture. + */ + renameTexture(currentKey: string, newKey: string): boolean; + + /** + * Passes all Textures to the given callback. + * @param callback The callback function to be sent the Textures. + * @param scope The value to use as `this` when executing the callback. + * @param args Additional arguments that will be passed to the callback, after the child. + */ + each(callback: EachTextureCallback, scope: object, ...args: any[]): void; + + /** + * Resets the internal Stamp object, ready for drawing and returns it. + * @param alpha The alpha to use. Default 1. + * @param tint WebGL only. The tint color to use. Default 0xffffff. + */ + resetStamp(alpha?: number, tint?: number): Phaser.GameObjects.Image; + + /** + * Destroys the Texture Manager and all Textures stored within it. + */ + destroy(): void; + + } + + /** + * A Texture Source is the encapsulation of the actual source data for a Texture. + * + * This is typically an Image Element, loaded from the file system or network, a Canvas Element or a Video Element. + * + * A Texture can contain multiple Texture Sources, which only happens when a multi-atlas is loaded. + */ + class TextureSource { + /** + * + * @param texture The Texture this TextureSource belongs to. + * @param source The source image data. + * @param width Optional width of the source image. If not given it's derived from the source itself. + * @param height Optional height of the source image. If not given it's derived from the source itself. + * @param flipY Sets the `UNPACK_FLIP_Y_WEBGL` flag the WebGL Texture uses during upload. Default false. + */ + constructor(texture: Phaser.Textures.Texture, source: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | Phaser.GameObjects.RenderTexture | Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | Phaser.Types.Textures.CompressedTextureData | Phaser.Textures.DynamicTexture, width?: number, height?: number, flipY?: boolean); + + /** + * A reference to the Canvas or WebGL Renderer. + */ + renderer: Phaser.Renderer.Canvas.CanvasRenderer | Phaser.Renderer.WebGL.WebGLRenderer; + + /** + * The Texture this TextureSource instance belongs to. + */ + texture: Phaser.Textures.Texture; + + /** + * The source of the image data. + * + * This is either an Image Element, a Canvas Element, a Video Element, a RenderTexture or a WebGLTextureWrapper. + * + * In Phaser 3.60 and above it can also be a Compressed Texture data object. + */ + source: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | Phaser.GameObjects.RenderTexture | Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | Phaser.Types.Textures.CompressedTextureData | Phaser.Textures.DynamicTexture; + + /** + * The image data. + * + * This is either an Image element, Canvas element, Video Element, or Uint8Array. + */ + image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | Uint8Array; + + /** + * Holds the compressed textured algorithm, or `null` if it's not a compressed texture. + * + * Prior to Phaser 3.60 this value always held `null`. + */ + compressionAlgorithm: number; + + /** + * The resolution of the source image. + */ + resolution: number; + + /** + * The width of the source image. If not specified in the constructor it will check + * the `naturalWidth` and then `width` properties of the source image. + */ + width: number; + + /** + * The height of the source image. If not specified in the constructor it will check + * the `naturalHeight` and then `height` properties of the source image. + */ + height: number; + + /** + * The Scale Mode the image will use when rendering. + * Either Linear or Nearest. + */ + scaleMode: number; + + /** + * Is the source image a Canvas Element? + */ + isCanvas: boolean; + + /** + * Is the source image a Video Element? + */ + isVideo: boolean; + + /** + * Is the source image a Render Texture? + */ + isRenderTexture: boolean; + + /** + * Is the source image a WebGLTextureWrapper? + */ + isGLTexture: boolean; + + /** + * Are the source image dimensions a power of two? + */ + isPowerOf2: boolean; + + /** + * The wrapped WebGL Texture of the source image. + * If this TextureSource is driven from a WebGLTexture already, + * then this wrapper contains a reference to that WebGLTexture. + */ + glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * Sets the `UNPACK_FLIP_Y_WEBGL` flag the WebGL Texture uses during upload. + */ + flipY: boolean; + + /** + * Creates a WebGL Texture, if required, and sets the Texture filter mode. + * @param game A reference to the Phaser Game instance. + */ + init(game: Phaser.Game): void; + + /** + * Sets the Filter Mode for this Texture. + * + * The mode can be either Linear, the default, or Nearest. + * + * For pixel-art you should use Nearest. + * @param filterMode The Filter Mode. + */ + setFilter(filterMode: Phaser.Textures.FilterMode): void; + + /** + * Sets the `UNPACK_FLIP_Y_WEBGL` flag for the WebGL Texture during texture upload. + * @param value Should the WebGL Texture be flipped on the Y axis on texture upload or not? Default true. + */ + setFlipY(value?: boolean): void; + + /** + * If this TextureSource is backed by a Canvas and is running under WebGL, + * it updates the WebGLTexture using the canvas data. + */ + update(): void; + + /** + * Destroys this Texture Source and nulls the references. + */ + destroy(): void; + + } + + } + + namespace Tilemaps { + namespace Components { + /** + * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting + * faces are used internally for optimizing collisions against tiles. This method is mostly used + * internally to optimize recalculating faces when only one tile has been changed. + * @param tileX The x coordinate. + * @param tileY The y coordinate. + * @param layer The Tilemap Layer to act upon. + */ + function CalculateFacesAt(tileX: number, tileY: number, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the + * layer. Interesting faces are used internally for optimizing collisions against tiles. This method + * is mostly used internally. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The Tilemap Layer to act upon. + */ + function CalculateFacesWithin(tileX: number, tileY: number, width: number, height: number, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Checks if the given tile coordinate is within the isometric layer bounds, or not. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param layer The Tilemap Layer to check against. + * @param camera The Camera to run the cull check against. + */ + function CheckIsoBounds(tileX: number, tileY: number, layer: Phaser.Tilemaps.LayerData, camera?: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Copies the tiles in the source rectangular area to a new destination (all specified in tile + * coordinates) within the layer. This copies all tile properties and recalculates collision + * information in the destination region. + * @param srcTileX The x coordinate of the area to copy from, in tiles, not pixels. + * @param srcTileY The y coordinate of the area to copy from, in tiles, not pixels. + * @param width The width of the area to copy, in tiles, not pixels. + * @param height The height of the area to copy, in tiles, not pixels. + * @param destTileX The x coordinate of the area to copy to, in tiles, not pixels. + * @param destTileY The y coordinate of the area to copy to, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The Tilemap Layer to act upon. + */ + function Copy(srcTileX: number, srcTileY: number, width: number, height: number, destTileX: number, destTileY: number, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Creates a Sprite for every object matching the given tile indexes in the layer. You can + * optionally specify if each tile will be replaced with a new tile after the Sprite has been + * created. This is useful if you want to lay down special tiles in a level that are converted to + * Sprites, but want to replace the tile itself with a floor tile or similar once converted. + * @param indexes The tile index, or array of indexes, to create Sprites from. + * @param replacements The tile index, or array of indexes, to change a converted tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a one-to-one mapping with the indexes array. + * @param spriteConfig The config object to pass into the Sprite creator (i.e. scene.make.sprite). + * @param scene The Scene to create the Sprites within. + * @param camera The Camera to use when determining the world XY + * @param layer The Tilemap Layer to act upon. + */ + function CreateFromTiles(indexes: number | number[], replacements: number | number[] | undefined, spriteConfig: Phaser.Types.GameObjects.Sprite.SpriteConfig, scene: Phaser.Scene, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.GameObjects.Sprite[]; + + /** + * Returns the bounds in the given orthogonal layer that are within the cameras viewport. + * This is used internally by the cull tiles function. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + */ + function CullBounds(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera): Phaser.Geom.Rectangle; + + /** + * Returns the tiles in the given layer that are within the cameras viewport. This is used internally. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + * @param outputArray An optional array to store the Tile objects within. + * @param renderOrder The rendering order constant. Default 0. + */ + function CullTiles(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera, outputArray?: any[], renderOrder?: number): Phaser.Tilemaps.Tile[]; + + /** + * Sets the tiles in the given rectangular area (in tile coordinates) of the layer with the + * specified index. Tiles will be set to collide if the given index is a colliding index. + * Collision information in the region will be recalculated. + * @param index The tile index to fill the area with. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The tile layer to use. If not given the current layer is used. + */ + function Fill(index: number, tileX: number, tileY: number, width: number, height: number, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given + * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns + * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS. + * @param callback The callback. Each tile in the given area will be passed to this + * callback as the first and only parameter. The callback should return true for tiles that pass the + * filter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The Tilemap Layer to act upon. + */ + function FilterTiles(callback: Function, context: object, tileX: number, tileY: number, width: number, height: number, filteringOptions: Phaser.Types.Tilemaps.FilteringOptions, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile[]; + + /** + * Searches the entire map layer for the first tile matching the given index, then returns that Tile + * object. If no match is found, it returns null. The search starts from the top-left tile and + * continues horizontally until it hits the end of the row, then it drops down to the next column. + * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to + * the top-left. + * @param index The tile index value to search for. + * @param skip The number of times to skip a matching tile before returning. + * @param reverse If true it will scan the layer in reverse, starting at the bottom-right. Otherwise it scans from the top-left. + * @param layer The Tilemap Layer to act upon. + */ + function FindByIndex(index: number, skip: number, reverse: boolean, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile | null; + + /** + * Find the first tile in the given rectangular area (in tile coordinates) of the layer that + * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns + * true. Similar to Array.prototype.find in vanilla JS. + * @param callback The callback. Each tile in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The Tilemap Layer to act upon. + */ + function FindTile(callback: FindTileCallback, context: object, tileX: number, tileY: number, width: number, height: number, filteringOptions: Phaser.Types.Tilemaps.FilteringOptions, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile | null; + + /** + * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given + * callback. Similar to Array.prototype.forEach in vanilla JS. + * @param callback The callback. Each tile in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The Tilemap Layer to act upon. + */ + function ForEachTile(callback: EachTileCallback, context: object, tileX: number, tileY: number, width: number, height: number, filteringOptions: Phaser.Types.Tilemaps.FilteringOptions, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Gets the correct function to use to cull tiles, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetCullTilesFunction(orientation: number): Function; + + /** + * Gets a tile at the given tile coordinates from the given layer. + * @param tileX X position to get the tile from (given in tile units, not pixels). + * @param tileY Y position to get the tile from (given in tile units, not pixels). + * @param nonNull If true getTile won't return null for empty tiles, but a Tile object with an index of -1. + * @param layer The Tilemap Layer to act upon. + */ + function GetTileAt(tileX: number, tileY: number, nonNull: boolean, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile; + + /** + * Gets a tile at the given world coordinates from the given layer. + * @param worldX X position to get the tile from (given in pixels) + * @param worldY Y position to get the tile from (given in pixels) + * @param nonNull If true, function won't return null for empty tiles, but a Tile object with an index of -1. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function GetTileAtWorldXY(worldX: number, worldY: number, nonNull: boolean, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile; + + /** + * Gets the corners of the Tile as an array of Vector2s. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function GetTileCorners(tileX: number, tileY: number, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2[]; + + /** + * Gets the correct function to use to get the tile corners, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetTileCornersFunction(orientation: number): Function; + + /** + * Gets the tiles in the given rectangular area (in tile coordinates) of the layer. + * + * This returns an array with references to the Tile instances in, so be aware of + * modifying them directly. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The Tilemap Layer to act upon. + */ + function GetTilesWithin(tileX: number, tileY: number, width: number, height: number, filteringOptions: Phaser.Types.Tilemaps.FilteringOptions, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile[]; + + /** + * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle, + * Line, Rectangle or Triangle. The shape should be in world coordinates. + * @param shape A shape in world (pixel) coordinates + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function GetTilesWithinShape(shape: Phaser.Geom.Circle | Phaser.Geom.Line | Phaser.Geom.Rectangle | Phaser.Geom.Triangle, filteringOptions: Phaser.Types.Tilemaps.FilteringOptions, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile[]; + + /** + * Gets the tiles in the given rectangular area (in world coordinates) of the layer. + * @param worldX The world x coordinate for the top-left of the area. + * @param worldY The world y coordinate for the top-left of the area. + * @param width The width of the area. + * @param height The height of the area. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param camera The Camera to use when factoring in which tiles to return. + * @param layer The Tilemap Layer to act upon. + */ + function GetTilesWithinWorldXY(worldX: number, worldY: number, width: number, height: number, filteringOptions: Phaser.Types.Tilemaps.FilteringOptions, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile[]; + + /** + * Gets the correct function to use to translate tiles, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetTileToWorldXFunction(orientation: number): Function; + + /** + * Gets the correct function to use to translate tiles, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetTileToWorldXYFunction(orientation: number): Function; + + /** + * Gets the correct function to use to translate tiles, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetTileToWorldYFunction(orientation: number): Function; + + /** + * Gets the correct function to use to translate tiles, based on the map orientation. + * + * Only orthogonal maps support this feature. + * @param orientation The Tilemap orientation constant. + */ + function GetWorldToTileXFunction(orientation: number): Function; + + /** + * Gets the correct function to use to translate tiles, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetWorldToTileXYFunction(orientation: number): Function; + + /** + * Gets the correct function to use to translate tiles, based on the map orientation. + * @param orientation The Tilemap orientation constant. + */ + function GetWorldToTileYFunction(orientation: number): Function; + + /** + * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns + * false if there is no tile or if the tile at that location has an index of -1. + * @param tileX X position to get the tile from (given in tile units, not pixels). + * @param tileY Y position to get the tile from (given in tile units, not pixels). + * @param layer The Tilemap Layer to act upon. + */ + function HasTileAt(tileX: number, tileY: number, layer: Phaser.Tilemaps.LayerData): boolean | null; + + /** + * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns + * false if there is no tile or if the tile at that location has an index of -1. + * @param worldX The X coordinate of the world position. + * @param worldY The Y coordinate of the world position. + * @param camera The Camera to use when factoring in which tiles to return. + * @param layer The Tilemap Layer to act upon. + */ + function HasTileAtWorldXY(worldX: number, worldY: number, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): boolean | null; + + /** + * Returns the bounds in the given layer that are within the camera's viewport. + * This is used internally by the cull tiles function. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + */ + function HexagonalCullBounds(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera): object; + + /** + * Returns the tiles in the given layer that are within the cameras viewport. This is used internally. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + * @param outputArray An optional array to store the Tile objects within. + * @param renderOrder The rendering order constant. Default 0. + */ + function HexagonalCullTiles(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera, outputArray?: any[], renderOrder?: number): Phaser.Tilemaps.Tile[]; + + /** + * Gets the corners of the Hexagonal Tile as an array of Vector2s. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function HexagonalGetTileCorners(tileX: number, tileY: number, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2[]; + + /** + * Converts from hexagonal tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function HexagonalTileToWorldXY(tileX: number, tileY: number, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Converts from world XY coordinates (pixels) to hexagonal tile XY coordinates (tile units), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinates down to the nearest integer. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function HexagonalWorldToTileXY(worldX: number, worldY: number, snapToFloor: boolean, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Checks if the given tile coordinates are within the bounds of the layer. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param layer The Tilemap Layer to act upon. + */ + function IsInLayerBounds(tileX: number, tileY: number, layer: Phaser.Tilemaps.LayerData): boolean; + + /** + * Returns the tiles in the given layer that are within the cameras viewport. This is used internally. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + * @param outputArray An optional array to store the Tile objects within. + * @param renderOrder The rendering order constant. Default 0. + */ + function IsometricCullTiles(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera, outputArray?: any[], renderOrder?: number): Phaser.Tilemaps.Tile[]; + + /** + * Converts from isometric tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function IsometricTileToWorldXY(tileX: number, tileY: number, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Converts from world XY coordinates (pixels) to isometric tile XY coordinates (tile units), factoring in the + * layers position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + * @param originTop Which is the active face of the isometric tile? The top (default, true), or the base? (false) Default true. + */ + function IsometricWorldToTileXY(worldX: number, worldY: number, snapToFloor: boolean, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData, originTop?: boolean): Phaser.Math.Vector2; + + /** + * Puts a tile at the given tile coordinates in the specified layer. You can pass in either an index + * or a Tile object. If you pass in a Tile, all attributes will be copied over to the specified + * location. If you pass in an index, only the index at the specified location will be changed. + * Collision information will be recalculated at the specified location. + * @param tile The index of this tile to set or a Tile object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The Tilemap Layer to act upon. + */ + function PutTileAt(tile: number | Phaser.Tilemaps.Tile, tileX: number, tileY: number, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile; + + /** + * Puts a tile at the given world coordinates (pixels) in the specified layer. You can pass in either + * an index or a Tile object. If you pass in a Tile, all attributes will be copied over to the + * specified location. If you pass in an index, only the index at the specified location will be + * changed. Collision information will be recalculated at the specified location. + * @param tile The index of this tile to set or a Tile object. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function PutTileAtWorldXY(tile: number | Phaser.Tilemaps.Tile, worldX: number, worldY: number, recalculateFaces: boolean, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile; + + /** + * Puts an array of tiles or a 2D array of tiles at the given tile coordinates in the specified + * layer. The array can be composed of either tile indexes or Tile objects. If you pass in a Tile, + * all attributes will be copied over to the specified location. If you pass in an index, only the + * index at the specified location will be changed. Collision information will be recalculated + * within the region tiles were changed. + * @param tile A row (array) or grid (2D array) of Tiles or tile indexes to place. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The Tilemap Layer to act upon. + */ + function PutTilesAt(tile: number[] | number[][] | Phaser.Tilemaps.Tile[] | Phaser.Tilemaps.Tile[][], tileX: number, tileY: number, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the + * specified layer. Each tile will receive a new index. If an array of indexes is passed in, then + * those will be used for randomly assigning new tile indexes. If an array is not provided, the + * indexes found within the region (excluding -1) will be used for randomly assigning new tile + * indexes. This method only modifies tile indexes and does not change collision information. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param indexes An array of indexes to randomly draw from during randomization. + * @param layer The Tilemap Layer to act upon. + */ + function Randomize(tileX: number, tileY: number, width: number, height: number, indexes: number[], layer: Phaser.Tilemaps.LayerData): void; + + /** + * Removes the tile at the given tile coordinates in the specified layer and updates the layer's + * collision information. + * @param tileX The x coordinate. + * @param tileY The y coordinate. + * @param replaceWithNull If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The Tilemap Layer to act upon. + */ + function RemoveTileAt(tileX: number, tileY: number, replaceWithNull: boolean, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile; + + /** + * Removes the tile at the given world coordinates in the specified layer and updates the layer's + * collision information. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param replaceWithNull If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function RemoveTileAtWorldXY(worldX: number, worldY: number, replaceWithNull: boolean, recalculateFaces: boolean, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Tilemaps.Tile; + + /** + * Draws a debug representation of the layer to the given Graphics. This is helpful when you want to + * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles + * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation + * wherever you want on the screen. + * @param graphics The target Graphics object to draw upon. + * @param styleConfig An object specifying the colors to use for the debug drawing. + * @param layer The Tilemap Layer to act upon. + */ + function RenderDebug(graphics: Phaser.GameObjects.Graphics, styleConfig: Phaser.Types.Tilemaps.DebugStyleOptions, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching + * `findIndex` and updates their index to match `newIndex`. This only modifies the index and does + * not change collision information. + * @param findIndex The index of the tile to search for. + * @param newIndex The index of the tile to replace it with. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The Tilemap Layer to act upon. + */ + function ReplaceByIndex(findIndex: number, newIndex: number, tileX: number, tileY: number, width: number, height: number, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Returns the tiles in the given layer that are within the cameras viewport. This is used internally. + * @param layer The Tilemap Layer to act upon. + * @param bounds An object containing the `left`, `right`, `top` and `bottom` bounds. + * @param renderOrder The rendering order constant. + * @param outputArray The array to store the Tile objects within. + */ + function RunCull(layer: Phaser.Tilemaps.LayerData, bounds: object, renderOrder: number, outputArray: any[]): Phaser.Tilemaps.Tile[]; + + /** + * Sets collision on the given tile or tiles within a layer by index. You can pass in either a + * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if + * collision will be enabled (true) or disabled (false). + * @param indexes Either a single tile index, or an array of tile indexes. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The Tilemap Layer to act upon. + * @param updateLayer If true, updates the current tiles on the layer. Set to false if no tiles have been placed for significant performance boost. Default true. + */ + function SetCollision(indexes: number | any[], collides: boolean, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData, updateLayer?: boolean): void; + + /** + * Sets collision on a range of tiles in a layer whose index is between the specified `start` and + * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set + * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be + * enabled (true) or disabled (false). + * @param start The first index of the tile to be set for collision. + * @param stop The last index of the tile to be set for collision. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The Tilemap Layer to act upon. + * @param updateLayer If true, updates the current tiles on the layer. Set to false if no tiles have been placed for significant performance boost. Default true. + */ + function SetCollisionBetween(start: number, stop: number, collides: boolean, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData, updateLayer?: boolean): void; + + /** + * Sets collision on all tiles in the given layer, except for tiles that have an index specified in + * the given array. The `collides` parameter controls if collision will be enabled (true) or + * disabled (false). Tile indexes not currently in the layer are not affected. + * @param indexes An array of the tile indexes to not be counted for collision. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The Tilemap Layer to act upon. + */ + function SetCollisionByExclusion(indexes: number[], collides: boolean, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property + * that matches the given properties object, its collision flag will be set. The `collides` + * parameter controls if collision will be enabled (true) or disabled (false). Passing in + * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that + * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can + * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a + * "types" property that matches any of those values, its collision flag will be updated. + * @param properties An object with tile properties and corresponding values that should be checked. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The Tilemap Layer to act upon. + */ + function SetCollisionByProperty(properties: object, collides: boolean, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Sets collision on the tiles within a layer by checking each tile's collision group data + * (typically defined in Tiled within the tileset collision editor). If any objects are found within + * a tile's collision group, the tile's colliding information will be set. The `collides` parameter + * controls if collision will be enabled (true) or disabled (false). + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The Tilemap Layer to act upon. + */ + function SetCollisionFromCollisionGroup(collides: boolean, recalculateFaces: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Internally used method to keep track of the tile indexes that collide within a layer. This + * updates LayerData.collideIndexes to either contain or not contain the given `tileIndex`. + * @param tileIndex The tile index to set the collision boolean for. + * @param collides Should the tile index collide or not? + * @param layer The Tilemap Layer to act upon. + */ + function SetLayerCollisionIndex(tileIndex: number, collides: boolean, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Internally used method to set the colliding state of a tile. This does not recalculate + * interesting faces. + * @param tile The Tile to set the collision on. + * @param collides Should the tile index collide or not? Default true. + */ + function SetTileCollision(tile: Phaser.Tilemaps.Tile, collides?: boolean): void; + + /** + * Sets a global collision callback for the given tile index within the layer. This will affect all + * tiles on this layer that have the same index. If a callback is already set for the tile index it + * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile + * at a specific location on the map then see setTileLocationCallback. + * @param indexes Either a single tile index, or an array of tile indexes to have a collision callback set for. + * @param callback The callback that will be invoked when the tile is collided with. + * @param callbackContext The context under which the callback is called. + * @param layer The Tilemap Layer to act upon. + */ + function SetTileIndexCallback(indexes: number | any[], callback: Function, callbackContext: object, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Sets a collision callback for the given rectangular area (in tile coordinates) within the layer. + * If a callback is already set for the tile index it will be replaced. Set the callback to null to + * remove it. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param callback The callback that will be invoked when the tile is collided with. + * @param callbackContext The context under which the callback is called. + * @param layer The Tilemap Layer to act upon. + */ + function SetTileLocationCallback(tileX: number, tileY: number, width: number, height: number, callback: Function, callbackContext: object, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Shuffles the tiles in a rectangular region (specified in tile coordinates) within the given + * layer. It will only randomize the tiles in that area, so if they're all the same nothing will + * appear to have changed! This method only modifies tile indexes and does not change collision + * information. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The Tilemap Layer to act upon. + */ + function Shuffle(tileX: number, tileY: number, width: number, height: number, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Returns the bounds in the given layer that are within the camera's viewport. + * This is used internally by the cull tiles function. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + */ + function StaggeredCullBounds(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera): object; + + /** + * Returns the tiles in the given layer that are within the cameras viewport. This is used internally. + * @param layer The Tilemap Layer to act upon. + * @param camera The Camera to run the cull check against. + * @param outputArray An optional array to store the Tile objects within. + * @param renderOrder The rendering order constant. Default 0. + */ + function StaggeredCullTiles(layer: Phaser.Tilemaps.LayerData, camera: Phaser.Cameras.Scene2D.Camera, outputArray?: any[], renderOrder?: number): Phaser.Tilemaps.Tile[]; + + /** + * Converts from staggered tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function StaggeredTileToWorldXY(tileX: number, tileY: number, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Converts from staggered tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the + * layers position, scale and scroll. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function StaggeredTileToWorldY(tileY: number, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): number; + + /** + * Converts from world XY coordinates (pixels) to staggered tile XY coordinates (tile units), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function StaggeredWorldToTileXY(worldX: number, worldY: number, snapToFloor: boolean, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Converts from world Y coordinates (pixels) to staggered tile Y coordinates (tile units), factoring in the + * layers position, scale and scroll. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function StaggeredWorldToTileY(worldY: number, snapToFloor: boolean, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): number; + + /** + * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching + * `indexA` and swaps then with `indexB`. This only modifies the index and does not change collision + * information. + * @param tileA First tile index. + * @param tileB Second tile index. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The Tilemap Layer to act upon. + */ + function SwapByIndex(tileA: number, tileB: number, tileX: number, tileY: number, width: number, height: number, layer: Phaser.Tilemaps.LayerData): void; + + /** + * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the + * layer's position, scale and scroll. + * @param tileX The x coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function TileToWorldX(tileX: number, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): number; + + /** + * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function TileToWorldXY(tileX: number, tileY: number, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the + * layer's position, scale and scroll. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function TileToWorldY(tileY: number, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): number; + + /** + * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the + * specified layer. Each tile will receive a new index. New indexes are drawn from the given + * weightedIndexes array. An example weighted array: + * + * [ + * { index: 6, weight: 4 }, // Probability of index 6 is 4 / 8 + * { index: 7, weight: 2 }, // Probability of index 7 would be 2 / 8 + * { index: 8, weight: 1.5 }, // Probability of index 8 would be 1.5 / 8 + * { index: 26, weight: 0.5 } // Probability of index 27 would be 0.5 / 8 + * ] + * + * The probability of any index being choose is (the index's weight) / (sum of all weights). This + * method only modifies tile indexes and does not change collision information. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param weightedIndexes An array of objects to randomly draw from during + * randomization. They should be in the form: { index: 0, weight: 4 } or + * { index: [0, 1], weight: 4 } if you wish to draw from multiple tile indexes. + * @param layer The Tilemap Layer to act upon. + */ + function WeightedRandomize(tileX: number, tileY: number, width: number, height: number, weightedIndexes: object[], layer: Phaser.Tilemaps.LayerData): void; + + /** + * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the + * layer's position, scale and scroll. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function WorldToTileX(worldX: number, snapToFloor: boolean, camera: Phaser.Cameras.Scene2D.Camera | undefined, layer: Phaser.Tilemaps.LayerData): number; + + /** + * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the + * layer's position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function WorldToTileXY(worldX: number, worldY: number, snapToFloor: boolean, point: Phaser.Math.Vector2, camera: Phaser.Cameras.Scene2D.Camera, layer: Phaser.Tilemaps.LayerData): Phaser.Math.Vector2; + + /** + * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the + * layer's position, scale and scroll. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The Tilemap Layer to act upon. + */ + function WorldToTileY(worldY: number, snapToFloor: boolean, camera: Phaser.Cameras.Scene2D.Camera | undefined, layer: Phaser.Tilemaps.LayerData): number; + + } + + /** + * Phaser Tilemap constants for orientation. + */ + enum Orientation { + /** + * Orthogonal Tilemap orientation constant. + */ + ORTHOGONAL, + /** + * Isometric Tilemap orientation constant. + */ + ISOMETRIC, + /** + * Staggered Tilemap orientation constant. + */ + STAGGERED, + /** + * Hexagonal Tilemap orientation constant. + */ + HEXAGONAL, + } + + /** + * Phaser Tilemap constants for orientation. + * + * To find out what each mode does please see [Phaser.Tilemaps.Orientation]{@link Phaser.Tilemaps.Orientation}. + */ + type OrientationType = Phaser.Tilemaps.Orientation; + + namespace Formats { + /** + * CSV Map Type + */ + var CSV: number; + + /** + * Tiled JSON Map Type + */ + var TILED_JSON: number; + + /** + * 2D Array Map Type + */ + var ARRAY_2D: number; + + /** + * Weltmeister (Impact.js) Map Type + */ + var WELTMEISTER: number; + + } + + /** + * An Image Collection is a special Tile Set containing multiple images, with no slicing into each image. + * + * Image Collections are normally created automatically when Tiled data is loaded. + */ + class ImageCollection { + /** + * + * @param name The name of the image collection in the map data. + * @param firstgid The first image index this image collection contains. + * @param width Width of widest image (in pixels). Default 32. + * @param height Height of tallest image (in pixels). Default 32. + * @param margin The margin around all images in the collection (in pixels). Default 0. + * @param spacing The spacing between each image in the collection (in pixels). Default 0. + * @param properties Custom Image Collection properties. Default {}. + */ + constructor(name: string, firstgid: number, width?: number, height?: number, margin?: number, spacing?: number, properties?: object); + + /** + * The name of the Image Collection. + */ + name: string; + + /** + * The Tiled firstgid value. + * This is the starting index of the first image index this Image Collection contains. + */ + firstgid: number; + + /** + * The width of the widest image (in pixels). + */ + readonly imageWidth: number; + + /** + * The height of the tallest image (in pixels). + */ + readonly imageHeight: number; + + /** + * The margin around the images in the collection (in pixels). + * Use `setSpacing` to change. + */ + readonly imageMarge: number; + + /** + * The spacing between each image in the collection (in pixels). + * Use `setSpacing` to change. + */ + readonly imageSpacing: number; + + /** + * Image Collection-specific properties that are typically defined in the Tiled editor. + */ + properties: object; + + /** + * The cached images that are a part of this collection. + */ + readonly images: any[]; + + /** + * The total number of images in the image collection. + */ + readonly total: number; + + /** + * Returns true if and only if this image collection contains the given image index. + * @param imageIndex The image index to search for. + */ + containsImageIndex(imageIndex: number): boolean; + + /** + * Add an image to this Image Collection. + * @param gid The gid of the image in the Image Collection. + * @param image The the key of the image in the Image Collection and in the cache. + */ + addImage(gid: number, image: string): Phaser.Tilemaps.ImageCollection; + + } + + /** + * A class for representing data about about a layer in a map. Maps are parsed from CSV, Tiled, + * etc. into this format. Tilemap and TilemapLayer objects have a reference + * to this data and use it to look up and perform operations on tiles. + */ + class LayerData { + /** + * + * @param config The Layer Data configuration object. + */ + constructor(config?: Phaser.Types.Tilemaps.LayerDataConfig); + + /** + * The name of the layer, if specified in Tiled. + */ + name: string; + + /** + * The id of the layer, as specified in the map data. + * + * Note: This is not the index of the layer in the map data, but its actual ID in Tiled. + */ + id: number; + + /** + * The x offset of where to draw from the top left. + */ + x: number; + + /** + * The y offset of where to draw from the top left. + */ + y: number; + + /** + * The width of the layer in tiles. + */ + width: number; + + /** + * The height of the layer in tiles. + */ + height: number; + + /** + * The pixel width of the tiles. + */ + tileWidth: number; + + /** + * The pixel height of the tiles. + */ + tileHeight: number; + + /** + * The base tile width. + */ + baseTileWidth: number; + + /** + * The base tile height. + */ + baseTileHeight: number; + + /** + * The layers orientation, necessary to be able to determine a tiles pixelX and pixelY as well as the layers width and height. + */ + orientation: Phaser.Tilemaps.OrientationType; + + /** + * The width in pixels of the entire layer. + */ + widthInPixels: number; + + /** + * The height in pixels of the entire layer. + */ + heightInPixels: number; + + /** + * The alpha value of the layer. + */ + alpha: number; + + /** + * Is the layer visible or not? + */ + visible: boolean; + + /** + * Layer specific properties (can be specified in Tiled) + */ + properties: object[]; + + /** + * Tile ID index map. + */ + indexes: any[]; + + /** + * Tile Collision ID index map. + */ + collideIndexes: any[]; + + /** + * An array of callbacks. + */ + callbacks: any[]; + + /** + * An array of physics bodies. + */ + bodies: any[]; + + /** + * An array of the tile data indexes. + */ + data: Phaser.Tilemaps.Tile[][]; + + /** + * A reference to the Tilemap layer that owns this data. + */ + tilemapLayer: Phaser.Tilemaps.TilemapLayer; + + /** + * The length of the horizontal sides of the hexagon. + * Only used for hexagonal orientation Tilemaps. + */ + hexSideLength: number; + + /** + * The Stagger Axis as defined in Tiled. + * + * Only used for hexagonal orientation Tilemaps. + */ + staggerAxis: string; + + /** + * The Stagger Index as defined in Tiled. + * + * Either 'odd' or 'even'. + * + * Only used for hexagonal orientation Tilemaps. + */ + staggerIndex: string; + + } + + /** + * A class for representing data about a map. Maps are parsed from CSV, Tiled, etc. into this + * format. A Tilemap object get a copy of this data and then unpacks the needed properties into + * itself. + */ + class MapData { + /** + * + * @param config The Map configuration object. + */ + constructor(config?: Phaser.Types.Tilemaps.MapDataConfig); + + /** + * The key in the Phaser cache that corresponds to the loaded tilemap data. + */ + name: string; + + /** + * The width of the entire tilemap. + */ + width: number; + + /** + * The height of the entire tilemap. + */ + height: number; + + /** + * If the map is infinite or not. + */ + infinite: boolean; + + /** + * The width of the tiles. + */ + tileWidth: number; + + /** + * The height of the tiles. + */ + tileHeight: number; + + /** + * The width in pixels of the entire tilemap. + */ + widthInPixels: number; + + /** + * The height in pixels of the entire tilemap. + */ + heightInPixels: number; + + /** + * The format of the map data. + */ + format: number; + + /** + * The orientation of the map data (i.e. orthogonal, isometric, hexagonal), default 'orthogonal'. + */ + orientation: Phaser.Tilemaps.OrientationType; + + /** + * Determines the draw order of tilemap. Default is right-down + * + * 0, or 'right-down' + * 1, or 'left-down' + * 2, or 'right-up' + * 3, or 'left-up' + */ + renderOrder: string; + + /** + * The version of the map data (as specified in Tiled). + */ + version: string; + + /** + * Map specific properties (can be specified in Tiled) + */ + properties: object; + + /** + * An array with all the layers configured to the MapData. + */ + layers: Phaser.Tilemaps.LayerData[] | Phaser.Tilemaps.ObjectLayer; + + /** + * An array of Tiled Image Layers. + */ + images: any[]; + + /** + * An object of Tiled Object Layers. + */ + objects: Phaser.Types.Tilemaps.ObjectLayerConfig[]; + + /** + * An object of collision data. Must be created as physics object or will return undefined. + */ + collision: object; + + /** + * An array of Tilesets. + */ + tilesets: Phaser.Tilemaps.Tileset[]; + + /** + * The collection of images the map uses(specified in Tiled) + */ + imageCollections: any[]; + + /** + * An array of tile instances. + */ + tiles: any[]; + + /** + * The length of the horizontal sides of the hexagon. + * + * Only used for hexagonal orientation Tilemaps. + */ + hexSideLength: number; + + /** + * The Stagger Axis as defined in Tiled. + * + * Only used for hexagonal orientation Tilemaps. + */ + staggerAxis: string; + + /** + * The Stagger Index as defined in Tiled. + * + * Either 'odd' or 'even'. + * + * Only used for hexagonal orientation Tilemaps. + */ + staggerIndex: string; + + } + + /** + * A class for representing a Tiled object layer in a map. This mirrors the structure of a Tiled + * object layer, except: + * - "x" & "y" properties are ignored since these cannot be changed in Tiled. + * - "offsetx" & "offsety" are applied to the individual object coordinates directly, so they + * are ignored as well. + * - "draworder" is ignored. + */ + class ObjectLayer { + /** + * + * @param config The data for the layer from the Tiled JSON object. + */ + constructor(config?: Phaser.Types.Tilemaps.ObjectLayerConfig); + + /** + * The name of the Object Layer. + */ + name: string; + + /** + * The id of the object layer, as specified in the map data. + */ + id: number; + + /** + * The opacity of the layer, between 0 and 1. + */ + opacity: number; + + /** + * The custom properties defined on the Object Layer, keyed by their name. + */ + properties: object; + + /** + * The type of each custom property defined on the Object Layer, keyed by its name. + */ + propertyTypes: object; + + /** + * The type of the layer, which should be `objectgroup`. + */ + type: string; + + /** + * Whether the layer is shown (`true`) or hidden (`false`). + */ + visible: boolean; + + /** + * An array of all objects on this Object Layer. + * + * Each Tiled object corresponds to a JavaScript object in this array. It has an `id` (unique), + * `name` (as assigned in Tiled), `type` (as assigned in Tiled), `rotation` (in clockwise degrees), + * `properties` (if any), `visible` state (`true` if visible, `false` otherwise), + * `x` and `y` coordinates (in pixels, relative to the tilemap), and a `width` and `height` (in pixels). + * + * An object tile has a `gid` property (GID of the represented tile), a `flippedHorizontal` property, + * a `flippedVertical` property, and `flippedAntiDiagonal` property. + * The {@link http://docs.mapeditor.org/en/latest/reference/tmx-map-format/|Tiled documentation} contains + * information on flipping and rotation. + * + * Polylines have a `polyline` property, which is an array of objects corresponding to points, + * where each point has an `x` property and a `y` property. Polygons have an identically structured + * array in their `polygon` property. Text objects have a `text` property with the text's properties. + * + * Rectangles and ellipses have a `rectangle` or `ellipse` property set to `true`. + */ + objects: Phaser.Types.Tilemaps.TiledObject[]; + + } + + /** + * The ObjectHelper helps tie objects with `gids` into the tileset + * that sits behind them. + */ + class ObjectHelper { + /** + * + * @param tilesets The backing tileset data. + */ + constructor(tilesets: Phaser.Tilemaps.Tileset[]); + + /** + * The Tile GIDs array. + */ + gids: any[]; + + /** + * Enabled if the object helper reaches in to tilesets for data. + * Disabled if it only uses data directly on a gid object. + */ + enabled: boolean; + + /** + * Gets the Tiled `type` field value from the object or the `gid` behind it. + * @param obj The Tiled object to investigate. + */ + getTypeIncludingTile(obj: Phaser.Types.Tilemaps.TiledObject): string | null; + + /** + * Sets the sprite texture data as specified (usually in a config) or, failing that, + * as specified in the `gid` of the object being loaded (if any). + * + * This fallback will only work if the tileset was loaded as a spritesheet matching + * the geometry of sprites fed into tiled, so that, for example: "tile id #`3`"" within + * the tileset is the same as texture frame `3` from the image of the tileset. + * @param sprite The Game Object to modify. + * @param key The texture key to set (or else the `obj.gid`'s tile is used if available). + * @param frame The frames key to set (or else the `obj.gid`'s tile is used if available). + * @param obj The Tiled object for fallback. + */ + setTextureAndFrame(sprite: Phaser.GameObjects.GameObject, key?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame, obj?: Phaser.Types.Tilemaps.TiledObject): void; + + /** + * Sets the `sprite.data` field from the tiled properties on the object and its tile (if any). + */ + setPropertiesFromTiledObject(sprite: Phaser.GameObjects.GameObject, obj: Phaser.Types.Tilemaps.TiledObject): void; + + } + + namespace Parsers { + /** + * Get the Tilemap orientation from the given string. + * @param orientation The orientation type as a string. + */ + function FromOrientationString(orientation?: string): Phaser.Tilemaps.OrientationType; + + namespace Impact { + /** + * Parses all tilemap layers in an Impact JSON object into new LayerData objects. + * @param json The Impact JSON object. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled (see {@link Phaser.Tilemaps.Parsers.Tiled.ParseJSONTiled}). + */ + function ParseTileLayers(json: object, insertNull: boolean): Phaser.Tilemaps.LayerData[]; + + /** + * Tilesets and Image Collections + * @param json The Impact JSON data. + */ + function ParseTilesets(json: object): any[]; + + /** + * Parses a Weltmeister JSON object into a new MapData object. + * @param name The name of the tilemap, used to set the name on the MapData. + * @param json The Weltmeister JSON object. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. + */ + function ParseWeltmeister(name: string, json: object, insertNull: boolean): Phaser.Tilemaps.MapData | null; + + } + + /** + * Parses raw data of a given Tilemap format into a new MapData object. If no recognized data format + * is found, returns `null`. When loading from CSV or a 2D array, you should specify the tileWidth & + * tileHeight. When parsing from a map from Tiled, the tileWidth & tileHeight will be pulled from + * the map data. + * @param name The name of the tilemap, used to set the name on the MapData. + * @param mapFormat See ../Formats.js. + * @param data 2D array, CSV string or Tiled JSON object. + * @param tileWidth The width of a tile in pixels. Required for 2D array and CSV, but + * ignored for Tiled JSON. + * @param tileHeight The height of a tile in pixels. Required for 2D array and CSV, but + * ignored for Tiled JSON. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. + */ + function Parse(name: string, mapFormat: number, data: number[][] | string | object, tileWidth: number, tileHeight: number, insertNull: boolean): Phaser.Tilemaps.MapData; + + /** + * Parses a 2D array of tile indexes into a new MapData object with a single layer. + * @param name The name of the tilemap, used to set the name on the MapData. + * @param data 2D array, CSV string or Tiled JSON object. + * @param tileWidth The width of a tile in pixels. + * @param tileHeight The height of a tile in pixels. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. + */ + function Parse2DArray(name: string, data: number[][], tileWidth: number, tileHeight: number, insertNull: boolean): Phaser.Tilemaps.MapData; + + /** + * Parses a CSV string of tile indexes into a new MapData object with a single layer. + * @param name The name of the tilemap, used to set the name on the MapData. + * @param data CSV string of tile indexes. + * @param tileWidth The width of a tile in pixels. + * @param tileHeight The height of a tile in pixels. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. + */ + function ParseCSV(name: string, data: string, tileWidth: number, tileHeight: number, insertNull: boolean): Phaser.Tilemaps.MapData; + + namespace Tiled { + /** + * Copy properties from tileset to tiles. + * @param mapData The Map Data object. + */ + function AssignTileProperties(mapData: Phaser.Tilemaps.MapData): void; + + /** + * Decode base-64 encoded data, for example as exported by Tiled. + * @param data Base-64 encoded data to decode. + */ + function Base64Decode(data: object): any[]; + + /** + * Master list of tiles -> x, y, index in tileset. + * @param mapData The Map Data object. + */ + function BuildTilesetIndex(mapData: Phaser.Tilemaps.MapData | Phaser.Tilemaps.Tilemap): any[]; + + /** + * Parse a Tiled group layer and create a state object for inheriting. + * @param json The Tiled JSON object. + * @param group The current group layer from the Tiled JSON file. + * @param parentState The state of the parent group (if any). + */ + function CreateGroupLayer(json: object, group?: object, parentState?: object): object; + + /** + * See Tiled documentation on tile flipping: + * http://docs.mapeditor.org/en/latest/reference/tmx-map-format/ + * @param gid A Tiled GID. + */ + function ParseGID(gid: number): Phaser.Types.Tilemaps.GIDData; + + /** + * Parses a Tiled JSON object into an array of objects with details about the image layers. + * @param json The Tiled JSON object. + */ + function ParseImageLayers(json: object): any[]; + + /** + * Parses a Tiled JSON object into a new MapData object. + * @param name The name of the tilemap, used to set the name on the MapData. + * @param source The original Tiled JSON object. This is deep copied by this function. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. + */ + function ParseJSONTiled(name: string, source: object, insertNull: boolean): Phaser.Tilemaps.MapData | null; + + /** + * Convert a Tiled object to an internal parsed object normalising and copying properties over, while applying optional x and y offsets. The parsed object will always have the properties `id`, `name`, `type`, `rotation`, `properties`, `visible`, `x`, `y`, `width` and `height`. Other properties will be added according to the object type (such as text, polyline, gid etc.) + * @param tiledObject Tiled object to convert to an internal parsed object normalising and copying properties over. + * @param offsetX Optional additional offset to apply to the object's x property. Defaults to 0. Default 0. + * @param offsetY Optional additional offset to apply to the object's y property. Defaults to 0. Default 0. + */ + function ParseObject(tiledObject: object, offsetX?: number, offsetY?: number): object; + + /** + * Parses a Tiled JSON object into an array of ObjectLayer objects. + * @param json The Tiled JSON object. + */ + function ParseObjectLayers(json: object): any[]; + + /** + * Parses all tilemap layers in a Tiled JSON object into new LayerData objects. + * @param json The Tiled JSON object. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the map + * data are handled (see {@link Phaser.Tilemaps.Parsers.Tiled.ParseJSONTiled}). + */ + function ParseTileLayers(json: object, insertNull: boolean): Phaser.Tilemaps.LayerData[]; + + /** + * Tilesets and Image Collections. + * @param json The Tiled JSON data. + */ + function ParseTilesets(json: object): object; + + /** + * Parses out the Wangset information from Tiled 1.1.5+ map data, if present. + * + * Since a given tile can be in more than one wangset, the resulting properties + * are nested. `tile.data.wangid[someWangsetName]` will return the array-based wang id in + * this implementation. + * + * Note that we're not guaranteed that there will be any 'normal' tiles if the only + * thing in the tilset are wangtile definitions, so this has to be parsed separately. + * + * See https://doc.mapeditor.org/en/latest/manual/using-wang-tiles/ for more information. + * @param wangsets The array of wangset objects (parsed from JSON) + * @param datas The field into which to put wangset data from Tiled. + */ + function ParseWangsets(wangsets: object[], datas: object): object; + + } + + } + + /** + * Create a Tilemap from the given key or data. If neither is given, make a blank Tilemap. When + * loading from CSV or a 2D array, you should specify the tileWidth & tileHeight. When parsing from + * a map from Tiled, the tileWidth, tileHeight, width & height will be pulled from the map data. For + * an empty map, you should specify tileWidth, tileHeight, width & height. + * @param scene The Scene to which this Tilemap belongs. + * @param key The key in the Phaser cache that corresponds to the loaded tilemap data. + * @param tileWidth The width of a tile in pixels. Default 32. + * @param tileHeight The height of a tile in pixels. Default 32. + * @param width The width of the map in tiles. Default 10. + * @param height The height of the map in tiles. Default 10. + * @param data Instead of loading from the cache, you can also load directly from + * a 2D array of tile indexes. + * @param insertNull Controls how empty tiles, tiles with an index of -1, in the + * map data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty + * location will get a Tile object with an index of -1. If you've a large sparsely populated map and + * the tile data doesn't need to change then setting this value to `true` will help with memory + * consumption. However if your map is small or you need to update the tiles dynamically, then leave + * the default value set. Default false. + */ + function ParseToTilemap(scene: Phaser.Scene, key?: string, tileWidth?: number, tileHeight?: number, width?: number, height?: number, data?: number[][], insertNull?: boolean): Phaser.Tilemaps.Tilemap; + + /** + * A Tile is a representation of a single tile within the Tilemap. This is a lightweight data + * representation, so its position information is stored without factoring in scroll, layer + * scale or layer position. + */ + class Tile implements Phaser.GameObjects.Components.AlphaSingle, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.Visible { + /** + * + * @param layer The LayerData object in the Tilemap that this tile belongs to. + * @param index The unique index of this tile within the map. + * @param x The x coordinate of this tile in tile coordinates. + * @param y The y coordinate of this tile in tile coordinates. + * @param width Width of the tile in pixels. + * @param height Height of the tile in pixels. + * @param baseWidth The base width a tile in the map (in pixels). Tiled maps support + * multiple tileset sizes within one map, but they are still placed at intervals of the base + * tile width. + * @param baseHeight The base height of the tile in pixels (in pixels). Tiled maps + * support multiple tileset sizes within one map, but they are still placed at intervals of the + * base tile height. + */ + constructor(layer: Phaser.Tilemaps.LayerData, index: number, x: number, y: number, width: number, height: number, baseWidth: number, baseHeight: number); + + /** + * The LayerData in the Tilemap data that this tile belongs to. + */ + layer: Phaser.Tilemaps.LayerData; + + /** + * The index of this tile within the map data corresponding to the tileset, or -1 if this + * represents a blank tile. + */ + index: number; + + /** + * The x map coordinate of this tile in tile units. + */ + x: number; + + /** + * The y map coordinate of this tile in tile units. + */ + y: number; + + /** + * The width of the tile in pixels. + */ + width: number; + + /** + * The height of the tile in pixels. + */ + height: number; + + /** + * The right of the tile in pixels. + * + * Set in the `updatePixelXY` method. + */ + right: number; + + /** + * The bottom of the tile in pixels. + * + * Set in the `updatePixelXY` method. + */ + bottom: number; + + /** + * The maps base width of a tile in pixels. Tiled maps support multiple tileset sizes + * within one map, but they are still placed at intervals of the base tile size. + */ + baseWidth: number; + + /** + * The maps base height of a tile in pixels. Tiled maps support multiple tileset sizes + * within one map, but they are still placed at intervals of the base tile size. + */ + baseHeight: number; + + /** + * The x coordinate of the top left of this tile in pixels. This is relative to the top left + * of the layer this tile is being rendered within. This property does NOT factor in camera + * scroll, layer scale or layer position. + */ + pixelX: number; + + /** + * The y coordinate of the top left of this tile in pixels. This is relative to the top left + * of the layer this tile is being rendered within. This property does NOT factor in camera + * scroll, layer scale or layer position. + */ + pixelY: number; + + /** + * Tile specific properties. These usually come from Tiled. + */ + properties: any; + + /** + * The rotation angle of this tile. + */ + rotation: number; + + /** + * Whether the tile should collide with any object on the left side. + * + * This property is used by Arcade Physics only, however, you can also use it + * in your own checks. + */ + collideLeft: boolean; + + /** + * Whether the tile should collide with any object on the right side. + * + * This property is used by Arcade Physics only, however, you can also use it + * in your own checks. + */ + collideRight: boolean; + + /** + * Whether the tile should collide with any object on the top side. + * + * This property is used by Arcade Physics only, however, you can also use it + * in your own checks. + */ + collideUp: boolean; + + /** + * Whether the tile should collide with any object on the bottom side. + * + * This property is used by Arcade Physics only, however, you can also use it + * in your own checks. + */ + collideDown: boolean; + + /** + * Whether the tiles left edge is interesting for collisions. + */ + faceLeft: boolean; + + /** + * Whether the tiles right edge is interesting for collisions. + */ + faceRight: boolean; + + /** + * Whether the tiles top edge is interesting for collisions. + */ + faceTop: boolean; + + /** + * Whether the tiles bottom edge is interesting for collisions. + */ + faceBottom: boolean; + + /** + * Tile collision callback. + */ + collisionCallback: Function; + + /** + * The context in which the collision callback will be called. + */ + collisionCallbackContext: object; + + /** + * The tint to apply to this tile. Note: tint is currently a single color value instead of + * the 4 corner tint component on other GameObjects. + */ + tint: number; + + /** + * The tint fill mode. + * + * `false` = An additive tint (the default), where vertices colors are blended with the texture. + * `true` = A fill tint, where the vertices colors replace the texture, but respects texture alpha. + */ + tintFill: boolean; + + /** + * An empty object where physics-engine specific information (e.g. bodies) may be stored. + */ + physics: object; + + /** + * Check if the given x and y world coordinates are within this Tile. This does not factor in + * camera scroll, layer scale or layer position. + * @param x The x coordinate to test. + * @param y The y coordinate to test. + */ + containsPoint(x: number, y: number): boolean; + + /** + * Copies the tile data and properties from the given Tile to this Tile. This copies everything + * except for position and interesting face calculations. + * @param tile The tile to copy from. + */ + copy(tile: Phaser.Tilemaps.Tile): this; + + /** + * The collision group for this Tile, defined within the Tileset. This returns a reference to + * the collision group stored within the Tileset, so any modification of the returned object + * will impact all tiles that have the same index as this tile. + */ + getCollisionGroup(): object | null; + + /** + * The tile data for this Tile, defined within the Tileset. This typically contains Tiled + * collision data, tile animations and terrain information. This returns a reference to the tile + * data stored within the Tileset, so any modification of the returned object will impact all + * tiles that have the same index as this tile. + */ + getTileData(): object | null; + + /** + * Gets the world X position of the left side of the tile, factoring in the layers position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + */ + getLeft(camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Gets the world X position of the right side of the tile, factoring in the layer's position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + */ + getRight(camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Gets the world Y position of the top side of the tile, factoring in the layer's position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + */ + getTop(camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Gets the world Y position of the bottom side of the tile, factoring in the layer's position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + */ + getBottom(camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Gets the world rectangle bounding box for the tile, factoring in the layers position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + * @param output Optional Rectangle object to store the results in. + */ + getBounds(camera?: Phaser.Cameras.Scene2D.Camera, output?: Phaser.Geom.Rectangle): Phaser.Geom.Rectangle | object; + + /** + * Gets the world X position of the center of the tile, factoring in the layer's position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + */ + getCenterX(camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Gets the world Y position of the center of the tile, factoring in the layer's position, + * scale and scroll. + * @param camera The Camera to use to perform the check. + */ + getCenterY(camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Check for intersection with this tile. This does not factor in camera scroll, layer scale or + * layer position. + * @param x The x axis in pixels. + * @param y The y axis in pixels. + * @param right The right point. + * @param bottom The bottom point. + */ + intersects(x: number, y: number, right: number, bottom: number): boolean; + + /** + * Checks if the tile is interesting. + * @param collides If true, will consider the tile interesting if it collides on any side. + * @param faces If true, will consider the tile interesting if it has an interesting face. + */ + isInteresting(collides: boolean, faces: boolean): boolean; + + /** + * Reset collision status flags. + * @param recalculateFaces Whether or not to recalculate interesting faces for this tile and its neighbors. Default true. + */ + resetCollision(recalculateFaces?: boolean): this; + + /** + * Reset faces. + */ + resetFaces(): this; + + /** + * Sets the collision flags for each side of this tile and updates the interesting faces list. + * @param left Indicating collide with any object on the left. + * @param right Indicating collide with any object on the right. + * @param up Indicating collide with any object on the top. + * @param down Indicating collide with any object on the bottom. + * @param recalculateFaces Whether or not to recalculate interesting faces for this tile and its neighbors. Default true. + */ + setCollision(left: boolean, right?: boolean, up?: boolean, down?: boolean, recalculateFaces?: boolean): this; + + /** + * Set a callback to be called when this tile is hit by an object. The callback must true for + * collision processing to take place. + * @param callback Callback function. + * @param context Callback will be called within this context. + */ + setCollisionCallback(callback: Function, context: object): this; + + /** + * Sets the size of the tile and updates its pixelX and pixelY. + * @param tileWidth The width of the tile in pixels. + * @param tileHeight The height of the tile in pixels. + * @param baseWidth The base width a tile in the map (in pixels). + * @param baseHeight The base height of the tile in pixels (in pixels). + */ + setSize(tileWidth: number, tileHeight: number, baseWidth: number, baseHeight: number): this; + + /** + * Used internally. Updates the tiles world XY position based on the current tile size. + */ + updatePixelXY(): this; + + /** + * Clean up memory. + */ + destroy(): void; + + /** + * True if this tile can collide on any of its faces or has a collision callback set. + */ + readonly canCollide: boolean; + + /** + * True if this tile can collide on any of its faces. + */ + readonly collides: boolean; + + /** + * True if this tile has any interesting faces. + */ + readonly hasInterestingFace: boolean; + + /** + * The tileset that contains this Tile. This is null if accessed from a LayerData instance + * before the tile is placed in a TilemapLayer, or if the tile has an index that doesn't correspond + * to any of the maps tilesets. + */ + readonly tileset: Phaser.Tilemaps.Tileset | null; + + /** + * The tilemap layer that contains this Tile. This will only return null if accessed from a + * LayerData instance before the tile is placed within a TilemapLayer. + */ + readonly tilemapLayer: Phaser.Tilemaps.TilemapLayer | null; + + /** + * The tilemap that contains this Tile. This will only return null if accessed from a LayerData + * instance before the tile is placed within a TilemapLayer. + */ + readonly tilemap: Phaser.Tilemaps.Tilemap | null; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * @param value The alpha value applied across the whole Game Object. Default 1. + */ + setAlpha(value?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + } + + /** + * A Tilemap is a container for Tilemap data. This isn't a display object, rather, it holds data + * about the map and allows you to add tilesets and tilemap layers to it. A map can have one or + * more tilemap layers, which are the display objects that actually render the tiles. + * + * The Tilemap data can be parsed from a Tiled JSON file, a CSV file or a 2D array. Tiled is a free + * software package specifically for creating tile maps, and is available from: + * http://www.mapeditor.org + * + * As of Phaser 3.50.0 the Tilemap API now supports the following types of map: + * + * 1) Orthogonal + * 2) Isometric + * 3) Hexagonal + * 4) Staggered + * + * Prior to this release, only orthogonal maps were supported. + * + * Another large change in 3.50 was the consolidation of Tilemap Layers. Previously, you created + * either a Static or Dynamic Tilemap Layer. However, as of 3.50 the features of both have been + * merged and the API simplified, so now there is just the single `TilemapLayer` class. + * + * A Tilemap has handy methods for getting and manipulating the tiles within a layer, allowing + * you to build or modify the tilemap data at runtime. + * + * Note that all Tilemaps use a base tile size to calculate dimensions from, but that a + * TilemapLayer may have its own unique tile size that overrides this. + * + * As of Phaser 3.21.0, if your tilemap includes layer groups (a feature of Tiled 1.2.0+) these + * will be traversed and the following properties will impact children: + * + * - Opacity (blended with parent) and visibility (parent overrides child) + * - Vertical and horizontal offset + * + * The grouping hierarchy is not preserved and all layers will be flattened into a single array. + * + * Group layers are parsed during Tilemap construction but are discarded after parsing so dynamic + * layers will NOT continue to be affected by a parent. + * + * To avoid duplicate layer names, a layer that is a child of a group layer will have its parent + * group name prepended with a '/'. For example, consider a group called 'ParentGroup' with a + * child called 'Layer 1'. In the Tilemap object, 'Layer 1' will have the name + * 'ParentGroup/Layer 1'. + * + * The Phaser Tiled Parser does **not** support the 'Collection of Images' feature for a Tileset. + * You must ensure all of your tiles are contained in a single tileset image file (per layer) + * and have this 'embedded' in the exported Tiled JSON map data. + */ + class Tilemap { + /** + * + * @param scene The Scene to which this Tilemap belongs. + * @param mapData A MapData instance containing Tilemap data. + */ + constructor(scene: Phaser.Scene, mapData: Phaser.Tilemaps.MapData); + + scene: Phaser.Scene; + + /** + * The base width of a tile in pixels. Note that individual layers may have a different tile + * width. + */ + tileWidth: number; + + /** + * The base height of a tile in pixels. Note that individual layers may have a different + * tile height. + */ + tileHeight: number; + + /** + * The width of the map (in tiles). + */ + width: number; + + /** + * The height of the map (in tiles). + */ + height: number; + + /** + * The orientation of the map data (as specified in Tiled), usually 'orthogonal'. + */ + orientation: string; + + /** + * The render (draw) order of the map data (as specified in Tiled), usually 'right-down'. + * + * The draw orders are: + * + * right-down + * left-down + * right-up + * left-up + * + * This can be changed via the `setRenderOrder` method. + */ + renderOrder: string; + + /** + * The format of the map data. + */ + format: number; + + /** + * The version of the map data (as specified in Tiled, usually 1). + */ + version: number; + + /** + * Map specific properties as specified in Tiled. + * + * Depending on the version of Tiled and the JSON export used, this will be either + * an object or an array of objects. For Tiled 1.2.0+ maps, it will be an array. + */ + properties: object | object[]; + + /** + * The width of the map in pixels based on width * tileWidth. + */ + widthInPixels: number; + + /** + * The height of the map in pixels based on height * tileHeight. + */ + heightInPixels: number; + + /** + * A collection of Images, as parsed from Tiled map data. + */ + imageCollections: Phaser.Tilemaps.ImageCollection[]; + + /** + * An array of Tiled Image Layers. + */ + images: any[]; + + /** + * An array of Tilemap layer data. + */ + layers: Phaser.Tilemaps.LayerData[]; + + /** + * Master list of tiles -> x, y, index in tileset. + */ + tiles: any[]; + + /** + * An array of Tilesets used in the map. + */ + tilesets: Phaser.Tilemaps.Tileset[]; + + /** + * An array of ObjectLayer instances parsed from Tiled object layers. + */ + objects: Phaser.Tilemaps.ObjectLayer[]; + + /** + * The index of the currently selected LayerData object. + */ + currentLayerIndex: number; + + /** + * The length of the horizontal sides of the hexagon. + * Only used for hexagonal orientation Tilemaps. + */ + hexSideLength: number; + + /** + * Sets the rendering (draw) order of the tiles in this map. + * + * The default is 'right-down', meaning it will order the tiles starting from the top-left, + * drawing to the right and then moving down to the next row. + * + * The draw orders are: + * + * 0 = right-down + * 1 = left-down + * 2 = right-up + * 3 = left-up + * + * Setting the render order does not change the tiles or how they are stored in the layer, + * it purely impacts the order in which they are rendered. + * + * You can provide either an integer (0 to 3), or the string version of the order. + * + * Calling this method _after_ creating Tilemap Layers will **not** automatically + * update them to use the new render order. If you call this method after creating layers, use their + * own `setRenderOrder` methods to change them as needed. + * @param renderOrder The render (draw) order value. Either an integer between 0 and 3, or a string: 'right-down', 'left-down', 'right-up' or 'left-up'. + */ + setRenderOrder(renderOrder: number | string): this; + + /** + * Adds an image to the map to be used as a tileset. A single map may use multiple tilesets. + * Note that the tileset name can be found in the JSON file exported from Tiled, or in the Tiled + * editor. + * @param tilesetName The name of the tileset as specified in the map data. + * @param key The key of the Phaser.Cache image used for this tileset. If + * `undefined` or `null` it will look for an image with a key matching the tilesetName parameter. + * @param tileWidth The width of the tile (in pixels) in the Tileset Image. If not + * given it will default to the map's tileWidth value, or the tileWidth specified in the Tiled + * JSON file. + * @param tileHeight The height of the tiles (in pixels) in the Tileset Image. If + * not given it will default to the map's tileHeight value, or the tileHeight specified in the + * Tiled JSON file. + * @param tileMargin The margin around the tiles in the sheet (in pixels). If not + * specified, it will default to 0 or the value specified in the Tiled JSON file. + * @param tileSpacing The spacing between each the tile in the sheet (in pixels). + * If not specified, it will default to 0 or the value specified in the Tiled JSON file. + * @param gid If adding multiple tilesets to a blank map, specify the starting + * GID this set will use here. Default 0. + * @param tileOffset Tile texture drawing offset. + * If not specified, it will default to {0, 0} Default {x: 0, y: 0}. + */ + addTilesetImage(tilesetName: string, key?: string, tileWidth?: number, tileHeight?: number, tileMargin?: number, tileSpacing?: number, gid?: number, tileOffset?: object): Phaser.Tilemaps.Tileset | null; + + /** + * Copies the tiles in the source rectangular area to a new destination (all specified in tile + * coordinates) within the layer. This copies all tile properties & recalculates collision + * information in the destination region. + * + * If no layer specified, the map's current layer is used. This cannot be applied to StaticTilemapLayers. + * @param srcTileX The x coordinate of the area to copy from, in tiles, not pixels. + * @param srcTileY The y coordinate of the area to copy from, in tiles, not pixels. + * @param width The width of the area to copy, in tiles, not pixels. + * @param height The height of the area to copy, in tiles, not pixels. + * @param destTileX The x coordinate of the area to copy to, in tiles, not pixels. + * @param destTileY The y coordinate of the area to copy to, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + * @param layer The tile layer to use. If not given the current layer is used. + */ + copy(srcTileX: number, srcTileY: number, width: number, height: number, destTileX: number, destTileY: number, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Creates a new and empty Tilemap Layer. The currently selected layer in the map is set to this new layer. + * + * Prior to v3.50.0 this method was called `createBlankDynamicLayer`. + * @param name The name of this layer. Must be unique within the map. + * @param tileset The tileset, or an array of tilesets, used to render this layer. Can be a string or a Tileset object. + * @param x The world x position where the top left of this layer will be placed. Default 0. + * @param y The world y position where the top left of this layer will be placed. Default 0. + * @param width The width of the layer in tiles. If not specified, it will default to the map's width. + * @param height The height of the layer in tiles. If not specified, it will default to the map's height. + * @param tileWidth The width of the tiles the layer uses for calculations. If not specified, it will default to the map's tileWidth. + * @param tileHeight The height of the tiles the layer uses for calculations. If not specified, it will default to the map's tileHeight. + */ + createBlankLayer(name: string, tileset: string | string[] | Phaser.Tilemaps.Tileset | Phaser.Tilemaps.Tileset[], x?: number, y?: number, width?: number, height?: number, tileWidth?: number, tileHeight?: number): Phaser.Tilemaps.TilemapLayer | null; + + /** + * Creates a new Tilemap Layer that renders the LayerData associated with the given + * `layerID`. The currently selected layer in the map is set to this new layer. + * + * The `layerID` is important. If you've created your map in Tiled then you can get this by + * looking in Tiled and looking at the layer name. Or you can open the JSON file it exports and + * look at the layers[].name value. Either way it must match. + * + * Prior to v3.50.0 this method was called `createDynamicLayer`. + * @param layerID The layer array index value, or if a string is given, the layer name from Tiled. + * @param tileset The tileset, or an array of tilesets, used to render this layer. Can be a string or a Tileset object. + * @param x The x position to place the layer in the world. If not specified, it will default to the layer offset from Tiled or 0. Default 0. + * @param y The y position to place the layer in the world. If not specified, it will default to the layer offset from Tiled or 0. Default 0. + */ + createLayer(layerID: number | string, tileset: string | string[] | Phaser.Tilemaps.Tileset | Phaser.Tilemaps.Tileset[], x?: number, y?: number): Phaser.Tilemaps.TilemapLayer | null; + + /** + * This method will iterate through all of the objects defined in a Tiled Object Layer and then + * convert the matching results into Phaser Game Objects (by default, Sprites) + * + * Objects are matched on one of 4 criteria: The Object ID, the Object GID, the Object Name, or the Object Type. + * + * Within Tiled, Object IDs are unique per Object. Object GIDs, however, are shared by all objects + * using the same image. Finally, Object Names and Types are strings and the same name can be used on multiple + * Objects in Tiled, they do not have to be unique; Names are specific to Objects while Types can be inherited + * from Object GIDs using the same image. + * + * You set the configuration parameter accordingly, based on which type of criteria you wish + * to match against. For example, to convert all items on an Object Layer with a `gid` of 26: + * + * ```javascript + * createFromObjects(layerName, { + * gid: 26 + * }); + * ``` + * + * Or, to convert objects with the name 'bonus': + * + * ```javascript + * createFromObjects(layerName, { + * name: 'bonus' + * }); + * ``` + * + * Or, to convert an object with a specific id: + * + * ```javascript + * createFromObjects(layerName, { + * id: 9 + * }); + * ``` + * + * You should only specify either `id`, `gid`, `name`, `type`, or none of them. Do not add more than + * one criteria to your config. If you do not specify any criteria, then _all_ objects in the + * Object Layer will be converted. + * + * By default this method will convert Objects into {@link Phaser.GameObjects.Sprite} instances, but you can override + * this by providing your own class type: + * + * ```javascript + * createFromObjects(layerName, { + * gid: 26, + * classType: Coin + * }); + * ``` + * + * This will convert all Objects with a gid of 26 into your custom `Coin` class. You can pass + * any class type here, but it _must_ extend {@link Phaser.GameObjects.GameObject} as its base class. + * Your class will always be passed 1 parameter: `scene`, which is a reference to either the Scene + * specified in the config object or, if not given, the Scene to which this Tilemap belongs. The + * class must have {@link Phaser.GameObjects.Components.Transform#setPosition setPosition} and + * {@link Phaser.GameObjects.Components.Texture#setTexture setTexture} methods. + * + * This method will set the following Tiled Object properties on the new Game Object: + * + * - `flippedHorizontal` as `flipX` + * - `flippedVertical` as `flipY` + * - `height` as `displayHeight` + * - `name` + * - `rotation` + * - `visible` + * - `width` as `displayWidth` + * - `x`, adjusted for origin + * - `y`, adjusted for origin + * + * Additionally, this method will set Tiled Object custom properties + * + * - on the Game Object, if it has the same property name and a value that isn't `undefined`; or + * - on the Game Object's {@link Phaser.GameObjects.GameObject#data data store} otherwise. + * + * For example, a Tiled Object with custom properties `{ alpha: 0.5, gold: 1 }` will be created as a Game + * Object with an `alpha` value of 0.5 and a `data.values.gold` value of 1. + * + * When `useTileset` is `true` (the default), Tile Objects will inherit the texture and any tile properties + * from the tileset, and the local tile ID will be used as the texture frame. For the frame selection to work + * you need to load the tileset texture as a spritesheet so its frame names match the local tile IDs. + * + * For instance, a tileset tile + * + * ``` + * { id: 3, type: 'treadmill', speed: 4 } + * ``` + * + * with gid 19 and an object + * + * ``` + * { id: 7, gid: 19, speed: 5, rotation: 90 } + * ``` + * + * will be interpreted as + * + * ``` + * { id: 7, gid: 19, speed: 5, rotation: 90, type: 'treadmill', texture: '[the tileset texture]', frame: 3 } + * ``` + * + * You can suppress this behavior by setting the boolean `ignoreTileset` for each `config` that should ignore + * object gid tilesets. + * + * You can set a `container` property in the config. If given, the new Game Object will be added to + * the Container or Layer instance instead of the Scene. + * + * You can set named texture-`key` and texture-`frame` properties, which will be set on the new Game Object. + * + * Finally, you can provide an array of config objects, to convert multiple types of object in + * a single call: + * + * ```javascript + * createFromObjects(layerName, [ + * { + * gid: 26, + * classType: Coin + * }, + * { + * id: 9, + * classType: BossMonster + * }, + * { + * name: 'lava', + * classType: LavaTile + * }, + * { + * type: 'endzone', + * classType: Phaser.GameObjects.Zone + * } + * ]); + * ``` + * + * The signature of this method changed significantly in v3.60.0. Prior to this, it did not take config objects. + * @param objectLayerName The name of the Tiled object layer to create the Game Objects from. + * @param config A CreateFromObjects configuration object, or an array of them. + * @param useTileset True if objects that set gids should also search the underlying tile for properties and data. Default true. + */ + createFromObjects(objectLayerName: string, config: Phaser.Types.Tilemaps.CreateFromObjectLayerConfig | Phaser.Types.Tilemaps.CreateFromObjectLayerConfig[], useTileset?: boolean): Phaser.GameObjects.GameObject[]; + + /** + * Creates a Sprite for every tile matching the given tile indexes in the layer. You can + * optionally specify if each tile will be replaced with a new tile after the Sprite has been + * created. Set this value to -1 if you want to just remove the tile after conversion. + * + * This is useful if you want to lay down special tiles in a level that are converted to + * Sprites, but want to replace the tile itself with a floor tile or similar once converted. + * + * The following features were added in Phaser v3.80: + * + * By default, Phaser Sprites have their origin set to 0.5 x 0.5. If you don't specify a new + * origin in the spriteConfig, then it will adjust the sprite positions by half the tile size, + * to position them accurately on the map. + * + * When the Sprite is created it will copy the following properties from the tile: + * + * 'rotation', 'flipX', 'flipY', 'alpha', 'visible' and 'tint'. + * + * The spriteConfig also has a special property called `useSpriteSheet`. If this is set to + * `true` and you have loaded the tileset as a sprite sheet (not an image), then it will + * set the Sprite key and frame to match the sprite texture and tile index. + * @param indexes The tile index, or array of indexes, to create Sprites from. + * @param replacements The tile index, or array of indexes, to change a converted + * tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a + * one-to-one mapping with the indexes array. + * @param spriteConfig The config object to pass into the Sprite creator (i.e. scene.make.sprite). + * @param scene The Scene to create the Sprites within. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + createFromTiles(indexes: number | any[], replacements: number | any[] | undefined, spriteConfig?: Phaser.Types.GameObjects.Sprite.SpriteConfig, scene?: Phaser.Scene, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.GameObjects.Sprite[] | null; + + /** + * Sets the tiles in the given rectangular area (in tile coordinates) of the layer with the + * specified index. Tiles will be set to collide if the given index is a colliding index. + * Collision information in the region will be recalculated. + * + * If no layer specified, the map's current layer is used. + * This cannot be applied to StaticTilemapLayers. + * @param index The tile index to fill the area with. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + * @param layer The tile layer to use. If not given the current layer is used. + */ + fill(index: number, tileX?: number, tileY?: number, width?: number, height?: number, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * For each object in the given object layer, run the given filter callback function. Any + * objects that pass the filter test (i.e. where the callback returns true) will be returned in a + * new array. Similar to Array.prototype.Filter in vanilla JS. + * @param objectLayer The name of an object layer (from Tiled) or an ObjectLayer instance. + * @param callback The callback. Each object in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + */ + filterObjects(objectLayer: Phaser.Tilemaps.ObjectLayer | string, callback: TilemapFilterCallback, context?: object): Phaser.Types.Tilemaps.TiledObject[] | null; + + /** + * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given + * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns + * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS. + * If no layer specified, the map's current layer is used. + * @param callback The callback. Each tile in the given area will be passed to this + * callback as the first and only parameter. The callback should return true for tiles that pass the + * filter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The tile layer to use. If not given the current layer is used. + */ + filterTiles(callback: Function, context?: object, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile[] | null; + + /** + * Searches the entire map layer for the first tile matching the given index, then returns that Tile + * object. If no match is found, it returns null. The search starts from the top-left tile and + * continues horizontally until it hits the end of the row, then it drops down to the next column. + * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to + * the top-left. + * If no layer specified, the map's current layer is used. + * @param index The tile index value to search for. + * @param skip The number of times to skip a matching tile before returning. Default 0. + * @param reverse If true it will scan the layer in reverse, starting at the bottom-right. Otherwise it scans from the top-left. Default false. + * @param layer The tile layer to use. If not given the current layer is used. + */ + findByIndex(index: number, skip?: number, reverse?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Find the first object in the given object layer that satisfies the provided testing function. + * I.e. finds the first object for which `callback` returns true. Similar to + * Array.prototype.find in vanilla JS. + * @param objectLayer The name of an object layer (from Tiled) or an ObjectLayer instance. + * @param callback The callback. Each object in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + */ + findObject(objectLayer: Phaser.Tilemaps.ObjectLayer | string, callback: TilemapFindCallback, context?: object): Phaser.Types.Tilemaps.TiledObject | null; + + /** + * Find the first tile in the given rectangular area (in tile coordinates) of the layer that + * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns + * true. Similar to Array.prototype.find in vanilla JS. + * If no layer specified, the maps current layer is used. + * @param callback The callback. Each tile in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to search. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to search. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The Tile layer to run the search on. If not provided will use the current layer. + */ + findTile(callback: FindTileCallback, context?: object, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given + * callback. Similar to Array.prototype.forEach in vanilla JS. + * + * If no layer specified, the map's current layer is used. + * @param callback The callback. Each tile in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to search. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to search. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The Tile layer to run the search on. If not provided will use the current layer. + */ + forEachTile(callback: EachTileCallback, context?: object, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Gets the image layer index based on its name. + * @param name The name of the image to get. + */ + getImageIndex(name: string): number; + + /** + * Return a list of all valid imagelayer names loaded in this Tilemap. + */ + getImageLayerNames(): string[]; + + /** + * Internally used. Returns the index of the object in one of the Tilemaps arrays whose name + * property matches the given `name`. + * @param location The Tilemap array to search. + * @param name The name of the array element to get. + */ + getIndex(location: any[], name: string): number; + + /** + * Gets the LayerData from `this.layers` that is associated with the given `layer`, or null if the layer is invalid. + * @param layer The name of the layer from Tiled, the index of the layer in the map or Tilemap Layer. If not given will default to the maps current layer index. + */ + getLayer(layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.LayerData | null; + + /** + * Gets the ObjectLayer from `this.objects` that has the given `name`, or null if no ObjectLayer is found with that name. + * @param name The name of the object layer from Tiled. + */ + getObjectLayer(name?: string): Phaser.Tilemaps.ObjectLayer | null; + + /** + * Return a list of all valid objectgroup names loaded in this Tilemap. + */ + getObjectLayerNames(): string[]; + + /** + * Gets the LayerData index of the given `layer` within this.layers, or null if an invalid + * `layer` is given. + * @param layer The name of the layer from Tiled, the index of the layer in the map or a Tilemap Layer. If not given will default to the map's current layer index. + */ + getLayerIndex(layer?: string | number | Phaser.Tilemaps.TilemapLayer): number; + + /** + * Gets the index of the LayerData within this.layers that has the given `name`, or null if an + * invalid `name` is given. + * @param name The name of the layer to get. + */ + getLayerIndexByName(name: string): number; + + /** + * Gets a tile at the given tile coordinates from the given layer. + * + * If no layer is specified, the maps current layer is used. + * @param tileX X position to get the tile from (given in tile units, not pixels). + * @param tileY Y position to get the tile from (given in tile units, not pixels). + * @param nonNull If true getTile won't return null for empty tiles, but a Tile object with an index of -1. + * @param layer The tile layer to use. If not given the current layer is used. + */ + getTileAt(tileX: number, tileY: number, nonNull?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Gets a tile at the given world coordinates from the given layer. + * + * If no layer is specified, the maps current layer is used. + * @param worldX X position to get the tile from (given in pixels) + * @param worldY Y position to get the tile from (given in pixels) + * @param nonNull If true, function won't return null for empty tiles, but a Tile object with an index of -1. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + getTileAtWorldXY(worldX: number, worldY: number, nonNull?: boolean, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Return a list of all valid tilelayer names loaded in this Tilemap. + */ + getTileLayerNames(): string[]; + + /** + * Gets the tiles in the given rectangular area (in tile coordinates) of the layer. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param layer The tile layer to use. If not given the current layer is used. + */ + getTilesWithin(tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile[] | null; + + /** + * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle, + * Line, Rectangle or Triangle. The shape should be in world coordinates. + * + * If no layer is specified, the maps current layer is used. + * @param shape A shape in world (pixel) coordinates + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param camera The Camera to use when factoring in which tiles to return. + * @param layer The tile layer to use. If not given the current layer is used. + */ + getTilesWithinShape(shape: Phaser.Geom.Circle | Phaser.Geom.Line | Phaser.Geom.Rectangle | Phaser.Geom.Triangle, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile[] | null; + + /** + * Gets the tiles in the given rectangular area (in world coordinates) of the layer. + * + * If no layer is specified, the maps current layer is used. + * @param worldX The world x coordinate for the top-left of the area. + * @param worldY The world y coordinate for the top-left of the area. + * @param width The width of the area. + * @param height The height of the area. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param camera The Camera to use when factoring in which tiles to return. + * @param layer The tile layer to use. If not given the current layer is used. + */ + getTilesWithinWorldXY(worldX: number, worldY: number, width: number, height: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile[] | null; + + /** + * Gets the Tileset that has the given `name`, or null if an invalid `name` is given. + * @param name The name of the Tileset to get. + */ + getTileset(name: string): Phaser.Tilemaps.Tileset | null; + + /** + * Gets the index of the Tileset within this.tilesets that has the given `name`, or null if an + * invalid `name` is given. + * @param name The name of the Tileset to get. + */ + getTilesetIndex(name: string): number; + + /** + * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns + * false if there is no tile or if the tile at that location has an index of -1. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param layer The tile layer to use. If not given the current layer is used. + */ + hasTileAt(tileX: number, tileY: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): boolean | null; + + /** + * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns + * false if there is no tile or if the tile at that location has an index of -1. + * + * If no layer is specified, the maps current layer is used. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param camera The Camera to use when factoring in which tiles to return. + * @param layer The tile layer to use. If not given the current layer is used. + */ + hasTileAtWorldXY(worldX: number, worldY: number, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): boolean | null; + + /** + * The LayerData object that is currently selected in the map. You can set this property using + * any type supported by setLayer. + */ + layer: Phaser.Tilemaps.LayerData; + + /** + * Puts a tile at the given tile coordinates in the specified layer. You can pass in either an index + * or a Tile object. If you pass in a Tile, all attributes will be copied over to the specified + * location. If you pass in an index, only the index at the specified location will be changed. + * Collision information will be recalculated at the specified location. + * + * If no layer is specified, the maps current layer is used. + * @param tile The index of this tile to set or a Tile object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The tile layer to use. If not given the current layer is used. + */ + putTileAt(tile: number | Phaser.Tilemaps.Tile, tileX: number, tileY: number, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Puts a tile at the given world coordinates (pixels) in the specified layer. You can pass in either + * an index or a Tile object. If you pass in a Tile, all attributes will be copied over to the + * specified location. If you pass in an index, only the index at the specified location will be + * changed. Collision information will be recalculated at the specified location. + * + * If no layer is specified, the maps current layer is used. + * @param tile The index of this tile to set or a Tile object. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + putTileAtWorldXY(tile: number | Phaser.Tilemaps.Tile, worldX: number, worldY: number, recalculateFaces?: boolean, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Puts an array of tiles or a 2D array of tiles at the given tile coordinates in the specified + * layer. The array can be composed of either tile indexes or Tile objects. If you pass in a Tile, + * all attributes will be copied over to the specified location. If you pass in an index, only the + * index at the specified location will be changed. Collision information will be recalculated + * within the region tiles were changed. + * + * If no layer is specified, the maps current layer is used. + * @param tile A row (array) or grid (2D array) of Tiles or tile indexes to place. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param layer The tile layer to use. If not given the current layer is used. + */ + putTilesAt(tile: number[] | number[][] | Phaser.Tilemaps.Tile[] | Phaser.Tilemaps.Tile[][], tileX: number, tileY: number, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the + * specified layer. Each tile will receive a new index. If an array of indexes is passed in, then + * those will be used for randomly assigning new tile indexes. If an array is not provided, the + * indexes found within the region (excluding -1) will be used for randomly assigning new tile + * indexes. This method only modifies tile indexes and does not change collision information. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param indexes An array of indexes to randomly draw from during randomization. + * @param layer The tile layer to use. If not given the current layer is used. + */ + randomize(tileX?: number, tileY?: number, width?: number, height?: number, indexes?: number[], layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting + * faces are used internally for optimizing collisions against tiles. This method is mostly used + * internally to optimize recalculating faces when only one tile has been changed. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param layer The tile layer to use. If not given the current layer is used. + */ + calculateFacesAt(tileX: number, tileY: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the + * layer. Interesting faces are used internally for optimizing collisions against tiles. This method + * is mostly used internally. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The tile layer to use. If not given the current layer is used. + */ + calculateFacesWithin(tileX?: number, tileY?: number, width?: number, height?: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Removes the given TilemapLayer from this Tilemap without destroying it. + * + * If no layer is specified, the maps current layer is used. + * @param layer The tile layer to be removed. + */ + removeLayer(layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Destroys the given TilemapLayer and removes it from this Tilemap. + * + * If no layer is specified, the maps current layer is used. + * @param layer The tile layer to be destroyed. + */ + destroyLayer(layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Removes all Tilemap Layers from this Tilemap and calls `destroy` on each of them. + */ + removeAllLayers(): this; + + /** + * Removes the given Tile, or an array of Tiles, from the layer to which they belong, + * and optionally recalculates the collision information. + * @param tiles The Tile to remove, or an array of Tiles. + * @param replaceIndex After removing the Tile, insert a brand new Tile into its location with the given index. Leave as -1 to just remove the tile. Default -1. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + */ + removeTile(tiles: Phaser.Tilemaps.Tile | Phaser.Tilemaps.Tile[], replaceIndex?: number, recalculateFaces?: boolean): Phaser.Tilemaps.Tile[]; + + /** + * Removes the tile at the given tile coordinates in the specified layer and updates the layers collision information. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param replaceWithNull If `true` (the default), this will replace the tile at the specified location with null instead of a Tile with an index of -1. + * @param recalculateFaces If `true` (the default), the faces data will be recalculated. + * @param layer The tile layer to use. If not given the current layer is used. + */ + removeTileAt(tileX: number, tileY: number, replaceWithNull?: boolean, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Removes the tile at the given world coordinates in the specified layer and updates the layers collision information. + * + * If no layer is specified, the maps current layer is used. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param replaceWithNull If `true` (the default), this will replace the tile at the specified location with null instead of a Tile with an index of -1. + * @param recalculateFaces If `true` (the default), the faces data will be recalculated. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + removeTileAtWorldXY(worldX: number, worldY: number, replaceWithNull?: boolean, recalculateFaces?: boolean, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tile | null; + + /** + * Draws a debug representation of the layer to the given Graphics object. This is helpful when you want to + * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles + * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation + * wherever you want on the screen. + * + * If no layer is specified, the maps current layer is used. + * + * **Note:** This method currently only works with orthogonal tilemap layers. + * @param graphics The target Graphics object to draw upon. + * @param styleConfig An object specifying the colors to use for the debug drawing. + * @param layer The tile layer to use. If not given the current layer is used. + */ + renderDebug(graphics: Phaser.GameObjects.Graphics, styleConfig?: Phaser.Types.Tilemaps.StyleConfig, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Draws a debug representation of all layers within this Tilemap to the given Graphics object. + * + * This is helpful when you want to get a quick idea of which of your tiles are colliding and which + * have interesting faces. The tiles are drawn starting at (0, 0) in the Graphics, allowing you to + * place the debug representation wherever you want on the screen. + * @param graphics The target Graphics object to draw upon. + * @param styleConfig An object specifying the colors to use for the debug drawing. + */ + renderDebugFull(graphics: Phaser.GameObjects.Graphics, styleConfig?: Phaser.Types.Tilemaps.StyleConfig): this; + + /** + * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching + * `findIndex` and updates their index to match `newIndex`. This only modifies the index and does + * not change collision information. + * + * If no layer is specified, the maps current layer is used. + * @param findIndex The index of the tile to search for. + * @param newIndex The index of the tile to replace it with. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The tile layer to use. If not given the current layer is used. + */ + replaceByIndex(findIndex: number, newIndex: number, tileX?: number, tileY?: number, width?: number, height?: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets collision on the given tile or tiles within a layer by index. You can pass in either a + * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if + * collision will be enabled (true) or disabled (false). + * + * If no layer is specified, the maps current layer is used. + * @param indexes Either a single tile index, or an array of tile indexes. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The tile layer to use. If not given the current layer is used. + * @param updateLayer If true, updates the current tiles on the layer. Set to false if no tiles have been placed for significant performance boost. Default true. + */ + setCollision(indexes: number | any[], collides?: boolean, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer, updateLayer?: boolean): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets collision on a range of tiles in a layer whose index is between the specified `start` and + * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set + * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be + * enabled (true) or disabled (false). + * + * If no layer is specified, the maps current layer is used. + * @param start The first index of the tile to be set for collision. + * @param stop The last index of the tile to be set for collision. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The tile layer to use. If not given the current layer is used. + */ + setCollisionBetween(start: number, stop: number, collides?: boolean, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property + * that matches the given properties object, its collision flag will be set. The `collides` + * parameter controls if collision will be enabled (true) or disabled (false). Passing in + * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that + * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can + * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a + * "types" property that matches any of those values, its collision flag will be updated. + * + * If no layer is specified, the maps current layer is used. + * @param properties An object with tile properties and corresponding values that should be checked. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The tile layer to use. If not given the current layer is used. + */ + setCollisionByProperty(properties: object, collides?: boolean, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets collision on all tiles in the given layer, except for tiles that have an index specified in + * the given array. The `collides` parameter controls if collision will be enabled (true) or + * disabled (false). Tile indexes not currently in the layer are not affected. + * + * If no layer is specified, the maps current layer is used. + * @param indexes An array of the tile indexes to not be counted for collision. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The tile layer to use. If not given the current layer is used. + */ + setCollisionByExclusion(indexes: number[], collides?: boolean, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets collision on the tiles within a layer by checking each tiles collision group data + * (typically defined in Tiled within the tileset collision editor). If any objects are found within + * a tiles collision group, the tiles colliding information will be set. The `collides` parameter + * controls if collision will be enabled (true) or disabled (false). + * + * If no layer is specified, the maps current layer is used. + * @param collides If true it will enable collision. If false it will clear collision. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. + * @param layer The tile layer to use. If not given the current layer is used. + */ + setCollisionFromCollisionGroup(collides?: boolean, recalculateFaces?: boolean, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets a global collision callback for the given tile index within the layer. This will affect all + * tiles on this layer that have the same index. If a callback is already set for the tile index it + * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile + * at a specific location on the map then see `setTileLocationCallback`. + * + * If no layer is specified, the maps current layer is used. + * @param indexes Either a single tile index, or an array of tile indexes to have a collision callback set for. All values should be integers. + * @param callback The callback that will be invoked when the tile is collided with. + * @param callbackContext The context under which the callback is called. + * @param layer The tile layer to use. If not given the current layer is used. + */ + setTileIndexCallback(indexes: number | number[], callback: Function, callbackContext: object, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets a collision callback for the given rectangular area (in tile coordinates) within the layer. + * If a callback is already set for the tile index it will be replaced. Set the callback to null to + * remove it. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param callback The callback that will be invoked when the tile is collided with. + * @param callbackContext The context under which the callback is called. + * @param layer The tile layer to use. If not given the current layer is used. + */ + setTileLocationCallback(tileX: number, tileY: number, width: number, height: number, callback: Function, callbackContext?: object, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Sets the current layer to the LayerData associated with `layer`. + * @param layer The name of the layer from Tiled, the index of the layer in the map or a TilemapLayer. If not given will default to the maps current layer index. + */ + setLayer(layer?: string | number | Phaser.Tilemaps.TilemapLayer): this; + + /** + * Sets the base tile size for the map. Note: this does not necessarily match the tileWidth and + * tileHeight for all layers. This also updates the base size on all tiles across all layers. + * @param tileWidth The width of the tiles the map uses for calculations. + * @param tileHeight The height of the tiles the map uses for calculations. + */ + setBaseTileSize(tileWidth: number, tileHeight: number): this; + + /** + * Sets the tile size for a specific `layer`. Note: this does not necessarily match the maps + * tileWidth and tileHeight for all layers. This will set the tile size for the layer and any + * tiles the layer has. + * @param tileWidth The width of the tiles (in pixels) in the layer. + * @param tileHeight The height of the tiles (in pixels) in the layer. + * @param layer The name of the layer from Tiled, the index of the layer in the map or a TilemapLayer. If not given will default to the maps current layer index. + */ + setLayerTileSize(tileWidth: number, tileHeight: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): this; + + /** + * Shuffles the tiles in a rectangular region (specified in tile coordinates) within the given + * layer. It will only randomize the tiles in that area, so if they're all the same nothing will + * appear to have changed! This method only modifies tile indexes and does not change collision + * information. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The tile layer to use. If not given the current layer is used. + */ + shuffle(tileX?: number, tileY?: number, width?: number, height?: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching + * `indexA` and swaps then with `indexB`. This only modifies the index and does not change collision + * information. + * + * If no layer is specified, the maps current layer is used. + * @param tileA First tile index. + * @param tileB Second tile index. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The tile layer to use. If not given the current layer is used. + */ + swapByIndex(tileA: number, tileB: number, tileX?: number, tileY?: number, width?: number, height?: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the + * layers position, scale and scroll. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The x coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + tileToWorldX(tileX: number, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): number | null; + + /** + * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the + * layers position, scale and scroll. + * + * If no layer is specified, the maps current layer is used. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + tileToWorldY(tileY: number, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): number | null; + + /** + * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the + * layers position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param vec2 A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + tileToWorldXY(tileX: number, tileY: number, vec2?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Math.Vector2 | null; + + /** + * Returns an array of Vector2s where each entry corresponds to the corner of the requested tile. + * + * The `tileX` and `tileY` parameters are in tile coordinates, not world coordinates. + * + * The corner coordinates are in world space, having factored in TilemapLayer scale, position + * and the camera, if given. + * + * The size of the array will vary based on the orientation of the map. For example an + * orthographic map will return an array of 4 vectors, where-as a hexagonal map will, + * of course, return an array of 6 corner vectors. + * + * If no layer is specified, the maps current layer is used. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + getTileCorners(tileX: number, tileY: number, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Math.Vector2[] | null; + + /** + * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the + * specified layer. Each tile will receive a new index. New indexes are drawn from the given + * weightedIndexes array. An example weighted array: + * + * [ + * { index: 6, weight: 4 }, // Probability of index 6 is 4 / 8 + * { index: 7, weight: 2 }, // Probability of index 7 would be 2 / 8 + * { index: 8, weight: 1.5 }, // Probability of index 8 would be 1.5 / 8 + * { index: 26, weight: 0.5 } // Probability of index 27 would be 0.5 / 8 + * ] + * + * The probability of any index being picked is (the indexs weight) / (sum of all weights). This + * method only modifies tile indexes and does not change collision information. + * + * If no layer is specified, the maps current layer is used. + * @param weightedIndexes An array of objects to randomly draw from during randomization. They should be in the form: { index: 0, weight: 4 } or { index: [0, 1], weight: 4 } if you wish to draw from multiple tile indexes. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param layer The tile layer to use. If not given the current layer is used. + */ + weightedRandomize(weightedIndexes: object[], tileX?: number, tileY?: number, width?: number, height?: number, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Tilemaps.Tilemap | null; + + /** + * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the + * layers position, scale and scroll. + * + * If no layer is specified, the maps current layer is used. + * + * You cannot call this method for Isometric or Hexagonal tilemaps as they require + * both `worldX` and `worldY` values to determine the correct tile, instead you + * should use the `worldToTileXY` method. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + worldToTileX(worldX: number, snapToFloor?: boolean, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): number | null; + + /** + * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the + * layers position, scale and scroll. + * + * If no layer is specified, the maps current layer is used. + * + * You cannot call this method for Isometric or Hexagonal tilemaps as they require + * both `worldX` and `worldY` values to determine the correct tile, instead you + * should use the `worldToTileXY` method. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + worldToTileY(worldY: number, snapToFloor?: boolean, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): number | null; + + /** + * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the + * layers position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * + * If no layer is specified, the maps current layer is used. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param vec2 A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + * @param layer The tile layer to use. If not given the current layer is used. + */ + worldToTileXY(worldX: number, worldY: number, snapToFloor?: boolean, vec2?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera, layer?: string | number | Phaser.Tilemaps.TilemapLayer): Phaser.Math.Vector2 | null; + + /** + * Removes all layer data from this Tilemap and nulls the scene reference. This will destroy any + * TilemapLayers that have been created. + */ + destroy(): void; + + } + + /** + * A Tilemap Layer is a Game Object that renders LayerData from a Tilemap when used in combination + * with one, or more, Tilesets. + */ + class TilemapLayer extends Phaser.GameObjects.GameObject implements Phaser.GameObjects.Components.Alpha, Phaser.GameObjects.Components.BlendMode, Phaser.GameObjects.Components.ComputedSize, Phaser.GameObjects.Components.Depth, Phaser.GameObjects.Components.Flip, Phaser.GameObjects.Components.GetBounds, Phaser.GameObjects.Components.Mask, Phaser.GameObjects.Components.Origin, Phaser.GameObjects.Components.Pipeline, Phaser.GameObjects.Components.PostPipeline, Phaser.GameObjects.Components.ScrollFactor, Phaser.GameObjects.Components.Transform, Phaser.GameObjects.Components.Visible, Phaser.Physics.Arcade.Components.Collision { + /** + * + * @param scene The Scene to which this Game Object belongs. + * @param tilemap The Tilemap this layer is a part of. + * @param layerIndex The index of the LayerData associated with this layer. + * @param tileset The tileset, or an array of tilesets, used to render this layer. Can be a string or a Tileset object. + * @param x The world x position where the top left of this layer will be placed. Default 0. + * @param y The world y position where the top left of this layer will be placed. Default 0. + */ + constructor(scene: Phaser.Scene, tilemap: Phaser.Tilemaps.Tilemap, layerIndex: number, tileset: string | string[] | Phaser.Tilemaps.Tileset | Phaser.Tilemaps.Tileset[], x?: number, y?: number); + + /** + * Used internally by physics system to perform fast type checks. + */ + readonly isTilemap: boolean; + + /** + * The Tilemap that this layer is a part of. + */ + tilemap: Phaser.Tilemaps.Tilemap; + + /** + * The index of the LayerData associated with this layer. + */ + layerIndex: number; + + /** + * The LayerData associated with this layer. LayerData can only be associated with one + * tilemap layer. + */ + layer: Phaser.Tilemaps.LayerData; + + /** + * An array of `Tileset` objects associated with this layer. + */ + tileset: Phaser.Tilemaps.Tileset[]; + + /** + * The total number of tiles drawn by the renderer in the last frame. + */ + readonly tilesDrawn: number; + + /** + * The total number of tiles in this layer. Updated every frame. + */ + readonly tilesTotal: number; + + /** + * Used internally during rendering. This holds the tiles that are visible within the Camera. + */ + culledTiles: Phaser.Tilemaps.Tile[]; + + /** + * You can control if the camera should cull tiles on this layer before rendering them or not. + * + * By default the camera will try to cull the tiles in this layer, to avoid over-drawing to the renderer. + * + * However, there are some instances when you may wish to disable this, and toggling this flag allows + * you to do so. Also see `setSkipCull` for a chainable method that does the same thing. + */ + skipCull: boolean; + + /** + * The amount of extra tiles to add into the cull rectangle when calculating its horizontal size. + * + * See the method `setCullPadding` for more details. + */ + cullPaddingX: number; + + /** + * The amount of extra tiles to add into the cull rectangle when calculating its vertical size. + * + * See the method `setCullPadding` for more details. + */ + cullPaddingY: number; + + /** + * The callback that is invoked when the tiles are culled. + * + * It will call a different function based on the map orientation: + * + * Orthogonal (the default) is `TilemapComponents.CullTiles` + * Isometric is `TilemapComponents.IsometricCullTiles` + * Hexagonal is `TilemapComponents.HexagonalCullTiles` + * Staggered is `TilemapComponents.StaggeredCullTiles` + * + * However, you can override this to call any function you like. + * + * It will be sent 4 arguments: + * + * 1. The Phaser.Tilemaps.LayerData object for this Layer + * 2. The Camera that is culling the layer. You can check its `dirty` property to see if it has changed since the last cull. + * 3. A reference to the `culledTiles` array, which should be used to store the tiles you want rendered. + * 4. The Render Order constant. + * + * See the `TilemapComponents.CullTiles` source code for details on implementing your own culling system. + */ + cullCallback: Function; + + /** + * An array holding the mapping between the tile indexes and the tileset they belong to. + */ + gidMap: Phaser.Tilemaps.Tileset[]; + + /** + * The Tilemap Layer Collision Category. + * + * This is exclusively used by the Arcade Physics system. + * + * This can be set to any valid collision bitfield value. + * + * See the `setCollisionCategory` method for more details. + */ + collisionCategory: number; + + /** + * The Tilemap Layer Collision Mask. + * + * This is exclusively used by the Arcade Physics system. + * + * See the `setCollidesWith` method for more details. + */ + collisionMask: number; + + /** + * The horizontal origin of this Tilemap Layer. + */ + readonly originX: number; + + /** + * The vertical origin of this Tilemap Layer. + */ + readonly originY: number; + + /** + * The horizontal display origin of this Tilemap Layer. + */ + readonly displayOriginX: number; + + /** + * The vertical display origin of this Tilemap Layer. + */ + readonly displayOriginY: number; + + /** + * Sets the rendering (draw) order of the tiles in this layer. + * + * The default is 'right-down', meaning it will order the tiles starting from the top-left, + * drawing to the right and then moving down to the next row. + * + * The draw orders are: + * + * 0 = right-down + * 1 = left-down + * 2 = right-up + * 3 = left-up + * + * Setting the render order does not change the tiles or how they are stored in the layer, + * it purely impacts the order in which they are rendered. + * + * You can provide either an integer (0 to 3), or the string version of the order. + * @param renderOrder The render (draw) order value. Either an integer between 0 and 3, or a string: 'right-down', 'left-down', 'right-up' or 'left-up'. + */ + setRenderOrder(renderOrder: number | string): this; + + /** + * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting + * faces are used internally for optimizing collisions against tiles. This method is mostly used + * internally to optimize recalculating faces when only one tile has been changed. + * @param tileX The x coordinate. + * @param tileY The y coordinate. + */ + calculateFacesAt(tileX: number, tileY: number): this; + + /** + * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the + * layer. Interesting faces are used internally for optimizing collisions against tiles. This method + * is mostly used internally. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + */ + calculateFacesWithin(tileX?: number, tileY?: number, width?: number, height?: number): this; + + /** + * Creates a Sprite for every object matching the given tile indexes in the layer. You can + * optionally specify if each tile will be replaced with a new tile after the Sprite has been + * created. This is useful if you want to lay down special tiles in a level that are converted to + * Sprites, but want to replace the tile itself with a floor tile or similar once converted. + * @param indexes The tile index, or array of indexes, to create Sprites from. + * @param replacements The tile index, or array of indexes, to change a converted + * tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a + * one-to-one mapping with the indexes array. + * @param spriteConfig The config object to pass into the Sprite creator (i.e. + * scene.make.sprite). + * @param scene The Scene to create the Sprites within. + * @param camera The Camera to use when determining the world XY + */ + createFromTiles(indexes: number | any[], replacements: number | any[] | undefined, spriteConfig?: Phaser.Types.GameObjects.Sprite.SpriteConfig, scene?: Phaser.Scene, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.GameObjects.Sprite[]; + + /** + * Returns the tiles in the given layer that are within the cameras viewport. + * This is used internally during rendering. + * @param camera The Camera to run the cull check against. + */ + cull(camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile[]; + + /** + * Copies the tiles in the source rectangular area to a new destination (all specified in tile + * coordinates) within the layer. This copies all tile properties & recalculates collision + * information in the destination region. + * @param srcTileX The x coordinate of the area to copy from, in tiles, not pixels. + * @param srcTileY The y coordinate of the area to copy from, in tiles, not pixels. + * @param width The width of the area to copy, in tiles, not pixels. + * @param height The height of the area to copy, in tiles, not pixels. + * @param destTileX The x coordinate of the area to copy to, in tiles, not pixels. + * @param destTileY The y coordinate of the area to copy to, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + */ + copy(srcTileX: number, srcTileY: number, width: number, height: number, destTileX: number, destTileY: number, recalculateFaces?: boolean): this; + + /** + * Sets the tiles in the given rectangular area (in tile coordinates) of the layer with the + * specified index. Tiles will be set to collide if the given index is a colliding index. + * Collision information in the region will be recalculated. + * @param index The tile index to fill the area with. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + */ + fill(index: number, tileX?: number, tileY?: number, width?: number, height?: number, recalculateFaces?: boolean): this; + + /** + * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given + * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns + * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS. + * @param callback The callback. Each tile in the given area will be passed to this + * callback as the first and only parameter. The callback should return true for tiles that pass the + * filter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to filter. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + */ + filterTiles(callback: Function, context?: object, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions): Phaser.Tilemaps.Tile[]; + + /** + * Searches the entire map layer for the first tile matching the given index, then returns that Tile + * object. If no match is found, it returns null. The search starts from the top-left tile and + * continues horizontally until it hits the end of the row, then it drops down to the next column. + * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to + * the top-left. + * @param index The tile index value to search for. + * @param skip The number of times to skip a matching tile before returning. Default 0. + * @param reverse If true it will scan the layer in reverse, starting at the bottom-right. Otherwise it scans from the top-left. Default false. + */ + findByIndex(index: number, skip?: number, reverse?: boolean): Phaser.Tilemaps.Tile; + + /** + * Find the first tile in the given rectangular area (in tile coordinates) of the layer that + * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns + * true. Similar to Array.prototype.find in vanilla JS. + * @param callback The callback. Each tile in the given area will be passed to this callback as the first and only parameter. + * @param context The context under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to search. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to search. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + */ + findTile(callback: FindTileCallback, context?: object, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions): Phaser.Tilemaps.Tile | null; + + /** + * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given + * callback. Similar to Array.prototype.forEach in vanilla JS. + * @param callback The callback. Each tile in the given area will be passed to this callback as the first and only parameter. + * @param context The context, or scope, under which the callback should be run. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to search. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to search. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + */ + forEachTile(callback: EachTileCallback, context?: object, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions): this; + + /** + * Sets an additive tint on each Tile within the given area. + * + * The tint works by taking the pixel color values from the tileset texture, and then + * multiplying it by the color value of the tint. + * + * If no area values are given then all tiles will be tinted to the given color. + * + * To remove a tint call this method with either no parameters, or by passing white `0xffffff` as the tint color. + * + * If a tile already has a tint set then calling this method will override that. + * @param tint The tint color being applied to each tile within the region. Given as a hex value, i.e. `0xff0000` for red. Set to white (`0xffffff`) to reset the tint. Default 0xffffff. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to search. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to search. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + */ + setTint(tint?: number, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions): this; + + /** + * Sets a fill-based tint on each Tile within the given area. + * + * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture + * with those in the tint. + * + * If no area values are given then all tiles will be tinted to the given color. + * + * To remove a tint call this method with either no parameters, or by passing white `0xffffff` as the tint color. + * + * If a tile already has a tint set then calling this method will override that. + * @param tint The tint color being applied to each tile within the region. Given as a hex value, i.e. `0xff0000` for red. Set to white (`0xffffff`) to reset the tint. Default 0xffffff. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area to search. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area to search. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + */ + setTintFill(tint?: number, tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions): this; + + /** + * Gets a tile at the given tile coordinates from the given layer. + * @param tileX X position to get the tile from (given in tile units, not pixels). + * @param tileY Y position to get the tile from (given in tile units, not pixels). + * @param nonNull If true getTile won't return null for empty tiles, but a Tile object with an index of -1. Default false. + */ + getTileAt(tileX: number, tileY: number, nonNull?: boolean): Phaser.Tilemaps.Tile; + + /** + * Gets a tile at the given world coordinates from the given layer. + * @param worldX X position to get the tile from (given in pixels) + * @param worldY Y position to get the tile from (given in pixels) + * @param nonNull If true, function won't return null for empty tiles, but a Tile object with an index of -1. Default false. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + getTileAtWorldXY(worldX: number, worldY: number, nonNull?: boolean, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile; + + /** + * Gets a tile at the given world coordinates from the given isometric layer. + * @param worldX X position to get the tile from (given in pixels) + * @param worldY Y position to get the tile from (given in pixels) + * @param originTop Which is the active face of the isometric tile? The top (default, true), or the base? (false) Default true. + * @param nonNull If true, function won't return null for empty tiles, but a Tile object with an index of -1. Default false. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + getIsoTileAtWorldXY(worldX: number, worldY: number, originTop?: boolean, nonNull?: boolean, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile; + + /** + * Gets the tiles in the given rectangular area (in tile coordinates) of the layer. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param filteringOptions Optional filters to apply when getting the tiles. + */ + getTilesWithin(tileX?: number, tileY?: number, width?: number, height?: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions): Phaser.Tilemaps.Tile[]; + + /** + * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle, + * Line, Rectangle or Triangle. The shape should be in world coordinates. + * @param shape A shape in world (pixel) coordinates + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param camera The Camera to use when factoring in which tiles to return. + */ + getTilesWithinShape(shape: Phaser.Geom.Circle | Phaser.Geom.Line | Phaser.Geom.Rectangle | Phaser.Geom.Triangle, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile[]; + + /** + * Gets the tiles in the given rectangular area (in world coordinates) of the layer. + * @param worldX The world x coordinate for the top-left of the area. + * @param worldY The world y coordinate for the top-left of the area. + * @param width The width of the area. + * @param height The height of the area. + * @param filteringOptions Optional filters to apply when getting the tiles. + * @param camera The Camera to use when factoring in which tiles to return. + */ + getTilesWithinWorldXY(worldX: number, worldY: number, width: number, height: number, filteringOptions?: Phaser.Types.Tilemaps.FilteringOptions, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile[]; + + /** + * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns + * false if there is no tile or if the tile at that location has an index of -1. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + */ + hasTileAt(tileX: number, tileY: number): boolean; + + /** + * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns + * false if there is no tile or if the tile at that location has an index of -1. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param camera The Camera to use when factoring in which tiles to return. + */ + hasTileAtWorldXY(worldX: number, worldY: number, camera?: Phaser.Cameras.Scene2D.Camera): boolean; + + /** + * Puts a tile at the given tile coordinates in the specified layer. You can pass in either an index + * or a Tile object. If you pass in a Tile, all attributes will be copied over to the specified + * location. If you pass in an index, only the index at the specified location will be changed. + * Collision information will be recalculated at the specified location. + * @param tile The index of this tile to set or a Tile object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + */ + putTileAt(tile: number | Phaser.Tilemaps.Tile, tileX: number, tileY: number, recalculateFaces?: boolean): Phaser.Tilemaps.Tile; + + /** + * Puts a tile at the given world coordinates (pixels) in the specified layer. You can pass in either + * an index or a Tile object. If you pass in a Tile, all attributes will be copied over to the + * specified location. If you pass in an index, only the index at the specified location will be + * changed. Collision information will be recalculated at the specified location. + * @param tile The index of this tile to set or a Tile object. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + putTileAtWorldXY(tile: number | Phaser.Tilemaps.Tile, worldX: number, worldY: number, recalculateFaces?: boolean, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile; + + /** + * Puts an array of tiles or a 2D array of tiles at the given tile coordinates in the specified + * layer. The array can be composed of either tile indexes or Tile objects. If you pass in a Tile, + * all attributes will be copied over to the specified location. If you pass in an index, only the + * index at the specified location will be changed. Collision information will be recalculated + * within the region tiles were changed. + * @param tile A row (array) or grid (2D array) of Tiles or tile indexes to place. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + */ + putTilesAt(tile: number[] | number[][] | Phaser.Tilemaps.Tile[] | Phaser.Tilemaps.Tile[][], tileX: number, tileY: number, recalculateFaces?: boolean): this; + + /** + * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the + * specified layer. Each tile will receive a new index. If an array of indexes is passed in, then + * those will be used for randomly assigning new tile indexes. If an array is not provided, the + * indexes found within the region (excluding -1) will be used for randomly assigning new tile + * indexes. This method only modifies tile indexes and does not change collision information. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param indexes An array of indexes to randomly draw from during randomization. + */ + randomize(tileX?: number, tileY?: number, width?: number, height?: number, indexes?: number[]): this; + + /** + * Removes the tile at the given tile coordinates in the specified layer and updates the layers + * collision information. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param replaceWithNull If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1. Default true. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + */ + removeTileAt(tileX: number, tileY: number, replaceWithNull?: boolean, recalculateFaces?: boolean): Phaser.Tilemaps.Tile; + + /** + * Removes the tile at the given world coordinates in the specified layer and updates the layers + * collision information. + * @param worldX The x coordinate, in pixels. + * @param worldY The y coordinate, in pixels. + * @param replaceWithNull If true, this will replace the tile at the specified location with null instead of a Tile with an index of -1. Default true. + * @param recalculateFaces `true` if the faces data should be recalculated. Default true. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + removeTileAtWorldXY(worldX: number, worldY: number, replaceWithNull?: boolean, recalculateFaces?: boolean, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Tilemaps.Tile; + + /** + * Draws a debug representation of the layer to the given Graphics. This is helpful when you want to + * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles + * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation + * wherever you want on the screen. + * @param graphics The target Graphics object to draw upon. + * @param styleConfig An object specifying the colors to use for the debug drawing. + */ + renderDebug(graphics: Phaser.GameObjects.Graphics, styleConfig?: Phaser.Types.Tilemaps.StyleConfig): this; + + /** + * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching + * `findIndex` and updates their index to match `newIndex`. This only modifies the index and does + * not change collision information. + * @param findIndex The index of the tile to search for. + * @param newIndex The index of the tile to replace it with. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + */ + replaceByIndex(findIndex: number, newIndex: number, tileX?: number, tileY?: number, width?: number, height?: number): this; + + /** + * You can control if the Cameras should cull tiles before rendering them or not. + * + * By default the camera will try to cull the tiles in this layer, to avoid over-drawing to the renderer. + * + * However, there are some instances when you may wish to disable this. + * @param value Set to `true` to stop culling tiles. Set to `false` to enable culling again. Default true. + */ + setSkipCull(value?: boolean): this; + + /** + * When a Camera culls the tiles in this layer it does so using its view into the world, building up a + * rectangle inside which the tiles must exist or they will be culled. Sometimes you may need to expand the size + * of this 'cull rectangle', especially if you plan on rotating the Camera viewing the layer. Do so + * by providing the padding values. The values given are in tiles, not pixels. So if the tile width was 32px + * and you set `paddingX` to be 4, it would add 32px x 4 to the cull rectangle (adjusted for scale) + * @param paddingX The amount of extra horizontal tiles to add to the cull check padding. Default 1. + * @param paddingY The amount of extra vertical tiles to add to the cull check padding. Default 1. + */ + setCullPadding(paddingX?: number, paddingY?: number): this; + + /** + * Sets collision on the given tile or tiles within a layer by index. You can pass in either a + * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if + * collision will be enabled (true) or disabled (false). + * @param indexes Either a single tile index, or an array of tile indexes. + * @param collides If true it will enable collision. If false it will clear collision. Default true. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. Default true. + * @param updateLayer If true, updates the current tiles on the layer. Set to false if no tiles have been placed for significant performance boost. Default true. + */ + setCollision(indexes: number | any[], collides?: boolean, recalculateFaces?: boolean, updateLayer?: boolean): this; + + /** + * Sets collision on a range of tiles in a layer whose index is between the specified `start` and + * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set + * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be + * enabled (true) or disabled (false). + * @param start The first index of the tile to be set for collision. + * @param stop The last index of the tile to be set for collision. + * @param collides If true it will enable collision. If false it will clear collision. Default true. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. Default true. + */ + setCollisionBetween(start: number, stop: number, collides?: boolean, recalculateFaces?: boolean): this; + + /** + * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property + * that matches the given properties object, its collision flag will be set. The `collides` + * parameter controls if collision will be enabled (true) or disabled (false). Passing in + * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that + * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can + * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a + * "types" property that matches any of those values, its collision flag will be updated. + * @param properties An object with tile properties and corresponding values that should be checked. + * @param collides If true it will enable collision. If false it will clear collision. Default true. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. Default true. + */ + setCollisionByProperty(properties: object, collides?: boolean, recalculateFaces?: boolean): this; + + /** + * Sets collision on all tiles in the given layer, except for tiles that have an index specified in + * the given array. The `collides` parameter controls if collision will be enabled (true) or + * disabled (false). Tile indexes not currently in the layer are not affected. + * @param indexes An array of the tile indexes to not be counted for collision. + * @param collides If true it will enable collision. If false it will clear collision. Default true. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. Default true. + */ + setCollisionByExclusion(indexes: number[], collides?: boolean, recalculateFaces?: boolean): this; + + /** + * Sets collision on the tiles within a layer by checking each tiles collision group data + * (typically defined in Tiled within the tileset collision editor). If any objects are found within + * a tiles collision group, the tile's colliding information will be set. The `collides` parameter + * controls if collision will be enabled (true) or disabled (false). + * @param collides If true it will enable collision. If false it will clear collision. Default true. + * @param recalculateFaces Whether or not to recalculate the tile faces after the update. Default true. + */ + setCollisionFromCollisionGroup(collides?: boolean, recalculateFaces?: boolean): this; + + /** + * Sets a global collision callback for the given tile index within the layer. This will affect all + * tiles on this layer that have the same index. If a callback is already set for the tile index it + * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile + * at a specific location on the map then see setTileLocationCallback. + * @param indexes Either a single tile index, or an array of tile indexes to have a collision callback set for. + * @param callback The callback that will be invoked when the tile is collided with. + * @param callbackContext The context under which the callback is called. + */ + setTileIndexCallback(indexes: number | number[], callback: Function, callbackContext: object): this; + + /** + * Sets a collision callback for the given rectangular area (in tile coordinates) within the layer. + * If a callback is already set for the tile index it will be replaced. Set the callback to null to + * remove it. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + * @param callback The callback that will be invoked when the tile is collided with. + * @param callbackContext The context, or scope, under which the callback is invoked. + */ + setTileLocationCallback(tileX?: number, tileY?: number, width?: number, height?: number, callback?: Function, callbackContext?: object): this; + + /** + * Shuffles the tiles in a rectangular region (specified in tile coordinates) within the given + * layer. It will only randomize the tiles in that area, so if they're all the same nothing will + * appear to have changed! This method only modifies tile indexes and does not change collision + * information. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + */ + shuffle(tileX?: number, tileY?: number, width?: number, height?: number): this; + + /** + * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching + * `indexA` and swaps then with `indexB`. This only modifies the index and does not change collision + * information. + * @param tileA First tile index. + * @param tileB Second tile index. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + */ + swapByIndex(tileA: number, tileB: number, tileX?: number, tileY?: number, width?: number, height?: number): this; + + /** + * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the + * layers position, scale and scroll. + * @param tileX The x coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + tileToWorldX(tileX: number, camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the + * layers position, scale and scroll. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + tileToWorldY(tileY: number, camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the + * layers position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + tileToWorldXY(tileX: number, tileY: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Returns an array of Vector2s where each entry corresponds to the corner of the requested tile. + * + * The `tileX` and `tileY` parameters are in tile coordinates, not world coordinates. + * + * The corner coordinates are in world space, having factored in TilemapLayer scale, position + * and the camera, if given. + * + * The size of the array will vary based on the orientation of the map. For example an + * orthographic map will return an array of 4 vectors, where-as a hexagonal map will, + * of course, return an array of 6 corner vectors. + * @param tileX The x coordinate, in tiles, not pixels. + * @param tileY The y coordinate, in tiles, not pixels. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + getTileCorners(tileX: number, tileY: number, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2[] | null; + + /** + * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the + * specified layer. Each tile will receive a new index. New indexes are drawn from the given + * weightedIndexes array. An example weighted array: + * + * [ + * { index: 6, weight: 4 }, // Probability of index 6 is 4 / 8 + * { index: 7, weight: 2 }, // Probability of index 7 would be 2 / 8 + * { index: 8, weight: 1.5 }, // Probability of index 8 would be 1.5 / 8 + * { index: 26, weight: 0.5 } // Probability of index 27 would be 0.5 / 8 + * ] + * + * The probability of any index being choose is (the index's weight) / (sum of all weights). This + * method only modifies tile indexes and does not change collision information. + * @param weightedIndexes An array of objects to randomly draw from during randomization. They should be in the form: { index: 0, weight: 4 } or { index: [0, 1], weight: 4 } if you wish to draw from multiple tile indexes. + * @param tileX The left most tile index (in tile coordinates) to use as the origin of the area. + * @param tileY The top most tile index (in tile coordinates) to use as the origin of the area. + * @param width How many tiles wide from the `tileX` index the area will be. + * @param height How many tiles tall from the `tileY` index the area will be. + */ + weightedRandomize(weightedIndexes: object[], tileX?: number, tileY?: number, width?: number, height?: number): this; + + /** + * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the + * layers position, scale and scroll. + * + * You cannot call this method for Isometric or Hexagonal tilemaps as they require + * both `worldX` and `worldY` values to determine the correct tile, instead you + * should use the `worldToTileXY` method. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + worldToTileX(worldX: number, snapToFloor?: boolean, camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the + * layers position, scale and scroll. + * + * You cannot call this method for Isometric or Hexagonal tilemaps as they require + * both `worldX` and `worldY` values to determine the correct tile, instead you + * should use the `worldToTileXY` method. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + worldToTileY(worldY: number, snapToFloor?: boolean, camera?: Phaser.Cameras.Scene2D.Camera): number; + + /** + * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the + * layers position, scale and scroll. This will return a new Vector2 object or update the given + * `point` object. + * @param worldX The x coordinate to be converted, in pixels, not tiles. + * @param worldY The y coordinate to be converted, in pixels, not tiles. + * @param snapToFloor Whether or not to round the tile coordinate down to the nearest integer. + * @param point A Vector2 to store the coordinates in. If not given a new Vector2 is created. + * @param camera The Camera to use when calculating the tile index from the world values. + */ + worldToTileXY(worldX: number, worldY: number, snapToFloor?: boolean, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Destroys this TilemapLayer and removes its link to the associated LayerData. + * @param removeFromTilemap Remove this layer from the parent Tilemap? Default true. + */ + destroy(removeFromTilemap?: boolean): void; + + /** + * Clears all alpha values associated with this Game Object. + * + * Immediately sets the alpha levels back to 1 (fully opaque). + */ + clearAlpha(): this; + + /** + * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders. + * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque. + * + * If your game is running under WebGL you can optionally specify four different alpha values, each of which + * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used. + * @param topLeft The alpha value used for the top-left of the Game Object. If this is the only value given it's applied across the whole Game Object. Default 1. + * @param topRight The alpha value used for the top-right of the Game Object. WebGL only. + * @param bottomLeft The alpha value used for the bottom-left of the Game Object. WebGL only. + * @param bottomRight The alpha value used for the bottom-right of the Game Object. WebGL only. + */ + setAlpha(topLeft?: number, topRight?: number, bottomLeft?: number, bottomRight?: number): this; + + /** + * The alpha value of the Game Object. + * + * This is a global value, impacting the entire Game Object, not just a region of it. + */ + alpha: number; + + /** + * The alpha value starting from the top-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopLeft: number; + + /** + * The alpha value starting from the top-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaTopRight: number; + + /** + * The alpha value starting from the bottom-left of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomLeft: number; + + /** + * The alpha value starting from the bottom-right of the Game Object. + * This value is interpolated from the corner to the center of the Game Object. + */ + alphaBottomRight: number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency of which blend modes + * are used. + */ + blendMode: Phaser.BlendModes | string | number; + + /** + * Sets the Blend Mode being used by this Game Object. + * + * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay) + * + * Under WebGL only the following Blend Modes are available: + * + * * NORMAL + * * ADD + * * MULTIPLY + * * SCREEN + * * ERASE (only works when rendering to a framebuffer, like a Render Texture) + * + * Canvas has more available depending on browser support. + * + * You can also create your own custom Blend Modes in WebGL. + * + * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending + * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these + * reasons try to be careful about the construction of your Scene and the frequency in which blend modes + * are used. + * @param value The BlendMode value. Either a string, a CONST or a number. + */ + setBlendMode(value: string | Phaser.BlendModes | number): this; + + /** + * The native (un-scaled) width of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayWidth` property. + */ + width: number; + + /** + * The native (un-scaled) height of this Game Object. + * + * Changing this value will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or use + * the `displayHeight` property. + */ + height: number; + + /** + * The displayed width of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayWidth: number; + + /** + * The displayed height of this Game Object. + * + * This value takes into account the scale factor. + * + * Setting this value will adjust the Game Object's scale property. + */ + displayHeight: number; + + /** + * Sets the internal size of this Game Object, as used for frame or physics body creation. + * + * This will not change the size that the Game Object is rendered in-game. + * For that you need to either set the scale of the Game Object (`setScale`) or call the + * `setDisplaySize` method, which is the same thing as changing the scale but allows you + * to do so by giving pixel values. + * + * If you have enabled this Game Object for input, changing the size will _not_ change the + * size of the hit area. To do this you should adjust the `input.hitArea` object directly. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setSize(width: number, height: number): this; + + /** + * Sets the display size of this Game Object. + * + * Calling this will adjust the scale. + * @param width The width of this Game Object. + * @param height The height of this Game Object. + */ + setDisplaySize(width: number, height: number): this; + + /** + * The depth of this Game Object within the Scene. Ensure this value is only ever set to a number data-type. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + */ + depth: number; + + /** + * The depth of this Game Object within the Scene. + * + * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order + * of Game Objects, without actually moving their position in the display list. + * + * The default depth is zero. A Game Object with a higher depth + * value will always render in front of one with a lower value. + * + * Setting the depth will queue a depth sort event within the Scene. + * @param value The depth of this Game Object. Ensure this value is only ever a number data-type. + */ + setDepth(value: number): this; + + /** + * The horizontally flipped state of the Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipX: boolean; + + /** + * The vertically flipped state of the Game Object. + * + * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down) + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + flipY: boolean; + + /** + * Toggles the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + */ + toggleFlipX(): this; + + /** + * Toggles the vertical flipped state of this Game Object. + */ + toggleFlipY(): this; + + /** + * Sets the horizontal flipped state of this Game Object. + * + * A Game Object that is flipped horizontally will render inversed on the horizontal axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipX(value: boolean): this; + + /** + * Sets the vertical flipped state of this Game Object. + * @param value The flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlipY(value: boolean): this; + + /** + * Sets the horizontal and vertical flipped state of this Game Object. + * + * A Game Object that is flipped will render inversed on the flipped axis. + * Flipping always takes place from the middle of the texture and does not impact the scale value. + * If this Game Object has a physics body, it will not change the body. This is a rendering toggle only. + * @param x The horizontal flipped state. `false` for no flip, or `true` to be flipped. + * @param y The horizontal flipped state. `false` for no flip, or `true` to be flipped. + */ + setFlip(x: boolean, y: boolean): this; + + /** + * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state. + */ + resetFlip(): this; + + /** + * Gets the center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the top-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getTopRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the left-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getLeftCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the right-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getRightCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-left corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomLeft(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-center coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomCenter(output?: O, includeParent?: boolean): O; + + /** + * Gets the bottom-right corner coordinate of this Game Object, regardless of origin. + * + * The returned point is calculated in local space and does not factor in any parent Containers, + * unless the `includeParent` argument is set to `true`. + * @param output An object to store the values in. If not provided a new Vector2 will be created. + * @param includeParent If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector? Default false. + */ + getBottomRight(output?: O, includeParent?: boolean): O; + + /** + * Gets the bounds of this Game Object, regardless of origin. + * + * The values are stored and returned in a Rectangle, or Rectangle-like, object. + * @param output An object to store the values in. If not provided a new Rectangle will be created. + */ + getBounds(output?: O): O; + + /** + * The Mask this Game Object is using during render. + */ + mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask; + + /** + * Sets the mask that this Game Object will use to render with. + * + * The mask must have been previously created and can be either a GeometryMask or a BitmapMask. + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * If a mask is already set on this Game Object it will be immediately replaced. + * + * Masks are positioned in global space and are not relative to the Game Object to which they + * are applied. The reason for this is that multiple Game Objects can all share the same mask. + * + * Masks have no impact on physics or input detection. They are purely a rendering component + * that allows you to limit what is visible during the render pass. + * @param mask The mask this Game Object will use when rendering. + */ + setMask(mask: Phaser.Display.Masks.BitmapMask | Phaser.Display.Masks.GeometryMask): this; + + /** + * Clears the mask that this Game Object was using. + * @param destroyMask Destroy the mask before clearing it? Default false. + */ + clearMask(destroyMask?: boolean): this; + + /** + * Creates and returns a Bitmap Mask. This mask can be used by any Game Object, + * including this one, or a Dynamic Texture. + * + * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas. + * + * To create the mask you need to pass in a reference to a renderable Game Object. + * A renderable Game Object is one that uses a texture to render with, such as an + * Image, Sprite, Render Texture or BitmapText. + * + * If you do not provide a renderable object, and this Game Object has a texture, + * it will use itself as the object. This means you can call this method to create + * a Bitmap Mask from any renderable texture-based Game Object. + * @param maskObject The Game Object or Dynamic Texture that will be used as the mask. If `null` it will generate an Image Game Object using the rest of the arguments. + * @param x If creating a Game Object, the horizontal position in the world. + * @param y If creating a Game Object, the vertical position in the world. + * @param texture If creating a Game Object, the key, or instance of the Texture it will use to render with, as stored in the Texture Manager. + * @param frame If creating a Game Object, an optional frame from the Texture this Game Object is rendering with. + */ + createBitmapMask(maskObject?: Phaser.GameObjects.GameObject | Phaser.Textures.DynamicTexture, x?: number, y?: number, texture?: string | Phaser.Textures.Texture, frame?: string | number | Phaser.Textures.Frame): Phaser.Display.Masks.BitmapMask; + + /** + * Creates and returns a Geometry Mask. This mask can be used by any Game Object, + * including this one. + * + * To create the mask you need to pass in a reference to a Graphics Game Object. + * + * If you do not provide a graphics object, and this Game Object is an instance + * of a Graphics object, then it will use itself to create the mask. + * + * This means you can call this method to create a Geometry Mask from any Graphics Game Object. + * @param graphics A Graphics Game Object, or any kind of Shape Game Object. The geometry within it will be used as the mask. + */ + createGeometryMask(graphics?: Phaser.GameObjects.Graphics | Phaser.GameObjects.Shape): Phaser.Display.Masks.GeometryMask; + + /** + * Sets the origin of this Game Object. + * + * The values are given in the range 0 to 1. + * @param x The horizontal origin value. Default 0.5. + * @param y The vertical origin value. If not defined it will be set to the value of `x`. Default x. + */ + setOrigin(x?: number, y?: number): this; + + /** + * Sets the origin of this Game Object based on the Pivot values in its Frame. + */ + setOriginFromFrame(): this; + + /** + * Sets the display origin of this Game Object. + * The difference between this and setting the origin is that you can use pixel values for setting the display origin. + * @param x The horizontal display origin value. Default 0. + * @param y The vertical display origin value. If not defined it will be set to the value of `x`. Default x. + */ + setDisplayOrigin(x?: number, y?: number): this; + + /** + * Updates the Display Origin cached values internally stored on this Game Object. + * You don't usually call this directly, but it is exposed for edge-cases where you may. + */ + updateDisplayOrigin(): this; + + /** + * The initial WebGL pipeline of this Game Object. + * + * If you call `resetPipeline` on this Game Object, the pipeline is reset to this default. + */ + defaultPipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * The current WebGL pipeline of this Game Object. + */ + pipeline: Phaser.Renderer.WebGL.WebGLPipeline; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + pipelineData: object; + + /** + * Sets the initial WebGL Pipeline of this Game Object. + * + * This should only be called during the instantiation of the Game Object. After that, use `setPipeline`. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + */ + initPipeline(pipeline?: string | Phaser.Renderer.WebGL.WebGLPipeline): boolean; + + /** + * Sets the main WebGL Pipeline of this Game Object. + * + * Also sets the `pipelineData` property, if the parameter is given. + * @param pipeline Either the string-based name of the pipeline, or a pipeline instance to set. + * @param pipelineData Optional pipeline data object that is set in to the `pipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `pipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPipeline(pipeline: string | Phaser.Renderer.WebGL.WebGLPipeline, pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `pipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPipelineData(key: string, value?: any): this; + + /** + * Resets the WebGL Pipeline of this Game Object back to the default it was created with. + * @param resetData Reset the `pipelineData` object to being an empty object? Default false. + */ + resetPipeline(resetData?: boolean): boolean; + + /** + * Gets the name of the WebGL Pipeline this Game Object is currently using. + */ + getPipelineName(): string; + + /** + * Does this Game Object have any Post Pipelines set? + */ + hasPostPipeline: boolean; + + /** + * The WebGL Post FX Pipelines this Game Object uses for post-render effects. + * + * The pipelines are processed in the order in which they appear in this array. + * + * If you modify this array directly, be sure to set the + * `hasPostPipeline` property accordingly. + */ + postPipelines: Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * An object to store pipeline specific data in, to be read by the pipelines this Game Object uses. + */ + postPipelineData: object; + + /** + * The Pre FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.preFX.addBloom(); + * ``` + * + * Only the following Game Objects support Pre FX: + * + * * Image + * * Sprite + * * TileSprite + * * Text + * * RenderTexture + * * Video + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + */ + preFX: Phaser.GameObjects.Components.FX | null; + + /** + * The Post FX component of this Game Object. + * + * This component allows you to apply a variety of built-in effects to this Game Object, such + * as glow, blur, bloom, displacements, vignettes and more. You access them via this property, + * for example: + * + * ```js + * const player = this.add.sprite(); + * player.postFX.addBloom(); + * ``` + * + * All FX are WebGL only and do not have Canvas counterparts. + * + * Please see the FX Class for more details and available methods. + * + * This property is always `null` until the `initPostPipeline` method is called. + */ + postFX: Phaser.GameObjects.Components.FX; + + /** + * This should only be called during the instantiation of the Game Object. + * + * It is called by default by all core Game Objects and doesn't need + * calling again. + * + * After that, use `setPostPipeline`. + * @param preFX Does this Game Object support Pre FX? Default false. + */ + initPostPipeline(preFX?: boolean): void; + + /** + * Sets one, or more, Post Pipelines on this Game Object. + * + * Post Pipelines are invoked after this Game Object has rendered to its target and + * are commonly used for post-fx. + * + * The post pipelines are appended to the `postPipelines` array belonging to this + * Game Object. When the renderer processes this Game Object, it iterates through the post + * pipelines in the order in which they appear in the array. If you are stacking together + * multiple effects, be aware that the order is important. + * + * If you call this method multiple times, the new pipelines will be appended to any existing + * post pipelines already set. Use the `resetPostPipeline` method to clear them first, if required. + * + * You can optionally also set the `postPipelineData` property, if the parameter is given. + * @param pipelines Either the string-based name of the pipeline, or a pipeline instance, or class, or an array of them. + * @param pipelineData Optional pipeline data object that is set in to the `postPipelineData` property of this Game Object. + * @param copyData Should the pipeline data object be _deep copied_ into the `postPipelineData` property of this Game Object? If `false` it will be set by reference instead. Default true. + */ + setPostPipeline(pipelines: string | string[] | Function | Function[] | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[], pipelineData?: object, copyData?: boolean): this; + + /** + * Adds an entry to the `postPipelineData` object belonging to this Game Object. + * + * If the 'key' already exists, its value is updated. If it doesn't exist, it is created. + * + * If `value` is undefined, and `key` exists, `key` is removed from the data object. + * @param key The key of the pipeline data to set, update, or delete. + * @param value The value to be set with the key. If `undefined` then `key` will be deleted from the object. + */ + setPostPipelineData(key: string, value?: any): this; + + /** + * Gets a Post Pipeline instance from this Game Object, based on the given name, and returns it. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + getPostPipeline(pipeline: string | Function | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): Phaser.Renderer.WebGL.Pipelines.PostFXPipeline | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline[]; + + /** + * Resets the WebGL Post Pipelines of this Game Object. It does this by calling + * the `destroy` method on each post pipeline and then clearing the local array. + * @param resetData Reset the `postPipelineData` object to being an empty object? Default false. + */ + resetPostPipeline(resetData?: boolean): void; + + /** + * Removes a type of Post Pipeline instances from this Game Object, based on the given name, and destroys them. + * + * If you wish to remove all Post Pipelines use the `resetPostPipeline` method instead. + * @param pipeline The string-based name of the pipeline, or a pipeline class. + */ + removePostPipeline(pipeline: string | Phaser.Renderer.WebGL.Pipelines.PostFXPipeline): this; + + /** + * Removes all Pre and Post FX Controllers from this Game Object. + * + * If you wish to remove a single controller, use the `preFX.remove(fx)` or `postFX.remove(fx)` methods instead. + * + * If you wish to clear a single controller, use the `preFX.clear()` or `postFX.clear()` methods instead. + */ + clearFX(): this; + + /** + * The horizontal scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorX: number; + + /** + * The vertical scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + */ + scrollFactorY: number; + + /** + * Sets the scroll factor of this Game Object. + * + * The scroll factor controls the influence of the movement of a Camera upon this Game Object. + * + * When a camera scrolls it will change the location at which this Game Object is rendered on-screen. + * It does not change the Game Objects actual position values. + * + * A value of 1 means it will move exactly in sync with a camera. + * A value of 0 means it will not move at all, even if the camera moves. + * Other values control the degree to which the camera movement is mapped to this Game Object. + * + * Please be aware that scroll factor values other than 1 are not taken in to consideration when + * calculating physics collisions. Bodies always collide based on their world position, but changing + * the scroll factor is a visual adjustment to where the textures are rendered, which can offset + * them from physics bodies if not accounted for in your code. + * @param x The horizontal scroll factor of this Game Object. + * @param y The vertical scroll factor of this Game Object. If not set it will use the `x` value. Default x. + */ + setScrollFactor(x: number, y?: number): this; + + /** + * A property indicating that a Game Object has this component. + */ + readonly hasTransformComponent: boolean; + + /** + * The x position of this Game Object. + */ + x: number; + + /** + * The y position of this Game Object. + */ + y: number; + + /** + * The z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#depth} instead. + */ + z: number; + + /** + * The w position of this Game Object. + */ + w: number; + + /** + * This is a special setter that allows you to set both the horizontal and vertical scale of this Game Object + * to the same value, at the same time. When reading this value the result returned is `(scaleX + scaleY) / 2`. + * + * Use of this property implies you wish the horizontal and vertical scales to be equal to each other. If this + * isn't the case, use the `scaleX` or `scaleY` properties instead. + */ + scale: number; + + /** + * The horizontal scale of this Game Object. + */ + scaleX: number; + + /** + * The vertical scale of this Game Object. + */ + scaleY: number; + + /** + * The angle of this Game Object as expressed in degrees. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, 90 is down, 180/-180 is left + * and -90 is up. + * + * If you prefer to work in radians, see the `rotation` property instead. + */ + angle: number; + + /** + * The angle of this Game Object in radians. + * + * Phaser uses a right-hand clockwise rotation system, where 0 is right, PI/2 is down, +-PI is left + * and -PI/2 is up. + * + * If you prefer to work in degrees, see the `angle` property instead. + */ + rotation: number; + + /** + * Sets the position of this Game Object. + * @param x The x position of this Game Object. Default 0. + * @param y The y position of this Game Object. If not set it will use the `x` value. Default x. + * @param z The z position of this Game Object. Default 0. + * @param w The w position of this Game Object. Default 0. + */ + setPosition(x?: number, y?: number, z?: number, w?: number): this; + + /** + * Copies an object's coordinates to this Game Object's position. + * @param source An object with numeric 'x', 'y', 'z', or 'w' properties. Undefined values are not copied. + */ + copyPosition(source: Phaser.Types.Math.Vector2Like | Phaser.Types.Math.Vector3Like | Phaser.Types.Math.Vector4Like): this; + + /** + * Sets the position of this Game Object to be a random position within the confines of + * the given area. + * + * If no area is specified a random position between 0 x 0 and the game width x height is used instead. + * + * The position does not factor in the size of this Game Object, meaning that only the origin is + * guaranteed to be within the area. + * @param x The x position of the top-left of the random area. Default 0. + * @param y The y position of the top-left of the random area. Default 0. + * @param width The width of the random area. + * @param height The height of the random area. + */ + setRandomPosition(x?: number, y?: number, width?: number, height?: number): this; + + /** + * Sets the rotation of this Game Object. + * @param radians The rotation of this Game Object, in radians. Default 0. + */ + setRotation(radians?: number): this; + + /** + * Sets the angle of this Game Object. + * @param degrees The rotation of this Game Object, in degrees. Default 0. + */ + setAngle(degrees?: number): this; + + /** + * Sets the scale of this Game Object. + * @param x The horizontal scale of this Game Object. Default 1. + * @param y The vertical scale of this Game Object. If not set it will use the `x` value. Default x. + */ + setScale(x?: number, y?: number): this; + + /** + * Sets the x position of this Game Object. + * @param value The x position of this Game Object. Default 0. + */ + setX(value?: number): this; + + /** + * Sets the y position of this Game Object. + * @param value The y position of this Game Object. Default 0. + */ + setY(value?: number): this; + + /** + * Sets the z position of this Game Object. + * + * Note: The z position does not control the rendering order of 2D Game Objects. Use + * {@link Phaser.GameObjects.Components.Depth#setDepth} instead. + * @param value The z position of this Game Object. Default 0. + */ + setZ(value?: number): this; + + /** + * Sets the w position of this Game Object. + * @param value The w position of this Game Object. Default 0. + */ + setW(value?: number): this; + + /** + * Gets the local transform matrix for this Game Object. + * @param tempMatrix The matrix to populate with the values from this Game Object. + */ + getLocalTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Gets the world transform matrix for this Game Object, factoring in any parent Containers. + * @param tempMatrix The matrix to populate with the values from this Game Object. + * @param parentMatrix A temporary matrix to hold parent values during the calculations. + */ + getWorldTransformMatrix(tempMatrix?: Phaser.GameObjects.Components.TransformMatrix, parentMatrix?: Phaser.GameObjects.Components.TransformMatrix): Phaser.GameObjects.Components.TransformMatrix; + + /** + * Takes the given `x` and `y` coordinates and converts them into local space for this + * Game Object, taking into account parent and local transforms, and the Display Origin. + * + * The returned Vector2 contains the translated point in its properties. + * + * A Camera needs to be provided in order to handle modified scroll factors. If no + * camera is specified, it will use the `main` camera from the Scene to which this + * Game Object belongs. + * @param x The x position to translate. + * @param y The y position to translate. + * @param point A Vector2, or point-like object, to store the results in. + * @param camera The Camera which is being tested against. If not given will use the Scene default camera. + */ + getLocalPoint(x: number, y: number, point?: Phaser.Math.Vector2, camera?: Phaser.Cameras.Scene2D.Camera): Phaser.Math.Vector2; + + /** + * Gets the sum total rotation of all of this Game Objects parent Containers. + * + * The returned value is in radians and will be zero if this Game Object has no parent container. + */ + getParentRotation(): number; + + /** + * The visible state of the Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + */ + visible: boolean; + + /** + * Sets the visibility of this Game Object. + * + * An invisible Game Object will skip rendering, but will still process update logic. + * @param value The visible state of the Game Object. + */ + setVisible(value: boolean): this; + + /** + * Sets the Collision Category that this Arcade Physics Body + * will use in order to determine what it can collide with. + * + * It can only have one single category assigned to it. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param category The collision category. + */ + setCollisionCategory(category: number): this; + + /** + * Checks to see if the given Collision Category will collide with + * this Arcade Physics object or not. + * @param category Collision category value to test. + */ + willCollideWith(category: number): boolean; + + /** + * Adds the given Collision Category to the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + addCollidesWith(category: number): this; + + /** + * Removes the given Collision Category from the list of those that this + * Arcade Physics Body will collide with. + * @param category The collision category to add. + */ + removeCollidesWith(category: number): this; + + /** + * Sets all of the Collision Categories that this Arcade Physics Body + * will collide with. You can either pass a single category value, or + * an array of them. + * + * Calling this method will reset all of the collision categories, + * so only those passed to this method are enabled. + * + * If you wish to add a new category to the existing mask, call + * the `addCollisionCategory` method. + * + * If you wish to reset the collision category and mask, call + * the `resetCollisionCategory` method. + * @param categories The collision category to collide with, or an array of them. + */ + setCollidesWith(categories: number | number[]): this; + + /** + * Resets the Collision Category and Mask back to the defaults, + * which is to collide with everything. + */ + resetCollisionCategory(): this; + + } + + /** + * A Tileset is a combination of a single image containing the tiles and a container for data about + * each tile. + */ + class Tileset { + /** + * + * @param name The name of the tileset in the map data. + * @param firstgid The first tile index this tileset contains. + * @param tileWidth Width of each tile (in pixels). Default 32. + * @param tileHeight Height of each tile (in pixels). Default 32. + * @param tileMargin The margin around all tiles in the sheet (in pixels). Default 0. + * @param tileSpacing The spacing between each tile in the sheet (in pixels). Default 0. + * @param tileProperties Custom properties defined per tile in the Tileset. + * These typically are custom properties created in Tiled when editing a tileset. Default {}. + * @param tileData Data stored per tile. These typically are created in Tiled when editing a tileset, e.g. from Tiled's tile collision editor or terrain editor. Default {}. + * @param tileOffset Tile texture drawing offset. Default {x: 0, y: 0}. + */ + constructor(name: string, firstgid: number, tileWidth?: number, tileHeight?: number, tileMargin?: number, tileSpacing?: number, tileProperties?: object, tileData?: object, tileOffset?: object); + + /** + * The name of the Tileset.s + */ + name: string; + + /** + * The starting index of the first tile index this Tileset contains. + */ + firstgid: number; + + /** + * The width of each tile (in pixels). Use setTileSize to change. + */ + readonly tileWidth: number; + + /** + * The height of each tile (in pixels). Use setTileSize to change. + */ + readonly tileHeight: number; + + /** + * The margin around the tiles in the sheet (in pixels). Use `setSpacing` to change. + */ + readonly tileMargin: number; + + /** + * The spacing between each the tile in the sheet (in pixels). Use `setSpacing` to change. + */ + readonly tileSpacing: number; + + /** + * Tileset-specific properties per tile that are typically defined in the Tiled editor in the + * Tileset editor. + */ + tileProperties: object; + + /** + * Tileset-specific data per tile that are typically defined in the Tiled editor, e.g. within + * the Tileset collision editor. This is where collision objects and terrain are stored. + */ + tileData: object; + + /** + * Controls the drawing offset from the tile origin. + * Defaults to 0x0, no offset. + */ + tileOffset: Phaser.Math.Vector2; + + /** + * The cached image that contains the individual tiles. Use setImage to set. + */ + readonly image: Phaser.Textures.Texture | null; + + /** + * The gl texture used by the WebGL renderer. + */ + readonly glTexture: Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper | null; + + /** + * The number of tile rows in the the tileset. + */ + readonly rows: number; + + /** + * The number of tile columns in the tileset. + */ + readonly columns: number; + + /** + * The total number of tiles in the tileset. + */ + readonly total: number; + + /** + * The look-up table to specific tile image texture coordinates (UV in pixels). Each element + * contains the coordinates for a tile in an object of the form {x, y}. + */ + readonly texCoordinates: object[]; + + /** + * Get a tiles properties that are stored in the Tileset. Returns null if tile index is not + * contained in this Tileset. This is typically defined in Tiled under the Tileset editor. + * @param tileIndex The unique id of the tile across all tilesets in the map. + */ + getTileProperties(tileIndex: number): object | undefined | null; + + /** + * Get a tile's data that is stored in the Tileset. Returns null if tile index is not contained + * in this Tileset. This is typically defined in Tiled and will contain both Tileset collision + * info and terrain mapping. + * @param tileIndex The unique id of the tile across all tilesets in the map. + */ + getTileData(tileIndex: number): object | undefined; + + /** + * Get a tile's collision group that is stored in the Tileset. Returns null if tile index is not + * contained in this Tileset. This is typically defined within Tiled's tileset collision editor. + * @param tileIndex The unique id of the tile across all tilesets in the map. + */ + getTileCollisionGroup(tileIndex: number): object | null; + + /** + * Returns true if and only if this Tileset contains the given tile index. + * @param tileIndex The unique id of the tile across all tilesets in the map. + */ + containsTileIndex(tileIndex: number): boolean; + + /** + * Returns the texture coordinates (UV in pixels) in the Tileset image for the given tile index. + * Returns null if tile index is not contained in this Tileset. + * @param tileIndex The unique id of the tile across all tilesets in the map. + */ + getTileTextureCoordinates(tileIndex: number): object | null; + + /** + * Sets the image associated with this Tileset and updates the tile data (rows, columns, etc.). + * @param texture The image that contains the tiles. + */ + setImage(texture: Phaser.Textures.Texture): Phaser.Tilemaps.Tileset; + + /** + * Sets the tile width & height and updates the tile data (rows, columns, etc.). + * @param tileWidth The width of a tile in pixels. + * @param tileHeight The height of a tile in pixels. + */ + setTileSize(tileWidth?: number, tileHeight?: number): Phaser.Tilemaps.Tileset; + + /** + * Sets the tile margin & spacing and updates the tile data (rows, columns, etc.). + * @param margin The margin around the tiles in the sheet (in pixels). + * @param spacing The spacing between the tiles in the sheet (in pixels). + */ + setSpacing(margin?: number, spacing?: number): Phaser.Tilemaps.Tileset; + + /** + * Updates tile texture coordinates and tileset data. + * @param imageWidth The (expected) width of the image to slice. + * @param imageHeight The (expected) height of the image to slice. + * @param offsetX The x offset in the source texture where the tileset starts. Default 0. + * @param offsetY The y offset in the source texture where the tileset starts. Default 0. + */ + updateTileData(imageWidth: number, imageHeight: number, offsetX?: number, offsetY?: number): Phaser.Tilemaps.Tileset; + + } + + /** + * Orthogonal Tilemap orientation constant. + */ + const ORTHOGONAL: number; + + /** + * Isometric Tilemap orientation constant. + */ + const ISOMETRIC: number; + + /** + * Staggered Tilemap orientation constant. + */ + const STAGGERED: number; + + /** + * Hexagonal Tilemap orientation constant. + */ + const HEXAGONAL: number; + + } + + namespace Time { + /** + * The Clock is a Scene plugin which creates and updates Timer Events for its Scene. + */ + class Clock { + /** + * + * @param scene The Scene which owns this Clock. + */ + constructor(scene: Phaser.Scene); + + /** + * The Scene which owns this Clock. + */ + scene: Phaser.Scene; + + /** + * The Scene Systems object of the Scene which owns this Clock. + */ + systems: Phaser.Scenes.Systems; + + /** + * The current time of the Clock, in milliseconds. + * + * If accessed externally, this is equivalent to the `time` parameter normally passed to a Scene's `update` method. + */ + now: number; + + /** + * The time the Clock (and Scene) started, in milliseconds. + * + * This can be compared to the `time` parameter passed to a Scene's `update` method. + */ + startTime: number; + + /** + * The scale of the Clock's time delta. + * + * The time delta is the time elapsed between two consecutive frames and influences the speed of time for this Clock and anything which uses it, such as its Timer Events. Values higher than 1 increase the speed of time, while values smaller than 1 decrease it. A value of 0 freezes time and is effectively equivalent to pausing the Clock. + */ + timeScale: number; + + /** + * Whether the Clock is paused (`true`) or active (`false`). + * + * When paused, the Clock will not update any of its Timer Events, thus freezing time. + */ + paused: boolean; + + /** + * Creates a Timer Event and adds it to this Clock at the start of the next frame. + * + * You can pass in either a `TimerEventConfig` object, from with a new `TimerEvent` will + * be created, or you can pass in a `TimerEvent` instance. + * + * If passing an instance please make sure that this instance hasn't been used before. + * If it has ever entered a 'completed' state then it will no longer be suitable to + * run again. + * + * Also, if the `TimerEvent` instance is being used by _another_ Clock (in another Scene) + * it will still be updated by that Clock as well, so be careful when using this feature. + * @param config The configuration for the Timer Event, or an existing Timer Event object. + */ + addEvent(config: Phaser.Time.TimerEvent | Phaser.Types.Time.TimerEventConfig): Phaser.Time.TimerEvent; + + /** + * Creates a Timer Event and adds it to the Clock at the start of the frame. + * + * This is a shortcut for {@link #addEvent} which can be shorter and is compatible with the syntax of the GreenSock Animation Platform (GSAP). + * @param delay The delay of the function call, in milliseconds. + * @param callback The function to call after the delay expires. + * @param args The arguments to call the function with. + * @param callbackScope The scope (`this` object) to call the function with. + */ + delayedCall(delay: number, callback: Function, args?: any[], callbackScope?: any): Phaser.Time.TimerEvent; + + /** + * Clears and recreates the array of pending Timer Events. + */ + clearPendingEvents(): this; + + /** + * Removes the given Timer Event, or an array of Timer Events, from this Clock. + * + * The events are removed from all internal lists (active, pending and removal), + * freeing the event up to be re-used. + * @param events The Timer Event, or an array of Timer Events, to remove from this Clock. + */ + removeEvent(events: Phaser.Time.TimerEvent | Phaser.Time.TimerEvent[]): this; + + /** + * Schedules all active Timer Events for removal at the start of the frame. + */ + removeAllEvents(): this; + + /** + * Updates the arrays of active and pending Timer Events. Called at the start of the frame. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + preUpdate(time: number, delta: number): void; + + /** + * Updates the Clock's internal time and all of its Timer Events. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(time: number, delta: number): void; + + } + + namespace Events { + /** + * The Timeline Complete Event. + * + * This event is dispatched by timeline when all timeline events complete. + * + * Listen to it from a Timeline instance using `Timeline.on('complete', listener)`, i.e.: + * + * ```javascript + * const timeline = this.add.timeline(); + * timeline.on('complete', listener); + * timeline.play(); + * ``` + */ + const COMPLETE: string; + + } + + /** + * A Timeline is a way to schedule events to happen at specific times in the future. + * + * You can think of it as an event sequencer for your game, allowing you to schedule the + * running of callbacks, events and other actions at specific times in the future. + * + * A Timeline is a Scene level system, meaning you can have as many Timelines as you like, each + * belonging to a different Scene. You can also have multiple Timelines running at the same time. + * + * If the Scene is paused, the Timeline will also pause. If the Scene is destroyed, the Timeline + * will be automatically destroyed. However, you can control the Timeline directly, pausing, + * resuming and stopping it at any time. + * + * Create an instance of a Timeline via the Game Object Factory: + * + * ```js + * const timeline = this.add.timeline(); + * ``` + * + * The Timeline always starts paused. You must call `play` on it to start it running. + * + * You can also pass in a configuration object on creation, or an array of them: + * + * ```js + * const timeline = this.add.timeline({ + * at: 1000, + * run: () => { + * this.add.sprite(400, 300, 'logo'); + * } + * }); + * + * timeline.play(); + * ``` + * + * In this example we sequence a few different events: + * + * ```js + * const timeline = this.add.timeline([ + * { + * at: 1000, + * run: () => { this.logo = this.add.sprite(400, 300, 'logo'); }, + * sound: 'TitleMusic' + * }, + * { + * at: 2500, + * tween: { + * targets: this.logo, + * y: 600, + * yoyo: true + * }, + * sound: 'Explode' + * }, + * { + * at: 8000, + * event: 'HURRY_PLAYER', + * target: this.background, + * set: { + * tint: 0xff0000 + * } + * } + * ]); + * + * timeline.play(); + * ``` + * + * The Timeline can also be looped with the repeat method: + * ```js + * timeline.repeat().play(); + * ``` + * + * There are lots of options available to you via the configuration object. See the + * {@link Phaser.Types.Time.TimelineEventConfig} typedef for more details. + */ + class Timeline extends Phaser.Events.EventEmitter { + /** + * + * @param scene The Scene which owns this Timeline. + * @param config The configuration object for this Timeline Event, or an array of them. + */ + constructor(scene: Phaser.Scene, config?: Phaser.Types.Time.TimelineEventConfig | Phaser.Types.Time.TimelineEventConfig[]); + + /** + * The Scene to which this Timeline belongs. + */ + scene: Phaser.Scene; + + /** + * A reference to the Scene Systems. + */ + systems: Phaser.Scenes.Systems; + + /** + * The elapsed time counter. + * + * Treat this as read-only. + */ + elapsed: number; + + /** + * Whether the Timeline is running (`true`) or active (`false`). + * + * When paused, the Timeline will not run any of its actions. + * + * By default a Timeline is always paused and should be started by + * calling the `Timeline.play` method. + * + * You can use the `Timeline.pause` and `Timeline.resume` methods to control + * this value in a chainable way. + */ + paused: boolean; + + /** + * Whether the Timeline is complete (`true`) or not (`false`). + * + * A Timeline is considered complete when all of its events have been run. + * + * If you wish to reset a Timeline after it has completed, you can do so + * by calling the `Timeline.reset` method. + * + * You can also use the `Timeline.stop` method to stop a running Timeline, + * at any point, without resetting it. + */ + complete: boolean; + + /** + * The total number of events that have been run. + * + * This value is reset to zero if the Timeline is restarted. + * + * Treat this as read-only. + */ + totalComplete: number; + + /** + * The number of times this timeline should loop. + * + * If this value is -1 or any negative number this Timeline will not stop. + */ + loop: number; + + /** + * The number of times this Timeline has looped. + * + * This value is incremented each loop if looping is enabled. + */ + iteration: number; + + /** + * An array of all the Timeline Events. + */ + events: Phaser.Types.Time.TimelineEvent[]; + + /** + * Updates the elapsed time counter, if this Timeline is not paused. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + preUpdate(time: number, delta: number): void; + + /** + * Called automatically by the Scene update step. + * + * Iterates through all of the Timeline Events and checks to see if they should be run. + * + * If they should be run, then the `TimelineEvent.action` callback is invoked. + * + * If the `TimelineEvent.once` property is `true` then the event is removed from the Timeline. + * + * If the `TimelineEvent.event` property is set then the Timeline emits that event. + * + * If the `TimelineEvent.run` property is set then the Timeline invokes that method. + * + * If the `TimelineEvent.loop` property is set then the Timeline invokes that method when repeated. + * + * If the `TimelineEvent.target` property is set then the Timeline invokes the `run` method on that target. + * @param time The current time. Either a High Resolution Timer value if it comes from Request Animation Frame, or Date.now if using SetTimeout. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(time: number, delta: number): void; + + /** + * Starts this Timeline running. + * + * If the Timeline is already running and the `fromStart` parameter is `true`, + * then calling this method will reset the Timeline events as incomplete. + * + * If you wish to resume a paused Timeline, then use the `Timeline.resume` method instead. + * @param fromStart Reset this Timeline back to the start before playing. Default true. + */ + play(fromStart?: boolean): this; + + /** + * Pauses this Timeline. + * + * To resume it again, call the `Timeline.resume` method or set the `Timeline.paused` property to `false`. + * + * If the Timeline is paused while processing the current game step, then it + * will carry on with all events that are due to run during that step and pause + * from the next game step. + * + * Note that if any Tweens have been started prior to calling this method, they will **not** be paused as well. + */ + pause(): this; + + /** + * Repeats this Timeline. + * + * If the value for `amount` is positive, the Timeline will repeat that many additional times. + * For example a value of 1 will actually run this Timeline twice. + * + * Depending on the value given, `false` is 0 and `true`, undefined and negative numbers are infinite. + * + * If this Timeline had any events set to `once` that have already been removed, + * they will **not** be repeated each loop. + * @param amount Amount of times to repeat, if `true` or negative it will be infinite. Default -1. + */ + repeat(amount?: number | boolean): this; + + /** + * Resumes this Timeline from a paused state. + * + * The Timeline will carry on from where it left off. + * + * If you need to reset the Timeline to the start, then call the `Timeline.reset` method. + */ + resume(): this; + + /** + * Stops this Timeline. + * + * This will set the `paused` and `complete` properties to `true`. + * + * If you wish to reset the Timeline to the start, then call the `Timeline.reset` method. + */ + stop(): this; + + /** + * Resets this Timeline back to the start. + * + * This will set the elapsed time to zero and set all events to be incomplete. + * + * If the Timeline had any events that were set to `once` that have already + * been removed, they will **not** be present again after calling this method. + * + * If the Timeline isn't currently running (i.e. it's paused or complete) then + * calling this method resets those states, the same as calling `Timeline.play(true)`. + * @param loop Set to true if you do not want to reset the loop counters. Default false. + */ + reset(loop?: boolean): this; + + /** + * Adds one or more events to this Timeline. + * + * You can pass in a single configuration object, or an array of them: + * + * ```js + * const timeline = this.add.timeline({ + * at: 1000, + * run: () => { + * this.add.sprite(400, 300, 'logo'); + * } + * }); + * ``` + * @param config The configuration object for this Timeline Event, or an array of them. + */ + add(config: Phaser.Types.Time.TimelineEventConfig | Phaser.Types.Time.TimelineEventConfig[]): this; + + /** + * Removes all events from this Timeline, resets the elapsed time to zero + * and pauses the Timeline. + */ + clear(): this; + + /** + * Returns `true` if this Timeline is currently playing. + * + * A Timeline is playing if it is not paused or not complete. + */ + isPlaying(): boolean; + + /** + * Returns a number between 0 and 1 representing the progress of this Timeline. + * + * A value of 0 means the Timeline has just started, 0.5 means it's half way through, + * and 1 means it's complete. + * + * If the Timeline has no events, or all events have been removed, this will return 1. + * + * If the Timeline is paused, this will return the progress value at the time it was paused. + * + * Note that the value returned is based on the number of events that have been completed, + * not the 'duration' of the events (as this is unknown to the Timeline). + */ + getProgress(): number; + + /** + * Destroys this Timeline. + * + * This will remove all events from the Timeline and stop it from processing. + * + * This method is called automatically when the Scene shuts down, but you may + * also call it directly should you need to destroy the Timeline earlier. + */ + destroy(): void; + + } + + /** + * A Timer Event represents a delayed function call. It's managed by a Scene's {@link Clock} and will call its function after a set amount of time has passed. The Timer Event can optionally repeat - i.e. call its function multiple times before finishing, or loop indefinitely. + * + * Because it's managed by a Clock, a Timer Event is based on game time, will be affected by its Clock's time scale, and will pause if its Clock pauses. + */ + class TimerEvent { + /** + * + * @param config The configuration for the Timer Event, including its delay and callback. + */ + constructor(config: Phaser.Types.Time.TimerEventConfig); + + /** + * The delay in ms at which this TimerEvent fires. + */ + readonly delay: number; + + /** + * The total number of times this TimerEvent will repeat before finishing. + */ + readonly repeat: number; + + /** + * If repeating this contains the current repeat count. + */ + repeatCount: number; + + /** + * True if this TimerEvent loops, otherwise false. + */ + readonly loop: boolean; + + /** + * The callback that will be called when the TimerEvent occurs. + */ + callback: Function; + + /** + * The scope in which the callback will be called. + */ + callbackScope: object; + + /** + * Additional arguments to be passed to the callback. + */ + args: any[]; + + /** + * Scale the time causing this TimerEvent to update. + */ + timeScale: number; + + /** + * Start this many MS into the elapsed (useful if you want a long duration with repeat, but for the first loop to fire quickly) + */ + startAt: number; + + /** + * The time in milliseconds which has elapsed since the Timer Event's creation. + * + * This value is local for the Timer Event and is relative to its Clock. As such, it's influenced by the Clock's time scale and paused state, the Timer Event's initial {@link #startAt} property, and the Timer Event's {@link #timeScale} and {@link #paused} state. + */ + elapsed: number; + + /** + * Whether or not this timer is paused. + */ + paused: boolean; + + /** + * Whether the Timer Event's function has been called. + * + * When the Timer Event fires, this property will be set to `true` before the callback function is invoked and will be reset immediately afterward if the Timer Event should repeat. The value of this property does not directly influence whether the Timer Event will be removed from its Clock, but can prevent it from firing. + */ + hasDispatched: boolean; + + /** + * Completely reinitializes the Timer Event, regardless of its current state, according to a configuration object. + * @param config The new state for the Timer Event. + */ + reset(config: Phaser.Types.Time.TimerEventConfig): Phaser.Time.TimerEvent; + + /** + * Gets the progress of the current iteration, not factoring in repeats. + */ + getProgress(): number; + + /** + * Gets the progress of the timer overall, factoring in repeats. + */ + getOverallProgress(): number; + + /** + * Returns the number of times this Timer Event will repeat before finishing. + * + * This should not be confused with the number of times the Timer Event will fire before finishing. A return value of 0 doesn't indicate that the Timer Event has finished running - it indicates that it will not repeat after the next time it fires. + */ + getRepeatCount(): number; + + /** + * Returns the local elapsed time for the current iteration of the Timer Event. + */ + getElapsed(): number; + + /** + * Returns the local elapsed time for the current iteration of the Timer Event in seconds. + */ + getElapsedSeconds(): number; + + /** + * Returns the time interval until the next iteration of the Timer Event. + */ + getRemaining(): number; + + /** + * Returns the time interval until the next iteration of the Timer Event in seconds. + */ + getRemainingSeconds(): number; + + /** + * Returns the time interval until the last iteration of the Timer Event. + */ + getOverallRemaining(): number; + + /** + * Returns the time interval until the last iteration of the Timer Event in seconds. + */ + getOverallRemainingSeconds(): number; + + /** + * Forces the Timer Event to immediately expire, thus scheduling its removal in the next frame. + * @param dispatchCallback If `true`, the function of the Timer Event will be called before its removal. Default false. + */ + remove(dispatchCallback?: boolean): void; + + /** + * Destroys all object references in the Timer Event, i.e. its callback, scope, and arguments. + * + * Normally, this method is only called by the Clock when it shuts down. As such, it doesn't stop the Timer Event. If called manually, the Timer Event will still be updated by the Clock, but it won't do anything when it fires. + */ + destroy(): void; + + } + + } + + namespace Tweens { + namespace Builders { + /** + * Retrieves the value of the given key from an object. + * @param source The object to retrieve the value from. + * @param key The key to look for in the `source` object. + * @param defaultValue The default value to return if the `key` doesn't exist or if no `source` object is provided. + */ + function GetBoolean(source: object, key: string, defaultValue: boolean): boolean; + + /** + * This internal function is used to return the correct ease function for a Tween. + * + * It can take a variety of input, including an EaseMap based string, or a custom function. + * @param ease The ease to find. This can be either a string from the EaseMap, or a custom function. + * @param easeParams An optional array of ease parameters to go with the ease. + */ + function GetEaseFunction(ease: string | Function, easeParams?: number[]): Function; + + /** + * This internal function is used to return the correct interpolation function for a Tween. + * + * It can take a variety of input, including a string, or a custom function. + * @param interpolation The interpolation function to find. This can be either a string, or a custom function, or null. + */ + function GetInterpolationFunction(interpolation: string | Function | null): Function | null; + + /** + * Internal function used by the Tween Builder to create a function that will return + * the given value from the source. + * @param source The source object to get the value from. + * @param key The property to get from the source. + * @param defaultValue A default value to return should the source not have the property set. + */ + function GetNewValue(source: any, key: string, defaultValue: any): Function; + + /** + * Internal function used by the Tween Builder to return an array of properties + * that the Tween will be operating on. It takes a tween configuration object + * and then checks that none of the `props` entries start with an underscore, or that + * none of the direct properties are on the Reserved list. + * @param config The configuration object of the Tween to get the properties from. + */ + function GetProps(config: Phaser.Types.Tweens.TweenBuilderConfig): string[]; + + /** + * Extracts an array of targets from a Tween configuration object. + * + * The targets will be looked for in a `targets` property. If it's a function, its return value will be used as the result. + * @param config The configuration object to use. + */ + function GetTargets(config: object): any[]; + + /** + * Returns `getActive`, `getStart` and `getEnd` functions for a TweenData based on a target property and end value. + * + * `getActive` if not null, is invoked _immediately_ as soon as the TweenData is running, and is set on the target property. + * `getEnd` is invoked once any start delays have expired and returns what the value should tween to. + * `getStart` is invoked when the tween reaches the end and needs to either repeat or yoyo, it returns the value to go back to. + * + * If the end value is a number, it will be treated as an absolute value and the property will be tweened to it. + * A string can be provided to specify a relative end value which consists of an operation + * (`+=` to add to the current value, `-=` to subtract from the current value, `*=` to multiply the current + * value, or `/=` to divide the current value) followed by its operand. + * + * A function can be provided to allow greater control over the end value; it will receive the target + * object being tweened, the name of the property being tweened, and the current value of the property + * as its arguments and must return a value. + * + * If both the starting and the ending values need to be controlled, an object with `getStart` and `getEnd` + * callbacks, which will receive the same arguments, can be provided instead. If an object with a `value` + * property is provided, the property will be used as the effective value under the same rules described here. + * @param key The name of the property to modify. + * @param propertyValue The ending value of the property, as described above. + */ + function GetValueOp(key: string, propertyValue: any): Function; + + /** + * Creates a new Number Tween. + * @param parent The owner of the new Tween. + * @param config Configuration for the new Tween. + * @param defaults Tween configuration defaults. + */ + function NumberTweenBuilder(parent: Phaser.Tweens.TweenManager, config: Phaser.Types.Tweens.NumberTweenBuilderConfig, defaults: Phaser.Types.Tweens.TweenConfigDefaults): Phaser.Tweens.Tween; + + /** + * Creates a Stagger function to be used by a Tween property. + * + * The stagger function will allow you to stagger changes to the value of the property across all targets of the tween. + * + * This is only worth using if the tween has multiple targets. + * + * The following will stagger the delay by 100ms across all targets of the tween, causing them to scale down to 0.2 + * over the duration specified: + * + * ```javascript + * this.tweens.add({ + * targets: [ ... ], + * scale: 0.2, + * ease: 'linear', + * duration: 1000, + * delay: this.tweens.stagger(100) + * }); + * ``` + * + * The following will stagger the delay by 500ms across all targets of the tween using a 10 x 6 grid, staggering + * from the center out, using a cubic ease. + * + * ```javascript + * this.tweens.add({ + * targets: [ ... ], + * scale: 0.2, + * ease: 'linear', + * duration: 1000, + * delay: this.tweens.stagger(500, { grid: [ 10, 6 ], from: 'center', ease: 'cubic.out' }) + * }); + * ``` + * @param value The amount to stagger by, or an array containing two elements representing the min and max values to stagger between. + * @param config A Stagger Configuration object. + */ + function StaggerBuilder(value: number | number[], config?: Phaser.Types.Tweens.StaggerConfig): Function; + + /** + * Creates a new Tween. + * @param parent The owner of the new Tween. + * @param config Configuration for the new Tween. + * @param defaults Tween configuration defaults. + */ + function TweenBuilder(parent: Phaser.Tweens.TweenManager, config: Phaser.Types.Tweens.TweenBuilderConfig | object, defaults: Phaser.Types.Tweens.TweenConfigDefaults): Phaser.Tweens.Tween; + + /** + * Creates a new Tween Chain instance. + * @param parent The owner of the new Tween. + * @param config Configuration for the new Tween. + */ + function TweenChainBuilder(parent: Phaser.Tweens.TweenManager, config: Phaser.Types.Tweens.TweenChainBuilderConfig | object): Phaser.Tweens.TweenChain; + + } + + namespace Events { + /** + * The Tween Active Event. + * + * This event is dispatched by a Tween when it becomes active within the Tween Manager. + * + * An 'active' Tween is one that is now progressing, although it may not yet be updating + * any target properties, due to settings such as `delay`. If you need an event for when + * the Tween starts actually updating its first property, see `TWEEN_START`. + * + * Listen to it from a Tween instance using `Tween.on('active', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.create({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000 + * }); + * tween.on('active', listener); + * this.tweens.existing(tween); + * ``` + * + * Note that this event is usually dispatched already by the time you call `this.tweens.add()`, and is + * meant for use with `tweens.create()` and/or `tweens.existing()`. + */ + const TWEEN_ACTIVE: string; + + /** + * The Tween Complete Event. + * + * This event is dispatched by a Tween when it completes playback entirely, factoring in repeats and loops. + * + * If the Tween has been set to loop or repeat infinitely, this event will not be dispatched + * unless the `Tween.stop` method is called. + * + * If a Tween has a `completeDelay` set, this event will fire after that delay expires. + * + * Listen to it from a Tween instance using `Tween.on('complete', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000 + * }); + * tween.on('complete', listener); + * ``` + */ + const TWEEN_COMPLETE: string; + + /** + * The Tween Loop Event. + * + * This event is dispatched by a Tween when it loops. + * + * This event will only be dispatched if the Tween has a loop count set. + * + * If a Tween has a `loopDelay` set, this event will fire after that delay expires. + * + * The difference between `loop` and `repeat` is that `repeat` is a property setting, + * where-as `loop` applies to the entire Tween. + * + * Listen to it from a Tween instance using `Tween.on('loop', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000, + * loop: 6 + * }); + * tween.on('loop', listener); + * ``` + */ + const TWEEN_LOOP: string; + + /** + * The Tween Pause Event. + * + * This event is dispatched by a Tween when it is paused. + * + * Listen to it from a Tween instance using `Tween.on('pause', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * ease: 'Power1', + * duration: 3000, + * x: 600 + * }); + * tween.on('pause', listener); + * // At some point later ... + * tween.pause(); + * ``` + */ + const TWEEN_PAUSE: string; + + /** + * The Tween Repeat Event. + * + * This event is dispatched by a Tween when one of the properties it is tweening repeats. + * + * This event will only be dispatched if the Tween has a property with a repeat count set. + * + * If a Tween has a `repeatDelay` set, this event will fire after that delay expires. + * + * The difference between `loop` and `repeat` is that `repeat` is a property setting, + * where-as `loop` applies to the entire Tween. + * + * Listen to it from a Tween instance using `Tween.on('repeat', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000, + * repeat: 4 + * }); + * tween.on('repeat', listener); + * ``` + */ + const TWEEN_REPEAT: string; + + /** + * The Tween Resume Event. + * + * This event is dispatched by a Tween when it is resumed from a paused state. + * + * Listen to it from a Tween instance using `Tween.on('resume', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * ease: 'Power1', + * duration: 3000, + * x: 600 + * }); + * tween.on('resume', listener); + * // At some point later ... + * tween.resume(); + * ``` + */ + const TWEEN_RESUME: string; + + /** + * The Tween Start Event. + * + * This event is dispatched by a Tween when it starts tweening its first property. + * + * A Tween will only emit this event once, as it can only start once. + * + * If a Tween has a `delay` set, this event will fire after that delay expires. + * + * Listen to it from a Tween instance using `Tween.on('start', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000 + * }); + * tween.on('start', listener); + * ``` + */ + const TWEEN_START: string; + + /** + * The Tween Stop Event. + * + * This event is dispatched by a Tween when it is stopped. + * + * Listen to it from a Tween instance using `Tween.on('stop', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000 + * }); + * tween.on('stop', listener); + * ``` + */ + const TWEEN_STOP: string; + + /** + * The Tween Update Event. + * + * This event is dispatched by a Tween every time it updates _any_ of the properties it is tweening. + * + * A Tween that is changing 3 properties of a target will emit this event 3 times per change, once per property. + * + * **Note:** This is a very high frequency event and may be dispatched multiple times, every single frame. + * + * Listen to it from a Tween instance using `Tween.on('update', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000, + * }); + * tween.on('update', listener); + * ``` + */ + const TWEEN_UPDATE: string; + + /** + * The Tween Yoyo Event. + * + * This event is dispatched by a Tween whenever a property it is tweening yoyos. + * + * This event will only be dispatched if the Tween has a property with `yoyo` set. + * + * If the Tween has a `hold` value, this event is dispatched when the hold expires. + * + * This event is dispatched for every property, and for every target, that yoyos. + * For example, if a Tween was updating 2 properties and had 10 targets, this event + * would be dispatched 20 times (twice per target). So be careful how you use it! + * + * Listen to it from a Tween instance using `Tween.on('yoyo', listener)`, i.e.: + * + * ```javascript + * var tween = this.tweens.add({ + * targets: image, + * x: 500, + * ease: 'Power1', + * duration: 3000, + * yoyo: true + * }); + * tween.on('yoyo', listener); + * ``` + */ + const TWEEN_YOYO: string; + + } + + /** + * As the name implies, this is the base Tween class that both the Tween and TweenChain + * inherit from. It contains shared properties and methods common to both types of Tween. + * + * Typically you would never instantiate this class directly, although you could certainly + * use it to create your own variation of Tweens from. + */ + class BaseTween extends Phaser.Events.EventEmitter { + /** + * + * @param parent A reference to the Tween Manager, or Tween Chain, that owns this Tween. + */ + constructor(parent: Phaser.Tweens.TweenManager | Phaser.Tweens.TweenChain); + + /** + * A reference to the Tween Manager, or Tween Chain, that owns this Tween. + */ + parent: Phaser.Tweens.TweenManager | Phaser.Tweens.TweenChain; + + /** + * The main data array. For a Tween, this contains all of the `TweenData` objects, each + * containing a unique property and target that is being tweened. + * + * For a TweenChain, this contains an array of `Tween` instances, which are being played + * through in sequence. + */ + data: Phaser.Tweens.TweenData[] | Phaser.Tweens.Tween[]; + + /** + * The cached size of the data array. + */ + totalData: number; + + /** + * The time in milliseconds before the 'onStart' event fires. + * + * For a Tween, this is the shortest `delay` value across all of the TweenDatas it owns. + * For a TweenChain, it is whatever delay value was given in the configuration. + */ + startDelay: number; + + /** + * Has this Tween started playback yet? + * + * This boolean is toggled when the Tween leaves the 'start delayed' state and begins running. + */ + readonly hasStarted: boolean; + + /** + * Scales the time applied to this Tween. A value of 1 runs in real-time. A value of 0.5 runs 50% slower, and so on. + * + * The value isn't used when calculating total duration of the tween, it's a run-time delta adjustment only. + * + * This value is multiplied by the `TweenManager.timeScale`. + */ + timeScale: number; + + /** + * The number of times this Tween will loop. + * + * Can be -1 for an infinite loop, zero for none, or a positive integer. + * + * Typically this is set in the configuration object, but can also be set directly + * as long as this Tween is paused and hasn't started playback. + * + * When enabled it will play through ALL Tweens again. + * + * Use TweenData.repeat to loop a single element. + */ + loop: number; + + /** + * The time in milliseconds before the Tween loops. + * + * Only used if `loop` is > 0. + */ + loopDelay: number; + + /** + * Internal counter recording how many loops are left to run. + */ + loopCounter: number; + + /** + * The time in milliseconds before the 'onComplete' event fires. + * + * This never fires if `loop = -1` as it never completes because it has been + * set to loop forever. + */ + completeDelay: number; + + /** + * An internal countdown timer (used by loopDelay and completeDelay) + */ + countdown: number; + + /** + * The current state of the Tween. + */ + state: Phaser.Tweens.StateType; + + /** + * Is the Tween currently paused? + * + * A paused Tween needs to be started with the `play` method, or resumed with the `resume` method. + * + * This property can be toggled at runtime if required. + */ + paused: boolean; + + /** + * An object containing the different Tween callback functions. + * + * You can either set these in the Tween config, or by calling the `Tween.setCallback` method. + * + * The types available are: + * + * `onActive` - When the Tween is first created it moves to an 'active' state when added to the Tween Manager. 'Active' does not mean 'playing'. + * `onStart` - When the Tween starts playing after a delayed or paused state. This will happen at the same time as `onActive` if the tween has no delay and isn't paused. + * `onLoop` - When a Tween loops, if it has been set to do so. This happens _after_ the `loopDelay` expires, if set. + * `onComplete` - When the Tween finishes playback fully. Never invoked if the Tween is set to repeat infinitely. + * `onStop` - Invoked only if the `Tween.stop` method is called. + * `onPause` - Invoked only if the `Tween.pause` method is called. Not invoked if the Tween Manager is paused. + * `onResume` - Invoked only if the `Tween.resume` method is called. Not invoked if the Tween Manager is resumed. + * + * The following types are also available and are invoked on a `TweenData` level - that is per-object, per-property, being tweened. + * + * `onYoyo` - When a TweenData starts a yoyo. This happens _after_ the `hold` delay expires, if set. + * `onRepeat` - When a TweenData repeats playback. This happens _after_ the `repeatDelay` expires, if set. + * `onUpdate` - When a TweenData updates a property on a source target during playback. + */ + callbacks: Phaser.Types.Tweens.TweenCallbacks; + + /** + * The scope (or context) in which all of the callbacks are invoked. + * + * This defaults to be this Tween, but you can override this property + * to set it to whatever object you require. + */ + callbackScope: any; + + /** + * Will this Tween persist after playback? A Tween that persists will _not_ be destroyed by the + * Tween Manager, or when calling `Tween.stop`, and can be re-played as required. You can either + * set this property when creating the tween in the tween config, or set it _prior_ to playback. + * + * However, it's up to you to ensure you destroy persistent tweens when you are finished with them, + * or they will retain references you may no longer require and waste memory. + * + * By default, `Tweens` are set to _not_ persist, so they are automatically cleaned-up by + * the Tween Manager. But `TweenChains` _do_ persist by default, unless overridden in their + * config. This is because the type of situations you use a chain for is far more likely to + * need to be replayed again in the future, rather than disposed of. + */ + persist: boolean; + + /** + * Sets the value of the time scale applied to this Tween. A value of 1 runs in real-time. + * A value of 0.5 runs 50% slower, and so on. + * + * The value isn't used when calculating total duration of the tween, it's a run-time delta adjustment only. + * + * This value is multiplied by the `TweenManager.timeScale`. + * @param value The time scale value to set. + */ + setTimeScale(value: number): this; + + /** + * Gets the value of the time scale applied to this Tween. A value of 1 runs in real-time. + * A value of 0.5 runs 50% slower, and so on. + */ + getTimeScale(): number; + + /** + * Checks if this Tween is currently playing. + * + * If this Tween is paused, or not active, this method will return false. + */ + isPlaying(): boolean; + + /** + * Checks if the Tween is currently paused. + * + * This is the same as inspecting the `BaseTween.paused` property directly. + */ + isPaused(): boolean; + + /** + * Pauses the Tween immediately. Use `resume` to continue playback. + * + * You can also toggle the `Tween.paused` boolean property, but doing so will not trigger the PAUSE event. + */ + pause(): this; + + /** + * Resumes the playback of a previously paused Tween. + * + * You can also toggle the `Tween.paused` boolean property, but doing so will not trigger the RESUME event. + */ + resume(): this; + + /** + * Internal method that makes this Tween active within the TweenManager + * and emits the onActive event and callback. + */ + makeActive(): void; + + /** + * Internal method that handles this tween completing and emitting the onComplete event + * and callback. + */ + onCompleteHandler(): void; + + /** + * Flags the Tween as being complete, whatever stage of progress it is at. + * + * If an `onComplete` callback has been defined it will automatically invoke it, unless a `delay` + * argument is provided, in which case the Tween will delay for that period of time before calling the callback. + * + * If you don't need a delay or don't have an `onComplete` callback then call `Tween.stop` instead. + * @param delay The time to wait before invoking the complete callback. If zero it will fire immediately. Default 0. + */ + complete(delay?: number): this; + + /** + * Flags the Tween as being complete only once the current loop has finished. + * + * This is a useful way to stop an infinitely looping tween once a complete cycle is over, + * rather than abruptly. + * + * If you don't have a loop then call `Tween.stop` instead. + * @param loops The number of loops that should finish before this tween completes. Zero means complete just the current loop. Default 0. + */ + completeAfterLoop(loops?: number): this; + + /** + * Immediately removes this Tween from the TweenManager and all of its internal arrays, + * no matter what stage it is at. Then sets the tween state to `REMOVED`. + * + * You should dispose of your reference to this tween after calling this method, to + * free it from memory. If you no longer require it, call `Tween.destroy()` on it. + */ + remove(): this; + + /** + * Stops the Tween immediately, whatever stage of progress it is at. + * + * If not a part of a Tween Chain it is also flagged for removal by the Tween Manager. + * + * If an `onStop` callback has been defined it will automatically invoke it. + * + * The Tween will be removed during the next game frame, but should be considered 'destroyed' from this point on. + * + * Typically, you cannot play a Tween that has been stopped. If you just wish to pause the tween, not destroy it, + * then call the `pause` method instead and use `resume` to continue playback. If you wish to restart the Tween, + * use the `restart` or `seek` methods. + */ + stop(): this; + + /** + * Internal method that handles the processing of the loop delay countdown timer and + * the dispatch of related events. Called automatically by `Tween.update`. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + updateLoopCountdown(delta: number): void; + + /** + * Internal method that handles the processing of the start delay countdown timer and + * the dispatch of related events. Called automatically by `Tween.update`. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + updateStartCountdown(delta: number): void; + + /** + * Internal method that handles the processing of the complete delay countdown timer and + * the dispatch of related events. Called automatically by `Tween.update`. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + updateCompleteDelay(delta: number): void; + + /** + * Sets an event based callback to be invoked during playback. + * + * Calling this method will replace a previously set callback for the given type, if any exists. + * + * The types available are: + * + * `onActive` - When the Tween is first created it moves to an 'active' state when added to the Tween Manager. 'Active' does not mean 'playing'. + * `onStart` - When the Tween starts playing after a delayed or paused state. This will happen at the same time as `onActive` if the tween has no delay and isn't paused. + * `onLoop` - When a Tween loops, if it has been set to do so. This happens _after_ the `loopDelay` expires, if set. + * `onComplete` - When the Tween finishes playback fully. Never invoked if the Tween is set to repeat infinitely. + * `onStop` - Invoked only if the `Tween.stop` method is called. + * `onPause` - Invoked only if the `Tween.pause` method is called. Not invoked if the Tween Manager is paused. + * `onResume` - Invoked only if the `Tween.resume` method is called. Not invoked if the Tween Manager is resumed. + * + * The following types are also available and are invoked on a `TweenData` level - that is per-object, per-property, being tweened. + * + * `onYoyo` - When a TweenData starts a yoyo. This happens _after_ the `hold` delay expires, if set. + * `onRepeat` - When a TweenData repeats playback. This happens _after_ the `repeatDelay` expires, if set. + * `onUpdate` - When a TweenData updates a property on a source target during playback. + * @param type The type of callback to set. One of: `onActive`, `onComplete`, `onLoop`, `onPause`, `onRepeat`, `onResume`, `onStart`, `onStop`, `onUpdate` or `onYoyo`. + * @param callback Your callback that will be invoked. + * @param params The parameters to pass to the callback. Pass an empty array if you don't want to define any, but do wish to set the scope. + */ + setCallback(type: Phaser.Types.Tweens.TweenCallbackTypes, callback: Function, params?: any[]): this; + + /** + * Sets this Tween state to PENDING. + */ + setPendingState(): void; + + /** + * Sets this Tween state to ACTIVE. + */ + setActiveState(): void; + + /** + * Sets this Tween state to LOOP_DELAY. + */ + setLoopDelayState(): void; + + /** + * Sets this Tween state to COMPLETE_DELAY. + */ + setCompleteDelayState(): void; + + /** + * Sets this Tween state to START_DELAY. + */ + setStartDelayState(): void; + + /** + * Sets this Tween state to PENDING_REMOVE. + */ + setPendingRemoveState(): void; + + /** + * Sets this Tween state to REMOVED. + */ + setRemovedState(): void; + + /** + * Sets this Tween state to FINISHED. + */ + setFinishedState(): void; + + /** + * Sets this Tween state to DESTROYED. + */ + setDestroyedState(): void; + + /** + * Returns `true` if this Tween has a _current_ state of PENDING, otherwise `false`. + */ + isPending(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of ACTIVE, otherwise `false`. + */ + isActive(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of LOOP_DELAY, otherwise `false`. + */ + isLoopDelayed(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of COMPLETE_DELAY, otherwise `false`. + */ + isCompleteDelayed(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of START_DELAY, otherwise `false`. + */ + isStartDelayed(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of PENDING_REMOVE, otherwise `false`. + */ + isPendingRemove(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of REMOVED, otherwise `false`. + */ + isRemoved(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of FINISHED, otherwise `false`. + */ + isFinished(): boolean; + + /** + * Returns `true` if this Tween has a _current_ state of DESTROYED, otherwise `false`. + */ + isDestroyed(): boolean; + + /** + * Handles the destroy process of this Tween, clearing out the + * Tween Data and resetting the targets. A Tween that has been + * destroyed cannot ever be played or used again. + */ + destroy(): void; + + } + + /** + * BaseTweenData is the class that the TweenData and TweenFrameData classes + * extend from. You should not typically instantiate this class directly, but instead + * use it to form your own tween data classes from, should you require it. + * + * Prior to Phaser 3.60 the TweenData was just an object, but was refactored to a class, + * to make it responsible for its own state and updating. + */ + class BaseTweenData { + /** + * + * @param tween The tween this TweenData instance belongs to. + * @param targetIndex The target index within the Tween targets array. + * @param key The property of the target to tween. + * @param getEnd What the property will be at the END of the Tween. + * @param getStart What the property will be at the START of the Tween. + * @param getActive If not null, is invoked _immediately_ as soon as the TweenData is running, and is set on the target property. + * @param ease The ease function this tween uses. + * @param delay Function that returns the time in milliseconds before tween will start. + * @param duration The duration of the tween in milliseconds. + * @param yoyo Determines whether the tween should return back to its start value after hold has expired. + * @param hold Function that returns the time in milliseconds the tween will pause before repeating or returning to its starting value if yoyo is set to true. + * @param repeat Function that returns the number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + * @param repeatDelay Function that returns the time in milliseconds before the repeat will start. + * @param flipX Should toggleFlipX be called when yoyo or repeat happens? + * @param flipY Should toggleFlipY be called when yoyo or repeat happens? + * @param interpolation The interpolation function to be used for arrays of data. Defaults to 'null'. + * @param interpolationData The array of interpolation data to be set. Defaults to 'null'. + */ + constructor(tween: Phaser.Tweens.Tween, targetIndex: number, key: string, getEnd: Phaser.Types.Tweens.GetEndCallback, getStart: Phaser.Types.Tweens.GetStartCallback, getActive: Phaser.Types.Tweens.GetActiveCallback | undefined, ease: Function, delay: Function, duration: number, yoyo: boolean, hold: number, repeat: number, repeatDelay: number, flipX: boolean, flipY: boolean, interpolation: Function | undefined, interpolationData: number[] | undefined); + + /** + * A reference to the Tween that this TweenData instance belongs to. + */ + tween: Phaser.Tweens.Tween; + + /** + * The index of the target within the Tween `targets` array. + */ + targetIndex: number; + + /** + * The duration of the tween in milliseconds, excluding any time required + * for yoyo or repeats. + */ + duration: number; + + /** + * The total calculated duration, in milliseconds, of this TweenData. + * Factoring in the duration, repeats, delays and yoyos. + */ + totalDuration: number; + + /** + * The time, in milliseconds, before this tween will start playing. + * + * This value is generated by the `getDelay` function. + */ + delay: number; + + /** + * This function returns the value to be used for `TweenData.delay`. + */ + getDelay: Function; + + /** + * Will the Tween ease back to its starting values, after reaching the end + * and any `hold` value that may be set? + */ + yoyo: boolean; + + /** + * The time, in milliseconds, before this tween will start a yoyo to repeat. + */ + hold: number; + + /** + * The number of times this tween will repeat. + * + * The tween will always run once regardless of this value, + * so a repeat value of '1' will play the tween twice: I.e. the original + * play-through and then it repeats that once (1). + * + * If this value is set to -1 this tween will repeat forever. + */ + repeat: number; + + /** + * The time, in milliseconds, before the repeat will start. + */ + repeatDelay: number; + + /** + * How many repeats are left to run? + */ + repeatCounter: number; + + /** + * If `true` this Tween will call `toggleFlipX` on the Tween target + * whenever it yoyo's or repeats. It will only be called if the target + * has a function matching this name, like most Phaser GameObjects do. + */ + flipX: boolean; + + /** + * If `true` this Tween will call `toggleFlipY` on the Tween target + * whenever it yoyo's or repeats. It will only be called if the target + * has a function matching this name, like most Phaser GameObjects do. + */ + flipY: boolean; + + /** + * A value between 0 and 1 holding the progress of this TweenData. + */ + progress: number; + + /** + * The amount of time, in milliseconds, that has elapsed since this + * TweenData was made active. + */ + elapsed: number; + + /** + * The state of this TweenData. + */ + state: Phaser.Tweens.StateType; + + /** + * Is this Tween Data currently waiting for a countdown to elapse, or not? + */ + isCountdown: boolean; + + /** + * Returns a reference to the target object belonging to this TweenData. + */ + getTarget(): object; + + /** + * Sets this TweenData's target object property to be the given value. + * @param value The value to set on the target. If not given, sets it to the last `current` value. + */ + setTargetValue(value?: number): void; + + /** + * Sets this TweenData state to CREATED. + */ + setCreatedState(): void; + + /** + * Sets this TweenData state to DELAY. + */ + setDelayState(): void; + + /** + * Sets this TweenData state to PENDING_RENDER. + */ + setPendingRenderState(): void; + + /** + * Sets this TweenData state to PLAYING_FORWARD. + */ + setPlayingForwardState(): void; + + /** + * Sets this TweenData state to PLAYING_BACKWARD. + */ + setPlayingBackwardState(): void; + + /** + * Sets this TweenData state to HOLD_DELAY. + */ + setHoldState(): void; + + /** + * Sets this TweenData state to REPEAT_DELAY. + */ + setRepeatState(): void; + + /** + * Sets this TweenData state to COMPLETE. + */ + setCompleteState(): void; + + /** + * Returns `true` if this TweenData has a _current_ state of CREATED, otherwise `false`. + */ + isCreated(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of DELAY, otherwise `false`. + */ + isDelayed(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of PENDING_RENDER, otherwise `false`. + */ + isPendingRender(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of PLAYING_FORWARD, otherwise `false`. + */ + isPlayingForward(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of PLAYING_BACKWARD, otherwise `false`. + */ + isPlayingBackward(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of HOLD_DELAY, otherwise `false`. + */ + isHolding(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of REPEAT_DELAY, otherwise `false`. + */ + isRepeating(): boolean; + + /** + * Returns `true` if this TweenData has a _current_ state of COMPLETE, otherwise `false`. + */ + isComplete(): boolean; + + /** + * Internal method used as part of the playback process that checks if this + * TweenData should yoyo, repeat, or has completed. + * @param diff Any extra time that needs to be accounted for in the elapsed and progress values. + */ + setStateFromEnd(diff: number): void; + + /** + * Internal method used as part of the playback process that checks if this + * TweenData should repeat or has completed. + * @param diff Any extra time that needs to be accounted for in the elapsed and progress values. + */ + setStateFromStart(diff: number): void; + + /** + * Internal method that resets this Tween Data entirely, including the progress and elapsed values. + * + * Called automatically by the parent Tween. Should not be called directly. + */ + reset(): void; + + /** + * Internal method that handles repeating or yoyo'ing this TweenData. + * + * Called automatically by `setStateFromStart` and `setStateFromEnd`. + * @param diff Any extra time that needs to be accounted for in the elapsed and progress values. + * @param setStart Set the TweenData start values? + * @param isYoyo Is this call a Yoyo check? + */ + onRepeat(diff: number, setStart: boolean, isYoyo: boolean): void; + + /** + * Immediately destroys this TweenData, nulling of all its references. + */ + destroy(): void; + + } + + /** + * Phaser Tween States. + */ + enum States { + /** + * TweenData state. + */ + CREATED, + /** + * TweenData state. + */ + DELAY, + /** + * TweenData state. + */ + PENDING_RENDER, + /** + * TweenData state. + */ + PLAYING_FORWARD, + /** + * TweenData state. + */ + PLAYING_BACKWARD, + /** + * TweenData state. + */ + HOLD_DELAY, + /** + * TweenData state. + */ + REPEAT_DELAY, + /** + * TweenData state. + */ + COMPLETE, + /** + * Tween state. The Tween has been created but has not yet been added to the Tween Manager. + */ + PENDING, + /** + * Tween state. The Tween is active within the Tween Manager. This means it is either playing, + * or was playing and is currently paused, but in both cases it's still being processed by + * the Tween Manager, so is considered 'active'. + */ + ACTIVE, + /** + * Tween state. The Tween is waiting for a loop countdown to elapse. + */ + LOOP_DELAY, + /** + * Tween state. The Tween is waiting for a complete delay to elapse. + */ + COMPLETE_DELAY, + /** + * Tween state. The Tween is waiting for a starting delay to elapse. + */ + START_DELAY, + /** + * Tween state. The Tween has finished playback and is waiting to be removed from the Tween Manager. + */ + PENDING_REMOVE, + /** + * Tween state. The Tween has been removed from the Tween Manager. + */ + REMOVED, + /** + * Tween state. The Tween has finished playback but was flagged as 'persistent' during creation, + * so will not be automatically removed by the Tween Manager. + */ + FINISHED, + /** + * Tween state. The Tween has been destroyed and can no longer be played by a Tween Manager. + */ + DESTROYED, + /** + * A large integer value used for 'infinite' style countdowns. + * + * Similar use-case to Number.MAX_SAFE_INTEGER but we cannot use that because it's not + * supported on IE. + */ + MAX, + } + + /** + * Phaser Tween state constants. + */ + type StateType = Phaser.Tweens.States; + + /** + * A Tween is able to manipulate the properties of one or more objects to any given value, based + * on a duration and type of ease. They are rarely instantiated directly and instead should be + * created via the TweenManager. + * + * Please note that a Tween will not manipulate any property that begins with an underscore. + */ + class Tween extends Phaser.Tweens.BaseTween { + /** + * + * @param parent A reference to the Tween Manager that owns this Tween. + * @param targets An array of targets to be tweened. + */ + constructor(parent: Phaser.Tweens.TweenManager, targets: object[]); + + /** + * An array of references to the target/s this Tween is operating on. + * + * This array should not be manipulated outside of this Tween. + */ + targets: object[]; + + /** + * Cached target total. + * + * Used internally and should be treated as read-only. + * + * This is not necessarily the same as the data total. + */ + totalTargets: number; + + /** + * Is this Tween currently seeking? + * + * This boolean is toggled in the `Tween.seek` method. + * + * When a tween is seeking, by default it will not dispatch any events or callbacks. + */ + readonly isSeeking: boolean; + + /** + * Does this Tween loop or repeat infinitely? + */ + readonly isInfinite: boolean; + + /** + * Elapsed time in milliseconds of this run through of the Tween. + */ + elapsed: number; + + /** + * Total elapsed time in milliseconds of the entire Tween, including looping. + */ + totalElapsed: number; + + /** + * Time in milliseconds for the whole Tween to play through once, excluding loop amounts and loop delays. + * + * This value is set in the `Tween.initTweenData` method and is zero before that point. + */ + duration: number; + + /** + * Value between 0 and 1. The amount of progress through the Tween, excluding loops. + */ + progress: number; + + /** + * Time in milliseconds it takes for the Tween to complete a full playthrough (including looping) + * + * For an infinite Tween, this value is a very large integer. + */ + totalDuration: number; + + /** + * The amount of progress that has been made through the entire Tween, including looping. + * + * A value between 0 and 1. + */ + totalProgress: number; + + /** + * Adds a new TweenData to this Tween. Typically, this method is called + * automatically by the TweenBuilder, however you can also invoke it + * yourself. + * @param targetIndex The target index within the Tween targets array. + * @param key The property of the target to tween. + * @param getEnd What the property will be at the END of the Tween. + * @param getStart What the property will be at the START of the Tween. + * @param getActive If not null, is invoked _immediately_ as soon as the TweenData is running, and is set on the target property. + * @param ease The ease function this tween uses. + * @param delay Function that returns the time in milliseconds before tween will start. + * @param duration The duration of the tween in milliseconds. + * @param yoyo Determines whether the tween should return back to its start value after hold has expired. + * @param hold Function that returns the time in milliseconds the tween will pause before repeating or returning to its starting value if yoyo is set to true. + * @param repeat Function that returns the number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + * @param repeatDelay Function that returns the time in milliseconds before the repeat will start. + * @param flipX Should toggleFlipX be called when yoyo or repeat happens? + * @param flipY Should toggleFlipY be called when yoyo or repeat happens? + * @param interpolation The interpolation function to be used for arrays of data. Defaults to 'null'. + * @param interpolationData The array of interpolation data to be set. Defaults to 'null'. + */ + add(targetIndex: number, key: string, getEnd: Phaser.Types.Tweens.GetEndCallback, getStart: Phaser.Types.Tweens.GetStartCallback, getActive: Phaser.Types.Tweens.GetActiveCallback | undefined, ease: Function, delay: Function, duration: number, yoyo: boolean, hold: number, repeat: number, repeatDelay: number, flipX: boolean, flipY: boolean, interpolation: Function | undefined, interpolationData: number[] | undefined): Phaser.Tweens.TweenData; + + /** + * Adds a new TweenFrameData to this Tween. Typically, this method is called + * automatically by the TweenBuilder, however you can also invoke it + * yourself. + * @param targetIndex The target index within the Tween targets array. + * @param texture The texture to set on the target at the end of the tween. + * @param frame The texture frame to set on the target at the end of the tween. + * @param delay Function that returns the time in milliseconds before tween will start. + * @param duration The duration of the tween in milliseconds. + * @param hold Function that returns the time in milliseconds the tween will pause before repeating or returning to its starting value if yoyo is set to true. + * @param repeat Function that returns the number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + * @param repeatDelay Function that returns the time in milliseconds before the repeat will start. + * @param flipX Should toggleFlipX be called when yoyo or repeat happens? + * @param flipY Should toggleFlipY be called when yoyo or repeat happens? + */ + addFrame(targetIndex: number, texture: string, frame: string | number, delay: Function, duration: number, hold: number, repeat: number, repeatDelay: number, flipX: boolean, flipY: boolean): Phaser.Tweens.TweenFrameData; + + /** + * Returns the current value of the specified Tween Data. + * + * If this Tween has been destroyed, it will return `null`. + * @param index The Tween Data to return the value from. Default 0. + */ + getValue(index?: number): number; + + /** + * See if this Tween is currently acting upon the given target. + * @param target The target to check against this Tween. + */ + hasTarget(target: object): boolean; + + /** + * Updates the 'end' value of the given property across all matching targets, as long + * as this Tween is currently playing (either forwards or backwards). + * + * Calling this does not adjust the duration of the Tween, or the current progress. + * + * You can optionally tell it to set the 'start' value to be the current value. + * + * If this Tween is in any other state other than playing then calling this method has no effect. + * + * Additionally, if the Tween repeats, is reset, or is seeked, it will revert to the original + * starting and ending values. + * @param key The property to set the new value for. You cannot update the 'texture' property via this method. + * @param value The new value of the property. + * @param startToCurrent Should this change set the start value to be the current value? Default false. + */ + updateTo(key: string, value: number, startToCurrent?: boolean): this; + + /** + * Restarts the Tween from the beginning. + * + * If the Tween has already finished and been destroyed, restarting it will throw an error. + * + * If you wish to restart the Tween from a specific point, use the `Tween.seek` method instead. + */ + restart(): this; + + /** + * Internal method that advances to the next state of the Tween during playback. + */ + nextState(): boolean; + + /** + * Internal method that handles this tween completing and starting + * the next tween in the chain, if any. + */ + onCompleteHandler(): void; + + /** + * Starts a Tween playing. + * + * You only need to call this method if you have configured the tween to be paused on creation. + * + * If the Tween is already playing, calling this method again will have no effect. If you wish to + * restart the Tween, use `Tween.restart` instead. + * + * Calling this method after the Tween has completed will start the Tween playing again from the beginning. + * This is the same as calling `Tween.seek(0)` and then `Tween.play()`. + */ + play(): this; + + /** + * Seeks to a specific point in the Tween. + * + * The given amount is a value in milliseconds that represents how far into the Tween + * you wish to seek, based on the start of the Tween. + * + * Note that the seek amount takes the entire duration of the Tween into account, including delays, loops and repeats. + * For example, a Tween that lasts for 2 seconds, but that loops 3 times, would have a total duration of 6 seconds, + * so seeking to 3000 ms would seek to the Tweens half-way point based on its _entire_ duration. + * + * Prior to Phaser 3.60 this value was given as a number between 0 and 1 and didn't + * work for Tweens had an infinite repeat. This new method works for all Tweens. + * + * Seeking works by resetting the Tween to its initial values and then iterating through the Tween at `delta` + * jumps per step. The longer the Tween, the longer this can take. If you need more precision you can + * reduce the delta value. If you need a faster seek, you can increase it. When the Tween is + * reset it will refresh the starting and ending values. If these are coming from a dynamic function, + * or a random array, it will be called for each seek. + * + * While seeking the Tween will _not_ emit any of its events or callbacks unless + * the 3rd parameter is set to `true`. + * + * If this Tween is paused, seeking will not change this fact. It will advance the Tween + * to the desired point and then pause it again. + * @param amount The number of milliseconds to seek into the Tween from the beginning. Default 0. + * @param delta The size of each step when seeking through the Tween. A higher value completes faster but at the cost of less precision. Default 16.6. + * @param emit While seeking, should the Tween emit any of its events or callbacks? The default is 'false', i.e. to seek silently. Default false. + */ + seek(amount?: number, delta?: number, emit?: boolean): this; + + /** + * Initialises all of the Tween Data and Tween values. + * + * This is called automatically and should not typically be invoked directly. + * @param isSeeking Is the Tween Data being reset as part of a seek? Default false. + */ + initTweenData(isSeeking?: boolean): void; + + /** + * Resets this Tween ready for another play-through. + * + * This is called automatically from the Tween Manager, or from the parent TweenChain, + * and should not typically be invoked directly. + * + * If you wish to restart this Tween, use the `Tween.restart` or `Tween.seek` methods instead. + * @param skipInit Skip resetting the TweenData and Active State? Default false. + */ + reset(skipInit?: boolean): this; + + /** + * Internal method that advances the Tween based on the time values. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(delta: number): boolean; + + /** + * Moves this Tween forward by the given amount of milliseconds. + * + * It will only advance through the current loop of the Tween. For example, if the + * Tween is set to repeat or yoyo, it can only fast forward through a single + * section of the sequence. Use `Tween.seek` for more complex playhead control. + * + * If the Tween is paused or has already finished, calling this will have no effect. + * @param ms The number of milliseconds to advance this Tween by. + */ + forward(ms: number): this; + + /** + * Moves this Tween backward by the given amount of milliseconds. + * + * It will only rewind through the current loop of the Tween. For example, if the + * Tween is set to repeat or yoyo, it can only fast forward through a single + * section of the sequence. Use `Tween.seek` for more complex playhead control. + * + * If the Tween is paused or has already finished, calling this will have no effect. + * @param ms The number of milliseconds to rewind this Tween by. + */ + rewind(ms: number): this; + + /** + * Internal method that will emit a Tween based Event and invoke the given callback. + * @param event The Event to be dispatched. + * @param callback The name of the callback to be invoked. Can be `null` or `undefined` to skip invocation. + */ + dispatchEvent(event: Phaser.Types.Tweens.Event, callback?: Phaser.Types.Tweens.TweenCallbackTypes): void; + + /** + * Handles the destroy process of this Tween, clearing out the + * Tween Data and resetting the targets. A Tween that has been + * destroyed cannot ever be played or used again. + */ + destroy(): void; + + } + + /** + * A TweenChain is a special type of Tween that allows you to create a sequence of Tweens, chained to one-another, + * and add them to the Tween Manager. + * + * The tweens are played in order, from start to finish. You can optionally set the chain + * to repeat as many times as you like. Once the chain has finished playing, or repeating if set, + * all tweens in the chain will be destroyed automatically. To override this, set the 'persist' + * argument to 'true'. + * + * Playback will start immediately unless the _first_ Tween has been configured to be paused. + * + * Please note that Tweens will not manipulate any target property that begins with an underscore. + */ + class TweenChain extends Phaser.Tweens.BaseTween { + /** + * + * @param parent A reference to the Tween Manager, or TweenChain, that owns this TweenChain. + */ + constructor(parent: Phaser.Tweens.TweenManager | Phaser.Tweens.TweenChain); + + /** + * A reference to the Tween that this TweenChain is currently playing. + */ + currentTween: Phaser.Tweens.Tween; + + /** + * A reference to the data array index of the currently playing tween. + */ + currentIndex: number; + + /** + * Prepares this TweenChain for playback. + * + * Called automatically by the TweenManager. Should not be called directly. + */ + init(): this; + + /** + * Create a sequence of Tweens, chained to one-another, and add them to this Tween Manager. + * + * The tweens are played in order, from start to finish. You can optionally set the chain + * to repeat as many times as you like. Once the chain has finished playing, or repeating if set, + * all tweens in the chain will be destroyed automatically. To override this, set the 'persist' + * argument to 'true'. + * + * Playback will start immediately unless the _first_ Tween has been configured to be paused. + * + * Please note that Tweens will not manipulate any target property that begins with an underscore. + * @param tweens An array of Tween configuration objects for the Tweens in this chain. + */ + add(tweens: Phaser.Types.Tweens.TweenBuilderConfig[] | object[]): this; + + /** + * See if any of the tweens in this Tween Chain is currently acting upon the given target. + * @param target The target to check against this TweenChain. + */ + hasTarget(target: object): boolean; + + /** + * Restarts the TweenChain from the beginning. + * + * If this TweenChain was configured to have a loop, or start delay, those + * are reset to their initial values as well. It will also dispatch the + * `onActive` callback and event again. + */ + restart(): this; + + /** + * Resets the given Tween. + * + * It will seek to position 0 and playback will start on the next frame. + * @param tween The Tween to be reset. + */ + reset(tween: Phaser.Tweens.Tween): this; + + /** + * Internal method that advances to the next state of the TweenChain playback. + */ + nextState(): boolean; + + /** + * Starts this TweenChain playing. + * + * You only need to call this method if you have configured this TweenChain to be paused on creation. + * + * If the TweenChain is already playing, calling this method again will have no effect. If you wish to + * restart the chain, use `TweenChain.restart` instead. + * + * Calling this method after the TweenChain has completed will start the chain playing again from the beginning. + */ + play(): this; + + /** + * Internal method that resets all of the Tweens and the current index pointer. + */ + resetTweens(): void; + + /** + * Internal method that advances the TweenChain based on the time values. + * @param delta The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. + */ + update(delta: number): boolean; + + /** + * Immediately advances to the next Tween in the chain. + * + * This is typically called internally, but can be used if you need to + * advance playback for some reason. + */ + nextTween(): boolean; + + /** + * Sets the current active Tween to the given index, based on its + * entry in the TweenChain data array. + * @param index The index of the Tween to be made current. + */ + setCurrentTween(index: number): void; + + /** + * Internal method that will emit a TweenChain based Event and invoke the given callback. + * @param event The Event to be dispatched. + * @param callback The name of the callback to be invoked. Can be `null` or `undefined` to skip invocation. + */ + dispatchEvent(event: Phaser.Types.Tweens.Event, callback?: Phaser.Types.Tweens.TweenCallbackTypes): void; + + /** + * Immediately destroys this TweenChain, nulling of all its references. + */ + destroy(): void; + + } + + /** + * The TweenData is a class that contains a single target and property that is being tweened. + * + * Tweens create TweenData instances when they are created, with one TweenData instance per + * target, per property. A Tween can own multiple TweenData instances, but a TweenData only + * ever belongs to a single Tween. + * + * You should not typically create these yourself, but rather use the TweenBuilder, + * or the `Tween.add` method. + * + * Prior to Phaser 3.60 the TweenData was just an object, but was refactored to a class, + * to make it responsible for its own state and updating. + */ + class TweenData extends Phaser.Tweens.BaseTweenData { + /** + * + * @param tween The tween this TweenData instance belongs to. + * @param targetIndex The target index within the Tween targets array. + * @param key The property of the target to tween. + * @param getEnd What the property will be at the END of the Tween. + * @param getStart What the property will be at the START of the Tween. + * @param getActive If not null, is invoked _immediately_ as soon as the TweenData is running, and is set on the target property. + * @param ease The ease function this tween uses. + * @param delay Function that returns the time in milliseconds before tween will start. + * @param duration The duration of the tween in milliseconds. + * @param yoyo Determines whether the tween should return back to its start value after hold has expired. + * @param hold Function that returns the time in milliseconds the tween will pause before repeating or returning to its starting value if yoyo is set to true. + * @param repeat Function that returns the number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + * @param repeatDelay Function that returns the time in milliseconds before the repeat will start. + * @param flipX Should toggleFlipX be called when yoyo or repeat happens? + * @param flipY Should toggleFlipY be called when yoyo or repeat happens? + * @param interpolation The interpolation function to be used for arrays of data. Defaults to 'null'. + * @param interpolationData The array of interpolation data to be set. Defaults to 'null'. + */ + constructor(tween: Phaser.Tweens.Tween, targetIndex: number, key: string, getEnd: Phaser.Types.Tweens.GetEndCallback, getStart: Phaser.Types.Tweens.GetStartCallback, getActive: Phaser.Types.Tweens.GetActiveCallback | undefined, ease: Function, delay: Function, duration: number, yoyo: boolean, hold: number, repeat: number, repeatDelay: number, flipX: boolean, flipY: boolean, interpolation: Function | undefined, interpolationData: number[] | undefined); + + /** + * The property of the target to be tweened. + */ + readonly key: string; + + /** + * A function that returns what to set the target property to, + * the moment the TweenData is invoked. + * + * This is called when this TweenData is inititalised or reset. + */ + getActiveValue: Phaser.Types.Tweens.GetActiveCallback | null; + + /** + * A function that returns what to set the target property to + * at the end of the tween. + * + * This is called when the tween starts playing, after any initial + * start delay, or if the tween is reset, or is set to repeat. + */ + getEndValue: Phaser.Types.Tweens.GetEndCallback; + + /** + * A function that returns what to set the target property to + * at the start of the tween. + * + * This is called when the tween starts playing, after any initial + * start delay, or if the tween is reset, or is set to repeat. + */ + getStartValue: Phaser.Types.Tweens.GetStartCallback; + + /** + * The ease function this Tween uses to calculate the target value. + */ + ease: Function; + + /** + * The targets starting value, as returned by `getStartValue`. + */ + start: number; + + /** + * The target value from the previous step. + */ + previous: number; + + /** + * The targets current value, as recorded in the most recent step. + */ + current: number; + + /** + * The targets ending value, as returned by `getEndValue`. + */ + end: number; + + /** + * The interpolation function to be used for arrays of data. + */ + interpolation: Function | null; + + /** + * The array of data to interpolate, if interpolation is being used. + */ + interpolationData: number[] | null; + + /** + * Internal method that resets this Tween Data entirely, including the progress and elapsed values. + * + * Called automatically by the parent Tween. Should not be called directly. + * @param isSeeking Is the Tween Data being reset as part of a Tween seek? Default false. + */ + reset(isSeeking?: boolean): void; + + /** + * Internal method that advances this TweenData based on the delta value given. + * @param delta The elapsed delta time in ms. + */ + update(delta: number): boolean; + + /** + * Internal method that will emit a TweenData based Event on the + * parent Tween and also invoke the given callback, if provided. + * @param event The Event to be dispatched. + * @param callback The name of the callback to be invoked. Can be `null` or `undefined` to skip invocation. + */ + dispatchEvent(event: Phaser.Types.Tweens.Event, callback?: Phaser.Types.Tweens.TweenCallbackTypes): void; + + /** + * Immediately destroys this TweenData, nulling of all its references. + */ + destroy(): void; + + } + + /** + * The TweenFrameData is a class that contains a single target that will change the texture frame + * at the conclusion of the Tween. + * + * TweenFrameData instances are typically created by the TweenBuilder automatically, when it + * detects the prescence of a 'texture' property as the key being tweened. + * + * A Tween can own multiple TweenFrameData instances, but a TweenFrameData only + * ever belongs to a single Tween. + * + * You should not typically create these yourself, but rather use the TweenBuilder, + * or the `Tween.addFrame` method. + */ + class TweenFrameData extends Phaser.Tweens.BaseTweenData { + /** + * + * @param tween The tween this TweenData instance belongs to. + * @param targetIndex The target index within the Tween targets array. + * @param texture The texture key to set at the end of this tween. + * @param frame The texture frame to set at the end of this tween. + * @param delay Function that returns the time in milliseconds before tween will start. + * @param duration The duration of the tween in milliseconds. + * @param hold Function that returns the time in milliseconds the tween will pause before repeating or returning to its starting value if yoyo is set to true. + * @param repeat Function that returns the number of times to repeat the tween. The tween will always run once regardless, so a repeat value of '1' will play the tween twice. + * @param repeatDelay Function that returns the time in milliseconds before the repeat will start. + * @param flipX Should toggleFlipX be called when yoyo or repeat happens? + * @param flipY Should toggleFlipY be called when yoyo or repeat happens? + */ + constructor(tween: Phaser.Tweens.Tween, targetIndex: number, texture: string, frame: string | number, delay: Function, duration: number, hold: number, repeat: number, repeatDelay: number, flipX: boolean, flipY: boolean); + + /** + * The property of the target to be tweened. + * + * Always 'texture' for a TweenFrameData object. + */ + readonly key: string; + + /** + * The texture to be set at the start of the tween. + */ + startTexture: string; + + /** + * The texture to be set at the end of the tween. + */ + endTexture: string; + + /** + * The frame to be set at the start of the tween. + */ + startFrame: string | number; + + /** + * The frame to be set at the end of the tween. + */ + endFrame: string | number; + + /** + * Will the Tween ease back to its starting values, after reaching the end + * and any `hold` value that may be set? + */ + yoyo: boolean; + + /** + * Internal method that resets this Tween Data entirely, including the progress and elapsed values. + * + * Called automatically by the parent Tween. Should not be called directly. + * @param isSeeking Is the Tween Data being reset as part of a Tween seek? Default false. + */ + reset(isSeeking?: boolean): void; + + /** + * Internal method that advances this TweenData based on the delta value given. + * @param delta The elapsed delta time in ms. + */ + update(delta: number): boolean; + + /** + * Internal method that will emit a TweenData based Event on the + * parent Tween and also invoke the given callback, if provided. + * @param event The Event to be dispatched. + * @param callback The name of the callback to be invoked. Can be `null` or `undefined` to skip invocation. + */ + dispatchEvent(event: Phaser.Types.Tweens.Event, callback?: Phaser.Types.Tweens.TweenCallbackTypes): void; + + /** + * Immediately destroys this TweenData, nulling of all its references. + */ + destroy(): void; + + } + + /** + * The Tween Manager is a default Scene Plugin which controls and updates Tweens. + * + * A tween is a way to alter one or more properties of a target object over a defined period of time. + * + * Tweens are created by calling the `add` method and passing in the configuration object. + * + * ```js + * const logo = this.add.image(100, 100, 'logo'); + * + * this.tweens.add({ + * targets: logo, + * x: 600, + * ease: 'Power1', + * duration: 2000 + * }); + * ``` + * + * See the `TweenBuilderConfig` for all of the options you have available. + * + * Playback will start immediately unless the tween has been configured to be paused. + * + * Please note that a Tween will not manipulate any target property that begins with an underscore. + * + * Tweens are designed to be 'fire-and-forget'. They automatically destroy themselves once playback + * is complete, to free-up memory and resources. If you wish to keep a tween after playback, i.e. to + * play it again at a later time, then you should set the `persist` property to `true` in the config. + * However, doing so means it's entirely up to _you_ to destroy the tween when you're finished with it, + * otherwise it will linger in memory forever. + * + * If you wish to chain Tweens together for sequential playback, see the `TweenManager.chain` method. + */ + class TweenManager { + /** + * + * @param scene The Scene which owns this Tween Manager. + */ + constructor(scene: Phaser.Scene); + + /** + * The Scene which owns this Tween Manager. + */ + scene: Phaser.Scene; + + /** + * The Scene Systems Event Emitter. + */ + events: Phaser.Events.EventEmitter; + + /** + * The time scale of the Tween Manager. + * + * This value scales the time delta between two frames, thus influencing the speed of time for all Tweens owned by this Tween Manager. + */ + timeScale: number; + + /** + * This toggles the updating state of this Tween Manager. + * + * Setting `paused` to `true` (or calling the `pauseAll` method) will + * stop this Tween Manager from updating any of its tweens, including + * newly created ones. Set back to `false` to resume playback. + */ + paused: boolean; + + /** + * Is this Tween Manager currently processing the tweens as part of + * its 'update' loop? This is set to 'true' at the start of 'update' + * and reset to 'false' at the end of the function. Allows you to trap + * Tween Manager status during tween callbacks. + */ + processing: boolean; + + /** + * An array of Tweens which are actively being processed by the Tween Manager. + */ + tweens: Phaser.Tweens.Tween[]; + + /** + * The time the Tween Manager was updated. + */ + time: number; + + /** + * The time the Tween Manager was started. + */ + startTime: number; + + /** + * The time the Tween Manager should next update. + */ + nextTime: number; + + /** + * The time the Tween Manager previously updated. + */ + prevTime: number; + + /** + * The maximum amount of time, in milliseconds, the browser can + * lag for, before lag smoothing is applied. + * + * See the `TweenManager.setLagSmooth` method for further details. + */ + maxLag: number; + + /** + * The amount of time, in milliseconds, that is used to set the + * delta when lag smoothing is applied. + * + * See the `TweenManager.setLagSmooth` method for further details. + */ + lagSkip: number; + + /** + * An internal value that holds the fps rate. + */ + gap: number; + + /** + * Create a Tween and return it, but does not add it to this Tween Manager. + * + * Please note that a Tween will not manipulate any target property that begins with an underscore. + * + * In order to play this tween, you'll need to add it to a Tween Manager via + * the `TweenManager.existing` method. + * + * You can optionally pass an **array** of Tween Configuration objects to this method and it will create + * one Tween per entry in the array. If an array is given, an array of tweens is returned. + * @param config A Tween Configuration object. Or an array of Tween Configuration objects. + */ + create(config: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenBuilderConfig[] | object | object[]): Phaser.Tweens.Tween | Phaser.Tweens.Tween[]; + + /** + * Create a Tween and add it to this Tween Manager by passing a Tween Configuration object. + * + * Example, run from within a Scene: + * + * ```js + * const logo = this.add.image(100, 100, 'logo'); + * + * this.tweens.add({ + * targets: logo, + * x: 600, + * ease: 'Power1', + * duration: 2000 + * }); + * ``` + * + * See the `TweenBuilderConfig` for all of the options you have available. + * + * Playback will start immediately unless the tween has been configured to be paused. + * + * Please note that a Tween will not manipulate any target property that begins with an underscore. + * + * Tweens are designed to be 'fire-and-forget'. They automatically destroy themselves once playback + * is complete, to free-up memory and resources. If you wish to keep a tween after playback, i.e. to + * play it again at a later time, then you should set the `persist` property to `true` in the config. + * However, doing so means it's entirely up to _you_ to destroy the tween when you're finished with it, + * otherwise it will linger in memory forever. + * + * If you wish to chain Tweens together for sequential playback, see the `TweenManager.chain` method. + * @param config A Tween Configuration object, or a Tween or TweenChain instance. + */ + add(config: Phaser.Types.Tweens.TweenBuilderConfig | Phaser.Types.Tweens.TweenChainBuilderConfig | Phaser.Tweens.Tween | Phaser.Tweens.TweenChain): Phaser.Tweens.Tween; + + /** + * Create multiple Tweens and add them all to this Tween Manager, by passing an array of Tween Configuration objects. + * + * See the `TweenBuilderConfig` for all of the options you have available. + * + * Playback will start immediately unless the tweens have been configured to be paused. + * + * Please note that a Tween will not manipulate any target property that begins with an underscore. + * + * Tweens are designed to be 'fire-and-forget'. They automatically destroy themselves once playback + * is complete, to free-up memory and resources. If you wish to keep a tween after playback, i.e. to + * play it again at a later time, then you should set the `persist` property to `true` in the config. + * However, doing so means it's entirely up to _you_ to destroy the tween when you're finished with it, + * otherwise it will linger in memory forever. + * + * If you wish to chain Tweens together for sequential playback, see the `TweenManager.chain` method. + * @param configs An array of Tween Configuration objects. + */ + addMultiple(configs: Phaser.Types.Tweens.TweenBuilderConfig[] | object[]): Phaser.Tweens.Tween[]; + + /** + * Create a sequence of Tweens, chained to one-another, and add them to this Tween Manager. + * + * The tweens are played in order, from start to finish. You can optionally set the chain + * to repeat as many times as you like. Once the chain has finished playing, or repeating if set, + * all tweens in the chain will be destroyed automatically. To override this, set the `persist` + * argument to 'true'. + * + * Playback will start immediately unless the _first_ Tween has been configured to be paused. + * + * Please note that Tweens will not manipulate any target property that begins with an underscore. + * @param tweens A Tween Chain configuration object. + */ + chain(tweens: Phaser.Types.Tweens.TweenChainBuilderConfig | object): Phaser.Tweens.TweenChain; + + /** + * Returns an array containing this Tween and all Tweens chained to it, + * in the order in which they will be played. + * + * If there are no chained Tweens an empty array is returned. + * @param tween The Tween to return the chain from. + */ + getChainedTweens(tween: Phaser.Tweens.Tween): Phaser.Tweens.Tween[]; + + /** + * Check to see if the given Tween instance exists within this Tween Manager. + * + * Will return `true` as long as the Tween is being processed by this Tween Manager. + * + * Will return `false` if not present, or has a state of `REMOVED` or `DESTROYED`. + * @param tween The Tween instance to check. + */ + has(tween: Phaser.Tweens.Tween): boolean; + + /** + * Add an existing Tween to this Tween Manager. + * + * Playback will start immediately unless the tween has been configured to be paused. + * @param tween The Tween to add. + */ + existing(tween: Phaser.Tweens.Tween): this; + + /** + * Create a Number Tween and add it to the active Tween list. + * + * A Number Tween is a special kind of tween that doesn't have a target. Instead, + * it allows you to tween between 2 numeric values. The default values are + * `0` and `1`, but you can change them via the `from` and `to` properties. + * + * You can get the current tweened value via the `Tween.getValue()` method. + * + * Playback will start immediately unless the tween has been configured to be paused. + * + * Please note that a Tween will not manipulate any target property that begins with an underscore. + * @param config The configuration object for the Number Tween. + */ + addCounter(config: Phaser.Types.Tweens.NumberTweenBuilderConfig): Phaser.Tweens.Tween; + + /** + * Creates a Stagger function to be used by a Tween property. + * + * The stagger function will allow you to stagger changes to the value of the property across all targets of the tween. + * + * This is only worth using if the tween has multiple targets. + * + * The following will stagger the delay by 100ms across all targets of the tween, causing them to scale down to 0.2 + * over the duration specified: + * + * ```javascript + * this.tweens.add({ + * targets: [ ... ], + * scale: 0.2, + * ease: 'linear', + * duration: 1000, + * delay: this.tweens.stagger(100) + * }); + * ``` + * + * The following will stagger the delay by 500ms across all targets of the tween using a 10 x 6 grid, staggering + * from the center out, using a cubic ease. + * + * ```javascript + * this.tweens.add({ + * targets: [ ... ], + * scale: 0.2, + * ease: 'linear', + * duration: 1000, + * delay: this.tweens.stagger(500, { grid: [ 10, 6 ], from: 'center', ease: 'cubic.out' }) + * }); + * ``` + * @param value The amount to stagger by, or an array containing two elements representing the min and max values to stagger between. + * @param config The configuration object for the Stagger function. + */ + stagger(value: number | number[], config: Phaser.Types.Tweens.StaggerConfig): Function; + + /** + * Set the limits that are used when a browser encounters lag, or delays that cause the elapsed + * time between two frames to exceed the expected amount. If this occurs, the Tween Manager will + * act as if the 'skip' amount of times has passed, in order to maintain strict tween sequencing. + * + * This is enabled by default with the values 500ms for the lag limit and 33ms for the skip. + * + * You should not set these to low values, as it won't give time for the browser to ever + * catch-up with itself and reclaim sync. + * + * Call this method with no arguments to disable smoothing. + * + * Call it with the arguments `500` and `33` to reset to the defaults. + * @param limit If the browser exceeds this amount, in milliseconds, it will act as if the 'skip' amount has elapsed instead. Default 0. + * @param skip The amount, in milliseconds, to use as the step delta should the browser lag beyond the 'limit'. Default 0. + */ + setLagSmooth(limit?: number, skip?: number): this; + + /** + * Limits the Tween system to run at a particular frame rate. + * + * You should not set this _above_ the frequency of the browser, + * but instead can use it to throttle the frame rate lower, should + * you need to in certain situations. + * @param fps The frame rate to tick at. Default 240. + */ + setFps(fps?: number): this; + + /** + * Internal method that calculates the delta value, along with the other timing values, + * and returns the new delta. + * + * You should not typically call this method directly. + * @param tick Is this a manual tick, or an automated tick? Default false. + */ + getDelta(tick?: boolean): number; + + /** + * Manually advance the Tween system by one step. + * + * This will update all Tweens even if the Tween Manager is currently + * paused. + */ + tick(): this; + + /** + * Internal update handler. + * + * Calls `TweenManager.step` as long as the Tween Manager has not + * been paused. + */ + update(): void; + + /** + * Updates all Tweens belonging to this Tween Manager. + * + * Called automatically by `update` and `tick`. + * @param tick Is this a manual tick, or an automated tick? Default false. + */ + step(tick?: boolean): void; + + /** + * Removes the given Tween from this Tween Manager, even if it hasn't started + * playback yet. If this method is called while the Tween Manager is processing + * an update loop, then the tween will be flagged for removal at the start of + * the next frame. Otherwise, it is removed immediately. + * + * The removed tween is _not_ destroyed. It is just removed from this Tween Manager. + * @param tween The Tween to be removed. + */ + remove(tween: Phaser.Tweens.Tween): this; + + /** + * Resets the given Tween. + * + * If the Tween does not belong to this Tween Manager, it will first be added. + * + * Then it will seek to position 0 and playback will start on the next frame. + * @param tween The Tween to be reset. + */ + reset(tween: Phaser.Tweens.Tween): this; + + /** + * Checks if a Tween is active and adds it to the Tween Manager at the start of the frame if it isn't. + * @param tween The Tween to check. + */ + makeActive(tween: Phaser.Tweens.Tween): this; + + /** + * Passes all Tweens to the given callback. + * @param callback The function to call. + * @param scope The scope (`this` object) to call the function with. + * @param args The arguments to pass into the function. Its first argument will always be the Tween currently being iterated. + */ + each(callback: Function, scope?: object, ...args: any[]): this; + + /** + * Returns an array containing references to all Tweens in this Tween Manager. + * + * It is safe to mutate the returned array. However, acting upon any of the Tweens + * within it, will adjust those stored in this Tween Manager, as they are passed + * by reference and not cloned. + * + * If you wish to get tweens for a specific target, see `getTweensOf`. + */ + getTweens(): Phaser.Tweens.Tween[]; + + /** + * Returns an array of all Tweens in the Tween Manager which affect the given target, or array of targets. + * + * It's possible for this method to return tweens that are about to be removed from + * the Tween Manager. You should check the state of the returned tween before acting + * upon it. + * @param target The target to look for. Provide an array to look for multiple targets. + */ + getTweensOf(target: object | object[]): Phaser.Tweens.Tween[]; + + /** + * Returns the scale of the time delta for all Tweens owned by this Tween Manager. + */ + getGlobalTimeScale(): number; + + /** + * Sets a new scale of the time delta for this Tween Manager. + * + * The time delta is the time elapsed between two consecutive frames and influences the speed of time for this Tween Manager and all Tweens it owns. Values higher than 1 increase the speed of time, while values smaller than 1 decrease it. A value of 0 freezes time and is effectively equivalent to pausing all Tweens. + * @param value The new scale of the time delta, where 1 is the normal speed. + */ + setGlobalTimeScale(value: number): this; + + /** + * Checks if the given object is being affected by a _playing_ Tween. + * + * If the Tween is paused, this method will return false. + * @param target The object to check if a tween is active for it, or not. + */ + isTweening(target: object): boolean; + + /** + * Destroys all Tweens in this Tween Manager. + * + * The tweens will erase all references to any targets they hold + * and be stopped immediately. + * + * If this method is called while the Tween Manager is running its + * update process, then the tweens will be removed at the start of + * the next frame. Outside of this, they are removed immediately. + */ + killAll(): this; + + /** + * Stops all Tweens which affect the given target or array of targets. + * + * The tweens will erase all references to any targets they hold + * and be stopped immediately. + * + * If this method is called while the Tween Manager is running its + * update process, then the tweens will be removed at the start of + * the next frame. Outside of this, they are removed immediately. + * @param target The target to kill the tweens of. Provide an array to use multiple targets. + */ + killTweensOf(target: object | any[]): this; + + /** + * Pauses this Tween Manager. No Tweens will update while paused. + * + * This includes tweens created after this method was called. + * + * See `TweenManager#resumeAll` to resume the playback. + * + * As of Phaser 3.60 you can also toggle the boolean property `TweenManager.paused`. + */ + pauseAll(): this; + + /** + * Resumes playback of this Tween Manager. + * + * All active Tweens will continue updating. + * + * See `TweenManager#pauseAll` to pause the playback. + * + * As of Phaser 3.60 you can also toggle the boolean property `TweenManager.paused`. + */ + resumeAll(): this; + + /** + * The Scene that owns this plugin is shutting down. + * + * We need to kill and reset all internal properties as well as stop listening to Scene events. + */ + shutdown(): void; + + /** + * The Scene that owns this plugin is being destroyed. + * We need to shutdown and then kill off all external references. + */ + destroy(): void; + + } + + } + + namespace Utils { + namespace Array { + /** + * Adds the given item, or array of items, to the array. + * + * Each item must be unique within the array. + * + * The array is modified in-place and returned. + * + * You can optionally specify a limit to the maximum size of the array. If the quantity of items being + * added will take the array length over this limit, it will stop adding once the limit is reached. + * + * You can optionally specify a callback to be invoked for each item successfully added to the array. + * @param array The array to be added to. + * @param item The item, or array of items, to add to the array. Each item must be unique within the array. + * @param limit Optional limit which caps the size of the array. + * @param callback A callback to be invoked for each item successfully added to the array. + * @param context The context in which the callback is invoked. + */ + function Add(array: any[], item: any | any[], limit?: number, callback?: Function, context?: object): any[]; + + /** + * Adds the given item, or array of items, to the array starting at the index specified. + * + * Each item must be unique within the array. + * + * Existing elements in the array are shifted up. + * + * The array is modified in-place and returned. + * + * You can optionally specify a limit to the maximum size of the array. If the quantity of items being + * added will take the array length over this limit, it will stop adding once the limit is reached. + * + * You can optionally specify a callback to be invoked for each item successfully added to the array. + * @param array The array to be added to. + * @param item The item, or array of items, to add to the array. + * @param index The index in the array where the item will be inserted. Default 0. + * @param limit Optional limit which caps the size of the array. + * @param callback A callback to be invoked for each item successfully added to the array. + * @param context The context in which the callback is invoked. + */ + function AddAt(array: any[], item: any | any[], index?: number, limit?: number, callback?: Function, context?: object): any[]; + + /** + * Moves the given element to the top of the array. + * The array is modified in-place. + * @param array The array. + * @param item The element to move. + */ + function BringToTop(array: any[], item: any): any; + + /** + * Returns the total number of elements in the array which have a property matching the given value. + * @param array The array to search. + * @param property The property to test on each array element. + * @param value The value to test the property against. Must pass a strict (`===`) comparison check. + * @param startIndex An optional start index to search from. + * @param endIndex An optional end index to search to. + */ + function CountAllMatching(array: any[], property: string, value: any, startIndex?: number, endIndex?: number): number; + + /** + * Passes each element in the array to the given callback. + * @param array The array to search. + * @param callback A callback to be invoked for each item in the array. + * @param context The context in which the callback is invoked. + * @param args Additional arguments that will be passed to the callback, after the current array item. + */ + function Each(array: any[], callback: Function, context: object, ...args: any[]): any[]; + + /** + * Passes each element in the array, between the start and end indexes, to the given callback. + * @param array The array to search. + * @param callback A callback to be invoked for each item in the array. + * @param context The context in which the callback is invoked. + * @param startIndex The start index to search from. + * @param endIndex The end index to search to. + * @param args Additional arguments that will be passed to the callback, after the child. + */ + function EachInRange(array: any[], callback: Function, context: object, startIndex: number, endIndex: number, ...args: any[]): any[]; + + /** + * Searches a pre-sorted array for the closet value to the given number. + * + * If the `key` argument is given it will assume the array contains objects that all have the required `key` property name, + * and will check for the closest value of those to the given number. + * @param value The value to search for in the array. + * @param array The array to search, which must be sorted. + * @param key An optional property key. If specified the array elements property will be checked against value. + */ + function FindClosestInSorted(value: number, array: any[], key?: string): number | any; + + /** + * Takes an array and flattens it, returning a shallow-copy flattened array. + * @param array The array to flatten. + * @param output An array to hold the results in. + */ + function Flatten(array: any[], output?: any[]): any[]; + + /** + * Returns all elements in the array. + * + * You can optionally specify a matching criteria using the `property` and `value` arguments. + * + * For example: `getAll('visible', true)` would return only elements that have their visible property set. + * + * Optionally you can specify a start and end index. For example if the array had 100 elements, + * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only + * the first 50 elements. + * @param array The array to search. + * @param property The property to test on each array element. + * @param value The value to test the property against. Must pass a strict (`===`) comparison check. + * @param startIndex An optional start index to search from. + * @param endIndex An optional end index to search to. + */ + function GetAll(array: any[], property?: string, value?: any, startIndex?: number, endIndex?: number): any[]; + + /** + * Returns the first element in the array. + * + * You can optionally specify a matching criteria using the `property` and `value` arguments. + * + * For example: `getAll('visible', true)` would return the first element that had its `visible` property set. + * + * Optionally you can specify a start and end index. For example if the array had 100 elements, + * and you set `startIndex` to 0 and `endIndex` to 50, it would search only the first 50 elements. + * @param array The array to search. + * @param property The property to test on each array element. + * @param value The value to test the property against. Must pass a strict (`===`) comparison check. + * @param startIndex An optional start index to search from. Default 0. + * @param endIndex An optional end index to search up to (but not included) Default array.length. + */ + function GetFirst(array: any[], property?: string, value?: any, startIndex?: number, endIndex?: number): object | null; + + /** + * Returns a Random element from the array. + * @param array The array to select the random entry from. + * @param startIndex An optional start index. Default 0. + * @param length An optional length, the total number of elements (from the startIndex) to choose from. Default array.length. + */ + function GetRandom(array: T[], startIndex?: number, length?: number): T; + + namespace Matrix { + /** + * Checks if an array can be used as a matrix. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array to check. + */ + function CheckMatrix(matrix?: T[][]): boolean; + + /** + * Generates a string (which you can pass to console.log) from the given Array Matrix. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix A 2-dimensional array. + */ + function MatrixToString(matrix?: T[][]): string; + + /** + * Reverses the columns in the given Array Matrix. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array matrix to reverse the columns for. + */ + function ReverseColumns(matrix?: T[][]): T[][]; + + /** + * Reverses the rows in the given Array Matrix. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array matrix to reverse the rows for. + */ + function ReverseRows(matrix?: T[][]): T[][]; + + /** + * Rotates the array matrix 180 degrees. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array to rotate. + */ + function Rotate180(matrix?: T[][]): T[][]; + + /** + * Rotates the array matrix to the left (or 90 degrees) + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array to rotate. + * @param amount The number of times to rotate the matrix. Default 1. + */ + function RotateLeft(matrix?: T[][], amount?: number): T[][]; + + /** + * Rotates the array matrix based on the given rotation value. + * + * The value can be given in degrees: 90, -90, 270, -270 or 180, + * or a string command: `rotateLeft`, `rotateRight` or `rotate180`. + * + * Based on the routine from {@link http://jsfiddle.net/MrPolywhirl/NH42z/}. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array to rotate. + * @param direction The amount to rotate the matrix by. Default 90. + */ + function RotateMatrix(matrix?: T[][], direction?: number | string): T[][]; + + /** + * Rotates the array matrix to the left (or -90 degrees) + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array to rotate. + * @param amount The number of times to rotate the matrix. Default 1. + */ + function RotateRight(matrix?: T[][], amount?: number): T[][]; + + /** + * Translates the given Array Matrix by shifting each column and row the + * amount specified. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param matrix The array matrix to translate. + * @param x The amount to horizontally translate the matrix by. Default 0. + * @param y The amount to vertically translate the matrix by. Default 0. + */ + function Translate(matrix?: T[][], x?: number, y?: number): T[][]; + + /** + * Transposes the elements of the given matrix (array of arrays). + * + * The transpose of a matrix is a new matrix whose rows are the columns of the original. + * + * A matrix is a two-dimensional array (array of arrays), where all sub-arrays (rows) + * have the same length. There must be at least two rows. This is an example matrix: + * + * ``` + * [ + * [ 1, 1, 1, 1, 1, 1 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 2, 0, 1, 2, 0, 4 ], + * [ 2, 0, 3, 4, 0, 4 ], + * [ 2, 0, 0, 0, 0, 4 ], + * [ 3, 3, 3, 3, 3, 3 ] + * ] + * ``` + * @param array The array matrix to transpose. + */ + function TransposeMatrix(array?: T[][]): T[][]; + + } + + /** + * Moves the given array element above another one in the array. + * The array is modified in-place. + * @param array The input array. + * @param item1 The element to move above base element. + * @param item2 The base element. + */ + function MoveAbove(array: any[], item1: any, item2: any): any[]; + + /** + * Moves the given array element below another one in the array. + * The array is modified in-place. + * @param array The input array. + * @param item1 The element to move below base element. + * @param item2 The base element. + */ + function MoveBelow(array: any[], item1: any, item2: any): any[]; + + /** + * Moves the given array element down one place in the array. + * The array is modified in-place. + * @param array The input array. + * @param item The element to move down the array. + */ + function MoveDown(array: any[], item: any): any[]; + + /** + * Moves an element in an array to a new position within the same array. + * The array is modified in-place. + * @param array The array. + * @param item The element to move. + * @param index The new index that the element will be moved to. + */ + function MoveTo(array: any[], item: any, index: number): any; + + /** + * Moves the given array element up one place in the array. + * The array is modified in-place. + * @param array The input array. + * @param item The element to move up the array. + */ + function MoveUp(array: any[], item: any): any[]; + + /** + * Create an array representing the range of numbers (usually integers), between, and inclusive of, + * the given `start` and `end` arguments. For example: + * + * `var array = Phaser.Utils.Array.NumberArray(2, 4); // array = [2, 3, 4]` + * `var array = Phaser.Utils.Array.NumberArray(0, 9); // array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]` + * `var array = Phaser.Utils.Array.NumberArray(8, 2); // array = [8, 7, 6, 5, 4, 3, 2]` + * + * This is equivalent to `Phaser.Utils.Array.NumberArrayStep(start, end, 1)`. + * + * You can optionally provide a prefix and / or suffix string. If given the array will contain + * strings, not integers. For example: + * + * `var array = Phaser.Utils.Array.NumberArray(1, 4, 'Level '); // array = ["Level 1", "Level 2", "Level 3", "Level 4"]` + * `var array = Phaser.Utils.Array.NumberArray(5, 7, 'HD-', '.png'); // array = ["HD-5.png", "HD-6.png", "HD-7.png"]` + * @param start The minimum value the array starts with. + * @param end The maximum value the array contains. + * @param prefix Optional prefix to place before the number. If provided the array will contain strings, not integers. + * @param suffix Optional suffix to place after the number. If provided the array will contain strings, not integers. + */ + function NumberArray(start: number, end: number, prefix?: string, suffix?: string): number[] | string[]; + + /** + * Create an array of numbers (positive and/or negative) progressing from `start` + * up to but not including `end` by advancing by `step`. + * + * If `start` is less than `end` a zero-length range is created unless a negative `step` is specified. + * + * Certain values for `start` and `end` (eg. NaN/undefined/null) are currently coerced to 0; + * for forward compatibility make sure to pass in actual numbers. + * @param start The start of the range. Default 0. + * @param end The end of the range. Default null. + * @param step The value to increment or decrement by. Default 1. + */ + function NumberArrayStep(start?: number, end?: number, step?: number): number[]; + + /** + * A [Floyd-Rivest](https://en.wikipedia.org/wiki/Floyd%E2%80%93Rivest_algorithm) quick selection algorithm. + * + * Rearranges the array items so that all items in the [left, k] range are smaller than all items in [k, right]; + * The k-th element will have the (k - left + 1)th smallest value in [left, right]. + * + * The array is modified in-place. + * + * Based on code by [Vladimir Agafonkin](https://www.npmjs.com/~mourner) + * @param arr The array to sort. + * @param k The k-th element index. + * @param left The index of the left part of the range. Default 0. + * @param right The index of the right part of the range. + * @param compare An optional comparison function. Is passed two elements and should return 0, 1 or -1. + */ + function QuickSelect(arr: any[], k: number, left?: number, right?: number, compare?: Function): void; + + /** + * Creates an array populated with a range of values, based on the given arguments and configuration object. + * + * Range ([a,b,c], [1,2,3]) = + * a1, a2, a3, b1, b2, b3, c1, c2, c3 + * + * Range ([a,b], [1,2,3], qty = 3) = + * a1, a1, a1, a2, a2, a2, a3, a3, a3, b1, b1, b1, b2, b2, b2, b3, b3, b3 + * + * Range ([a,b,c], [1,2,3], repeat x1) = + * a1, a2, a3, b1, b2, b3, c1, c2, c3, a1, a2, a3, b1, b2, b3, c1, c2, c3 + * + * Range ([a,b], [1,2], repeat -1 = endless, max = 14) = + * Maybe if max is set then repeat goes to -1 automatically? + * a1, a2, b1, b2, a1, a2, b1, b2, a1, a2, b1, b2, a1, a2 (capped at 14 elements) + * + * Range ([a], [1,2,3,4,5], random = true) = + * a4, a1, a5, a2, a3 + * + * Range ([a, b], [1,2,3], random = true) = + * b3, a2, a1, b1, a3, b2 + * + * Range ([a, b, c], [1,2,3], randomB = true) = + * a3, a1, a2, b2, b3, b1, c1, c3, c2 + * + * Range ([a], [1,2,3,4,5], yoyo = true) = + * a1, a2, a3, a4, a5, a5, a4, a3, a2, a1 + * + * Range ([a, b], [1,2,3], yoyo = true) = + * a1, a2, a3, b1, b2, b3, b3, b2, b1, a3, a2, a1 + * @param a The first array of range elements. + * @param b The second array of range elements. + * @param options A range configuration object. Can contain: repeat, random, randomB, yoyo, max, qty. + */ + function Range(a: any[], b: any[], options?: object): any[]; + + /** + * Removes the given item, or array of items, from the array. + * + * The array is modified in-place. + * + * You can optionally specify a callback to be invoked for each item successfully removed from the array. + * @param array The array to be modified. + * @param item The item, or array of items, to be removed from the array. + * @param callback A callback to be invoked for each item successfully removed from the array. + * @param context The context in which the callback is invoked. + */ + function Remove(array: any[], item: any | any[], callback?: Function, context?: object): any | any[]; + + /** + * Removes the item from the given position in the array. + * + * The array is modified in-place. + * + * You can optionally specify a callback to be invoked for the item if it is successfully removed from the array. + * @param array The array to be modified. + * @param index The array index to remove the item from. The index must be in bounds or it will throw an error. + * @param callback A callback to be invoked for the item removed from the array. + * @param context The context in which the callback is invoked. + */ + function RemoveAt(array: any[], index: number, callback?: Function, context?: object): any; + + /** + * Removes the item within the given range in the array. + * + * The array is modified in-place. + * + * You can optionally specify a callback to be invoked for the item/s successfully removed from the array. + * @param array The array to be modified. + * @param startIndex The start index to remove from. + * @param endIndex The end index to remove to. + * @param callback A callback to be invoked for the item removed from the array. + * @param context The context in which the callback is invoked. + */ + function RemoveBetween(array: any[], startIndex: number, endIndex: number, callback?: Function, context?: object): any[]; + + /** + * Removes a random object from the given array and returns it. + * Will return null if there are no array items that fall within the specified range or if there is no item for the randomly chosen index. + * @param array The array to removed a random element from. + * @param start The array index to start the search from. Default 0. + * @param length Optional restriction on the number of elements to randomly select from. Default array.length. + */ + function RemoveRandomElement(array: any[], start?: number, length?: number): object; + + /** + * Replaces an element of the array with the new element. + * The new element cannot already be a member of the array. + * The array is modified in-place. + * @param array The array to search within. + * @param oldChild The element in the array that will be replaced. + * @param newChild The element to be inserted into the array at the position of `oldChild`. + */ + function Replace(array: any[], oldChild: any, newChild: any): boolean; + + /** + * Moves the element at the start of the array to the end, shifting all items in the process. + * The "rotation" happens to the left. + * @param array The array to shift to the left. This array is modified in place. + * @param total The number of times to shift the array. Default 1. + */ + function RotateLeft(array: any[], total?: number): any; + + /** + * Moves the element at the end of the array to the start, shifting all items in the process. + * The "rotation" happens to the right. + * @param array The array to shift to the right. This array is modified in place. + * @param total The number of times to shift the array. Default 1. + */ + function RotateRight(array: any[], total?: number): any; + + /** + * Tests if the start and end indexes are a safe range for the given array. + * @param array The array to check. + * @param startIndex The start index. + * @param endIndex The end index. + * @param throwError Throw an error if the range is out of bounds. Default true. + */ + function SafeRange(array: any[], startIndex: number, endIndex: number, throwError?: boolean): boolean; + + /** + * Moves the given element to the bottom of the array. + * The array is modified in-place. + * @param array The array. + * @param item The element to move. + */ + function SendToBack(array: any[], item: any): any; + + /** + * Scans the array for elements with the given property. If found, the property is set to the `value`. + * + * For example: `SetAll('visible', true)` would set all elements that have a `visible` property to `false`. + * + * Optionally you can specify a start and end index. For example if the array had 100 elements, + * and you set `startIndex` to 0 and `endIndex` to 50, it would update only the first 50 elements. + * @param array The array to search. + * @param property The property to test for on each array element. + * @param value The value to set the property to. + * @param startIndex An optional start index to search from. + * @param endIndex An optional end index to search to. + */ + function SetAll(array: any[], property: string, value: any, startIndex?: number, endIndex?: number): any[]; + + /** + * Shuffles the contents of the given array using the Fisher-Yates implementation. + * + * The original array is modified directly and returned. + * @param array The array to shuffle. This array is modified in place. + */ + function Shuffle(array: T[]): T[]; + + /** + * Takes the given array and runs a numeric sort on it, ignoring any non-digits that + * may be in the entries. + * + * You should only run this on arrays containing strings. + * @param array The input array of strings. + */ + function SortByDigits(array: string[]): string[]; + + /** + * Removes a single item from an array and returns it without creating gc, like the native splice does. + * Based on code by Mike Reinstein. + * @param array The array to splice from. + * @param index The index of the item which should be spliced. + */ + function SpliceOne(array: any[], index: number): any; + + /** + * An in-place stable array sort, because `Array#sort()` is not guaranteed stable. + * + * This is an implementation of merge sort, without recursion. + * + * Function based on the Two-Screen/stable sort 0.1.8 from https://github.com/Two-Screen/stable + * @param array The input array to be sorted. + * @param compare The comparison function. + */ + function StableSort(array: any[], compare?: Function): any[]; + + /** + * Swaps the position of two elements in the given array. + * The elements must exist in the same array. + * The array is modified in-place. + * @param array The input array. + * @param item1 The first element to swap. + * @param item2 The second element to swap. + */ + function Swap(array: any[], item1: any, item2: any): any[]; + + } + + namespace Base64 { + /** + * Converts an ArrayBuffer into a base64 string. + * + * The resulting string can optionally be a data uri if the `mediaType` argument is provided. + * + * See https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs for more details. + * @param arrayBuffer The Array Buffer to encode. + * @param mediaType An optional media type, i.e. `audio/ogg` or `image/jpeg`. If included the resulting string will be a data URI. + */ + function ArrayBufferToBase64(arrayBuffer: ArrayBuffer, mediaType?: string): string; + + /** + * Converts a base64 string, either with or without a data uri, into an Array Buffer. + * @param base64 The base64 string to be decoded. Can optionally contain a data URI header, which will be stripped out prior to decoding. + */ + function Base64ToArrayBuffer(base64: string): ArrayBuffer; + + } + + /** + * A NOOP (No Operation) callback function. + * + * Used internally by Phaser when it's more expensive to determine if a callback exists + * than it is to just invoke an empty function. + */ + function NOOP(): void; + + /** + * A NULL OP callback function. + * + * This function always returns `null`. + * + * Used internally by Phaser when it's more expensive to determine if a callback exists + * than it is to just invoke an empty function. + */ + function NULL(): void; + + namespace Objects { + /** + * Shallow Object Clone. Will not clone nested objects. + * @param obj The object to clone. + */ + function Clone(obj: object): object; + + /** + * Deep Copy the given object or array. + * @param obj The object to deep copy. + */ + function DeepCopy(obj: object): object; + + /** + * This is a slightly modified version of http://api.jquery.com/jQuery.extend/ + * @param args The objects that will be mixed. + */ + function Extend(...args: any[]): object; + + /** + * Retrieves a value from an object. Allows for more advanced selection options, including: + * + * Allowed types: + * + * Explicit: + * { + * x: 4 + * } + * + * From function + * { + * x: function () + * } + * + * Randomly pick one element from the array + * { + * x: [a, b, c, d, e, f] + * } + * + * Random integer between min and max: + * { + * x: { randInt: [min, max] } + * } + * + * Random float between min and max: + * { + * x: { randFloat: [min, max] } + * } + * @param source The object to retrieve the value from. + * @param key The name of the property to retrieve from the object. If a property is nested, the names of its preceding properties should be separated by a dot (`.`) - `banner.hideBanner` would return the value of the `hideBanner` property from the object stored in the `banner` property of the `source` object. + * @param defaultValue The value to return if the `key` isn't found in the `source` object. + */ + function GetAdvancedValue(source: object, key: string, defaultValue: any): any; + + /** + * Finds the key within the top level of the {@link source} object, or returns {@link defaultValue} + * @param source The object to search + * @param key The key for the property on source. Must exist at the top level of the source object (no periods) + * @param defaultValue The default value to use if the key does not exist. + */ + function GetFastValue(source: object, key: string, defaultValue?: any): any; + + /** + * Retrieves and clamps a numerical value from an object. + * @param source The object to retrieve the value from. + * @param key The name of the property to retrieve from the object. If a property is nested, the names of its preceding properties should be separated by a dot (`.`). + * @param min The minimum value which can be returned. + * @param max The maximum value which can be returned. + * @param defaultValue The value to return if the property doesn't exist. It's also constrained to the given bounds. + */ + function GetMinMaxValue(source: object, key: string, min: number, max: number, defaultValue: number): number; + + /** + * Retrieves a value from an object, or an alternative object, falling to a back-up default value if not found. + * + * The key is a string, which can be split based on the use of the period character. + * + * For example: + * + * ```javascript + * const source = { + * lives: 3, + * render: { + * screen: { + * width: 1024 + * } + * } + * } + * + * const lives = GetValue(source, 'lives', 1); + * const width = GetValue(source, 'render.screen.width', 800); + * const height = GetValue(source, 'render.screen.height', 600); + * ``` + * + * In the code above, `lives` will be 3 because it's defined at the top level of `source`. + * The `width` value will be 1024 because it can be found inside the `render.screen` object. + * The `height` value will be 600, the default value, because it is missing from the `render.screen` object. + * @param source The primary object to try to retrieve the value from. If not found in here, `altSource` is checked. + * @param key The name of the property to retrieve from the object. If a property is nested, the names of its preceding properties should be separated by a dot (`.`) - `banner.hideBanner` would return the value of the `hideBanner` property from the object stored in the `banner` property of the `source` object. + * @param defaultValue The value to return if the `key` isn't found in the `source` object. + * @param altSource An alternative object to retrieve the value from. If the property exists in `source` then `altSource` will not be used. + */ + function GetValue(source: object, key: string, defaultValue: any, altSource?: object): any; + + /** + * Verifies that an object contains all requested keys + * @param source an object on which to check for key existence + * @param keys an array of keys to ensure the source object contains + */ + function HasAll(source: object, keys: string[]): boolean; + + /** + * Verifies that an object contains at least one of the requested keys + * @param source an object on which to check for key existence + * @param keys an array of keys to search the object for + */ + function HasAny(source: object, keys: string[]): boolean; + + /** + * Determine whether the source object has a property with the specified key. + * @param source The source object to be checked. + * @param key The property to check for within the object + */ + function HasValue(source: object, key: string): boolean; + + /** + * This is a slightly modified version of jQuery.isPlainObject. + * A plain object is an object whose internal class property is [object Object]. + * @param obj The object to inspect. + */ + function IsPlainObject(obj: object): boolean; + + /** + * Creates a new Object using all values from obj1 and obj2. + * If a value exists in both obj1 and obj2, the value in obj1 is used. + * + * This is only a shallow copy. Deeply nested objects are not cloned, so be sure to only use this + * function on shallow objects. + * @param obj1 The first object. + * @param obj2 The second object. + */ + function Merge(obj1: object, obj2: object): object; + + /** + * Creates a new Object using all values from obj1. + * + * Then scans obj2. If a property is found in obj2 that *also* exists in obj1, the value from obj2 is used, otherwise the property is skipped. + * @param obj1 The first object to merge. + * @param obj2 The second object to merge. Keys from this object which also exist in `obj1` will be copied to `obj1`. + */ + function MergeRight(obj1: object, obj2: object): object; + + /** + * Returns a new object that only contains the `keys` that were found on the object provided. + * If no `keys` are found, an empty object is returned. + * @param object The object to pick the provided keys from. + * @param keys An array of properties to retrieve from the provided object. + */ + function Pick(object: object, keys: any[]): object; + + /** + * Sets a value in an object, allowing for dot notation to control the depth of the property. + * + * For example: + * + * ```javascript + * var data = { + * world: { + * position: { + * x: 200, + * y: 100 + * } + * } + * }; + * + * SetValue(data, 'world.position.y', 300); + * + * console.log(data.world.position.y); // 300 + * ``` + * @param source The object to set the value in. + * @param key The name of the property in the object. If a property is nested, the names of its preceding properties should be separated by a dot (`.`) + * @param value The value to set into the property, if found in the source object. + */ + function SetValue(source: object, key: string, value: any): boolean; + + } + + namespace String { + /** + * Takes a string and replaces instances of markers with values in the given array. + * The markers take the form of `%1`, `%2`, etc. I.e.: + * + * `Format("The %1 is worth %2 gold", [ 'Sword', 500 ])` + * @param string The string containing the replacement markers. + * @param values An array containing values that will replace the markers. If no value exists an empty string is inserted instead. + */ + function Format(string: string, values: any[]): string; + + /** + * Takes the given string and pads it out, to the length required, using the character + * specified. For example if you need a string to be 6 characters long, you can call: + * + * `pad('bob', 6, '-', 2)` + * + * This would return: `bob---` as it has padded it out to 6 characters, using the `-` on the right. + * + * You can also use it to pad numbers (they are always returned as strings): + * + * `pad(512, 6, '0', 1)` + * + * Would return: `000512` with the string padded to the left. + * + * If you don't specify a direction it'll pad to both sides: + * + * `pad('c64', 7, '*')` + * + * Would return: `**c64**` + * @param str The target string. `toString()` will be called on the string, which means you can also pass in common data types like numbers. + * @param len The number of characters to be added. Default 0. + * @param pad The string to pad it out with (defaults to a space). Default " ". + * @param dir The direction dir = 1 (left), 2 (right), 3 (both). Default 3. + */ + function Pad(str: string | number | object, len?: number, pad?: string, dir?: number): string; + + /** + * Takes a string and removes the character at the given index. + * @param string The string to be worked on. + * @param index The index of the character to be removed. + */ + function RemoveAt(string: string, index: number): string; + + /** + * Takes the given string and reverses it, returning the reversed string. + * For example if given the string `Atari 520ST` it would return `TS025 iratA`. + * @param string The string to be reversed. + */ + function Reverse(string: string): string; + + /** + * Capitalizes the first letter of a string if there is one. + * @param str The string to capitalize. + */ + function UppercaseFirst(str: string): string; + + /** + * Creates and returns an RFC4122 version 4 compliant UUID. + * + * The string is in the form: `xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx` where each `x` is replaced with a random + * hexadecimal digit from 0 to f, and `y` is replaced with a random hexadecimal digit from 8 to b. + */ + function UUID(): string; + + } + + } + + /** + * The Facebook Instant Games Plugin for Phaser 3 provides a seamless bridge between Phaser + * and the Facebook Instant Games API version 6.2. + * + * You can access this plugin via the `facebook` property in a Scene, i.e: + * + * ```javascript + * this.facebook.getPlatform(); + * ``` + * + * If this is unavailable please check to make sure you're using a build of Phaser that has + * this plugin within it. You can quickly check this by looking at the dev tools console + * header - the Phaser version number will have `-FB` after it if this plugin is loaded. + * + * If you are building your own version of Phaser then use this Webpack DefinePlugin flag: + * + * `"typeof PLUGIN_FBINSTANT": JSON.stringify(true)` + * + * You will find that every Instant Games API method has a mapping in this plugin. + * For a full list please consult either the plugin documentation, or the 6.2 SDK documentation + * at https://developers.facebook.com/docs/games/instant-games/sdk/fbinstant6.2 + * + * Internally this plugin uses its own Data Manager to handle seamless user data updates and provides + * handy functions for advertisement displaying, opening share dialogs, logging, leaderboards, purchase API requests, + * loader integration and more. + * + * To get started with Facebook Instant Games you will need to register on Facebook and create a new Instant + * Game app that has its own unique app ID. Facebook have also provided a dashboard interface for setting up + * various features for your game, including leaderboards, ad requests and the payments API. There are lots + * of guides on the Facebook Developers portal to assist with setting these + * various systems up: https://developers.facebook.com/docs/games/instant-games/guides + * + * For more details follow the Quick Start guide here: https://developers.facebook.com/docs/games/instant-games + */ + class FacebookInstantGamesPlugin extends Phaser.Events.EventEmitter { + /** + * + * @param game A reference to the Phaser.Game instance. + */ + constructor(game: Phaser.Game); + + /** + * A reference to the Phaser.Game instance. + */ + readonly game: Phaser.Game; + + /** + * A Data Manager instance. + * It allows you to store, query and retrieve any key/value data you may need to store. + * It's also used internally by the plugin to store FBIG API data. + */ + data: Phaser.Data.DataManager; + + /** + * Has the Facebook Instant Games API loaded yet? + * This is set automatically during the boot process. + */ + hasLoaded: boolean; + + /** + * Is the Data Manager currently locked? + */ + dataLocked: boolean; + + /** + * A list of the Facebook Instant Games APIs that are available, + * based on the given platform, context and user privacy settings. + * This value is populated automatically during boot. + */ + supportedAPIs: string[]; + + /** + * Holds the entry point that the game was launched from. + * This value is populated automatically during boot. + */ + entryPoint: string; + + /** + * An object that contains any data associated with the entry point that the game was launched from. + * The contents of the object are developer-defined, and can occur from entry points on different platforms. + * This will return null for older mobile clients, as well as when there is no data associated with the particular entry point. + * This value is populated automatically during boot. + */ + entryPointData: any; + + /** + * A unique identifier for the current game context. This represents a specific context + * that the game is being played in (for example, a particular messenger conversation or facebook post). + * The identifier will be null if game is being played in a solo context. + * This value is populated automatically during boot. + */ + contextID: string; + + /** + * The current context in which your game is running. This can be either `null` or + * one of: + * + * `POST` - The game is running inside of a Facebook post. + * `THREAD` - The game is running inside a Facebook Messenger thread. + * `GROUP` - The game is running inside a Facebook Group. + * `SOLO` - This is the default context, the player is the only participant. + * + * This value is populated automatically during boot. + */ + contextType: string | null; + + /** + * The current locale. + * See https://origincache.facebook.com/developers/resources/?id=FacebookLocales.xml for a complete list of supported locale values. + * Use this to determine what languages the current game should be localized with. + * This value is populated automatically during boot. + */ + locale: string | null; + + /** + * The platform on which the game is currently running, i.e. `IOS`. + * This value is populated automatically during boot. + */ + platform: string | null; + + /** + * The string representation of the Facebook Instant Games SDK version being used. + * This value is populated automatically during boot. + */ + version: string | null; + + /** + * Holds the id of the player. This is a string based ID, the same as `FBInstant.player.getID()`. + * This value is populated automatically during boot if the API is supported. + */ + playerID: string | null; + + /** + * The player's localized display name. + * This value is populated automatically during boot if the API is supported. + */ + playerName: string | null; + + /** + * A url to the player's public profile photo. The photo will always be a square, and with dimensions + * of at least 200x200. When rendering it in the game, the exact dimensions should never be assumed to be constant. + * It's recommended to always scale the image to a desired size before rendering. + * This value is populated automatically during boot if the API is supported. + */ + playerPhotoURL: string | null; + + /** + * Whether a player can subscribe to the game bot or not. + */ + playerCanSubscribeBot: boolean; + + /** + * Does the current platform and context allow for use of the payments API? + * Currently this is only available on Facebook.com and Android 6+. + */ + paymentsReady: boolean; + + /** + * The set of products that are registered to the game. + */ + catalog: Product[]; + + /** + * Contains all of the player's unconsumed purchases. + * The game must fetch the current player's purchases as soon as the client indicates that it is ready to perform payments-related operations, + * i.e. at game start. The game can then process and consume any purchases that are waiting to be consumed. + */ + purchases: Purchase[]; + + /** + * Contains all of the leaderboard data, as populated by the `getLeaderboard()` method. + */ + leaderboards: Phaser.FacebookInstantGamesLeaderboard[]; + + /** + * Contains AdInstance objects, as created by the `preloadAds()` method. + */ + ads: AdInstance[]; + + /** + * Call this method from your `Scene.preload` in order to sync the load progress + * of the Phaser Loader with the Facebook Instant Games loader display, i.e.: + * + * ```javascript + * this.facebook.showLoadProgress(this); + * this.facebook.once('startgame', this.startGame, this); + * ``` + * @param scene The Scene for which you want to show loader progress for. + */ + showLoadProgress(scene: Phaser.Scene): this; + + /** + * This method is called automatically when the game has finished loading, + * if you used the `showLoadProgress` method. If your game doesn't need to + * load any assets, or you're managing the load yourself, then call this + * method directly to start the API running. + * + * When the API has finished starting this plugin will emit a `startgame` event + * which you should listen for. + */ + gameStarted(): void; + + /** + * Checks to see if a given Facebook Instant Games API is available or not. + * @param api The API to check for, i.e. `player.getID`. + */ + checkAPI(api: string): boolean; + + /** + * Returns the unique identifier for the current game context. This represents a specific context + * that the game is being played in (for example, a particular messenger conversation or facebook post). + * The identifier will be null if game is being played in a solo context. + * + * It is only populated if `contextGetID` is in the list of supported APIs. + */ + getID(): string; + + /** + * Returns the current context in which your game is running. This can be either `null` or one of: + * + * `POST` - The game is running inside of a Facebook post. + * `THREAD` - The game is running inside a Facebook Messenger thread. + * `GROUP` - The game is running inside a Facebook Group. + * `SOLO` - This is the default context, the player is the only participant. + * + * It is only populated if `contextGetType` is in the list of supported APIs. + */ + getType(): string | null; + + /** + * Returns the current locale. + * See https://origincache.facebook.com/developers/resources/?id=FacebookLocales.xml for a complete list of supported locale values. + * Use this to determine what languages the current game should be localized with. + * It is only populated if `getLocale` is in the list of supported APIs. + */ + getLocale(): string | null; + + /** + * Returns the platform on which the game is currently running, i.e. `IOS`. + * It is only populated if `getPlatform` is in the list of supported APIs. + */ + getPlatform(): string | null; + + /** + * Returns the string representation of the Facebook Instant Games SDK version being used. + * It is only populated if `getSDKVersion` is in the list of supported APIs. + */ + getSDKVersion(): string | null; + + /** + * Returns the id of the player. This is a string based ID, the same as `FBInstant.player.getID()`. + * It is only populated if `playerGetID` is in the list of supported APIs. + */ + getPlayerID(): string | null; + + /** + * Returns the player's localized display name. + * It is only populated if `playerGetName` is in the list of supported APIs. + */ + getPlayerName(): string | null; + + /** + * Returns the url to the player's public profile photo. The photo will always be a square, and with dimensions + * of at least 200x200. When rendering it in the game, the exact dimensions should never be assumed to be constant. + * It's recommended to always scale the image to a desired size before rendering. + * It is only populated if `playerGetPhoto` is in the list of supported APIs. + */ + getPlayerPhotoURL(): string | null; + + /** + * Load the player's photo and store it in the Texture Manager, ready for use in-game. + * + * This method works by using a Scene Loader instance and then asking the Loader to + * retrieve the image. + * + * When complete the plugin will emit a `photocomplete` event, along with the key of the photo. + * + * ```javascript + * this.facebook.loadPlayerPhoto(this, 'player').once('photocomplete', function (key) { + * this.add.image(x, y, 'player'); + * }, this); + * ``` + * @param scene The Scene that will be responsible for loading this photo. + * @param key The key to use when storing the photo in the Texture Manager. + */ + loadPlayerPhoto(scene: Phaser.Scene, key: string): this; + + /** + * Checks if the current player can subscribe to the game bot. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they can subscribe, the `playerCanSubscribeBot` property is set to `true` + * and this plugin will emit the `cansubscribebot` event. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `cansubscribebotfail` event instead. + */ + canSubscribeBot(): this; + + /** + * Subscribes the current player to the game bot. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they are successfully subscribed this plugin will emit the `subscribebot` event. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `subscribebotfail` event instead. + */ + subscribeBot(): this; + + /** + * Gets the associated data from the player based on the given key, or array of keys. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes the data is set into this plugins Data Manager and the + * `getdata` event will be emitted. + * @param keys The key/s of the data to retrieve. + */ + getData(keys: string | string[]): this; + + /** + * Set data to be saved to the designated cloud storage of the current player. The game can store up to 1MB of data for each unique player. + * + * The data save is requested in an async call, so the result isn't available immediately. + * + * Data managed via this plugins Data Manager instance is automatically synced with Facebook. However, you can call this + * method directly if you need to replace the data object directly. + * + * When the APIs `setDataAsync` call resolves it will emit the `savedata` event from this plugin. If the call fails for some + * reason it will emit `savedatafail` instead. + * + * The call resolving does not necessarily mean that the input has already been persisted. Rather, it means that the data was valid and + * has been scheduled to be saved. It also guarantees that all values that were set are now available in `getData`. + * @param data An object containing a set of key-value pairs that should be persisted to cloud storage. + * The object must contain only serializable values - any non-serializable values will cause the entire modification to be rejected. + */ + saveData(data: object): this; + + /** + * Immediately flushes any changes to the player data to the designated cloud storage. + * This function is expensive, and should primarily be used for critical changes where persistence needs to be immediate + * and known by the game. Non-critical changes should rely on the platform to persist them in the background. + * NOTE: Calls to player.setDataAsync will be rejected while this function's result is pending. + * + * Data managed via this plugins Data Manager instance is automatically synced with Facebook. However, you can call this + * method directly if you need to flush the data directly. + * + * When the APIs `flushDataAsync` call resolves it will emit the `flushdata` event from this plugin. If the call fails for some + * reason it will emit `flushdatafail` instead. + */ + flushData(): this; + + /** + * Retrieve stats from the designated cloud storage of the current player. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes the `getstats` event will be emitted along with the data object returned. + * + * If the call fails, i.e. it's not in the list of supported APIs, or the request was rejected, + * it will emit a `getstatsfail` event instead. + * @param keys An optional array of unique keys to retrieve stats for. If the function is called without it, it will fetch all stats. + */ + getStats(keys?: string[]): this; + + /** + * Save the stats of the current player to the designated cloud storage. + * + * Stats in the Facebook Instant Games API are purely numerical values paired with a string-based key. Only numbers can be saved as stats, + * all other data types will be ignored. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes the `savestats` event will be emitted along with the data object returned. + * + * If the call fails, i.e. it's not in the list of supported APIs, or the request was rejected, + * it will emit a `savestatsfail` event instead. + * @param data An object containing a set of key-value pairs that should be persisted to cloud storage as stats. Note that only numerical values are stored. + */ + saveStats(data: object): this; + + /** + * Increment the stats of the current player and save them to the designated cloud storage. + * + * Stats in the Facebook Instant Games API are purely numerical values paired with a string-based key. Only numbers can be saved as stats, + * all other data types will be ignored. + * + * The data object provided for this call should contain offsets for how much to modify the stats by: + * + * ```javascript + * this.facebook.incStats({ + * level: 1, + * zombiesSlain: 17, + * rank: -1 + * }); + * ``` + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes the `incstats` event will be emitted along with the data object returned. + * + * If the call fails, i.e. it's not in the list of supported APIs, or the request was rejected, + * it will emit a `incstatsfail` event instead. + * @param data An object containing a set of key-value pairs indicating how much to increment each stat in cloud storage. Note that only numerical values are processed. + */ + incStats(data: object): this; + + /** + * Sets the data associated with the individual gameplay session for the current context. + * + * This function should be called whenever the game would like to update the current session data. + * + * This session data may be used to populate a variety of payloads, such as game play webhooks. + * @param data An arbitrary data object, which must be less than or equal to 1000 characters when stringified. + */ + saveSession(data: object): this; + + /** + * This invokes a dialog to let the user share specified content, either as a message in Messenger or as a post on the user's timeline. + * + * A blob of data can be attached to the share which every game session launched from the share will be able to access via the `this.entryPointData` property. + * + * This data must be less than or equal to 1000 characters when stringified. + * + * When this method is called you should consider your game paused. Listen out for the `resume` event from this plugin to know when the dialog has been closed. + * + * The user may choose to cancel the share action and close the dialog. The resulting `resume` event will be dispatched regardless if the user actually shared the content or not. + * @param text A text message to be shared. + * @param key The key of the texture to use as the share image. + * @param frame The frame of the texture to use as the share image. Set to `null` if you don't require a frame, but do need to set session data. + * @param sessionData A blob of data to attach to the share. + */ + openShare(text: string, key: string, frame?: string, sessionData?: object): this; + + /** + * This invokes a dialog to let the user invite a friend to play this game, either as a message in Messenger or as a post on the user's timeline. + * + * A blob of data can be attached to the share which every game session launched from the share will be able to access via the `this.entryPointData` property. + * + * This data must be less than or equal to 1000 characters when stringified. + * + * When this method is called you should consider your game paused. Listen out for the `resume` event from this plugin to know when the dialog has been closed. + * + * The user may choose to cancel the share action and close the dialog. The resulting `resume` event will be dispatched regardless if the user actually shared the content or not. + * @param text A text message to be shared. + * @param key The key of the texture to use as the share image. + * @param frame The frame of the texture to use as the share image. Set to `null` if you don't require a frame, but do need to set session data. + * @param sessionData A blob of data to attach to the share. + */ + openInvite(text: string, key: string, frame?: string, sessionData?: object): this; + + /** + * This invokes a dialog to let the user share specified content, either as a message in Messenger or as a post on the user's timeline. + * + * A blob of data can be attached to the share which every game session launched from the share will be able to access via the `this.entryPointData` property. + * + * This data must be less than or equal to 1000 characters when stringified. + * + * When this method is called you should consider your game paused. Listen out for the `resume` event from this plugin to know when the dialog has been closed. + * + * The user may choose to cancel the share action and close the dialog. The resulting `resume` event will be dispatched regardless if the user actually shared the content or not. + * @param text A text message to be shared. + * @param key The key of the texture to use as the share image. + * @param frame The frame of the texture to use as the share image. Set to `null` if you don't require a frame, but do need to set session data. + * @param sessionData A blob of data to attach to the share. + */ + openRequest(text: string, key: string, frame?: string, sessionData?: object): this; + + /** + * This invokes a dialog to let the user share specified content, either as a message in Messenger or as a post on the user's timeline. + * + * A blob of data can be attached to the share which every game session launched from the share will be able to access via the `this.entryPointData` property. + * + * This data must be less than or equal to 1000 characters when stringified. + * + * When this method is called you should consider your game paused. Listen out for the `resume` event from this plugin to know when the dialog has been closed. + * + * The user may choose to cancel the share action and close the dialog. The resulting `resume` event will be dispatched regardless if the user actually shared the content or not. + * @param text A text message to be shared. + * @param key The key of the texture to use as the share image. + * @param frame The frame of the texture to use as the share image. Set to `null` if you don't require a frame, but do need to set session data. + * @param sessionData A blob of data to attach to the share. + */ + openChallenge(text: string, key: string, frame?: string, sessionData?: object): this; + + /** + * This function determines whether the number of participants in the current game context is between a given minimum and maximum, inclusive. + * If one of the bounds is null only the other bound will be checked against. + * It will always return the original result for the first call made in a context in a given game play session. + * Subsequent calls, regardless of arguments, will return the answer to the original query until a context change occurs and the query result is reset. + * @param min The minimum bound of the context size query. + * @param max The maximum bound of the context size query. + */ + isSizeBetween(min?: integer, max?: integer): object; + + /** + * Request a switch into a specific context. If the player does not have permission to enter that context, + * or if the player does not provide permission for the game to enter that context, this will emit a `switchfail` event. + * + * Otherwise, the plugin will emit the `switch` event when the game has switched into the specified context. + * @param contextID The ID of the desired context. + */ + switchContext(contextID: string): this; + + /** + * Opens a context selection dialog for the player. If the player selects an available context, + * the client will attempt to switch into that context, and emit the `choose` event if successful. + * Otherwise, if the player exits the menu or the client fails to switch into the new context, the `choosefail` event will be emitted. + * @param options An object specifying conditions on the contexts that should be offered. + */ + chooseContext(options?: ChooseContextConfig): this; + + /** + * Attempts to create or switch into a context between a specified player and the current player. + * This plugin will emit the `create` event once the context switch is completed. + * If the API call fails, such as if the player listed is not a Connected Player of the current player or if the + * player does not provide permission to enter the new context, then the plugin will emit a 'createfail' event. + * @param playerID ID of the player. + */ + createContext(playerID: string): this; + + /** + * Fetches an array of ConnectedPlayer objects containing information about active players + * (people who played the game in the last 90 days) that are connected to the current player. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they are successfully subscribed this plugin will emit the `players` event along + * with the player data. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `playersfail` event instead. + */ + getPlayers(): this; + + /** + * Fetches the game's product catalog. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they are successfully subscribed this plugin will emit the `getcatalog` event along + * with the catalog data. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `getcatalogfail` event instead. + */ + getCatalog(): this; + + /** + * Fetches a single Product from the game's product catalog. + * + * The product catalog must have been populated using `getCatalog` prior to calling this method. + * + * Use this to look-up product details based on a purchase list. + * @param productID The Product ID of the item to get from the catalog. + */ + getProduct(productID: string): Product | null; + + /** + * Begins the purchase flow for a specific product. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they are successfully subscribed this plugin will emit the `purchase` event along + * with the purchase data. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `purchasefail` event instead. + * @param productID The identifier of the product to purchase. + * @param developerPayload An optional developer-specified payload, to be included in the returned purchase's signed request. + */ + purchase(productID: string, developerPayload?: string): this; + + /** + * Fetches all of the player's unconsumed purchases. The game must fetch the current player's purchases + * as soon as the client indicates that it is ready to perform payments-related operations, + * i.e. at game start. The game can then process and consume any purchases that are waiting to be consumed. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they are successfully subscribed this plugin will emit the `getpurchases` event along + * with the purchase data. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `getpurchasesfail` event instead. + */ + getPurchases(): this; + + /** + * Consumes a specific purchase belonging to the current player. Before provisioning a product's effects to the player, + * the game should request the consumption of the purchased product. Once the purchase is successfully consumed, + * the game should immediately provide the player with the effects of their purchase. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If they are successfully subscribed this plugin will emit the `consumepurchase` event along + * with the purchase data. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `consumepurchasefail` event instead. + * @param purchaseToken The purchase token of the purchase that should be consumed. + */ + consumePurchase(purchaseToken: string): this; + + /** + * Informs Facebook of a custom update that occurred in the game. + * This will temporarily yield control to Facebook and Facebook will decide what to do based on what the update is. + * Once Facebook returns control to the game the plugin will emit an `update` or `updatefail` event. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * The `text` parameter is an update payload with the following structure: + * + * ``` + * text: { + * default: 'X just invaded Y\'s village!', + * localizations: { + * ar_AR: 'X \u0641\u0642\u0637 \u063A\u0632\u062A ' + + * '\u0642\u0631\u064A\u0629 Y!', + * en_US: 'X just invaded Y\'s village!', + * es_LA: '\u00A1X acaba de invadir el pueblo de Y!', + * } + * } + * ``` + * @param cta The call to action text. + * @param text The text object. + * @param key The key of the texture to use as the share image. + * @param frame The frame of the texture to use as the share image. Set to `null` if you don't require a frame, but do need to set session data. + * @param template The update template key. + * @param updateData The update data object payload. + */ + update(cta: string, text: object, key: string, frame: string | integer | undefined, template: string, updateData: object): this; + + /** + * Informs Facebook of a leaderboard update that occurred in the game. + * This will temporarily yield control to Facebook and Facebook will decide what to do based on what the update is. + * Once Facebook returns control to the game the plugin will emit an `update` or `updatefail` event. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * The `text` parameter is an update payload with the following structure: + * + * ``` + * text: { + * default: 'X just invaded Y\'s village!', + * localizations: { + * ar_AR: 'X \u0641\u0642\u0637 \u063A\u0632\u062A ' + + * '\u0642\u0631\u064A\u0629 Y!', + * en_US: 'X just invaded Y\'s village!', + * es_LA: '\u00A1X acaba de invadir el pueblo de Y!', + * } + * } + * ``` + * @param cta The call to action text. + * @param text The text object. + * @param key The key of the texture to use as the share image. + * @param frame The frame of the texture to use as the share image. Set to `null` if you don't require a frame, but do need to set session data. + * @param template The update template key. + * @param updateData The update data object payload. + */ + updateLeaderboard(cta: string, text: object, key: string, frame: string | integer | undefined, template: string, updateData: object): this; + + /** + * Request that the client switch to a different Instant Game. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If the game switches successfully this plugin will emit the `switchgame` event and the client will load the new game. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `switchgamefail` event instead. + * @param appID The Application ID of the Instant Game to switch to. The application must be an Instant Game, and must belong to the same business as the current game. + * @param data An optional data payload. This will be set as the entrypoint data for the game being switched to. Must be less than or equal to 1000 characters when stringified. + */ + switchGame(appID: string, data?: object): this; + + /** + * Prompts the user to create a shortcut to the game if they are eligible to. + * Can only be called once per session. + * + * It makes an async call to the API, so the result isn't available immediately. + * + * If the user choose to create a shortcut this plugin will emit the `shortcutcreated` event. + * + * If they cannot, i.e. it's not in the list of supported APIs, or the request + * was rejected, it will emit a `shortcutcreatedfail` event instead. + */ + createShortcut(): this; + + /** + * Quits the game. + */ + quit(): void; + + /** + * Log an app event with FB Analytics. + * + * See https://developers.facebook.com/docs/javascript/reference/v2.8#app_events for more details about FB Analytics. + * @param name Name of the event. Must be 2 to 40 characters, and can only contain '_', '-', ' ', and alphanumeric characters. + * @param value An optional numeric value that FB Analytics can calculate a sum with. + * @param params An optional object that can contain up to 25 key-value pairs to be logged with the event. Keys must be 2 to 40 characters, and can only contain '_', '-', ' ', and alphanumeric characters. Values must be less than 100 characters in length. + */ + log(name: string, value?: number, params?: object): this; + + /** + * Attempt to create an instance of an interstitial ad. + * + * If the instance is created successfully then the ad is preloaded ready for display in-game via the method `showAd()`. + * + * If the ad loads it will emit the `adloaded` event, passing the AdInstance as the only parameter. + * + * If the ad cannot be displayed because there was no inventory to fill it, it will emit the `adsnofill` event. + * @param placementID The ad placement ID, or an array of IDs, as created in your Audience Network settings within Facebook. + */ + preloadAds(placementID: string | string[]): this; + + /** + * Attempt to create an instance of an rewarded video ad. + * + * If the instance is created successfully then the ad is preloaded ready for display in-game via the method `showVideo()`. + * + * If the ad loads it will emit the `adloaded` event, passing the AdInstance as the only parameter. + * + * If the ad cannot be displayed because there was no inventory to fill it, it will emit the `adsnofill` event. + * @param placementID The ad placement ID, or an array of IDs, as created in your Audience Network settings within Facebook. + */ + preloadVideoAds(placementID: string | string[]): this; + + /** + * Displays a previously loaded interstitial ad. + * + * If the ad is successfully displayed this plugin will emit the `adfinished` event, with the AdInstance object as its parameter. + * + * If the ad cannot be displayed, it will emit the `adsnotloaded` event. + * @param placementID The ad placement ID to display. + */ + showAd(placementID: string): this; + + /** + * Displays a previously loaded interstitial video ad. + * + * If the ad is successfully displayed this plugin will emit the `adfinished` event, with the AdInstance object as its parameter. + * + * If the ad cannot be displayed, it will emit the `adsnotloaded` event. + * @param placementID The ad placement ID to display. + */ + showVideo(placementID: string): this; + + /** + * Attempts to match the current player with other users looking for people to play with. + * If successful, a new Messenger group thread will be created containing the matched players and the player will + * be context switched to that thread. This plugin will also dispatch the `matchplayer` event, containing the new context ID and Type. + * + * The default minimum and maximum number of players in one matched thread are 2 and 20 respectively, + * depending on how many players are trying to get matched around the same time. + * + * The values can be changed in `fbapp-config.json`. See the Bundle Config documentation for documentation about `fbapp-config.json`. + * @param matchTag Optional extra information about the player used to group them with similar players. Players will only be grouped with other players with exactly the same tag. The tag must only include letters, numbers, and underscores and be 100 characters or less in length. + * @param switchImmediately Optional extra parameter that specifies whether the player should be immediately switched to the new context when a match is found. By default this will be false which will mean the player needs explicitly press play after being matched to switch to the new context. Default false. + */ + matchPlayer(matchTag?: string, switchImmediately?: boolean): this; + + /** + * Fetch a specific leaderboard belonging to this Instant Game. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes the `getleaderboard` event will be emitted along with a Leaderboard object instance. + * @param name The name of the leaderboard. Each leaderboard for an Instant Game must have its own distinct name. + */ + getLeaderboard(name: string): this; + + /** + * Quits the Facebook API and then destroys this plugin. + */ + destroy(): void; + + } + + /** + * This class represents one single Leaderboard that belongs to a Facebook Instant Game. + * + * You do not need to instantiate this class directly, it will be created when you use the + * `getLeaderboard()` method of the main plugin. + */ + class FacebookInstantGamesLeaderboard extends Phaser.Events.EventEmitter { + /** + * + * @param plugin A reference to the Facebook Instant Games Plugin. + * @param data An Instant Game leaderboard instance. + */ + constructor(plugin: Phaser.FacebookInstantGamesPlugin, data: any); + + /** + * A reference to the Facebook Instant Games Plugin. + */ + plugin: Phaser.FacebookInstantGamesPlugin; + + /** + * An Instant Game leaderboard instance. + */ + ref: any; + + /** + * The name of the leaderboard. + */ + name: string; + + /** + * The ID of the context that the leaderboard is associated with, or null if the leaderboard is not tied to a particular context. + */ + contextID: string; + + /** + * The total number of player entries in the leaderboard. + * This value defaults to zero. Populate it via the `getEntryCount()` method. + */ + entryCount: integer; + + /** + * The players score object. + * This value defaults to `null`. Populate it via the `getPlayerScore()` method. + */ + playerScore: LeaderboardScore; + + /** + * The scores in the Leaderboard from the currently requested range. + * This value defaults to an empty array. Populate it via the `getScores()` method. + * The contents of this array are reset each time `getScores()` is called. + */ + scores: LeaderboardScore[]; + + /** + * Fetches the total number of player entries in the leaderboard. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes this Leaderboard will emit the `getentrycount` event along with the count and name of the Leaderboard. + */ + getEntryCount(): this; + + /** + * Updates the player's score. If the player has an existing score, the old score will only be replaced if the new score is better than it. + * NOTE: If the leaderboard is associated with a specific context, the game must be in that context to set a score for the player. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes this Leaderboard will emit the `setscore` event along with the LeaderboardScore object and the name of the Leaderboard. + * + * If the save fails the event will send `null` as the score value. + * @param score The new score for the player. Must be a 64-bit integer number. + * @param data Metadata to associate with the stored score. Must be less than 2KB in size. If an object is given it will be passed to `JSON.stringify`. + */ + setScore(score: integer, data?: string | any): this; + + /** + * Gets the players leaderboard entry and stores it in the `playerScore` property. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes this Leaderboard will emit the `getplayerscore` event along with the score and the name of the Leaderboard. + * + * If the player has not yet saved a score, the event will send `null` as the score value, and `playerScore` will be set to `null` as well. + */ + getPlayerScore(): this; + + /** + * Retrieves a set of leaderboard entries, ordered by score ranking in the leaderboard. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes this Leaderboard will emit the `getscores` event along with an array of LeaderboardScore entries and the name of the Leaderboard. + * @param count The number of entries to attempt to fetch from the leaderboard. Currently, up to a maximum of 100 entries may be fetched per query. Default 10. + * @param offset The offset from the top of the leaderboard that entries will be fetched from. Default 0. + */ + getScores(count?: integer, offset?: integer): this; + + /** + * Retrieves a set of leaderboard entries, based on the current player's connected players (including the current player), ordered by local rank within the set of connected players. + * + * The data is requested in an async call, so the result isn't available immediately. + * + * When the call completes this Leaderboard will emit the `getconnectedscores` event along with an array of LeaderboardScore entries and the name of the Leaderboard. + */ + getConnectedScores(): this; + + } + +} + +declare type WebGLContextCallback = (renderer: Phaser.Renderer.WebGL.WebGLRenderer)=>void; + +/** + * Create temporary WebGL textures to stop WebGL errors on mac os + */ +declare function createTemporaryTextures(): void; + +declare type EachListCallback = (item: I, ...args: any[])=>void; + +declare type EachMapCallback = (key: string, entry: E)=>boolean | null; + +declare type EachSetCallback = (entry: E, index: number)=>boolean | null; + +declare type EachTextureCallback = (texture: Phaser.Textures.Texture, ...args: any[])=>void; + +declare type FindTileCallback = (value: Phaser.Tilemaps.Tile, index: number, array: Phaser.Tilemaps.Tile[])=>boolean; + +declare type EachTileCallback = (value: Phaser.Tilemaps.Tile, index: number, array: Phaser.Tilemaps.Tile[])=>void; + +/** + * A predicate, to test each element of the array. + */ +declare type TilemapFilterCallback = (value: Phaser.GameObjects.GameObject, index: number, array: Phaser.GameObjects.GameObject[])=>boolean; + +declare type TilemapFindCallback = (value: Phaser.GameObjects.GameObject, index: number, array: Phaser.GameObjects.GameObject[])=>boolean; + +/** + * Phaser.Class + */ +declare class Class { + /** + * + * @param definition a dictionary of functions for the class + */ + constructor(definition: Object); + +} + +declare type AdInstance = { + /** + * Represents an instance of an ad. + */ + instance: any; + /** + * The Audience Network placement ID of this ad instance. + */ + placementID: string; + /** + * Has this ad already been shown in-game? + */ + shown: boolean; + /** + * Is this a video ad? + */ + video: boolean; +}; + +/** + * A filter that may be applied to a Context Choose operation. + * + * 'NEW_CONTEXT_ONLY' - Prefer to only surface contexts the game has not been played in before. + * 'INCLUDE_EXISTING_CHALLENGES' - Include the "Existing Challenges" section, which surfaces actively played-in contexts that the player is a part of. + * 'NEW_PLAYERS_ONLY' - In sections containing individuals, prefer people who have not played the game. + */ +declare type ContextFilter = string; + +/** + * A configuration object that may be applied to a Context Choose operation. + */ +declare type ChooseContextConfig = { + /** + * The set of filters to apply to the context suggestions: 'NEW_CONTEXT_ONLY', 'INCLUDE_EXISTING_CHALLENGES' or 'NEW_PLAYERS_ONLY'. + */ + filters?: ContextFilter[]; + /** + * The maximum number of participants that a suggested context should ideally have. + */ + maxSize?: number; + /** + * The minimum number of participants that a suggested context should ideally have. + */ + minSize?: number; +}; + +declare type LeaderboardScore = { + /** + * An integer score value. + */ + score: integer; + /** + * The score value, formatted with the score format associated with the leaderboard. + */ + scoreFormatted: string; + /** + * The Unix timestamp of when the leaderboard entry was last updated. + */ + timestamp: integer; + /** + * The entry's leaderboard ranking. + */ + rank: integer; + /** + * The developer-specified payload associated with the score, or null if one was not set. + */ + data: string; + /** + * The player's localized display name. + */ + playerName: string; + /** + * A url to the player's public profile photo. + */ + playerPhotoURL: string; + /** + * The game's unique identifier for the player. + */ + playerID: string; +}; + +declare type Product = { + /** + * The title of the product. + */ + title?: string; + /** + * The product's game-specified identifier. + */ + productID?: string; + /** + * The product description. + */ + description?: string; + /** + * A link to the product's associated image. + */ + imageURI?: string; + /** + * The price of the product. + */ + price?: string; + /** + * The currency code for the product. + */ + priceCurrencyCode?: string; +}; + +declare type Purchase = { + /** + * A developer-specified string, provided during the purchase of the product. + */ + developerPayload?: string; + /** + * The identifier for the purchase transaction. + */ + paymentID?: string; + /** + * The product's game-specified identifier. + */ + productID?: string; + /** + * Unix timestamp of when the purchase occurred. + */ + purchaseTime?: string; + /** + * A token representing the purchase that may be used to consume the purchase. + */ + purchaseToken?: string; + /** + * Server-signed encoding of the purchase request. + */ + signedRequest?: string; +}; + +declare type integer = number; + +declare module 'phaser' { + export = Phaser; + +} +

    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

  • i{C~#J5?;gz!(X5XYG;R*X9w?uA{T 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

  • +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